[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[tor-commits] [donate/master] Latest packages.



commit c260f4a7aa0c7fa58a051a9bad7b08e00433f100
Author: peterh <peterh@xxxxxxxxxxxxxxx>
Date:   Mon Jun 24 11:54:32 2019 -0700

    Latest packages.
---
 vendor/bin/resque                                  |    2 +-
 vendor/chrisboulton/php-resque/composer.lock       |  514 ----
 vendor/colinmollenhour/credis/.travis.yml          |   17 +-
 vendor/colinmollenhour/credis/Client.php           |   29 +-
 vendor/colinmollenhour/credis/Cluster.php          |  119 +-
 .../credis/tests/CredisClusterTest.php             |    6 +-
 .../credis/tests/CredisSentinelTest.php            |   44 +-
 .../credis/tests/CredisStandaloneClusterTest.php   |    2 +-
 .../credis/tests/CredisStandaloneTest.php          |    2 +-
 vendor/colinmollenhour/credis/tests/CredisTest.php |   41 +-
 .../credis/tests/CredisTestCommon.php              |   58 +-
 .../colinmollenhour/credis/tests/SetUpBefore.php   |   35 -
 .../colinmollenhour/credis/tests/TearDownAfter.php |   35 -
 vendor/composer/ClassLoader.php                    |    6 +-
 vendor/composer/autoload_classmap.php              |    7 +
 vendor/composer/autoload_files.php                 |    6 +-
 vendor/composer/autoload_namespaces.php            |    3 +-
 vendor/composer/autoload_psr4.php                  |    4 +
 vendor/composer/autoload_static.php                |   42 +-
 vendor/composer/installed.json                     | 2929 +++++++++++---------
 vendor/cweagans/composer-patches/.editorconfig     |   11 +
 vendor/cweagans/composer-patches/.gitignore        |    1 +
 vendor/cweagans/composer-patches/LICENSE.md        |    9 +
 vendor/cweagans/composer-patches/README.md         |  178 ++
 vendor/cweagans/composer-patches/composer.json     |   30 +
 .../composer-patches}/composer.lock                |  864 ++++--
 vendor/cweagans/composer-patches/phpunit.xml.dist  |   18 +
 .../cweagans/composer-patches/src/PatchEvent.php   |   70 +
 .../cweagans/composer-patches/src/PatchEvents.php  |   30 +
 vendor/cweagans/composer-patches/src/Patches.php   |  551 ++++
 .../composer-patches/tests/PatchEventTest.php      |   39 +
 .../doctrine/instantiator/.doctrine-project.json   |   26 +
 vendor/doctrine/instantiator/.gitignore            |    5 -
 vendor/doctrine/instantiator/.scrutinizer.yml      |   46 -
 vendor/doctrine/instantiator/.travis.install.sh    |   14 -
 vendor/doctrine/instantiator/.travis.yml           |   22 -
 vendor/doctrine/instantiator/CONTRIBUTING.md       |    2 +-
 vendor/doctrine/instantiator/README.md             |    3 +-
 vendor/doctrine/instantiator/composer.json         |   14 +-
 vendor/doctrine/instantiator/docs/en/index.rst     |   68 +
 vendor/doctrine/instantiator/docs/en/sidebar.rst   |    4 +
 vendor/doctrine/instantiator/phpbench.json         |    4 +
 vendor/doctrine/instantiator/phpcs.xml.dist        |   35 +
 vendor/doctrine/instantiator/phpmd.xml.dist        |   27 -
 vendor/doctrine/instantiator/phpstan.neon.dist     |   19 +
 vendor/doctrine/instantiator/phpunit.xml.dist      |   22 -
 .../Instantiator/Exception/ExceptionInterface.php  |   23 +-
 .../Exception/InvalidArgumentException.php         |   37 +-
 .../Exception/UnexpectedValueException.php         |   51 +-
 .../src/Doctrine/Instantiator/Instantiator.php     |  165 +-
 .../Instantiator/InstantiatorInterface.php         |   23 +-
 .../InstantiatorPerformanceEvent.php               |   96 -
 .../Exception/InvalidArgumentExceptionTest.php     |   83 -
 .../Exception/UnexpectedValueExceptionTest.php     |   69 -
 .../InstantiatorTest/InstantiatorTest.php          |  219 --
 .../InstantiatorTestAsset/AbstractClassAsset.php   |   29 -
 .../InstantiatorTestAsset/ArrayObjectAsset.php     |   41 -
 .../InstantiatorTestAsset/ExceptionAsset.php       |   41 -
 .../InstantiatorTestAsset/FinalExceptionAsset.php  |   41 -
 .../InstantiatorTestAsset/PharAsset.php            |   41 -
 .../InstantiatorTestAsset/PharExceptionAsset.php   |   44 -
 .../SerializableArrayObjectAsset.php               |   62 -
 .../SimpleSerializableAsset.php                    |   61 -
 .../InstantiatorTestAsset/SimpleTraitAsset.php     |   29 -
 .../InstantiatorTestAsset/UnCloneableAsset.php     |   50 -
 .../UnserializeExceptionArrayObjectAsset.php       |   39 -
 .../InstantiatorTestAsset/WakeUpNoticesAsset.php   |   38 -
 .../InstantiatorTestAsset/XMLReaderAsset.php       |   41 -
 vendor/guzzlehttp/guzzle/CHANGELOG.md              |   25 +-
 vendor/guzzlehttp/guzzle/LICENSE                   |    2 +-
 vendor/guzzlehttp/guzzle/README.md                 |    4 +-
 vendor/guzzlehttp/guzzle/composer.json             |    4 +-
 vendor/guzzlehttp/guzzle/src/Client.php            |   28 +-
 vendor/guzzlehttp/guzzle/src/ClientInterface.php   |    2 +-
 vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php  |    6 +-
 .../guzzle/src/Cookie/SessionCookieJar.php         |    2 +-
 vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php  |   13 +-
 .../guzzle/src/Exception/GuzzleException.php       |    9 +
 .../guzzlehttp/guzzle/src/Handler/CurlFactory.php  |   12 +-
 .../guzzle/src/Handler/CurlMultiHandler.php        |    4 +-
 .../guzzle/src/Handler/StreamHandler.php           |    7 +-
 vendor/guzzlehttp/guzzle/src/HandlerStack.php      |    2 +-
 vendor/guzzlehttp/guzzle/src/MessageFormatter.php  |    2 -
 vendor/guzzlehttp/guzzle/src/Middleware.php        |   11 +-
 vendor/guzzlehttp/guzzle/src/UriTemplate.php       |    4 -
 vendor/guzzlehttp/guzzle/src/functions.php         |    6 +-
 vendor/guzzlehttp/psr7/.editorconfig               |    9 +
 vendor/guzzlehttp/psr7/CHANGELOG.md                |  231 +-
 vendor/guzzlehttp/psr7/README.md                   |    8 +-
 vendor/guzzlehttp/psr7/composer.json               |   14 +-
 vendor/guzzlehttp/psr7/src/AppendStream.php        |   16 +-
 vendor/guzzlehttp/psr7/src/FnStream.php            |    9 +
 vendor/guzzlehttp/psr7/src/InflateStream.php       |    2 +-
 vendor/guzzlehttp/psr7/src/Request.php             |    4 +-
 vendor/guzzlehttp/psr7/src/Response.php            |    4 +
 vendor/guzzlehttp/psr7/src/Rfc7230.php             |   18 +
 vendor/guzzlehttp/psr7/src/ServerRequest.php       |   32 +-
 vendor/guzzlehttp/psr7/src/Stream.php              |   39 +-
 vendor/guzzlehttp/psr7/src/StreamWrapper.php       |   46 +-
 vendor/guzzlehttp/psr7/src/Uri.php                 |   88 +-
 vendor/guzzlehttp/psr7/src/functions.php           |  130 +-
 vendor/monolog/monolog/CHANGELOG.md                |   28 +
 vendor/monolog/monolog/CHANGELOG.mdown             |  328 ---
 vendor/monolog/monolog/README.md                   |    1 -
 vendor/monolog/monolog/README.mdown                |   95 -
 .../doc/02-handlers-formatters-processors.md       |    1 +
 vendor/monolog/monolog/doc/03-utilities.md         |    2 +
 .../monolog/monolog/src/Monolog/ErrorHandler.php   |   13 +-
 .../src/Monolog/Formatter/FluentdFormatter.php     |    1 +
 .../src/Monolog/Formatter/HtmlFormatter.php        |    2 +-
 .../src/Monolog/Formatter/JsonFormatter.php        |   18 +-
 .../src/Monolog/Formatter/LineFormatter.php        |    8 +-
 .../src/Monolog/Formatter/MongoDBFormatter.php     |    6 +-
 .../src/Monolog/Formatter/NormalizerFormatter.php  |   31 +-
 .../src/Monolog/Formatter/WildfireFormatter.php    |    4 +-
 .../src/Monolog/Handler/AbstractHandler.php        |   26 +-
 .../Monolog/Handler/AbstractProcessingHandler.php  |    2 +
 .../src/Monolog/Handler/AbstractSyslogHandler.php  |    6 +-
 .../src/Monolog/Handler/BrowserConsoleHandler.php  |   56 +-
 .../monolog/src/Monolog/Handler/BufferHandler.php  |   16 +-
 .../src/Monolog/Handler/ChromePHPHandler.php       |   10 +-
 .../src/Monolog/Handler/DeduplicationHandler.php   |    2 +-
 .../src/Monolog/Handler/ElasticSearchHandler.php   |    8 +-
 .../src/Monolog/Handler/ErrorLogHandler.php        |    8 +-
 .../monolog/src/Monolog/Handler/FilterHandler.php  |    4 +-
 .../FingersCrossed/ActivationStrategyInterface.php |    2 +-
 .../src/Monolog/Handler/FingersCrossedHandler.php  |   46 +-
 .../monolog/src/Monolog/Handler/FirePHPHandler.php |    2 +-
 .../monolog/src/Monolog/Handler/GelfHandler.php    |    8 -
 .../monolog/src/Monolog/Handler/GroupHandler.php   |   16 +-
 .../src/Monolog/Handler/HandlerInterface.php       |    4 +-
 .../monolog/src/Monolog/Handler/HandlerWrapper.php |   10 +-
 .../monolog/src/Monolog/Handler/HipChatHandler.php |   15 +
 .../monolog/src/Monolog/Handler/IFTTTHandler.php   |    8 +-
 .../src/Monolog/Handler/InsightOpsHandler.php      |   62 +
 .../src/Monolog/Handler/LogEntriesHandler.php      |    4 +-
 .../src/Monolog/Handler/MandrillHandler.php        |    2 +-
 .../src/Monolog/Handler/NewRelicHandler.php        |    4 +-
 .../monolog/src/Monolog/Handler/PsrHandler.php     |    2 +-
 .../src/Monolog/Handler/PushoverHandler.php        |    6 +-
 .../monolog/src/Monolog/Handler/RavenHandler.php   |   12 +-
 .../monolog/src/Monolog/Handler/RollbarHandler.php |   12 +
 .../src/Monolog/Handler/RotatingFileHandler.php    |   18 +-
 .../src/Monolog/Handler/Slack/SlackRecord.php      |   10 +-
 .../monolog/src/Monolog/Handler/SlackHandler.php   |    5 +
 .../src/Monolog/Handler/SlackWebhookHandler.php    |    5 +
 .../monolog/src/Monolog/Handler/SocketHandler.php  |   47 +-
 .../monolog/src/Monolog/Handler/StreamHandler.php  |    6 +-
 .../src/Monolog/Handler/SwiftMailerHandler.php     |   16 +-
 .../monolog/src/Monolog/Handler/SyslogHandler.php  |   10 +-
 .../src/Monolog/Handler/SyslogUdpHandler.php       |   12 +-
 .../monolog/src/Monolog/Handler/TestHandler.php    |   16 +-
 .../Monolog/Handler/WhatFailureGroupHandler.php    |   10 +
 vendor/monolog/monolog/src/Monolog/Logger.php      |  239 +-
 .../monolog/src/Monolog/Processor/GitProcessor.php |    2 +-
 .../Monolog/Processor/IntrospectionProcessor.php   |    2 +-
 .../src/Monolog/Processor/MemoryProcessor.php      |    6 +-
 .../src/Monolog/Processor/MercurialProcessor.php   |    2 +-
 .../src/Monolog/Processor/ProcessIdProcessor.php   |    2 +-
 .../src/Monolog/Processor/ProcessorInterface.php   |   25 +
 .../Monolog/Processor/PsrLogMessageProcessor.php   |    6 +-
 .../monolog/src/Monolog/Processor/TagProcessor.php |    2 +-
 .../monolog/src/Monolog/Processor/UidProcessor.php |   17 +-
 .../monolog/src/Monolog/Processor/WebProcessor.php |    2 +-
 .../monolog/src/Monolog/ResettableInterface.php    |   31 +
 .../monolog/monolog/src/Monolog/SignalHandler.php  |  115 +
 vendor/monolog/monolog/src/Monolog/Utils.php       |   25 +
 .../Monolog/Formatter/FluentdFormatterTest.php     |    4 +-
 .../tests/Monolog/Formatter/JsonFormatterTest.php  |   36 +
 .../Monolog/Formatter/NormalizerFormatterTest.php  |   60 +-
 .../Monolog/Handler/BrowserConsoleHandlerTest.php  |    2 +-
 .../tests/Monolog/Handler/ChromePHPHandlerTest.php |    4 +-
 .../Monolog/Handler/FingersCrossedHandlerTest.php  |    4 +-
 .../tests/Monolog/Handler/FirePHPHandlerTest.php   |    4 +-
 .../Monolog/Handler/InsightOpsHandlerTest.php      |   80 +
 .../Monolog/Handler/RotatingFileHandlerTest.php    |   34 +
 .../Monolog/Handler/Slack/SlackRecordTest.php      |   16 +-
 .../tests/Monolog/Handler/SocketHandlerTest.php    |   26 +
 .../tests/Monolog/Handler/TestHandlerTest.php      |   46 +
 .../Handler/WhatFailureGroupHandlerTest.php        |   23 +
 .../monolog/monolog/tests/Monolog/LoggerTest.php   |  142 +
 .../monolog/tests/Monolog/SignalHandlerTest.php    |  287 ++
 vendor/myclabs/deep-copy/.gitignore                |    9 +-
 vendor/myclabs/deep-copy/.scrutinizer.yml          |    4 +
 vendor/myclabs/deep-copy/.travis.yml               |   27 +-
 vendor/myclabs/deep-copy/README.md                 |  284 +-
 vendor/myclabs/deep-copy/composer.json             |   29 +-
 vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php |   95 +-
 .../src/DeepCopy/Exception/CloneException.php      |    5 +-
 .../Filter/Doctrine/DoctrineCollectionFilter.php   |    8 +-
 .../Doctrine/DoctrineEmptyCollectionFilter.php     |    8 +-
 .../Filter/Doctrine/DoctrineProxyFilter.php        |    6 +-
 .../deep-copy/src/DeepCopy/Filter/Filter.php       |    3 +-
 .../deep-copy/src/DeepCopy/Filter/KeepFilter.php   |    5 +-
 .../src/DeepCopy/Filter/ReplaceFilter.php          |    8 +-
 .../src/DeepCopy/Filter/SetNullFilter.php          |    8 +-
 .../Matcher/Doctrine/DoctrineProxyMatcher.php      |    4 +-
 .../deep-copy/src/DeepCopy/Matcher/Matcher.php     |    4 +-
 .../src/DeepCopy/Matcher/PropertyMatcher.php       |    6 +-
 .../src/DeepCopy/Matcher/PropertyNameMatcher.php   |    4 +-
 .../src/DeepCopy/Matcher/PropertyTypeMatcher.php   |   14 +-
 .../src/DeepCopy/Reflection/ReflectionHelper.php   |   45 +-
 .../src/DeepCopy/TypeFilter/ReplaceFilter.php      |    3 +
 .../src/DeepCopy/TypeFilter/ShallowCopyFilter.php  |    3 +
 .../TypeFilter/Spl/SplDoublyLinkedList.php         |   35 +-
 .../src/DeepCopy/TypeFilter/TypeFilter.php         |    3 +-
 .../src/DeepCopy/TypeMatcher/TypeMatcher.php       |    6 +-
 .../myclabs/deep-copy/src/DeepCopy/deep_copy.php   |   26 +-
 vendor/nikic/fast-route/.travis.yml                |   14 +-
 vendor/nikic/fast-route/FastRoute.hhi              |   20 +-
 vendor/nikic/fast-route/composer.json              |    9 +-
 vendor/nikic/fast-route/psalm.xml                  |   28 +
 vendor/nikic/fast-route/src/BadRouteException.php  |    3 +-
 vendor/nikic/fast-route/src/DataGenerator.php      |    3 +-
 .../src/DataGenerator/CharCountBased.php           |    9 +-
 .../src/DataGenerator/GroupCountBased.php          |   10 +-
 .../fast-route/src/DataGenerator/GroupPosBased.php |   10 +-
 .../fast-route/src/DataGenerator/MarkBased.php     |   10 +-
 .../src/DataGenerator/RegexBasedAbstract.php       |   74 +-
 vendor/nikic/fast-route/src/Dispatcher.php         |    3 +-
 .../fast-route/src/Dispatcher/CharCountBased.php   |    9 +-
 .../fast-route/src/Dispatcher/GroupCountBased.php  |    9 +-
 .../fast-route/src/Dispatcher/GroupPosBased.php    |    9 +-
 .../nikic/fast-route/src/Dispatcher/MarkBased.php  |    9 +-
 .../src/Dispatcher/RegexBasedAbstract.php          |   22 +-
 vendor/nikic/fast-route/src/Route.php              |   17 +-
 vendor/nikic/fast-route/src/RouteCollector.php     |   48 +-
 vendor/nikic/fast-route/src/RouteParser.php        |    5 +-
 vendor/nikic/fast-route/src/RouteParser/Std.php    |   18 +-
 vendor/nikic/fast-route/src/bootstrap.php          |    2 +-
 vendor/nikic/fast-route/src/functions.php          |    6 +-
 .../test/Dispatcher/CharCountBasedTest.php         |    9 +-
 .../fast-route/test/Dispatcher/DispatcherTest.php  |  142 +-
 .../test/Dispatcher/GroupCountBasedTest.php        |    9 +-
 .../test/Dispatcher/GroupPosBasedTest.php          |    9 +-
 .../fast-route/test/Dispatcher/MarkBasedTest.php   |   12 +-
 .../test/HackTypechecker/HackTypecheckerTest.php   |   17 +-
 .../nikic/fast-route/test/RouteCollectorTest.php   |   25 +-
 .../nikic/fast-route/test/RouteParser/StdTest.php  |   25 +-
 vendor/nikic/fast-route/test/bootstrap.php         |    2 +-
 vendor/paragonie/random_compat/composer.json       |    9 +-
 .../random_compat/lib/byte_safe_strings.php        |  181 --
 vendor/paragonie/random_compat/lib/cast_to_int.php |   74 -
 .../paragonie/random_compat/lib/error_polyfill.php |   49 -
 vendor/paragonie/random_compat/lib/random.php      |  199 +-
 .../random_compat/lib/random_bytes_com_dotnet.php  |   88 -
 .../random_compat/lib/random_bytes_dev_urandom.php |  167 --
 .../random_compat/lib/random_bytes_libsodium.php   |   88 -
 .../lib/random_bytes_libsodium_legacy.php          |   92 -
 .../random_compat/lib/random_bytes_mcrypt.php      |   77 -
 vendor/paragonie/random_compat/lib/random_int.php  |  190 --
 vendor/paragonie/random_compat/psalm.xml           |    4 +
 vendor/paypal/merchant-sdk-php/CHANGELOG.md        |    4 +
 vendor/paypal/merchant-sdk-php/README.md           |   17 +-
 .../SetAccessPermissionsRequestDetailsType.php     |    8 +-
 .../SetAuthFlowParamRequestDetailsType.php         |    8 +-
 ...tCustomerBillingAgreementRequestDetailsType.php |    8 +-
 .../SetExpressCheckoutRequestDetailsType.php       |   12 +-
 .../Service/PayPalAPIInterfaceServiceService.php   |    2 +-
 vendor/paypal/merchant-sdk-php/samples/.gitignore  |   14 -
 .../AccountAuthentication/GetAuthDetails.html.php  |   33 -
 .../AccountAuthentication/GetAuthDetails.php       |   39 -
 .../SetAuthFlowParam.html.php                      |   48 -
 .../AccountAuthentication/SetAuthFlowParam.php     |   52 -
 .../samples/AdminCalls/AddressVerify.html.php      |   47 -
 .../samples/AdminCalls/AddressVerify.php           |   44 -
 .../samples/AdminCalls/GetBalance.html.php         |   39 -
 .../samples/AdminCalls/GetBalance.php              |   46 -
 .../samples/AdminCalls/GetPalDetails.html.php      |   26 -
 .../samples/AdminCalls/GetPalDetails.php           |   35 -
 .../AdminCalls/GetTransactionDetails.html.php      |   40 -
 .../samples/AdminCalls/GetTransactionDetails.php   |   42 -
 .../samples/AdminCalls/TransactionSearch.html.php  |   70 -
 .../samples/AdminCalls/TransactionSearch.php       |   52 -
 .../samples/BillingAgreements/BillUser.html.php    |   98 -
 .../samples/BillingAgreements/BillUser.php         |   55 -
 .../BillingAgreementUpdate.html.php                |   55 -
 .../BillingAgreements/BillingAgreementUpdate.php   |   34 -
 .../DoReferenceTransaction.html.php                |  397 ---
 .../BillingAgreements/DoReferenceTransaction.php   |  143 -
 .../GetBillingAgreementCustomerDetails.html.php    |   40 -
 .../GetBillingAgreementCustomerDetails.php         |   38 -
 .../paypal/merchant-sdk-php/samples/Common/sdk.css |   92 -
 .../paypal/merchant-sdk-php/samples/Common/sdk.js  |    9 -
 .../merchant-sdk-php/samples/Configuration.php     |   49 -
 .../samples/DirectPayment/DoDirectPayment.html.php |  290 --
 .../samples/DirectPayment/DoDirectPayment.php      |  155 --
 vendor/paypal/merchant-sdk-php/samples/Error.php   |   51 -
 .../ExpressCheckout/DGdoExpressCheckout.php        |  129 -
 .../samples/ExpressCheckout/DGsetEC.html.php       |   59 -
 .../ExpressCheckout/DGsetExpressCheckout.php       |  127 -
 .../ExpressCheckout/DoExpressCheckout.html.php     |   76 -
 .../samples/ExpressCheckout/DoExpressCheckout.php  |   98 -
 .../ExpressCheckout/GetExpressCheckout.html.php    |   37 -
 .../samples/ExpressCheckout/GetExpressCheckout.php |   49 -
 .../ExpressCheckout/SetExpressCheckout.html.php    |  359 ---
 .../samples/ExpressCheckout/SetExpressCheckout.php |  198 --
 .../merchant-sdk-php/samples/IPN/IPN-README.md     |  201 --
 .../merchant-sdk-php/samples/IPN/IPNListener.php   |   23 -
 .../samples/MassPay/MassPay.html.php               |   84 -
 .../merchant-sdk-php/samples/MassPay/MassPay.php   |   88 -
 .../merchant-sdk-php/samples/PPBootStrap.php       |   23 -
 .../PaymentSettlements/DoAuthorization.html.php    |   72 -
 .../samples/PaymentSettlements/DoAuthorization.php |   57 -
 .../samples/PaymentSettlements/DoCapture.html.php  |   75 -
 .../samples/PaymentSettlements/DoCapture.php       |   62 -
 .../DoNonReferencedCredit.html.php                 |  127 -
 .../PaymentSettlements/DoNonReferencedCredit.php   |   91 -
 .../PaymentSettlements/DoReauthorization.html.php  |   69 -
 .../PaymentSettlements/DoReauthorization.php       |   41 -
 .../samples/PaymentSettlements/DoVoid.html.php     |   53 -
 .../samples/PaymentSettlements/DoVoid.php          |   54 -
 .../ManagePendingTransactionStatus.html.php        |   66 -
 .../ManagePendingTransactionStatus.php             |   44 -
 .../samples/PaymentSettlements/Refund.html.php     |   84 -
 .../samples/PaymentSettlements/Refund.php          |   94 -
 .../PaymentSettlements/ReverseTransaction.html.php |   58 -
 .../PaymentSettlements/ReverseTransaction.php      |   40 -
 .../samples/Permissions/APIError.php               |   58 -
 .../merchant-sdk-php/samples/Permissions/Error.php |   39 -
 .../samples/Permissions/GetAccessToken.php         |   33 -
 .../samples/Permissions/GetAccessTokenReceipt.php  |   72 -
 .../samples/Permissions/Permission.html.php        |   20 -
 .../merchant-sdk-php/samples/Permissions/README.md |   14 -
 .../samples/Permissions/RequestPermissions.php     |   78 -
 .../Permissions/RequestPermissionsReceipt.php      |  127 -
 .../samples/Permissions/ShowAllResponse.php        |   30 -
 .../merchant-sdk-php/samples/Permissions/index.php |   25 -
 .../BillOutstandingAmount.html.php                 |   47 -
 .../RecurringPayments/BillOutstandingAmount.php    |   52 -
 .../CreateRecurringPaymentsProfile.html.php        |  336 ---
 .../CreateRecurringPaymentsProfile.php             |  234 --
 .../GetRecurringPaymentsProfileDetails.html.php    |   40 -
 .../GetRecurringPaymentsProfileDetails.php         |   44 -
 .../ManageRecurringPaymentsProfileStatus.html.php  |   49 -
 .../ManageRecurringPaymentsProfileStatus.php       |   60 -
 .../UpdateRecurringPaymentsProfile.html.php        |  277 --
 .../UpdateRecurringPaymentsProfile.php             |  160 --
 .../paypal/merchant-sdk-php/samples/Response.php   |   25 -
 .../paypal/merchant-sdk-php/samples/cert_key.pem   |   31 -
 .../paypal/merchant-sdk-php/samples/composer.json  |   19 -
 vendor/paypal/merchant-sdk-php/samples/index.php   |  130 -
 vendor/paypal/merchant-sdk-php/samples/install.php |  451 ---
 vendor/paypal/sdk-core-php/.gitattributes          |    8 +
 .../paypal/sdk-core-php/.github/ISSUE_TEMPLATE.md  |   13 +-
 vendor/paypal/sdk-core-php/.releasinator.rb        |   61 -
 vendor/paypal/sdk-core-php/.travis.yml             |   14 -
 vendor/paypal/sdk-core-php/CHANGELOG.md            |    4 +
 vendor/paypal/sdk-core-php/CONTRIBUTING.md         |    7 -
 vendor/paypal/sdk-core-php/Gemfile                 |    3 -
 vendor/paypal/sdk-core-php/Gemfile.lock            |   37 -
 vendor/paypal/sdk-core-php/Rakefile                |    2 -
 vendor/paypal/sdk-core-php/build.xml               |   81 -
 .../lib/PayPal/Core/PPConfigManager.php            |    1 +
 .../lib/PayPal/Core/PPConnectionManager.php        |    5 +-
 .../sdk-core-php/lib/PayPal/Core/PPConstants.php   |    2 +-
 .../sdk-core-php/lib/PayPal/Core/PPHttpConfig.php  |   12 +-
 .../lib/PayPal/Core/PPLoggingManager.php           |   15 +-
 vendor/paypal/sdk-core-php/tests/CallTest.php      |   37 -
 vendor/paypal/sdk-core-php/tests/Constants.php     |    5 -
 vendor/paypal/sdk-core-php/tests/Mocks.php         |   23 -
 .../tests/Openid/PPOpenIdAddressTest.php           |   44 -
 .../tests/Openid/PPOpenIdErrorTest.php             |   40 -
 .../tests/Openid/PPOpenIdSessionTest.php           |   86 -
 .../tests/Openid/PPOpenIdTokeninfoTest.php         |   70 -
 .../tests/Openid/PPOpenIdUserinfoTest.php          |   56 -
 .../paypal/sdk-core-php/tests/PPAPIServiceTest.php |   92 -
 .../sdk-core-php/tests/PPBaseServiceTest.php       |  104 -
 vendor/paypal/sdk-core-php/tests/PPBootStrap.php   |   10 -
 .../tests/PPCertificateCredentialTest.php          |  106 -
 .../sdk-core-php/tests/PPConfigManagerTest.php     |   98 -
 .../tests/PPConfigurationExceptionTest.php         |   35 -
 .../tests/PPConnectionExceptionTest.php            |   48 -
 .../sdk-core-php/tests/PPConnectionManagerTest.php |   76 -
 .../sdk-core-php/tests/PPCredentialManagerTest.php |  153 -
 .../paypal/sdk-core-php/tests/PPHttpConfigTest.php |  121 -
 .../paypal/sdk-core-php/tests/PPIPNMessageTest.php |  101 -
 .../tests/PPInvalidCredentialExceptionTest.php     |   40 -
 .../sdk-core-php/tests/PPLoggingManagerTest.php    |   64 -
 vendor/paypal/sdk-core-php/tests/PPMessageTest.php |  441 ---
 .../tests/PPMissingCredentialExceptionTest.php     |   41 -
 vendor/paypal/sdk-core-php/tests/PPModelTest.php   |  228 --
 .../tests/PPSignatureCredentialTest.php            |  103 -
 .../sdk-core-php/tests/PPTransformerException.php  |   17 -
 vendor/paypal/sdk-core-php/tests/PPUtilsTest.php   |  204 --
 .../paypal/sdk-core-php/tests/PPXMLMessageTest.php |  596 ----
 .../tests/formatters/FormatterFactoryTest.php      |   20 -
 .../tests/formatters/PPNVPFormatterTest.php        |   34 -
 .../tests/formatters/PPSOAPFormatterTest.php       |   70 -
 .../tests/handlers/PPAuthenticationHandlerTest.php |   44 -
 .../handlers/PPCertificateAuthHandlerTest.php      |  115 -
 .../tests/handlers/PPGenericServiceHandlerTest.php |   58 -
 .../handlers/PPMerchantServiceHandlerTest.php      |  153 -
 .../tests/handlers/PPOpenIdHandlerTest.php         |  104 -
 .../handlers/PPPlatformServiceHandlerTest.php      |  150 -
 .../tests/handlers/PPSignatureAuthHandlerTest.php  |  113 -
 vendor/paypal/sdk-core-php/tests/sdk_config.ini    |   33 -
 .../reflection-docblock/.coveralls.yml             |    3 +
 .../phpdocumentor/reflection-docblock/.gitignore   |    2 -
 .../reflection-docblock/.scrutinizer.yml           |   32 -
 .../phpdocumentor/reflection-docblock/.travis.yml  |   36 -
 vendor/phpdocumentor/reflection-docblock/README.md |   28 +-
 .../reflection-docblock/composer.json              |   16 +-
 .../reflection-docblock/easy-coding-standard.neon  |   31 +
 .../examples/01-interpreting-a-simple-docblock.php |   27 -
 .../examples/02-interpreting-tags.php              |   24 -
 .../examples/03-reconstituting-a-docblock.php      |   27 -
 .../examples/04-adding-your-own-tag.php            |  135 -
 .../playing-with-descriptions/02-escaping.php      |   47 -
 .../reflection-docblock/phpmd.xml.dist             |   23 -
 .../reflection-docblock/phpunit.xml.dist           |   33 -
 .../reflection-docblock/src/DocBlock.php           |   28 +-
 .../src/DocBlock/Description.php                   |   11 +
 .../src/DocBlock/DescriptionFactory.php            |    1 -
 .../src/DocBlock/ExampleFinder.php                 |    4 +-
 .../src/DocBlock/Serializer.php                    |    9 +-
 .../src/DocBlock/StandardTagFactory.php            |    5 +-
 .../src/DocBlock/Tags/Covers.php                   |    7 +-
 .../src/DocBlock/Tags/Deprecated.php               |    2 +-
 .../src/DocBlock/Tags/Example.php                  |  114 +-
 .../src/DocBlock/Tags/Generic.php                  |    2 +-
 .../src/DocBlock/Tags/Method.php                   |    5 +-
 .../src/DocBlock/Tags/Param.php                    |    2 +-
 .../src/DocBlock/Tags/Property.php                 |    2 +-
 .../src/DocBlock/Tags/PropertyRead.php             |    2 +-
 .../src/DocBlock/Tags/PropertyWrite.php            |    2 +-
 .../src/DocBlock/Tags/Reference/Fqsen.php          |   42 +
 .../src/DocBlock/Tags/Reference/Reference.php      |   21 +
 .../src/DocBlock/Tags/Reference/Url.php            |   40 +
 .../src/DocBlock/Tags/Return_.php                  |    3 +-
 .../reflection-docblock/src/DocBlock/Tags/See.php  |   23 +-
 .../src/DocBlock/Tags/Since.php                    |    2 +-
 .../src/DocBlock/Tags/Source.php                   |    1 +
 .../reflection-docblock/src/DocBlock/Tags/Var_.php |    6 +-
 .../src/DocBlock/Tags/Version.php                  |    2 +-
 .../reflection-docblock/src/DocBlockFactory.php    |   10 +-
 .../integration/InterpretingDocBlocksTest.php      |   97 -
 .../integration/ReconstitutingADocBlockTest.php    |   35 -
 .../tests/integration/UsingTagsTest.php            |   39 -
 .../tests/unit/DocBlock/DescriptionFactoryTest.php |  174 --
 .../tests/unit/DocBlock/DescriptionTest.php        |   75 -
 .../tests/unit/DocBlock/SerializerTest.php         |  201 --
 .../tests/unit/DocBlock/StandardTagFactoryTest.php |  361 ---
 .../tests/unit/DocBlock/Tags/AuthorTest.php        |  148 -
 .../tests/unit/DocBlock/Tags/CoversTest.php        |  155 --
 .../tests/unit/DocBlock/Tags/DeprecatedTest.php    |  166 --
 .../Tags/Formatter/PassthroughFormatterTest.php    |   41 -
 .../tests/unit/DocBlock/Tags/GenericTest.php       |  146 -
 .../tests/unit/DocBlock/Tags/LinkTest.php          |  158 --
 .../tests/unit/DocBlock/Tags/MethodTest.php        |  437 ---
 .../tests/unit/DocBlock/Tags/ParamTest.php         |  228 --
 .../tests/unit/DocBlock/Tags/PropertyReadTest.php  |  201 --
 .../tests/unit/DocBlock/Tags/PropertyTest.php      |  200 --
 .../tests/unit/DocBlock/Tags/PropertyWriteTest.php |  201 --
 .../tests/unit/DocBlock/Tags/ReturnTest.php        |  170 --
 .../tests/unit/DocBlock/Tags/SeeTest.php           |  173 --
 .../tests/unit/DocBlock/Tags/SinceTest.php         |  166 --
 .../tests/unit/DocBlock/Tags/SourceTest.php        |  199 --
 .../tests/unit/DocBlock/Tags/ThrowsTest.php        |  170 --
 .../tests/unit/DocBlock/Tags/UsesTest.php          |  174 --
 .../tests/unit/DocBlock/Tags/VarTest.php           |  200 --
 .../tests/unit/DocBlock/Tags/VersionTest.php       |  166 --
 .../tests/unit/DocBlockFactoryTest.php             |  290 --
 .../tests/unit/DocBlockTest.php                    |  252 --
 vendor/phpdocumentor/type-resolver/.gitignore      |    3 -
 .../phpdocumentor/type-resolver/.scrutinizer.yml   |   31 -
 vendor/phpdocumentor/type-resolver/.travis.yml     |   34 -
 .../examples/01-resolving-simple-types.php         |   13 -
 .../examples/02-resolving-classes.php              |   12 -
 .../examples/03-resolving-all-elements.php         |   17 -
 ...covering-the-context-using-class-reflection.php |   30 -
 ...overing-the-context-using-method-reflection.php |   30 -
 ...discovering-the-context-using-file-contents.php |   22 -
 .../type-resolver/examples/Classy.php              |   16 -
 vendor/phpdocumentor/type-resolver/phpmd.xml.dist  |   23 -
 .../phpdocumentor/type-resolver/phpunit.xml.dist   |   31 -
 .../type-resolver/src/TypeResolver.php             |    4 +-
 .../type-resolver/src/Types/Array_.php             |    6 +-
 .../type-resolver/src/Types/Compound.php           |   12 +-
 .../src/Types/{Mixed.php => Mixed_.php}            |    2 +-
 .../src/Types/{Resource.php => Resource_.php}      |    2 +-
 .../type-resolver/tests/unit/TypeResolverTest.php  |  395 ---
 .../tests/unit/Types/ContextFactoryTest.php        |  188 --
 .../type-resolver/tests/unit/Types/ContextTest.php |   61 -
 .../phpmailer/phpmailer/.github/ISSUE_TEMPLATE.md  |    1 -
 .../phpmailer/.github/PULL_REQUEST_TEMPLATE.md     |    1 -
 vendor/phpmailer/phpmailer/LICENSE                 |   42 +-
 vendor/phpmailer/phpmailer/VERSION                 |    2 +-
 vendor/phpmailer/phpmailer/class.phpmailer.php     |   35 +-
 vendor/phpmailer/phpmailer/class.pop3.php          |    2 +-
 vendor/phpmailer/phpmailer/class.smtp.php          |    4 +-
 vendor/phpspec/prophecy/.gitignore                 |    5 -
 vendor/phpspec/prophecy/.travis.yml                |   36 -
 vendor/phpspec/prophecy/CHANGES.md                 |   40 +
 vendor/phpspec/prophecy/CONTRIBUTING.md            |   22 -
 vendor/phpspec/prophecy/composer.json              |   10 +-
 vendor/phpspec/prophecy/fixtures/EmptyClass.php    |    7 -
 .../phpspec/prophecy/fixtures/EmptyInterface.php   |    7 -
 vendor/phpspec/prophecy/fixtures/FinalClass.php    |    7 -
 .../prophecy/fixtures/ModifierInterface.php        |   10 -
 vendor/phpspec/prophecy/fixtures/Named.php         |    8 -
 .../prophecy/fixtures/OptionalDepsClass.php        |   16 -
 .../phpspec/prophecy/fixtures/SpecialMethods.php   |   36 -
 vendor/phpspec/prophecy/fixtures/WithArguments.php |   14 -
 .../prophecy/fixtures/WithCallableArgument.php     |   10 -
 .../phpspec/prophecy/fixtures/WithFinalMethod.php  |   10 -
 .../fixtures/WithFinalVirtuallyPrivateMethod.php   |   15 -
 .../fixtures/WithProtectedAbstractMethod.php       |    8 -
 .../phpspec/prophecy/fixtures/WithReferences.php   |   10 -
 .../prophecy/fixtures/WithReturnTypehints.php      |   18 -
 .../phpspec/prophecy/fixtures/WithStaticMethod.php |   10 -
 .../fixtures/WithTypehintedVariadicArgument.php    |   10 -
 .../prophecy/fixtures/WithVariadicArgument.php     |   10 -
 .../fixtures/WithVirtuallyPrivateMethod.php        |   19 -
 vendor/phpspec/prophecy/phpunit.xml.dist           |   24 -
 .../Prophecy/Argument/ArgumentsWildcardSpec.php    |  128 -
 .../Prophecy/Argument/Token/AnyValueTokenSpec.php  |   28 -
 .../Prophecy/Argument/Token/AnyValuesTokenSpec.php |   28 -
 .../Argument/Token/ApproximateValueTokenSpec.php   |   55 -
 .../Argument/Token/ArrayCountTokenSpec.php         |   58 -
 .../Argument/Token/ArrayEntryTokenSpec.php         |  202 --
 .../Argument/Token/ArrayEveryEntryTokenSpec.php    |   96 -
 .../Prophecy/Argument/Token/CallbackTokenSpec.php  |   42 -
 .../Argument/Token/ExactValueTokenSpec.php         |  152 -
 .../Argument/Token/IdenticalValueTokenSpec.php     |  152 -
 .../Argument/Token/LogicalAndTokenSpec.php         |   69 -
 .../Argument/Token/LogicalNotTokenSpec.php         |   62 -
 .../Argument/Token/ObjectStateTokenSpec.php        |   89 -
 .../Argument/Token/StringContainsTokenSpec.php     |   49 -
 .../spec/Prophecy/Argument/Token/TypeTokenSpec.php |   57 -
 .../prophecy/spec/Prophecy/ArgumentSpec.php        |  107 -
 .../prophecy/spec/Prophecy/Call/CallCenterSpec.php |  173 --
 .../prophecy/spec/Prophecy/Call/CallSpec.php       |   51 -
 .../Prophecy/Comparator/ClosureComparatorSpec.php  |   39 -
 .../spec/Prophecy/Comparator/FactorySpec.php       |   20 -
 .../Prophecy/Comparator/ProphecyComparatorSpec.php |   39 -
 .../ClassPatch/DisableConstructorPatchSpec.php     |   54 -
 .../Doubler/ClassPatch/HhvmExceptionPatchSpec.php  |   34 -
 .../Doubler/ClassPatch/KeywordPatchSpec.php        |   43 -
 .../Doubler/ClassPatch/MagicCallPatchSpec.php      |  146 -
 .../ClassPatch/ProphecySubjectPatchSpec.php        |   75 -
 .../ReflectionClassNewInstancePatchSpec.php        |   43 -
 .../Doubler/ClassPatch/SplFileInfoPatchSpec.php    |   85 -
 .../Doubler/ClassPatch/TraversablePatchSpec.php    |   50 -
 .../prophecy/spec/Prophecy/Doubler/DoublerSpec.php |  115 -
 .../Doubler/Generator/ClassCodeGeneratorSpec.php   |  309 ---
 .../Doubler/Generator/ClassCreatorSpec.php         |   37 -
 .../Doubler/Generator/Node/ArgumentNodeSpec.php    |   92 -
 .../Doubler/Generator/Node/ClassNodeSpec.php       |  185 --
 .../Doubler/Generator/Node/MethodNodeSpec.php      |  134 -
 .../spec/Prophecy/Doubler/LazyDoubleSpec.php       |   79 -
 .../spec/Prophecy/Doubler/NameGeneratorSpec.php    |   60 -
 .../Exception/Call/UnexpectedCallExceptionSpec.php |   30 -
 .../Doubler/ClassCreatorExceptionSpec.php          |   26 -
 .../Exception/Doubler/ClassMirrorExceptionSpec.php |   24 -
 .../Doubler/ClassNotFoundExceptionSpec.php         |   25 -
 .../Exception/Doubler/DoubleExceptionSpec.php      |   14 -
 .../Doubler/InterfaceNotFoundExceptionSpec.php     |   24 -
 .../Doubler/MethodNotExtendableExceptionSpec.php   |   29 -
 .../Doubler/MethodNotFoundExceptionSpec.php        |   40 -
 .../Prediction/AggregateExceptionSpec.php          |   50 -
 .../Exception/Prediction/NoCallsExceptionSpec.php  |   27 -
 .../UnexpectedCallsCountExceptionSpec.php          |   27 -
 .../Prediction/UnexpectedCallsExceptionSpec.php    |   33 -
 .../Prophecy/MethodProphecyExceptionSpec.php       |   28 -
 .../Prophecy/ObjectProphecyExceptionSpec.php       |   24 -
 .../Prophecy/Prediction/CallPredictionSpec.php     |   42 -
 .../Prediction/CallTimesPredictionSpec.php         |   50 -
 .../Prophecy/Prediction/CallbackPredictionSpec.php |   34 -
 .../Prophecy/Prediction/NoCallsPredictionSpec.php  |   41 -
 .../spec/Prophecy/Promise/CallbackPromiseSpec.php  |   96 -
 .../Prophecy/Promise/ReturnArgumentPromiseSpec.php |   31 -
 .../spec/Prophecy/Promise/ReturnPromiseSpec.php    |   49 -
 .../spec/Prophecy/Promise/ThrowPromiseSpec.php     |   48 -
 .../spec/Prophecy/Prophecy/MethodProphecySpec.php  |  342 ---
 .../spec/Prophecy/Prophecy/ObjectProphecySpec.php  |  283 --
 .../spec/Prophecy/Prophecy/RevealerSpec.php        |   44 -
 .../phpspec/prophecy/spec/Prophecy/ProphetSpec.php |   81 -
 .../prophecy/spec/Prophecy/Util/StringUtilSpec.php |   91 -
 .../Argument/Token/StringContainsToken.php         |    2 +-
 vendor/phpspec/prophecy/src/Prophecy/Call/Call.php |   35 +
 .../prophecy/src/Prophecy/Call/CallCenter.php      |   82 +-
 .../Doubler/ClassPatch/DisableConstructorPatch.php |    4 +
 .../Prophecy/Doubler/ClassPatch/MagicCallPatch.php |   25 +-
 .../Doubler/ClassPatch/ProphecySubjectPatch.php    |    6 +-
 .../Doubler/ClassPatch/SplFileInfoPatch.php        |   19 +-
 .../Prophecy/Doubler/ClassPatch/ThrowablePatch.php |   95 +
 .../Doubler/Generator/ClassCodeGenerator.php       |   42 +-
 .../src/Prophecy/Doubler/Generator/ClassMirror.php |    2 +
 .../Prophecy/Doubler/Generator/Node/ClassNode.php  |    7 +-
 .../Prophecy/Doubler/Generator/Node/MethodNode.php |   55 +-
 .../Doubler/Generator/TypeHintReference.php        |   46 +
 .../Exception/Doubler/MethodNotFoundException.php  |    4 +-
 .../Exception/Prediction/AggregateException.php    |    3 +-
 .../src/Prophecy/Prophecy/MethodProphecy.php       |   26 +-
 vendor/phpspec/prophecy/src/Prophecy/Prophet.php   |    1 +
 .../prophecy/src/Prophecy/Util/StringUtil.php      |   12 +-
 .../tests/Doubler/Generator/ClassMirrorTest.php    |  469 ----
 vendor/phpunit/php-file-iterator/ChangeLog.md      |   33 +-
 vendor/phpunit/php-file-iterator/src/Factory.php   |    4 +-
 vendor/phpunit/php-file-iterator/src/Iterator.php  |    2 +-
 vendor/phpunit/php-token-stream/.gitignore         |    1 -
 vendor/phpunit/php-token-stream/.travis.yml        |   14 +-
 vendor/phpunit/php-token-stream/ChangeLog.md       |   19 +
 vendor/phpunit/php-token-stream/LICENSE            |    2 +-
 vendor/phpunit/php-token-stream/README.md          |    2 +-
 vendor/phpunit/php-token-stream/build.xml          |   46 +-
 vendor/phpunit/php-token-stream/build/phpunit.xml  |   17 -
 vendor/phpunit/php-token-stream/composer.json      |   10 +-
 vendor/phpunit/php-token-stream/phpunit.xml        |   17 +
 vendor/phpunit/php-token-stream/src/Token.php      | 1163 ++++++--
 .../phpunit/php-token-stream/src/Token/Stream.php  |  117 +-
 .../src/Token/Stream/CachingFactory.php            |   15 +-
 .../php-token-stream/tests/Token/ClassTest.php     |  100 +-
 .../php-token-stream/tests/Token/ClosureTest.php   |   47 +-
 .../php-token-stream/tests/Token/FunctionTest.php  |   35 +-
 .../php-token-stream/tests/Token/IncludeTest.php   |   44 +-
 .../php-token-stream/tests/Token/InterfaceTest.php |   90 +-
 .../php-token-stream/tests/Token/NamespaceTest.php |   35 +-
 .../phpunit/php-token-stream/tests/TokenTest.php   |   18 +-
 .../_fixture/class_with_method_named_empty.php     |    7 +
 ...th_multiple_anonymous_classes_and_functions.php |   26 +
 .../tests/_fixture/php-code-coverage-issue-424.php |   13 +
 .../phpunit/php-token-stream/tests/bootstrap.php   |    8 +
 vendor/phpunit/phpunit/.github/CONTRIBUTING.md     |    2 +-
 vendor/phpunit/phpunit/.github/ISSUE_TEMPLATE.md   |    3 +-
 vendor/phpunit/phpunit/.gitignore                  |    8 +-
 vendor/phpunit/phpunit/{.php_cs => .php_cs.dist}   |    0
 vendor/phpunit/phpunit/.travis.yml                 |   14 +-
 vendor/phpunit/phpunit/CODE_OF_CONDUCT.md          |   28 -
 vendor/phpunit/phpunit/CONTRIBUTING.md             |   64 -
 vendor/phpunit/phpunit/ChangeLog-4.0.md            |  176 --
 vendor/phpunit/phpunit/ChangeLog-4.1.md            |   73 -
 vendor/phpunit/phpunit/ChangeLog-4.2.md            |   56 -
 vendor/phpunit/phpunit/ChangeLog-4.3.md            |   54 -
 vendor/phpunit/phpunit/ChangeLog-4.4.md            |   57 -
 vendor/phpunit/phpunit/ChangeLog-4.5.md            |   28 -
 vendor/phpunit/phpunit/ChangeLog-4.6.md            |   95 -
 vendor/phpunit/phpunit/ChangeLog-4.7.md            |   71 -
 vendor/phpunit/phpunit/ChangeLog-4.8.md            |  293 --
 vendor/phpunit/phpunit/ChangeLog-5.0.md            |  128 -
 vendor/phpunit/phpunit/ChangeLog-5.1.md            |   68 -
 vendor/phpunit/phpunit/ChangeLog-5.2.md            |  117 -
 vendor/phpunit/phpunit/ChangeLog-5.3.md            |   55 -
 vendor/phpunit/phpunit/ChangeLog-5.4.md            |   84 -
 vendor/phpunit/phpunit/ChangeLog-5.5.md            |   74 -
 vendor/phpunit/phpunit/ChangeLog-5.6.md            |   79 -
 vendor/phpunit/phpunit/ChangeLog-5.7.md            |   39 +
 vendor/phpunit/phpunit/LICENSE                     |    2 +-
 vendor/phpunit/phpunit/composer.json               |    4 +-
 .../src/Framework/Constraint/ExceptionMessage.php  |   15 +
 vendor/phpunit/phpunit/src/Framework/TestCase.php  |   40 +-
 vendor/phpunit/phpunit/src/Framework/TestSuite.php |   21 +-
 vendor/phpunit/phpunit/src/Framework/Warning.php   |    2 +-
 vendor/phpunit/phpunit/src/Runner/Version.php      |    2 +-
 vendor/phpunit/phpunit/src/TextUI/TestRunner.php   |    2 +-
 .../phpunit/src/Util/ConfigurationGenerator.php    |    2 +-
 vendor/phpunit/phpunit/src/Util/Getopt.php         |   39 +-
 vendor/phpunit/phpunit/src/Util/Log/TeamCity.php   |    6 +-
 .../phpunit/tests/Framework/TestCaseTest.php       |    1 +
 .../phpunit/tests/Regression/GitHub/2811.phpt      |   20 +
 .../tests/Regression/GitHub/2811/Issue2811Test.php |   10 +
 .../phpunit/tests/Regression/GitHub/2972.phpt      |   18 +
 .../Regression/GitHub/2972/issue-2972-test.phpt    |   10 +
 .../2972/unconventiallyNamedIssue2972Test.php      |   13 +
 .../tests/TextUI/dataprovider-issue-2833.phpt      |   17 +
 .../tests/TextUI/dataprovider-issue-2859.phpt      |   17 +
 .../tests/TextUI/dataprovider-issue-2922.phpt      |   18 +
 .../tests/TextUI/teamcity-inner-exceptions.phpt    |   39 +
 .../_files/DataProviderIssue2833/FirstTest.php     |   23 +
 .../_files/DataProviderIssue2833/SecondTest.php    |   15 +
 .../tests/_files/DataProviderIssue2859/phpunit.xml |   10 +
 .../tests/another/TestWithDataProviderTest.php     |   21 +
 .../_files/DataProviderIssue2922/FirstTest.php     |   24 +
 .../_files/DataProviderIssue2922/SecondTest.php    |   14 +
 vendor/pimple/pimple/CHANGELOG                     |    4 +
 vendor/pimple/pimple/README.rst                    |    2 +-
 vendor/pimple/pimple/ext/pimple/php_pimple.h       |    2 +-
 vendor/pimple/pimple/src/Pimple/Container.php      |   18 +-
 .../Pimple/Exception/FrozenServiceException.php    |    2 +-
 .../InvalidServiceIdentifierException.php          |    2 +-
 .../Exception/UnknownIdentifierException.php       |    2 +-
 .../pimple/src/Pimple/Psr11/ServiceLocator.php     |    2 +-
 .../pimple/pimple/src/Pimple/ServiceIterator.php   |   10 +-
 .../psr/log/Psr/Log/Test/LoggerInterfaceTest.php   |    4 +
 vendor/psr/log/Psr/Log/Test/TestLogger.php         |  146 +
 vendor/psr/log/README.md                           |    7 +
 vendor/ralouphie/getallheaders/.gitignore          |    5 +
 vendor/ralouphie/getallheaders/.travis.yml         |   18 +
 vendor/ralouphie/getallheaders/LICENSE             |   21 +
 vendor/ralouphie/getallheaders/README.md           |   19 +
 vendor/ralouphie/getallheaders/composer.json       |   21 +
 vendor/ralouphie/getallheaders/phpunit.xml         |   22 +
 .../ralouphie/getallheaders/src/getallheaders.php  |   46 +
 .../getallheaders/tests/GetAllHeadersTest.php      |  121 +
 .../{chrisboulton => resque}/php-resque/.gitignore |    1 +
 .../php-resque/.travis.yml                         |    0
 .../php-resque/CHANGELOG.md                        |    0
 .../php-resque/HOWITWORKS.md                       |    0
 vendor/{chrisboulton => resque}/php-resque/LICENSE |    0
 .../{chrisboulton => resque}/php-resque/README.md  |    0
 .../{chrisboulton => resque}/php-resque/bin/resque |  108 +-
 .../{chrisboulton => resque}/php-resque/build.xml  |    0
 .../php-resque/composer.json                       |    2 +-
 .../php-resque/demo/bad_job.php                    |    0
 .../php-resque/demo/check_status.php               |    0
 .../php-resque/demo/init.php                       |    0
 .../php-resque/demo/job.php                        |    0
 .../php-resque/demo/long_job.php                   |    0
 .../php-resque/demo/php_error_job.php              |    0
 .../php-resque/demo/queue.php                      |    0
 .../php-resque/demo/resque.php                     |    0
 .../php-resque/extras/resque.logrotate             |    0
 .../php-resque/extras/resque.monit                 |    0
 .../php-resque/extras/sample-plugin.php            |    0
 .../php-resque/lib/Resque.php                      |    0
 .../php-resque/lib/Resque/Event.php                |    0
 .../php-resque/lib/Resque/Exception.php            |    0
 .../php-resque/lib/Resque/Failure.php              |    0
 .../php-resque/lib/Resque/Failure/Interface.php    |    0
 .../php-resque/lib/Resque/Failure/Redis.php        |    0
 .../php-resque/lib/Resque/Job.php                  |    0
 .../lib/Resque/Job/DirtyExitException.php          |    0
 .../php-resque/lib/Resque/Job/DontCreate.php       |    0
 .../php-resque/lib/Resque/Job/DontPerform.php      |    0
 .../php-resque/lib/Resque/Job/Factory.php          |    0
 .../php-resque/lib/Resque/Job/FactoryInterface.php |    0
 .../php-resque/lib/Resque/Job/Status.php           |    0
 .../php-resque/lib/Resque/JobInterface.php         |    0
 .../php-resque/lib/Resque/Log.php                  |    0
 .../php-resque/lib/Resque/Redis.php                |    0
 .../php-resque/lib/Resque/RedisException.php       |    0
 .../php-resque/lib/Resque/Stat.php                 |    0
 .../php-resque/lib/Resque/Worker.php               |   25 +-
 .../php-resque/phpunit.xml.dist                    |    0
 .../php-resque/test/Resque/Tests/EventTest.php     |    0
 .../php-resque/test/Resque/Tests/JobStatusTest.php |    0
 .../php-resque/test/Resque/Tests/JobTest.php       |    0
 .../php-resque/test/Resque/Tests/LogTest.php       |    0
 .../php-resque/test/Resque/Tests/RedisTest.php     |    0
 .../php-resque/test/Resque/Tests/StatTest.php      |    0
 .../php-resque/test/Resque/Tests/TestCase.php      |    0
 .../php-resque/test/Resque/Tests/WorkerTest.php    |   11 +
 .../php-resque/test/bootstrap.php                  |    8 +
 .../php-resque/test/misc/redis.conf                |    0
 vendor/slim/slim/CODE_OF_CONDUCT.md                |    8 +
 vendor/slim/slim/LICENSE.md                        |    2 +-
 vendor/slim/slim/MAINTAINERS.md                    |   17 +
 vendor/slim/slim/Slim/App.php                      |   97 +-
 vendor/slim/slim/Slim/CallableResolver.php         |    2 +-
 vendor/slim/slim/Slim/Container.php                |   26 +-
 vendor/slim/slim/Slim/DefaultServicesProvider.php  |    9 +-
 .../slim/Slim/Exception/ContainerException.php     |    2 +-
 .../Exception/ContainerValueNotFoundException.php  |    2 +-
 .../slim/Slim/Exception/InvalidMethodException.php |    8 +-
 .../Slim/Exception/MethodNotAllowedException.php   |    2 +-
 .../slim/slim/Slim/Exception/NotFoundException.php |    2 +-
 vendor/slim/slim/Slim/Handlers/AbstractError.php   |    2 +-
 vendor/slim/slim/Slim/Handlers/NotAllowed.php      |    6 +-
 vendor/slim/slim/Slim/Handlers/NotFound.php        |   49 +-
 vendor/slim/slim/Slim/Http/Cookies.php             |    8 +-
 vendor/slim/slim/Slim/Http/Environment.php         |   13 +-
 vendor/slim/slim/Slim/Http/Headers.php             |    2 +-
 vendor/slim/slim/Slim/Http/Message.php             |    1 +
 vendor/slim/slim/Slim/Http/Request.php             |   42 +-
 vendor/slim/slim/Slim/Http/Response.php            |  213 +-
 vendor/slim/slim/Slim/Http/StatusCode.php          |   81 +
 vendor/slim/slim/Slim/Http/UploadedFile.php        |   14 +-
 vendor/slim/slim/Slim/Http/Uri.php                 |   51 +-
 .../slim/slim/Slim/Interfaces/RouteInterface.php   |   11 +
 .../slim/slim/Slim/Interfaces/RouterInterface.php  |    2 +-
 vendor/slim/slim/Slim/MiddlewareAwareTrait.php     |   25 +-
 vendor/slim/slim/Slim/Route.php                    |   63 +-
 vendor/slim/slim/Slim/RouteGroup.php               |    4 +-
 vendor/slim/slim/Slim/Router.php                   |   33 +-
 vendor/slim/slim/composer.json                     |   13 +-
 vendor/slim/slim/phpstan.neon.dist                 |    2 +
 vendor/slim/twig-view/README.md                    |   18 +-
 vendor/slim/twig-view/composer.json                |    5 +-
 vendor/slim/twig-view/src/Twig.php                 |   22 +-
 vendor/slim/twig-view/src/TwigExtension.php        |   64 +-
 vendor/slim/twig-view/tests/TwigExtensionTest.php  |   91 +
 vendor/symfony/http-foundation/AcceptHeader.php    |    8 +-
 .../symfony/http-foundation/AcceptHeaderItem.php   |   33 +-
 vendor/symfony/http-foundation/ApacheRequest.php   |    2 +-
 .../symfony/http-foundation/BinaryFileResponse.php |   36 +-
 vendor/symfony/http-foundation/CHANGELOG.md        |   20 +-
 vendor/symfony/http-foundation/Cookie.php          |   19 +-
 .../http-foundation/ExpressionRequestMatcher.php   |    4 +-
 .../File/Exception/AccessDeniedException.php       |    2 -
 .../File/Exception/FileNotFoundException.php       |    2 -
 .../File/Exception/UnexpectedTypeException.php     |    2 +-
 vendor/symfony/http-foundation/File/File.php       |   12 +-
 .../File/MimeType/ExtensionGuesser.php             |    4 +-
 .../File/MimeType/FileBinaryMimeTypeGuesser.php    |   20 +-
 .../File/MimeType/FileinfoMimeTypeGuesser.php      |    6 +-
 .../File/MimeType/MimeTypeExtensionGuesser.php     |   34 +-
 .../File/MimeType/MimeTypeGuesser.php              |   27 +-
 .../File/MimeType/MimeTypeGuesserInterface.php     |    2 +-
 .../symfony/http-foundation/File/UploadedFile.php  |   59 +-
 vendor/symfony/http-foundation/FileBag.php         |   33 +-
 vendor/symfony/http-foundation/HeaderBag.php       |   70 +-
 vendor/symfony/http-foundation/IpUtils.php         |   18 +-
 vendor/symfony/http-foundation/JsonResponse.php    |   20 +-
 vendor/symfony/http-foundation/LICENSE             |    2 +-
 vendor/symfony/http-foundation/ParameterBag.php    |   28 +-
 .../symfony/http-foundation/RedirectResponse.php   |   14 +-
 vendor/symfony/http-foundation/Request.php         |  419 +--
 vendor/symfony/http-foundation/RequestMatcher.php  |   22 +-
 .../http-foundation/RequestMatcherInterface.php    |    2 -
 vendor/symfony/http-foundation/RequestStack.php    |    4 +-
 vendor/symfony/http-foundation/Response.php        |  154 +-
 .../symfony/http-foundation/ResponseHeaderBag.php  |   79 +-
 vendor/symfony/http-foundation/ServerBag.php       |    6 +-
 .../Session/Attribute/AttributeBag.php             |   23 +-
 .../Session/Attribute/NamespacedAttributeBag.php   |   31 +-
 .../Session/Flash/AutoExpireFlashBag.php           |   32 +-
 .../http-foundation/Session/Flash/FlashBag.php     |   26 +-
 .../Session/Flash/FlashBagInterface.php            |   16 +-
 vendor/symfony/http-foundation/Session/Session.php |   65 +-
 .../Session/SessionBagInterface.php                |    2 -
 .../http-foundation/Session/SessionBagProxy.php    |   89 +
 .../http-foundation/Session/SessionInterface.php   |    4 +-
 .../Storage/Handler/AbstractSessionHandler.php     |  168 ++
 .../Storage/Handler/MemcacheSessionHandler.php     |   17 +-
 .../Storage/Handler/MemcachedSessionHandler.php    |   37 +-
 .../Storage/Handler/MongoDbSessionHandler.php      |   93 +-
 .../Storage/Handler/NativeFileSessionHandler.php   |    5 +-
 .../Storage/Handler/NativeSessionHandler.php       |    7 +-
 .../Session/Storage/Handler/NullSessionHandler.php |   22 +-
 .../Session/Storage/Handler/PdoSessionHandler.php  |  347 ++-
 .../Storage/Handler/StrictSessionHandler.php       |  103 +
 .../Storage/Handler/WriteCheckSessionHandler.php   |    7 +-
 .../Session/Storage/MetadataBag.php                |    4 +-
 .../Session/Storage/MockArraySessionStorage.php    |   22 +-
 .../Session/Storage/MockFileSessionStorage.php     |   28 +-
 .../Session/Storage/NativeSessionStorage.php       |  121 +-
 .../Session/Storage/PhpBridgeSessionStorage.php    |    9 +-
 .../Session/Storage/Proxy/AbstractProxy.php        |    2 -
 .../Session/Storage/Proxy/NativeProxy.php          |    9 +-
 .../Session/Storage/Proxy/SessionHandlerProxy.php  |   28 +-
 .../Session/Storage/SessionStorageInterface.php    |    8 +-
 .../symfony/http-foundation/StreamedResponse.php   |   32 +-
 .../http-foundation/Tests/AcceptHeaderItemTest.php |   54 +-
 .../http-foundation/Tests/AcceptHeaderTest.php     |   42 +-
 .../http-foundation/Tests/ApacheRequestTest.php    |   52 +-
 .../Tests/BinaryFileResponseTest.php               |   95 +-
 .../symfony/http-foundation/Tests/CookieTest.php   |   42 +-
 .../Tests/ExpressionRequestMatcherTest.php         |   20 +-
 .../http-foundation/Tests/File/FileTest.php        |   16 +-
 .../File/Fixtures/case-sensitive-mime-type.xlsm    |  Bin 0 -> 4791 bytes
 .../Tests/File/MimeType/MimeTypeTest.php           |    6 +-
 .../Tests/File/UploadedFileTest.php                |   29 +-
 .../symfony/http-foundation/Tests/FileBagTest.php  |  104 +-
 .../Tests/Fixtures/response-functional/common.inc  |   43 +
 .../response-functional/cookie_max_age.expected    |   11 +
 .../response-functional/cookie_max_age.php         |   10 +
 .../cookie_raw_urlencode.expected                  |   10 +
 .../response-functional/cookie_raw_urlencode.php   |   12 +
 .../cookie_samesite_lax.expected                   |    9 +
 .../response-functional/cookie_samesite_lax.php    |    8 +
 .../cookie_samesite_strict.expected                |    9 +
 .../response-functional/cookie_samesite_strict.php |    8 +
 .../response-functional/cookie_urlencode.expected  |   10 +
 .../response-functional/cookie_urlencode.php       |   12 +
 .../invalid_cookie_name.expected                   |    6 +
 .../response-functional/invalid_cookie_name.php    |   11 +
 .../http-foundation/Tests/HeaderBagTest.php        |   58 +-
 .../symfony/http-foundation/Tests/IpUtilsTest.php  |   75 +-
 .../http-foundation/Tests/JsonResponseTest.php     |   47 +-
 .../http-foundation/Tests/ParameterBagTest.php     |   76 +-
 .../http-foundation/Tests/RedirectResponseTest.php |    4 +-
 .../http-foundation/Tests/RequestMatcherTest.php   |   42 +-
 .../symfony/http-foundation/Tests/RequestTest.php  | 1101 +++++---
 .../Tests/ResponseFunctionalTest.php               |   58 +
 .../Tests/ResponseHeaderBagTest.php                |  212 +-
 .../symfony/http-foundation/Tests/ResponseTest.php |  153 +-
 .../http-foundation/Tests/ServerBagTest.php        |   74 +-
 .../Tests/Session/Attribute/AttributeBagTest.php   |   55 +-
 .../Attribute/NamespacedAttributeBagTest.php       |   87 +-
 .../Tests/Session/Flash/AutoExpireFlashBagTest.php |   81 +-
 .../Tests/Session/Flash/FlashBagTest.php           |   80 +-
 .../http-foundation/Tests/Session/SessionTest.php  |   71 +-
 .../Storage/Handler/AbstractSessionHandlerTest.php |   61 +
 .../Session/Storage/Handler/Fixtures/common.inc    |  151 +
 .../Handler/Fixtures/empty_destroys.expected       |   17 +
 .../Storage/Handler/Fixtures/empty_destroys.php    |    8 +
 .../Storage/Handler/Fixtures/read_only.expected    |   14 +
 .../Session/Storage/Handler/Fixtures/read_only.php |    8 +
 .../Storage/Handler/Fixtures/regenerate.expected   |   24 +
 .../Storage/Handler/Fixtures/regenerate.php        |   10 +
 .../Storage/Handler/Fixtures/storage.expected      |   20 +
 .../Session/Storage/Handler/Fixtures/storage.php   |   24 +
 .../Storage/Handler/Fixtures/with_cookie.expected  |   15 +
 .../Storage/Handler/Fixtures/with_cookie.php       |    8 +
 .../Fixtures/with_cookie_and_session.expected      |   24 +
 .../Handler/Fixtures/with_cookie_and_session.php   |   13 +
 .../Storage/Handler/MemcacheSessionHandlerTest.php |   18 +-
 .../Handler/MemcachedSessionHandlerTest.php        |   22 +-
 .../Storage/Handler/MongoDbSessionHandlerTest.php  |   41 +-
 .../Handler/NativeFileSessionHandlerTest.php       |   14 +-
 .../Storage/Handler/NativeSessionHandlerTest.php   |    6 +-
 .../Storage/Handler/NullSessionHandlerTest.php     |    4 +-
 .../Storage/Handler/PdoSessionHandlerTest.php      |   57 +-
 .../Storage/Handler/StrictSessionHandlerTest.php   |  189 ++
 .../Handler/WriteCheckSessionHandlerTest.php       |    2 +
 .../Tests/Session/Storage/MetadataBagTest.php      |   21 +-
 .../Storage/MockArraySessionStorageTest.php        |   22 +-
 .../Session/Storage/MockFileSessionStorageTest.php |    6 +-
 .../Session/Storage/NativeSessionStorageTest.php   |   71 +-
 .../Storage/PhpBridgeSessionStorageTest.php        |   10 +-
 .../Session/Storage/Proxy/AbstractProxyTest.php    |   38 +-
 .../Session/Storage/Proxy/NativeProxyTest.php      |    2 +
 .../Storage/Proxy/SessionHandlerProxyTest.php      |   33 +
 .../http-foundation/Tests/StreamedResponseTest.php |   35 +-
 vendor/symfony/http-foundation/composer.json       |    7 +-
 vendor/symfony/http-foundation/phpunit.xml.dist    |    2 +-
 vendor/symfony/polyfill-ctype/Ctype.php            |  227 ++
 vendor/symfony/polyfill-ctype/LICENSE              |   19 +
 vendor/symfony/polyfill-ctype/README.md            |   12 +
 vendor/symfony/polyfill-ctype/bootstrap.php        |   26 +
 vendor/symfony/polyfill-ctype/composer.json        |   34 +
 vendor/symfony/polyfill-mbstring/LICENSE           |    2 +-
 vendor/symfony/polyfill-mbstring/Mbstring.php      |  196 +-
 .../Resources/unidata/lowerCase.php                |    7 +-
 .../Resources/unidata/titleCaseRegexp.php          |    5 +
 .../Resources/unidata/upperCase.php                |    7 +-
 vendor/symfony/polyfill-mbstring/bootstrap.php     |    2 +
 vendor/symfony/polyfill-mbstring/composer.json     |    2 +-
 vendor/symfony/polyfill-php70/LICENSE              |    2 +-
 vendor/symfony/polyfill-php70/Php70.php            |   12 +-
 vendor/symfony/polyfill-php70/README.md            |    6 +-
 .../SessionUpdateTimestampHandlerInterface.php     |   23 +
 vendor/symfony/polyfill-php70/composer.json        |    4 +-
 vendor/symfony/yaml/CHANGELOG.md                   |   60 +-
 vendor/symfony/yaml/Command/LintCommand.php        |   56 +-
 vendor/symfony/yaml/Dumper.php                     |   52 +-
 vendor/symfony/yaml/Escaper.php                    |   18 +-
 .../symfony/yaml/Exception/ExceptionInterface.php  |    2 +-
 vendor/symfony/yaml/Exception/ParseException.php   |    4 +-
 vendor/symfony/yaml/Inline.php                     |  451 ++-
 vendor/symfony/yaml/LICENSE                        |    2 +-
 vendor/symfony/yaml/Parser.php                     |  542 ++--
 vendor/symfony/yaml/Tag/TaggedValue.php            |   14 +-
 .../symfony/yaml/Tests/Command/LintCommandTest.php |   44 +-
 vendor/symfony/yaml/Tests/DumperTest.php           |  201 +-
 .../symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml |    4 +-
 .../symfony/yaml/Tests/Fixtures/YtsBasicTests.yml  |   52 +-
 .../yaml/Tests/Fixtures/YtsBlockMapping.yml        |   14 +-
 .../yaml/Tests/Fixtures/YtsDocumentSeparator.yml   |    8 +-
 .../symfony/yaml/Tests/Fixtures/YtsErrorTests.yml  |    2 +-
 .../yaml/Tests/Fixtures/YtsFlowCollections.yml     |   16 +-
 .../yaml/Tests/Fixtures/YtsFoldedScalars.yml       |   26 +-
 .../yaml/Tests/Fixtures/YtsNullsAndEmpties.yml     |    8 +-
 .../Tests/Fixtures/YtsSpecificationExamples.yml    |  238 +-
 .../yaml/Tests/Fixtures/YtsTypeTransfers.yml       |   98 +-
 .../yaml/Tests/Fixtures/booleanMappingKeys.yml     |    4 +-
 .../yaml/Tests/Fixtures/escapedCharacters.yml      |   10 +-
 .../Tests/Fixtures/legacyBooleanMappingKeys.yml    |   23 -
 .../yaml/Tests/Fixtures/legacyNonStringKeys.yml    |    2 -
 .../yaml/Tests/Fixtures/legacyNullMappingKey.yml   |    9 -
 .../Fixtures/multiple_lines_as_literal_block.yml   |    1 +
 ...s_literal_block_leading_space_in_first_line.yml |    4 +
 .../symfony/yaml/Tests/Fixtures/not_readable.yml   |   18 +
 .../symfony/yaml/Tests/Fixtures/nullMappingKey.yml |    4 +-
 .../yaml/Tests/Fixtures/numericMappingKeys.yml     |    6 +-
 vendor/symfony/yaml/Tests/Fixtures/sfComments.yml  |   14 +-
 vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml   |  108 +-
 vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml  |   26 +-
 vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml   |    2 +-
 vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml    |   10 +-
 vendor/symfony/yaml/Tests/Fixtures/sfTests.yml     |   32 +-
 .../yaml/Tests/Fixtures/unindentedCollections.yml  |   14 +-
 vendor/symfony/yaml/Tests/InlineTest.php           |  634 ++---
 vendor/symfony/yaml/Tests/ParserTest.php           | 1175 +++++---
 vendor/symfony/yaml/Tests/YamlTest.php             |    6 +-
 vendor/symfony/yaml/Unescaper.php                  |   20 +-
 vendor/symfony/yaml/Yaml.php                       |   73 +-
 vendor/symfony/yaml/composer.json                  |   10 +-
 vendor/symfony/yaml/phpunit.xml.dist               |    2 +-
 vendor/twig/extensions/.travis.yml                 |   15 +-
 vendor/twig/extensions/composer.json               |    7 +-
 vendor/twig/extensions/doc/i18n.rst                |   19 +-
 vendor/twig/extensions/doc/intl.rst                |    5 +-
 .../lib/Twig/Extensions/Extension/Date.php         |    6 +
 .../lib/Twig/Extensions/Extension/Intl.php         |   19 +-
 .../test/Twig/Tests/Extension/ArrayTest.php        |    2 +-
 .../test/Twig/Tests/Extension/DateTest.php         |    2 +-
 .../test/Twig/Tests/Extension/IntlTest.php         |   14 +-
 .../test/Twig/Tests/Extension/TextTest.php         |    2 +-
 .../test/Twig/Tests/Grammar/ArgumentsTest.php      |    2 +-
 .../test/Twig/Tests/Grammar/ArrayTest.php          |    2 +-
 .../test/Twig/Tests/Grammar/BodyTest.php           |    2 +-
 .../test/Twig/Tests/Grammar/BooleanTest.php        |    2 +-
 .../test/Twig/Tests/Grammar/ConstantTest.php       |    2 +-
 .../test/Twig/Tests/Grammar/ExpressionTest.php     |    2 +-
 .../test/Twig/Tests/Grammar/NumberTest.php         |    2 +-
 .../test/Twig/Tests/Grammar/OptionalTest.php       |    2 +-
 .../extensions/test/Twig/Tests/Grammar/TagTest.php |    2 +-
 .../test/Twig/Tests/SimpleTokenParserTest.php      |    2 +-
 .../extensions/test/Twig/Tests/grammarTest.php     |    2 +-
 vendor/twig/twig/.gitignore                        |    2 -
 vendor/twig/twig/.php_cs.dist                      |   14 +-
 vendor/twig/twig/.travis.yml                       |   39 +-
 vendor/twig/twig/CHANGELOG                         |  393 +++
 vendor/twig/twig/LICENSE                           |    2 +-
 vendor/twig/twig/README.rst                        |    2 +-
 vendor/twig/twig/composer.json                     |   22 +-
 vendor/twig/twig/doc/advanced.rst                  |  497 ++--
 vendor/twig/twig/doc/advanced_legacy.rst           |  885 ------
 vendor/twig/twig/doc/api.rst                       |  347 +--
 vendor/twig/twig/doc/coding_standards.rst          |   22 +-
 vendor/twig/twig/doc/deprecated.rst                |  261 +-
 vendor/twig/twig/doc/filters/abs.rst               |    4 +-
 vendor/twig/twig/doc/filters/batch.rst             |    7 +-
 vendor/twig/twig/doc/filters/capitalize.rst        |    2 +-
 vendor/twig/twig/doc/filters/column.rst            |   27 +
 vendor/twig/twig/doc/filters/convert_encoding.rst  |   12 +-
 vendor/twig/twig/doc/filters/date.rst              |   48 +-
 vendor/twig/twig/doc/filters/date_modify.rst       |    9 +-
 vendor/twig/twig/doc/filters/default.rst           |    4 +-
 vendor/twig/twig/doc/filters/escape.rst            |   58 +-
 vendor/twig/twig/doc/filters/filter.rst            |   58 +
 vendor/twig/twig/doc/filters/first.rst             |    7 +-
 vendor/twig/twig/doc/filters/format.rst            |    4 +-
 vendor/twig/twig/doc/filters/index.rst             |    5 +
 vendor/twig/twig/doc/filters/join.rst              |   16 +-
 vendor/twig/twig/doc/filters/json_encode.rst       |   12 +-
 vendor/twig/twig/doc/filters/keys.rst              |    2 +-
 vendor/twig/twig/doc/filters/last.rst              |    7 +-
 vendor/twig/twig/doc/filters/length.rst            |    8 +-
 vendor/twig/twig/doc/filters/lower.rst             |    2 +-
 vendor/twig/twig/doc/filters/map.rst               |   38 +
 vendor/twig/twig/doc/filters/merge.rst             |    8 +-
 vendor/twig/twig/doc/filters/nl2br.rst             |    5 +-
 vendor/twig/twig/doc/filters/number_format.rst     |   18 +-
 vendor/twig/twig/doc/filters/raw.rst               |    6 +-
 vendor/twig/twig/doc/filters/reduce.rst            |   33 +
 vendor/twig/twig/doc/filters/replace.rst           |    8 +-
 vendor/twig/twig/doc/filters/reverse.rst           |    9 +-
 vendor/twig/twig/doc/filters/round.rst             |    5 +-
 vendor/twig/twig/doc/filters/slice.rst             |   17 +-
 vendor/twig/twig/doc/filters/sort.rst              |    4 +-
 vendor/twig/twig/doc/filters/spaceless.rst         |   65 +
 vendor/twig/twig/doc/filters/split.rst             |   23 +-
 vendor/twig/twig/doc/filters/striptags.rst         |    6 +-
 vendor/twig/twig/doc/filters/title.rst             |    2 +-
 vendor/twig/twig/doc/filters/trim.rst              |   14 +-
 vendor/twig/twig/doc/filters/upper.rst             |    2 +-
 vendor/twig/twig/doc/filters/url_encode.rst        |   18 +-
 vendor/twig/twig/doc/functions/attribute.rst       |    7 +-
 vendor/twig/twig/doc/functions/block.rst           |   14 +-
 vendor/twig/twig/doc/functions/constant.rst        |   14 +-
 vendor/twig/twig/doc/functions/cycle.rst           |    4 +-
 vendor/twig/twig/doc/functions/date.rst            |   21 +-
 vendor/twig/twig/doc/functions/dump.rst            |   23 +-
 vendor/twig/twig/doc/functions/include.rst         |   27 +-
 vendor/twig/twig/doc/functions/max.rst             |    7 +-
 vendor/twig/twig/doc/functions/min.rst             |    7 +-
 vendor/twig/twig/doc/functions/parent.rst          |    2 +-
 vendor/twig/twig/doc/functions/random.rst          |   15 +-
 vendor/twig/twig/doc/functions/range.rst           |   10 +-
 vendor/twig/twig/doc/functions/source.rst          |   10 +-
 .../twig/doc/functions/template_from_string.rst    |   20 +-
 vendor/twig/twig/doc/installation.rst              |  110 +-
 vendor/twig/twig/doc/internals.rst                 |   58 +-
 vendor/twig/twig/doc/intro.rst                     |   50 +-
 vendor/twig/twig/doc/recipes.rst                   |  203 +-
 vendor/twig/twig/doc/tags/apply.rst                |   23 +
 vendor/twig/twig/doc/tags/autoescape.rst           |   26 +-
 vendor/twig/twig/doc/tags/deprecated.rst           |   30 +
 vendor/twig/twig/doc/tags/do.rst                   |    5 +-
 vendor/twig/twig/doc/tags/embed.rst                |   41 +-
 vendor/twig/twig/doc/tags/extends.rst              |   43 +-
 vendor/twig/twig/doc/tags/filter.rst               |   13 +-
 vendor/twig/twig/doc/tags/flush.rst                |    7 +-
 vendor/twig/twig/doc/tags/for.rst                  |   30 +-
 vendor/twig/twig/doc/tags/from.rst                 |    4 +-
 vendor/twig/twig/doc/tags/if.rst                   |   23 +-
 vendor/twig/twig/doc/tags/import.rst               |   57 +-
 vendor/twig/twig/doc/tags/include.rst              |   63 +-
 vendor/twig/twig/doc/tags/index.rst                |    2 +
 vendor/twig/twig/doc/tags/macro.rst                |  167 +-
 vendor/twig/twig/doc/tags/sandbox.rst              |    4 +-
 vendor/twig/twig/doc/tags/set.rst                  |   16 +-
 vendor/twig/twig/doc/tags/spaceless.rst            |    6 +-
 vendor/twig/twig/doc/tags/use.rst                  |   23 +-
 vendor/twig/twig/doc/tags/verbatim.rst             |   10 +-
 vendor/twig/twig/doc/tags/with.rst                 |   13 +-
 vendor/twig/twig/doc/templates.rst                 |  366 ++-
 vendor/twig/twig/doc/tests/constant.rst            |    7 +-
 vendor/twig/twig/doc/tests/defined.rst             |    4 +-
 vendor/twig/twig/doc/tests/divisibleby.rst         |    6 +-
 vendor/twig/twig/doc/tests/empty.rst               |    6 +-
 vendor/twig/twig/doc/tests/even.rst                |    2 +-
 vendor/twig/twig/doc/tests/iterable.rst            |    5 +-
 vendor/twig/twig/doc/tests/null.rst                |    2 +-
 vendor/twig/twig/doc/tests/odd.rst                 |    2 +-
 vendor/twig/twig/doc/tests/sameas.rst              |    5 +-
 vendor/twig/twig/drupal_test.sh                    |   52 +
 vendor/twig/twig/ext/twig/.gitignore               |   30 -
 vendor/twig/twig/ext/twig/config.m4                |    8 -
 vendor/twig/twig/ext/twig/config.w32               |    8 -
 vendor/twig/twig/ext/twig/php_twig.h               |   35 -
 vendor/twig/twig/ext/twig/twig.c                   | 1215 --------
 vendor/twig/twig/lib/Twig/Autoloader.php           |   54 -
 vendor/twig/twig/lib/Twig/BaseNodeVisitor.php      |   52 +-
 vendor/twig/twig/lib/Twig/Cache/Filesystem.php     |   91 +-
 vendor/twig/twig/lib/Twig/Cache/Null.php           |   38 +-
 vendor/twig/twig/lib/Twig/CacheInterface.php       |   60 +-
 vendor/twig/twig/lib/Twig/Compiler.php             |  282 +-
 vendor/twig/twig/lib/Twig/CompilerInterface.php    |   34 -
 .../twig/twig/lib/Twig/ContainerRuntimeLoader.php  |   37 +-
 vendor/twig/twig/lib/Twig/Environment.php          | 1598 +----------
 vendor/twig/twig/lib/Twig/Error.php                |  361 +--
 vendor/twig/twig/lib/Twig/Error/Loader.php         |   42 +-
 vendor/twig/twig/lib/Twig/Error/Runtime.php        |   28 +-
 vendor/twig/twig/lib/Twig/Error/Syntax.php         |   53 +-
 .../twig/twig/lib/Twig/ExistsLoaderInterface.php   |   37 +-
 vendor/twig/twig/lib/Twig/ExpressionParser.php     |  739 +----
 vendor/twig/twig/lib/Twig/Extension.php            |   67 +-
 vendor/twig/twig/lib/Twig/Extension/Core.php       | 1610 +----------
 vendor/twig/twig/lib/Twig/Extension/Debug.php      |   65 +-
 vendor/twig/twig/lib/Twig/Extension/Escaper.php    |  110 +-
 .../twig/lib/Twig/Extension/GlobalsInterface.php   |   30 +-
 .../lib/Twig/Extension/InitRuntimeInterface.php    |   30 +-
 vendor/twig/twig/lib/Twig/Extension/Optimizer.php  |   33 +-
 vendor/twig/twig/lib/Twig/Extension/Profiler.php   |   47 +-
 vendor/twig/twig/lib/Twig/Extension/Sandbox.php    |  101 +-
 vendor/twig/twig/lib/Twig/Extension/Staging.php    |  110 +-
 .../twig/twig/lib/Twig/Extension/StringLoader.php  |   47 +-
 vendor/twig/twig/lib/Twig/ExtensionInterface.php   |   92 +-
 vendor/twig/twig/lib/Twig/ExtensionSet.php         |   14 +
 vendor/twig/twig/lib/Twig/FactoryRuntimeLoader.php |   37 +-
 .../lib/Twig/FileExtensionEscapingStrategy.php     |   60 +-
 vendor/twig/twig/lib/Twig/Filter.php               |   82 +-
 vendor/twig/twig/lib/Twig/Filter/Function.php      |   40 -
 vendor/twig/twig/lib/Twig/Filter/Method.php        |   42 -
 vendor/twig/twig/lib/Twig/Filter/Node.php          |   42 -
 .../twig/twig/lib/Twig/FilterCallableInterface.php |   24 -
 vendor/twig/twig/lib/Twig/FilterInterface.php      |   43 -
 vendor/twig/twig/lib/Twig/Function.php             |   72 +-
 vendor/twig/twig/lib/Twig/Function/Function.php    |   41 -
 vendor/twig/twig/lib/Twig/Function/Method.php      |   43 -
 vendor/twig/twig/lib/Twig/Function/Node.php        |   42 -
 .../twig/lib/Twig/FunctionCallableInterface.php    |   24 -
 vendor/twig/twig/lib/Twig/FunctionInterface.php    |   40 -
 vendor/twig/twig/lib/Twig/Lexer.php                |  422 +--
 vendor/twig/twig/lib/Twig/LexerInterface.php       |   32 -
 vendor/twig/twig/lib/Twig/Loader/Array.php         |   95 +-
 vendor/twig/twig/lib/Twig/Loader/Chain.php         |  149 +-
 vendor/twig/twig/lib/Twig/Loader/Filesystem.php    |  288 +-
 vendor/twig/twig/lib/Twig/Loader/String.php        |   58 -
 vendor/twig/twig/lib/Twig/LoaderInterface.php      |   59 +-
 vendor/twig/twig/lib/Twig/Markup.php               |   37 +-
 vendor/twig/twig/lib/Twig/Node.php                 |  254 +-
 vendor/twig/twig/lib/Twig/Node/AutoEscape.php      |   36 +-
 vendor/twig/twig/lib/Twig/Node/Block.php           |   41 +-
 vendor/twig/twig/lib/Twig/Node/BlockReference.php  |   34 +-
 vendor/twig/twig/lib/Twig/Node/Body.php            |   27 +-
 vendor/twig/twig/lib/Twig/Node/CheckSecurity.php   |   78 +-
 vendor/twig/twig/lib/Twig/Node/Deprecated.php      |   14 +
 vendor/twig/twig/lib/Twig/Node/Do.php              |   35 +-
 vendor/twig/twig/lib/Twig/Node/Embed.php           |   44 +-
 vendor/twig/twig/lib/Twig/Node/Expression.php      |   28 +-
 .../twig/twig/lib/Twig/Node/Expression/Array.php   |   81 +-
 .../twig/lib/Twig/Node/Expression/AssignName.php   |   27 +-
 .../twig/twig/lib/Twig/Node/Expression/Binary.php  |   39 +-
 .../twig/lib/Twig/Node/Expression/Binary/Add.php   |   24 +-
 .../twig/lib/Twig/Node/Expression/Binary/And.php   |   24 +-
 .../lib/Twig/Node/Expression/Binary/BitwiseAnd.php |   24 +-
 .../lib/Twig/Node/Expression/Binary/BitwiseOr.php  |   24 +-
 .../lib/Twig/Node/Expression/Binary/BitwiseXor.php |   24 +-
 .../lib/Twig/Node/Expression/Binary/Concat.php     |   24 +-
 .../twig/lib/Twig/Node/Expression/Binary/Div.php   |   24 +-
 .../lib/Twig/Node/Expression/Binary/EndsWith.php   |   34 +-
 .../twig/lib/Twig/Node/Expression/Binary/Equal.php |   23 +-
 .../lib/Twig/Node/Expression/Binary/FloorDiv.php   |   28 +-
 .../lib/Twig/Node/Expression/Binary/Greater.php    |   23 +-
 .../Twig/Node/Expression/Binary/GreaterEqual.php   |   23 +-
 .../twig/lib/Twig/Node/Expression/Binary/In.php    |   32 +-
 .../twig/lib/Twig/Node/Expression/Binary/Less.php  |   23 +-
 .../lib/Twig/Node/Expression/Binary/LessEqual.php  |   23 +-
 .../lib/Twig/Node/Expression/Binary/Matches.php    |   32 +-
 .../twig/lib/Twig/Node/Expression/Binary/Mod.php   |   24 +-
 .../twig/lib/Twig/Node/Expression/Binary/Mul.php   |   24 +-
 .../lib/Twig/Node/Expression/Binary/NotEqual.php   |   23 +-
 .../twig/lib/Twig/Node/Expression/Binary/NotIn.php |   32 +-
 .../twig/lib/Twig/Node/Expression/Binary/Or.php    |   24 +-
 .../twig/lib/Twig/Node/Expression/Binary/Power.php |   34 +-
 .../twig/lib/Twig/Node/Expression/Binary/Range.php |   32 +-
 .../lib/Twig/Node/Expression/Binary/StartsWith.php |   34 +-
 .../twig/lib/Twig/Node/Expression/Binary/Sub.php   |   24 +-
 .../lib/Twig/Node/Expression/BlockReference.php    |   91 +-
 vendor/twig/twig/lib/Twig/Node/Expression/Call.php |  289 +-
 .../twig/lib/Twig/Node/Expression/Conditional.php  |   35 +-
 .../twig/lib/Twig/Node/Expression/Constant.php     |   27 +-
 .../Twig/Node/Expression/ExtensionReference.php    |   32 -
 .../twig/twig/lib/Twig/Node/Expression/Filter.php  |   41 +-
 .../lib/Twig/Node/Expression/Filter/Default.php    |   43 +-
 .../twig/lib/Twig/Node/Expression/Function.php     |   45 +-
 .../twig/twig/lib/Twig/Node/Expression/GetAttr.php |   74 +-
 .../twig/lib/Twig/Node/Expression/MethodCall.php   |   43 +-
 vendor/twig/twig/lib/Twig/Node/Expression/Name.php |  100 +-
 .../twig/lib/Twig/Node/Expression/NullCoalesce.php |   48 +-
 .../twig/twig/lib/Twig/Node/Expression/Parent.php  |   44 +-
 .../twig/lib/Twig/Node/Expression/TempName.php     |   30 +-
 vendor/twig/twig/lib/Twig/Node/Expression/Test.php |   42 +-
 .../lib/Twig/Node/Expression/Test/Constant.php     |   48 +-
 .../twig/lib/Twig/Node/Expression/Test/Defined.php |   59 +-
 .../lib/Twig/Node/Expression/Test/Divisibleby.php  |   37 +-
 .../twig/lib/Twig/Node/Expression/Test/Even.php    |   36 +-
 .../twig/lib/Twig/Node/Expression/Test/Null.php    |   35 +-
 .../twig/lib/Twig/Node/Expression/Test/Odd.php     |   36 +-
 .../twig/lib/Twig/Node/Expression/Test/Sameas.php  |   33 +-
 .../twig/twig/lib/Twig/Node/Expression/Unary.php   |   31 +-
 .../twig/lib/Twig/Node/Expression/Unary/Neg.php    |   24 +-
 .../twig/lib/Twig/Node/Expression/Unary/Not.php    |   24 +-
 .../twig/lib/Twig/Node/Expression/Unary/Pos.php    |   24 +-
 vendor/twig/twig/lib/Twig/Node/Flush.php           |   33 +-
 vendor/twig/twig/lib/Twig/Node/For.php             |  111 +-
 vendor/twig/twig/lib/Twig/Node/ForLoop.php         |   52 +-
 vendor/twig/twig/lib/Twig/Node/If.php              |   66 +-
 vendor/twig/twig/lib/Twig/Node/Import.php          |   51 +-
 vendor/twig/twig/lib/Twig/Node/Include.php         |   88 +-
 vendor/twig/twig/lib/Twig/Node/Macro.php           |  123 +-
 vendor/twig/twig/lib/Twig/Node/Module.php          |  459 +--
 vendor/twig/twig/lib/Twig/Node/Print.php           |   36 +-
 vendor/twig/twig/lib/Twig/Node/Sandbox.php         |   44 +-
 vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php  |   51 +-
 vendor/twig/twig/lib/Twig/Node/Set.php             |   96 +-
 vendor/twig/twig/lib/Twig/Node/SetTemp.php         |   40 -
 vendor/twig/twig/lib/Twig/Node/Spaceless.php       |   37 +-
 vendor/twig/twig/lib/Twig/Node/Text.php            |   36 +-
 vendor/twig/twig/lib/Twig/Node/With.php            |   62 +-
 vendor/twig/twig/lib/Twig/NodeCaptureInterface.php |   27 +-
 vendor/twig/twig/lib/Twig/NodeInterface.php        |   32 -
 vendor/twig/twig/lib/Twig/NodeOutputInterface.php  |   27 +-
 vendor/twig/twig/lib/Twig/NodeTraverser.php        |   82 +-
 vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php  |  152 +-
 .../twig/twig/lib/Twig/NodeVisitor/Optimizer.php   |  251 +-
 .../twig/lib/Twig/NodeVisitor/SafeAnalysis.php     |  148 +-
 vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php  |   75 +-
 vendor/twig/twig/lib/Twig/NodeVisitorInterface.php |   47 +-
 vendor/twig/twig/lib/Twig/Parser.php               |  408 +--
 vendor/twig/twig/lib/Twig/ParserInterface.php      |   29 -
 vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php |   60 +-
 .../twig/lib/Twig/Profiler/Dumper/Blackfire.php    |   70 +-
 vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php |   45 +-
 vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php |   33 +-
 .../twig/lib/Twig/Profiler/Node/EnterProfile.php   |   39 +-
 .../twig/lib/Twig/Profiler/Node/LeaveProfile.php   |   33 +-
 .../lib/Twig/Profiler/NodeVisitor/Profiler.php     |   65 +-
 vendor/twig/twig/lib/Twig/Profiler/Profile.php     |  168 +-
 .../twig/twig/lib/Twig/RuntimeLoaderInterface.php  |   35 +-
 .../twig/twig/lib/Twig/Sandbox/SecurityError.php   |   27 +-
 .../Twig/Sandbox/SecurityNotAllowedFilterError.php |   31 +-
 .../Sandbox/SecurityNotAllowedFunctionError.php    |   31 +-
 .../Twig/Sandbox/SecurityNotAllowedMethodError.php |   38 +-
 .../Sandbox/SecurityNotAllowedPropertyError.php    |   38 +-
 .../Twig/Sandbox/SecurityNotAllowedTagError.php    |   31 +-
 .../twig/twig/lib/Twig/Sandbox/SecurityPolicy.php  |  123 +-
 .../lib/Twig/Sandbox/SecurityPolicyInterface.php   |   28 +-
 vendor/twig/twig/lib/Twig/SimpleFilter.php         |  113 +-
 vendor/twig/twig/lib/Twig/SimpleFunction.php       |  103 +-
 vendor/twig/twig/lib/Twig/SimpleTest.php           |   65 +-
 vendor/twig/twig/lib/Twig/Source.php               |   51 +-
 .../twig/lib/Twig/SourceContextLoaderInterface.php |   39 +-
 vendor/twig/twig/lib/Twig/Template.php             |  704 +----
 vendor/twig/twig/lib/Twig/TemplateInterface.php    |   48 -
 vendor/twig/twig/lib/Twig/TemplateWrapper.php      |  131 +-
 vendor/twig/twig/lib/Twig/Test.php                 |   35 +-
 vendor/twig/twig/lib/Twig/Test/Function.php        |   38 -
 .../twig/lib/Twig/Test/IntegrationTestCase.php     |  247 +-
 vendor/twig/twig/lib/Twig/Test/Method.php          |   40 -
 vendor/twig/twig/lib/Twig/Test/Node.php            |   40 -
 vendor/twig/twig/lib/Twig/Test/NodeTestCase.php    |   73 +-
 .../twig/twig/lib/Twig/TestCallableInterface.php   |   22 -
 vendor/twig/twig/lib/Twig/TestInterface.php        |   27 -
 vendor/twig/twig/lib/Twig/Token.php                |  205 +-
 vendor/twig/twig/lib/Twig/TokenParser.php          |   33 +-
 .../twig/twig/lib/Twig/TokenParser/AutoEscape.php  |   81 +-
 vendor/twig/twig/lib/Twig/TokenParser/Block.php    |   71 +-
 .../twig/twig/lib/Twig/TokenParser/Deprecated.php  |   14 +
 vendor/twig/twig/lib/Twig/TokenParser/Do.php       |   32 +-
 vendor/twig/twig/lib/Twig/TokenParser/Embed.php    |   65 +-
 vendor/twig/twig/lib/Twig/TokenParser/Extends.php  |   44 +-
 vendor/twig/twig/lib/Twig/TokenParser/Filter.php   |   51 +-
 vendor/twig/twig/lib/Twig/TokenParser/Flush.php    |   32 +-
 vendor/twig/twig/lib/Twig/TokenParser/For.php      |  125 +-
 vendor/twig/twig/lib/Twig/TokenParser/From.php     |   64 +-
 vendor/twig/twig/lib/Twig/TokenParser/If.php       |   84 +-
 vendor/twig/twig/lib/Twig/TokenParser/Import.php   |   39 +-
 vendor/twig/twig/lib/Twig/TokenParser/Include.php  |   63 +-
 vendor/twig/twig/lib/Twig/TokenParser/Macro.php    |   58 +-
 vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php  |   59 +-
 vendor/twig/twig/lib/Twig/TokenParser/Set.php      |   73 +-
 .../twig/twig/lib/Twig/TokenParser/Spaceless.php   |   49 +-
 vendor/twig/twig/lib/Twig/TokenParser/Use.php      |   68 +-
 vendor/twig/twig/lib/Twig/TokenParser/With.php     |   50 +-
 vendor/twig/twig/lib/Twig/TokenParserBroker.php    |  120 -
 .../twig/lib/Twig/TokenParserBrokerInterface.php   |   44 -
 vendor/twig/twig/lib/Twig/TokenParserInterface.php |   45 +-
 vendor/twig/twig/lib/Twig/TokenStream.php          |  194 +-
 .../twig/lib/Twig/Util/DeprecationCollector.php    |   84 +-
 .../twig/lib/Twig/Util/TemplateDirIterator.php     |   28 +-
 vendor/twig/twig/phpunit.xml.dist                  |    4 +-
 vendor/twig/twig/src/Cache/CacheInterface.php      |   59 +-
 vendor/twig/twig/src/Cache/FilesystemCache.php     |   88 +-
 vendor/twig/twig/src/Cache/NullCache.php           |   35 +-
 vendor/twig/twig/src/Compiler.php                  |  240 +-
 vendor/twig/twig/src/Environment.php               |  990 ++++++-
 vendor/twig/twig/src/Error/Error.php               |  252 +-
 vendor/twig/twig/src/Error/LoaderError.php         |   24 +-
 vendor/twig/twig/src/Error/RuntimeError.php        |   25 +-
 vendor/twig/twig/src/Error/SyntaxError.php         |   45 +-
 vendor/twig/twig/src/ExpressionParser.php          |  809 +++++-
 .../twig/twig/src/Extension/AbstractExtension.php  |   42 +-
 vendor/twig/twig/src/Extension/CoreExtension.php   | 1548 ++++++++++-
 vendor/twig/twig/src/Extension/DebugExtension.php  |   63 +-
 .../twig/twig/src/Extension/EscaperExtension.php   |  424 ++-
 .../twig/twig/src/Extension/ExtensionInterface.php |   72 +-
 .../twig/twig/src/Extension/GlobalsInterface.php   |   33 +-
 .../twig/src/Extension/InitRuntimeInterface.php    |   35 +-
 .../twig/twig/src/Extension/OptimizerExtension.php |   26 +-
 .../twig/twig/src/Extension/ProfilerExtension.php  |   43 +-
 .../twig/twig/src/Extension/SandboxExtension.php   |  120 +-
 .../twig/twig/src/Extension/StagingExtension.php   |   97 +-
 .../twig/src/Extension/StringLoaderExtension.php   |   43 +-
 vendor/twig/twig/src/ExtensionSet.php              |  477 ++++
 .../twig/src/FileExtensionEscapingStrategy.php     |   59 +-
 vendor/twig/twig/src/Lexer.php                     |  496 +++-
 vendor/twig/twig/src/Loader/ArrayLoader.php        |   81 +-
 vendor/twig/twig/src/Loader/ChainLoader.php        |  115 +-
 .../twig/twig/src/Loader/ExistsLoaderInterface.php |   24 +-
 vendor/twig/twig/src/Loader/FilesystemLoader.php   |  303 +-
 vendor/twig/twig/src/Loader/LoaderInterface.php    |   68 +-
 .../src/Loader/SourceContextLoaderInterface.php    |   22 +-
 vendor/twig/twig/src/Markup.php                    |   41 +-
 vendor/twig/twig/src/Node/AutoEscapeNode.php       |   35 +-
 vendor/twig/twig/src/Node/BlockNode.php            |   41 +-
 vendor/twig/twig/src/Node/BlockReferenceNode.php   |   33 +-
 vendor/twig/twig/src/Node/BodyNode.php             |   24 +-
 vendor/twig/twig/src/Node/CheckSecurityNode.php    |   80 +-
 vendor/twig/twig/src/Node/CheckToStringNode.php    |   45 +
 vendor/twig/twig/src/Node/DeprecatedNode.php       |   55 +
 vendor/twig/twig/src/Node/DoNode.php               |   35 +-
 vendor/twig/twig/src/Node/EmbedNode.php            |   45 +-
 .../src/Node/Expression/AbstractExpression.php     |   25 +-
 .../twig/src/Node/Expression/ArrayExpression.php   |   83 +-
 .../Node/Expression/ArrowFunctionExpression.php    |   64 +
 .../src/Node/Expression/AssignNameExpression.php   |   24 +-
 .../src/Node/Expression/Binary/AbstractBinary.php  |   39 +-
 .../twig/src/Node/Expression/Binary/AddBinary.php  |   20 +-
 .../twig/src/Node/Expression/Binary/AndBinary.php  |   20 +-
 .../Node/Expression/Binary/BitwiseAndBinary.php    |   20 +-
 .../src/Node/Expression/Binary/BitwiseOrBinary.php |   20 +-
 .../Node/Expression/Binary/BitwiseXorBinary.php    |   20 +-
 .../src/Node/Expression/Binary/ConcatBinary.php    |   20 +-
 .../twig/src/Node/Expression/Binary/DivBinary.php  |   20 +-
 .../src/Node/Expression/Binary/EndsWithBinary.php  |   32 +-
 .../src/Node/Expression/Binary/EqualBinary.php     |   19 +-
 .../src/Node/Expression/Binary/FloorDivBinary.php  |   26 +-
 .../src/Node/Expression/Binary/GreaterBinary.php   |   19 +-
 .../Node/Expression/Binary/GreaterEqualBinary.php  |   19 +-
 .../twig/src/Node/Expression/Binary/InBinary.php   |   30 +-
 .../twig/src/Node/Expression/Binary/LessBinary.php |   19 +-
 .../src/Node/Expression/Binary/LessEqualBinary.php |   19 +-
 .../src/Node/Expression/Binary/MatchesBinary.php   |   30 +-
 .../twig/src/Node/Expression/Binary/ModBinary.php  |   20 +-
 .../twig/src/Node/Expression/Binary/MulBinary.php  |   20 +-
 .../src/Node/Expression/Binary/NotEqualBinary.php  |   19 +-
 .../src/Node/Expression/Binary/NotInBinary.php     |   30 +-
 .../twig/src/Node/Expression/Binary/OrBinary.php   |   20 +-
 .../src/Node/Expression/Binary/PowerBinary.php     |   19 +-
 .../src/Node/Expression/Binary/RangeBinary.php     |   30 +-
 .../Node/Expression/Binary/StartsWithBinary.php    |   32 +-
 .../twig/src/Node/Expression/Binary/SubBinary.php  |   20 +-
 .../Node/Expression/BlockReferenceExpression.php   |   83 +-
 .../twig/src/Node/Expression/CallExpression.php    |  308 +-
 .../src/Node/Expression/ConditionalExpression.php  |   33 +-
 .../src/Node/Expression/ConstantExpression.php     |   25 +-
 .../src/Node/Expression/Filter/DefaultFilter.php   |   49 +-
 .../twig/src/Node/Expression/FilterExpression.php  |   37 +-
 .../src/Node/Expression/FunctionExpression.php     |   40 +-
 .../twig/src/Node/Expression/GetAttrExpression.php |   84 +-
 .../twig/twig/src/Node/Expression/InlinePrint.php  |   35 +
 .../src/Node/Expression/MethodCallExpression.php   |   59 +-
 .../twig/src/Node/Expression/NameExpression.php    |   94 +-
 .../src/Node/Expression/NullCoalesceExpression.php |   53 +-
 .../twig/src/Node/Expression/ParentExpression.php  |   43 +-
 .../src/Node/Expression/TempNameExpression.php     |   28 +-
 .../twig/src/Node/Expression/Test/ConstantTest.php |   46 +-
 .../twig/src/Node/Expression/Test/DefinedTest.php  |   71 +-
 .../src/Node/Expression/Test/DivisiblebyTest.php   |   33 +-
 .../twig/src/Node/Expression/Test/EvenTest.php     |   32 +-
 .../twig/src/Node/Expression/Test/NullTest.php     |   31 +-
 .../twig/twig/src/Node/Expression/Test/OddTest.php |   32 +-
 .../twig/src/Node/Expression/Test/SameasTest.php   |   31 +-
 .../twig/src/Node/Expression/TestExpression.php    |   39 +-
 .../src/Node/Expression/Unary/AbstractUnary.php    |   31 +-
 .../twig/src/Node/Expression/Unary/NegUnary.php    |   20 +-
 .../twig/src/Node/Expression/Unary/NotUnary.php    |   20 +-
 .../twig/src/Node/Expression/Unary/PosUnary.php    |   20 +-
 .../src/Node/Expression/VariadicExpression.php     |   24 +
 vendor/twig/twig/src/Node/FlushNode.php            |   32 +-
 vendor/twig/twig/src/Node/ForLoopNode.php          |   51 +-
 vendor/twig/twig/src/Node/ForNode.php              |  114 +-
 vendor/twig/twig/src/Node/IfNode.php               |   67 +-
 vendor/twig/twig/src/Node/ImportNode.php           |   60 +-
 vendor/twig/twig/src/Node/IncludeNode.php          |  103 +-
 vendor/twig/twig/src/Node/MacroNode.php            |  110 +-
 vendor/twig/twig/src/Node/ModuleNode.php           |  467 +++-
 vendor/twig/twig/src/Node/Node.php                 |  206 +-
 vendor/twig/twig/src/Node/NodeCaptureInterface.php |   24 +-
 vendor/twig/twig/src/Node/NodeOutputInterface.php  |   24 +-
 vendor/twig/twig/src/Node/PrintNode.php            |   36 +-
 vendor/twig/twig/src/Node/SandboxNode.php          |   42 +-
 vendor/twig/twig/src/Node/SandboxedPrintNode.php   |   49 +-
 vendor/twig/twig/src/Node/SetNode.php              |  102 +-
 vendor/twig/twig/src/Node/SetTempNode.php          |   11 -
 vendor/twig/twig/src/Node/SpacelessNode.php        |   44 +-
 vendor/twig/twig/src/Node/TextNode.php             |   35 +-
 vendor/twig/twig/src/Node/WithNode.php             |   67 +-
 vendor/twig/twig/src/NodeTraverser.php             |   80 +-
 .../twig/src/NodeVisitor/AbstractNodeVisitor.php   |   46 +-
 .../twig/src/NodeVisitor/EscaperNodeVisitor.php    |  203 +-
 .../src/NodeVisitor/MacroAutoImportNodeVisitor.php |   72 +
 .../twig/src/NodeVisitor/NodeVisitorInterface.php  |   50 +-
 .../twig/src/NodeVisitor/OptimizerNodeVisitor.php  |  214 +-
 .../src/NodeVisitor/SafeAnalysisNodeVisitor.php    |  155 +-
 .../twig/src/NodeVisitor/SandboxNodeVisitor.php    |  130 +-
 vendor/twig/twig/src/Parser.php                    |  389 ++-
 .../twig/twig/src/Profiler/Dumper/BaseDumper.php   |   60 +-
 .../twig/src/Profiler/Dumper/BlackfireDumper.php   |   69 +-
 .../twig/twig/src/Profiler/Dumper/HtmlDumper.php   |   44 +-
 .../twig/twig/src/Profiler/Dumper/TextDumper.php   |   32 +-
 .../twig/src/Profiler/Node/EnterProfileNode.php    |   39 +-
 .../twig/src/Profiler/Node/LeaveProfileNode.php    |   33 +-
 .../Profiler/NodeVisitor/ProfilerNodeVisitor.php   |   73 +-
 vendor/twig/twig/src/Profiler/Profile.php          |  187 +-
 .../src/RuntimeLoader/ContainerRuntimeLoader.php   |   36 +-
 .../src/RuntimeLoader/FactoryRuntimeLoader.php     |   36 +-
 .../src/RuntimeLoader/RuntimeLoaderInterface.php   |   32 +-
 vendor/twig/twig/src/Sandbox/SecurityError.php     |   24 +-
 .../src/Sandbox/SecurityNotAllowedFilterError.php  |   41 +-
 .../Sandbox/SecurityNotAllowedFunctionError.php    |   41 +-
 .../src/Sandbox/SecurityNotAllowedMethodError.php  |   48 +-
 .../Sandbox/SecurityNotAllowedPropertyError.php    |   48 +-
 .../src/Sandbox/SecurityNotAllowedTagError.php     |   41 +-
 vendor/twig/twig/src/Sandbox/SecurityPolicy.php    |  123 +-
 .../twig/src/Sandbox/SecurityPolicyInterface.php   |   36 +-
 vendor/twig/twig/src/Source.php                    |   48 +-
 vendor/twig/twig/src/Template.php                  |  432 ++-
 vendor/twig/twig/src/TemplateWrapper.php           |  140 +-
 vendor/twig/twig/src/Test/IntegrationTestCase.php  |  262 +-
 vendor/twig/twig/src/Test/NodeTestCase.php         |   62 +-
 vendor/twig/twig/src/Token.php                     |  208 +-
 .../twig/src/TokenParser/AbstractTokenParser.php   |   29 +-
 .../twig/twig/src/TokenParser/ApplyTokenParser.php |   58 +
 .../twig/src/TokenParser/AutoEscapeTokenParser.php |   52 +-
 .../twig/twig/src/TokenParser/BlockTokenParser.php |   73 +-
 .../twig/src/TokenParser/DeprecatedTokenParser.php |   44 +
 vendor/twig/twig/src/TokenParser/DoTokenParser.php |   32 +-
 .../twig/twig/src/TokenParser/EmbedTokenParser.php |   67 +-
 .../twig/src/TokenParser/ExtendsTokenParser.php    |   47 +-
 .../twig/src/TokenParser/FilterTokenParser.php     |   59 +-
 .../twig/twig/src/TokenParser/FlushTokenParser.php |   32 +-
 .../twig/twig/src/TokenParser/ForTokenParser.php   |  132 +-
 .../twig/twig/src/TokenParser/FromTokenParser.php  |   60 +-
 vendor/twig/twig/src/TokenParser/IfTokenParser.php |   84 +-
 .../twig/src/TokenParser/ImportTokenParser.php     |   38 +-
 .../twig/src/TokenParser/IncludeTokenParser.php    |   63 +-
 .../twig/twig/src/TokenParser/MacroTokenParser.php |   61 +-
 .../twig/src/TokenParser/SandboxTokenParser.php    |   60 +-
 .../twig/twig/src/TokenParser/SetTokenParser.php   |   67 +-
 .../twig/src/TokenParser/SpacelessTokenParser.php  |   51 +-
 .../twig/src/TokenParser/TokenParserInterface.php  |   51 +-
 .../twig/twig/src/TokenParser/UseTokenParser.php   |   68 +-
 .../twig/twig/src/TokenParser/WithTokenParser.php  |   50 +-
 vendor/twig/twig/src/TokenStream.php               |  129 +-
 vendor/twig/twig/src/TwigFilter.php                |  145 +-
 vendor/twig/twig/src/TwigFunction.php              |  135 +-
 vendor/twig/twig/src/TwigTest.php                  |  104 +-
 vendor/twig/twig/src/Util/DeprecationCollector.php |   74 +-
 vendor/twig/twig/src/Util/TemplateDirIterator.php  |   25 +-
 .../twig/twig/test/Twig/Tests/AutoloaderTest.php   |   24 -
 .../twig/test/Twig/Tests/Cache/FilesystemTest.php  |   44 +-
 vendor/twig/twig/test/Twig/Tests/CompilerTest.php  |    8 +-
 .../test/Twig/Tests/ContainerRuntimeLoaderTest.php |   20 +-
 .../twig/test/Twig/Tests/CustomExtensionTest.php   |   43 +-
 .../twig/twig/test/Twig/Tests/EnvironmentTest.php  |  461 +--
 vendor/twig/twig/test/Twig/Tests/ErrorTest.php     |  134 +-
 .../twig/test/Twig/Tests/ExpressionParserTest.php  |  363 +--
 .../twig/test/Twig/Tests/Extension/CoreTest.php    |  271 +-
 .../EscaperTest.php}                               |  213 +-
 .../twig/test/Twig/Tests/Extension/SandboxTest.php |  260 +-
 .../test/Twig/Tests/FactoryRuntimeLoaderTest.php   |    8 +-
 .../twig/twig/test/Twig/Tests/FileCachingTest.php  |   63 -
 .../Tests/FileExtensionEscapingStrategyTest.php    |   42 +-
 .../twig/twig/test/Twig/Tests/FilesystemHelper.php |    6 +-
 .../test/Twig/Tests/Fixtures/autoescape/block.test |    4 +-
 .../test/Twig/Tests/Fixtures/autoescape/name.test  |    6 +-
 .../Twig/Tests/Fixtures/errors/leak-output.php     |   31 +
 .../exceptions/child_contents_outside_blocks.test  |    4 +-
 .../exceptions/exception_in_extension_extends.test |   12 +
 .../exceptions/exception_in_extension_include.test |   12 +
 .../multiline_array_with_undefined_variable.test   |    4 +-
 ...tiline_array_with_undefined_variable_again.test |    4 +-
 ...multiline_function_with_undefined_variable.test |    4 +-
 .../multiline_function_with_unknown_argument.test  |    2 +-
 .../multiline_tag_with_undefined_variable.test     |    4 +-
 .../exceptions/strict_comparison_operator.test     |    6 +
 .../syntax_error_in_reused_template.test           |    2 +-
 .../Tests/Fixtures/exceptions/unclosed_tag.test    |    2 +-
 .../Fixtures/exceptions/undefined_parent.test      |    4 +-
 .../undefined_template_in_child_template.test      |    4 +-
 .../Tests/Fixtures/exceptions/undefined_trait.test |    2 +-
 .../Twig/Tests/Fixtures/expressions/_self.test     |    2 +-
 .../Twig/Tests/Fixtures/expressions/array.test     |   46 +-
 .../Tests/Fixtures/expressions/array_call.test     |    2 +-
 .../Twig/Tests/Fixtures/expressions/binary.test    |    2 +-
 .../Twig/Tests/Fixtures/expressions/bitwise.test   |    2 +-
 .../expressions/call_argument_defined_twice.test   |    8 +
 .../call_positional_arg_after_named_arg.test       |    8 +
 .../Tests/Fixtures/expressions/comparison.test     |    2 +-
 .../Tests/Fixtures/expressions/divisibleby.test    |    2 +-
 .../Twig/Tests/Fixtures/expressions/dotdot.test    |    2 +-
 .../Twig/Tests/Fixtures/expressions/ends_with.test |    2 +-
 .../Twig/Tests/Fixtures/expressions/floats.test    |   14 +
 .../Twig/Tests/Fixtures/expressions/grouping.test  |    2 +-
 .../Twig/Tests/Fixtures/expressions/literals.test  |    2 +-
 .../Tests/Fixtures/expressions/magic_call.test     |    2 +-
 .../Twig/Tests/Fixtures/expressions/matches.test   |    2 +-
 .../Tests/Fixtures/expressions/method_call.test    |    4 +-
 .../Fixtures/expressions/negative_numbers.test     |    2 +-
 .../Tests/Fixtures/expressions/not_arrow_fn.test   |    8 +
 .../expressions/operators_as_variables.test        |    2 +-
 .../Twig/Tests/Fixtures/expressions/postfix.test   |    2 +-
 .../Twig/Tests/Fixtures/expressions/power.test     |    2 +-
 .../Twig/Tests/Fixtures/expressions/sameas.test    |    2 +-
 .../Tests/Fixtures/expressions/starts_with.test    |    2 +-
 .../string_operator_as_var_assignment.test         |   18 +
 .../Twig/Tests/Fixtures/expressions/strings.test   |    2 +-
 .../Fixtures/expressions/ternary_operator.test     |    2 +-
 .../expressions/ternary_operator_noelse.test       |    2 +-
 .../expressions/ternary_operator_nothen.test       |    2 +-
 .../two_word_operators_as_variables.test           |    4 +-
 .../Twig/Tests/Fixtures/expressions/unary.test     |    2 +-
 .../expressions/unary_macro_arguments.test         |    2 +-
 .../Fixtures/expressions/unary_precedence.test     |    2 +-
 .../Fixtures/extensions/anonymous_functions.test   |   10 +
 .../twig/test/Twig/Tests/Fixtures/filters/abs.test |    2 +-
 .../test/Twig/Tests/Fixtures/filters/batch.test    |    2 +-
 .../Twig/Tests/Fixtures/filters/batch_float.test   |    2 +-
 .../Fixtures/filters/batch_with_empty_fill.test    |    2 +-
 .../filters/batch_with_exact_elements.test         |    2 +-
 .../Tests/Fixtures/filters/batch_with_fill.test    |    2 +-
 .../Tests/Fixtures/filters/batch_with_keys.test    |    6 +-
 .../Fixtures/filters/batch_with_more_elements.test |   23 +
 .../Fixtures/filters/batch_with_zero_elements.test |    2 +-
 .../test/Twig/Tests/Fixtures/filters/column.test   |   11 +
 .../Tests/Fixtures/filters/convert_encoding.test   |    4 +-
 .../test/Twig/Tests/Fixtures/filters/date.test     |   14 +-
 .../Fixtures/filters/date_default_format.test      |    6 +-
 .../filters/date_default_format_interval.test      |   12 +-
 .../Tests/Fixtures/filters/date_immutable.test     |   12 +-
 .../Twig/Tests/Fixtures/filters/date_interval.test |   14 +-
 .../Twig/Tests/Fixtures/filters/date_modify.test   |    6 +-
 .../Tests/Fixtures/filters/date_namedargs.test     |    2 +-
 .../test/Twig/Tests/Fixtures/filters/default.test  |   33 +-
 .../Tests/Fixtures/filters/dynamic_filter.test     |    2 +-
 .../test/Twig/Tests/Fixtures/filters/escape.test   |    2 +-
 .../Tests/Fixtures/filters/escape_html_attr.test   |    2 +-
 .../Tests/Fixtures/filters/escape_javascript.test  |    4 +-
 .../filters/escape_non_supported_charset.test      |    2 +-
 .../test/Twig/Tests/Fixtures/filters/filter.test   |   77 +
 .../test/Twig/Tests/Fixtures/filters/first.test    |    2 +-
 .../Twig/Tests/Fixtures/filters/force_escape.test  |    4 +-
 .../test/Twig/Tests/Fixtures/filters/format.test   |    2 +-
 .../test/Twig/Tests/Fixtures/filters/join.test     |   28 +-
 .../Twig/Tests/Fixtures/filters/json_encode.test   |    2 +-
 .../test/Twig/Tests/Fixtures/filters/last.test     |    2 +-
 .../test/Twig/Tests/Fixtures/filters/length.test   |   15 +-
 .../Twig/Tests/Fixtures/filters/length_utf8.test   |    4 +-
 .../twig/test/Twig/Tests/Fixtures/filters/map.test |   41 +
 .../test/Twig/Tests/Fixtures/filters/merge.test    |    9 +-
 .../test/Twig/Tests/Fixtures/filters/nl2br.test    |    2 +-
 .../Twig/Tests/Fixtures/filters/number_format.test |    2 +-
 .../Fixtures/filters/number_format_default.test    |    4 +-
 .../test/Twig/Tests/Fixtures/filters/reduce.test   |   14 +
 .../test/Twig/Tests/Fixtures/filters/replace.test  |    2 +-
 .../Fixtures/filters/replace_invalid_arg.test      |    4 +-
 .../test/Twig/Tests/Fixtures/filters/reverse.test  |    2 +-
 .../test/Twig/Tests/Fixtures/filters/round.test    |    2 +-
 .../test/Twig/Tests/Fixtures/filters/slice.test    |    2 +-
 .../test/Twig/Tests/Fixtures/filters/sort.test     |    2 +-
 .../Twig/Tests/Fixtures/filters/spaceless.test     |    8 +
 .../Twig/Tests/Fixtures/filters/special_chars.test |    2 +-
 .../test/Twig/Tests/Fixtures/filters/split.test    |    2 +-
 .../Twig/Tests/Fixtures/filters/split_utf8.test    |    4 +-
 .../Twig/Tests/Fixtures/filters/static_calls.test  |    2 +-
 .../test/Twig/Tests/Fixtures/filters/trim.test     |    2 +-
 .../Twig/Tests/Fixtures/filters/urlencode.test     |    4 +-
 .../Fixtures/filters/urlencode_deprecated.test     |   16 -
 .../Twig/Tests/Fixtures/functions/attribute.test   |    2 +-
 .../test/Twig/Tests/Fixtures/functions/block.test  |    2 +-
 .../Fixtures/functions/block_with_template.test    |    6 +-
 .../Fixtures/functions/block_without_name.test     |    4 +-
 .../Fixtures/functions/block_without_parent.test   |   11 +
 .../Twig/Tests/Fixtures/functions/constant.test    |    2 +-
 .../test/Twig/Tests/Fixtures/functions/cycle.test  |    2 +-
 .../test/Twig/Tests/Fixtures/functions/date.test   |   10 +-
 .../Tests/Fixtures/functions/date_namedargs.test   |    2 +-
 .../test/Twig/Tests/Fixtures/functions/dump.test   |    4 +-
 .../Twig/Tests/Fixtures/functions/dump_array.test  |    6 +-
 .../Tests/Fixtures/functions/dynamic_function.test |    2 +-
 .../Fixtures/functions/include/assignment.test     |    2 +-
 .../Fixtures/functions/include/autoescaping.test   |    2 +-
 .../Tests/Fixtures/functions/include/basic.test    |    2 +-
 .../Fixtures/functions/include/expression.test     |    2 +-
 .../Fixtures/functions/include/ignore_missing.test |    2 +-
 .../functions/include/ignore_missing_exists.test   |   11 +
 .../functions/include/include_missing_extends.test |   13 +
 .../Tests/Fixtures/functions/include/missing.test  |    4 +-
 .../Fixtures/functions/include/missing_nested.test |    4 +-
 .../Tests/Fixtures/functions/include/sandbox.test  |    4 +-
 .../functions/include/sandbox_disabling.test       |    2 +-
 .../include/sandbox_disabling_ignore_missing.test  |    2 +-
 .../functions/include/template_instance.test       |    2 +-
 .../functions/include/templates_as_array.test      |    2 +-
 .../Fixtures/functions/include/with_context.test   |    2 +-
 .../Fixtures/functions/include/with_variables.test |    2 +-
 .../functions/include_template_from_string.test    |   11 +
 .../Twig/Tests/Fixtures/functions/magic_call.test  |    2 +-
 .../{magic_call53.test => magic_static_call.test}  |    4 +-
 .../test/Twig/Tests/Fixtures/functions/max.test    |    2 +-
 .../test/Twig/Tests/Fixtures/functions/min.test    |    2 +-
 .../test/Twig/Tests/Fixtures/functions/range.test  |    2 +-
 .../recursive_block_with_inheritance.test          |    2 +-
 .../test/Twig/Tests/Fixtures/functions/source.test |    2 +-
 .../Tests/Fixtures/functions/special_chars.test    |    2 +-
 .../Tests/Fixtures/functions/static_calls.test     |    2 +-
 .../Fixtures/functions/template_from_string.test   |    2 +-
 .../functions/template_from_string_error.test      |    8 +
 .../Tests/Fixtures/functions/undefined_block.test  |   16 +
 .../Fixtures/functions/undefined_block_deep.test   |   20 +
 .../Twig/Tests/Fixtures/macros/default_values.test |    2 +-
 .../Twig/Tests/Fixtures/macros/nested_calls.test   |    2 +-
 .../Tests/Fixtures/macros/reserved_variables.test  |    2 +-
 .../test/Twig/Tests/Fixtures/macros/simple.test    |    2 +-
 .../Twig/Tests/Fixtures/macros/unknown_macro.test  |   10 +
 .../test/Twig/Tests/Fixtures/macros/varargs.test   |    2 +-
 .../Tests/Fixtures/macros/varargs_argument.test    |    2 +-
 .../Twig/Tests/Fixtures/macros/with_filters.test   |    4 +-
 .../Fixtures/regression/block_names_unicity.test   |   19 +
 .../Fixtures/regression/combined_debug_info.test   |    4 +-
 .../Tests/Fixtures/regression/empty_token.test     |    2 +-
 .../Twig/Tests/Fixtures/regression/issue_1143.test |    4 +-
 .../Fixtures/regression/multi_word_tests.test      |    2 +-
 .../Fixtures/regression/simple_xml_element.test    |    4 +-
 .../Fixtures/regression/strings_like_numbers.test  |    2 +-
 .../test/Twig/Tests/Fixtures/tags/apply/basic.test |   10 +
 .../Tests/Fixtures/tags/apply/json_encode.test     |    8 +
 .../Twig/Tests/Fixtures/tags/apply/multiple.test   |   10 +
 .../Twig/Tests/Fixtures/tags/apply/nested.test     |   16 +
 .../test/Twig/Tests/Fixtures/tags/apply/scope.test |   15 +
 .../Tests/Fixtures/tags/apply/with_for_tag.test    |   13 +
 .../Tests/Fixtures/tags/apply/with_if_tag.test     |   29 +
 .../Twig/Tests/Fixtures/tags/autoescape/basic.test |    6 +-
 .../Tests/Fixtures/tags/autoescape/blocks.test     |    2 +-
 .../Fixtures/tags/autoescape/double_escaping.test  |    2 +-
 .../Tests/Fixtures/tags/autoescape/functions.test  |    4 +-
 .../Tests/Fixtures/tags/autoescape/literal.test    |   44 +-
 .../Tests/Fixtures/tags/autoescape/nested.test     |    2 +-
 .../Tests/Fixtures/tags/autoescape/objects.test    |    2 +-
 .../Twig/Tests/Fixtures/tags/autoescape/raw.test   |    2 +-
 .../Fixtures/tags/autoescape/strategy.legacy.test  |   11 -
 .../Tests/Fixtures/tags/autoescape/strategy.test   |    4 +-
 .../Twig/Tests/Fixtures/tags/autoescape/type.test  |   12 +-
 .../Fixtures/tags/autoescape/with_filters.test     |    2 +-
 .../tags/autoescape/with_filters_arguments.test    |    2 +-
 .../tags/autoescape/with_pre_escape_filters.test   |    2 +-
 .../autoescape/with_preserves_safety_filters.test  |    2 +-
 .../test/Twig/Tests/Fixtures/tags/block/basic.test |    2 +-
 .../Fixtures/tags/block/block_unique_name.test     |    4 +-
 .../Tests/Fixtures/tags/block/capturing_block.test |   24 +
 .../Fixtures/tags/block/conditional_block.test     |    9 +
 .../Tests/Fixtures/tags/block/special_chars.test   |    2 +-
 .../Fixtures/tags/deprecated/block.legacy.test     |   20 +
 .../Fixtures/tags/deprecated/macro.legacy.test     |   21 +
 .../Fixtures/tags/deprecated/template.legacy.test  |   12 +
 .../test/Twig/Tests/Fixtures/tags/embed/basic.test |    2 +-
 .../tags/embed/complex_dynamic_parent.test         |    2 +-
 .../Tests/Fixtures/tags/embed/dynamic_parent.test  |    2 +-
 .../Twig/Tests/Fixtures/tags/embed/error_line.test |    4 +-
 .../Twig/Tests/Fixtures/tags/embed/multiple.test   |    2 +-
 .../Twig/Tests/Fixtures/tags/embed/nested.test     |    2 +-
 .../Tests/Fixtures/tags/embed/with_extends.test    |    2 +-
 .../tags/filter/{basic.test => basic.legacy.test}  |    4 +-
 .../{json_encode.test => json_encode.legacy.test}  |    4 +-
 .../filter/{multiple.test => multiple.legacy.test} |    4 +-
 .../Tests/Fixtures/tags/filter/nested.legacy.test  |   19 +
 .../Twig/Tests/Fixtures/tags/filter/nested.test    |   16 -
 .../Tests/Fixtures/tags/filter/scope.legacy.test   |   13 +
 ...{with_for_tag.test => with_for_tag.legacy.test} |    4 +-
 .../{with_if_tag.test => with_if_tag.legacy.test}  |    4 +-
 .../Tests/Fixtures/tags/for/condition.legacy.test  |   16 +
 .../Twig/Tests/Fixtures/tags/for/condition.test    |   14 -
 .../test/Twig/Tests/Fixtures/tags/for/context.test |    2 +-
 .../test/Twig/Tests/Fixtures/tags/for/else.test    |    8 +-
 .../Tests/Fixtures/tags/for/inner_variables.test   |    2 +-
 .../test/Twig/Tests/Fixtures/tags/for/keys.test    |    2 +-
 .../Tests/Fixtures/tags/for/keys_and_values.test   |    2 +-
 .../Twig/Tests/Fixtures/tags/for/loop_context.test |    2 +-
 .../Fixtures/tags/for/loop_context_local.test      |    2 +-
 .../Tests/Fixtures/tags/for/loop_not_defined.test  |    4 +-
 .../Fixtures/tags/for/loop_not_defined_cond.test   |    4 +-
 .../Twig/Tests/Fixtures/tags/for/nested_else.test  |    2 +-
 .../test/Twig/Tests/Fixtures/tags/for/objects.test |    6 +-
 .../Tests/Fixtures/tags/for/objects_countable.test |    6 +-
 .../Twig/Tests/Fixtures/tags/for/recursive.test    |    2 +-
 .../test/Twig/Tests/Fixtures/tags/for/values.test  |    2 +-
 .../twig/test/Twig/Tests/Fixtures/tags/from.test   |    2 +-
 .../test/Twig/Tests/Fixtures/tags/if/basic.test    |    6 +-
 .../Twig/Tests/Fixtures/tags/if/expression.test    |    6 +-
 .../Twig/Tests/Fixtures/tags/include/basic.test    |    2 +-
 .../Tests/Fixtures/tags/include/expression.test    |    2 +-
 .../Fixtures/tags/include/ignore_missing.test      |    2 +-
 .../tags/include/ignore_missing_exists.test        |   11 +
 .../tags/include/include_missing_extends.test      |   13 +
 .../Twig/Tests/Fixtures/tags/include/missing.test  |    4 +-
 .../Fixtures/tags/include/missing_nested.test      |    4 +-
 .../Twig/Tests/Fixtures/tags/include/only.test     |   14 +-
 .../Fixtures/tags/include/template_instance.test   |    4 +-
 .../Fixtures/tags/include/templates_as_array.test  |    2 +-
 .../Fixtures/tags/include/with_variables.test      |    6 +-
 .../Tests/Fixtures/tags/inheritance/basic.test     |    2 +-
 .../Fixtures/tags/inheritance/block_expr.test      |   14 +-
 .../Fixtures/tags/inheritance/block_expr2.test     |   14 +-
 .../Fixtures/tags/inheritance/capturing_block.test |   17 +
 .../Fixtures/tags/inheritance/conditional.test     |    2 +-
 .../tags/inheritance/conditional_block.legacy.test |   16 +
 .../Tests/Fixtures/tags/inheritance/dynamic.test   |    2 +-
 .../Tests/Fixtures/tags/inheritance/empty.test     |    2 +-
 .../tags/inheritance/extends_as_array.test         |    2 +-
 .../extends_as_array_with_empty_name.test          |    2 +-
 .../extends_as_array_with_null_name.test           |    2 +-
 .../tags/inheritance/extends_in_block.test         |   10 +
 .../tags/inheritance/extends_in_macro.test         |   10 +
 .../Tests/Fixtures/tags/inheritance/multiple.test  |    2 +-
 .../tags/inheritance/multiple_dynamic.test         |    2 +-
 .../Fixtures/tags/inheritance/nested_blocks.test   |    2 +-
 .../inheritance/nested_blocks_parent_only.test     |    2 +-
 .../tags/inheritance/nested_inheritance.test       |    2 +-
 .../Tests/Fixtures/tags/inheritance/parent.test    |    2 +-
 .../inheritance/parent_as_template_wrapper.test    |   12 +
 .../Fixtures/tags/inheritance/parent_change.test   |    4 +-
 .../tags/inheritance/parent_in_a_block.test        |    8 -
 .../tags/inheritance/parent_isolation.test         |    2 +-
 .../Fixtures/tags/inheritance/parent_nested.test   |    2 +-
 .../tags/inheritance/parent_without_extends.test   |    2 +-
 .../parent_without_extends_but_traits.test         |    2 +-
 .../tags/inheritance/template_instance.test        |    2 +-
 .../Twig/Tests/Fixtures/tags/inheritance/use.test  |    2 +-
 .../Tests/Fixtures/tags/macro/auto_import.test     |   16 +
 .../Fixtures/tags/macro/auto_import_blocks.test    |   18 +
 .../tags/macro/auto_import_without_blocks.test     |   18 +
 .../test/Twig/Tests/Fixtures/tags/macro/basic.test |    2 +-
 .../Tests/Fixtures/tags/macro/endmacro_name.test   |    2 +-
 .../Twig/Tests/Fixtures/tags/macro/external.test   |    2 +-
 .../test/Twig/Tests/Fixtures/tags/macro/from.test  |    2 +-
 .../tags/macro/from_embed_with_global_macro.test   |   21 +
 .../tags/macro/from_in_block_is_local.test         |   18 +
 .../Fixtures/tags/macro/from_local_override.test   |   28 +
 .../Fixtures/tags/macro/from_macro_in_a_macro.test |   18 +
 .../Fixtures/tags/macro/from_macros_in_parent.test |   16 +
 .../Fixtures/tags/macro/from_nested_blocks.test    |   18 +
 .../from_nested_blocks_with_global_macro.test      |   18 +
 .../Tests/Fixtures/tags/macro/from_recursive.test  |   27 +
 .../Fixtures/tags/macro/from_self_parent.test      |   20 +
 .../Fixtures/tags/macro/from_syntax_error.test     |    8 +
 .../tags/macro/from_with_reserved_name.test        |    9 -
 .../Twig/Tests/Fixtures/tags/macro/global.test     |    2 +-
 .../Fixtures/tags/macro/import_and_blocks.test     |   36 +
 .../tags/macro/import_embed_with_global_macro.test |   21 +
 .../tags/macro/import_from_string_template.test    |   10 +
 .../tags/macro/import_in_block_is_local.test       |   18 +
 .../Fixtures/tags/macro/import_local_override.test |   28 +
 .../tags/macro/import_macro_in_a_macro.test        |   18 +
 .../tags/macro/import_macros_in_parent.test        |   16 +
 .../Fixtures/tags/macro/import_nested_blocks.test  |   18 +
 .../import_nested_blocks_with_global_macro.test    |   18 +
 .../tags/macro/import_same_parent_and_child.test   |   30 +
 .../Fixtures/tags/macro/import_self_parent.test    |   23 +
 .../Fixtures/tags/macro/import_syntax_error.test   |   10 +
 .../tags/macro/import_with_reserved_nam.test       |   11 -
 .../Tests/Fixtures/tags/macro/reserved_name.test   |   10 -
 .../Tests/Fixtures/tags/macro/self_import.test     |    2 +-
 .../Tests/Fixtures/tags/macro/special_chars.test   |    2 +-
 .../Tests/Fixtures/tags/macro/super_globals.test   |    2 +-
 .../Twig/Tests/Fixtures/tags/raw/basic.legacy.test |   10 -
 .../tags/raw/mixed_usage_with_raw.legacy.test      |   10 -
 .../tags/raw/whitespace_control.legacy.test        |   56 -
 .../Twig/Tests/Fixtures/tags/sandbox/array.test    |   16 +
 .../Tests/Fixtures/tags/sandbox/not_valid1.test    |    2 +-
 .../Tests/Fixtures/tags/sandbox/not_valid2.test    |    2 +-
 .../Twig/Tests/Fixtures/tags/sandbox/simple.test   |    2 +-
 .../test/Twig/Tests/Fixtures/tags/set/basic.test   |    2 +-
 .../Tests/Fixtures/tags/set/capture-empty.test     |    2 +-
 .../test/Twig/Tests/Fixtures/tags/set/capture.test |    2 +-
 .../Tests/Fixtures/tags/set/capture_scope.test     |   10 +
 .../Twig/Tests/Fixtures/tags/set/expression.test   |    2 +-
 .../Twig/Tests/Fixtures/tags/set/inheritance.test  |   24 +
 .../Fixtures/tags/set/inheritance_overriding.test  |   24 +
 .../Twig/Tests/Fixtures/tags/set/mutating.test     |   17 +
 .../tags/spaceless/root_level_in_child.legacy.test |   23 +
 .../Twig/Tests/Fixtures/tags/spaceless/simple.test |    4 +-
 .../Twig/Tests/Fixtures/tags/special_chars.test    |    2 +-
 .../test/Twig/Tests/Fixtures/tags/use/aliases.test |    2 +-
 .../test/Twig/Tests/Fixtures/tags/use/basic.test   |    2 +-
 .../test/Twig/Tests/Fixtures/tags/use/deep.test    |    2 +-
 .../Twig/Tests/Fixtures/tags/use/deep_empty.test   |    2 +-
 .../Twig/Tests/Fixtures/tags/use/inheritance.test  |    2 +-
 .../Twig/Tests/Fixtures/tags/use/inheritance2.test |    2 +-
 .../Twig/Tests/Fixtures/tags/use/multiple.test     |    2 +-
 .../Tests/Fixtures/tags/use/multiple_aliases.test  |    2 +-
 .../Twig/Tests/Fixtures/tags/use/parent_block.test |    2 +-
 .../Tests/Fixtures/tags/use/parent_block2.test     |    2 +-
 .../Tests/Fixtures/tags/use/parent_block3.test     |    2 +-
 .../Tests/Fixtures/tags/use/use_with_parent.test   |    2 +-
 .../Twig/Tests/Fixtures/tags/verbatim/basic.test   |    2 +-
 .../tags/verbatim/mixed_usage_with_raw.test        |   10 -
 .../Fixtures/tags/verbatim/whitespace_control.test |    2 +-
 .../test/Twig/Tests/Fixtures/tags/with/basic.test  |    2 +-
 .../Twig/Tests/Fixtures/tags/with/expression.test  |    2 +-
 .../Twig/Tests/Fixtures/tags/with/globals.test     |   10 +
 .../Twig/Tests/Fixtures/tags/with/iterable.test    |   10 +
 .../test/Twig/Tests/Fixtures/tags/with/nested.test |    2 +-
 .../Tests/Fixtures/tags/with/with_no_hash.test     |    4 +-
 .../Twig/Tests/Fixtures/tags/with/with_only.test   |    4 +-
 .../twig/test/Twig/Tests/Fixtures/tests/array.test |   18 +-
 .../test/Twig/Tests/Fixtures/tests/constant.test   |    2 +-
 .../test/Twig/Tests/Fixtures/tests/defined.test    |   22 +-
 .../Fixtures/tests/defined_for_attribute.test      |   18 +-
 .../Tests/Fixtures/tests/defined_for_blocks.test   |    2 +-
 .../tests/defined_for_blocks_with_template.test    |    6 +-
 .../Fixtures/tests/defined_for_constants.test      |    2 +-
 .../Tests/Fixtures/tests/defined_for_macros.test   |   41 +
 .../Fixtures/tests/defined_on_complex_expr.test    |    8 +
 .../Twig/Tests/Fixtures/tests/dynamic_test.test    |   14 +
 .../twig/test/Twig/Tests/Fixtures/tests/empty.test |   10 +-
 .../twig/test/Twig/Tests/Fixtures/tests/even.test  |    2 +-
 .../twig/test/Twig/Tests/Fixtures/tests/in.test    |  236 +-
 .../Twig/Tests/Fixtures/tests/in_with_objects.test |    6 +-
 .../test/Twig/Tests/Fixtures/tests/iterable.test   |   10 +-
 .../Twig/Tests/Fixtures/tests/null_coalesce.test   |    2 +-
 .../twig/test/Twig/Tests/Fixtures/tests/odd.test   |    2 +-
 .../Fixtures/{tags => whitespace}/trim_block.test  |    8 +-
 .../whitespace/trim_delimiter_as_strings.test      |   10 +
 .../Twig/Tests/Fixtures/whitespace/trim_left.test  |   32 +
 .../Tests/Fixtures/whitespace/trim_line_left.test  |   33 +
 .../Tests/Fixtures/whitespace/trim_line_right.test |   32 +
 .../Twig/Tests/Fixtures/whitespace/trim_right.test |   28 +
 .../twig/twig/test/Twig/Tests/IntegrationTest.php  |  171 +-
 .../LegacyFixtures/autoescape/filename.legacy.test |   18 -
 .../functions/undefined_block.legacy.test          |   12 -
 .../Twig/Tests/LegacyFixtures/test.legacy.test     |    8 -
 .../twig/test/Twig/Tests/LegacyIntegrationTest.php |   54 -
 vendor/twig/twig/test/Twig/Tests/LexerTest.php     |  239 +-
 .../twig/twig/test/Twig/Tests/Loader/ArrayTest.php |   79 +-
 .../twig/twig/test/Twig/Tests/Loader/ChainTest.php |   83 +-
 .../twig/test/Twig/Tests/Loader/FilesystemTest.php |  178 +-
 .../twig/test/Twig/Tests/NativeExtensionTest.php   |   32 -
 .../twig/test/Twig/Tests/Node/AutoEscapeTest.php   |   21 +-
 .../test/Twig/Tests/Node/BlockReferenceTest.php    |   15 +-
 .../twig/twig/test/Twig/Tests/Node/BlockTest.php   |   25 +-
 .../twig/test/Twig/Tests/Node/DeprecatedTest.php   |   82 +
 vendor/twig/twig/test/Twig/Tests/Node/DoTest.php   |   18 +-
 .../test/Twig/Tests/Node/Expression/ArrayTest.php  |   30 +-
 .../Twig/Tests/Node/Expression/AssignNameTest.php  |   15 +-
 .../Twig/Tests/Node/Expression/Binary/AddTest.php  |   24 +-
 .../Twig/Tests/Node/Expression/Binary/AndTest.php  |   24 +-
 .../Tests/Node/Expression/Binary/ConcatTest.php    |   24 +-
 .../Twig/Tests/Node/Expression/Binary/DivTest.php  |   24 +-
 .../Tests/Node/Expression/Binary/FloorDivTest.php  |   24 +-
 .../Twig/Tests/Node/Expression/Binary/ModTest.php  |   24 +-
 .../Twig/Tests/Node/Expression/Binary/MulTest.php  |   24 +-
 .../Twig/Tests/Node/Expression/Binary/OrTest.php   |   24 +-
 .../Twig/Tests/Node/Expression/Binary/SubTest.php  |   24 +-
 .../test/Twig/Tests/Node/Expression/CallTest.php   |   84 +-
 .../Twig/Tests/Node/Expression/ConditionalTest.php |   26 +-
 .../Twig/Tests/Node/Expression/ConstantTest.php    |   13 +-
 .../test/Twig/Tests/Node/Expression/FilterTest.php |  156 +-
 .../Twig/Tests/Node/Expression/FunctionTest.php    |  110 +-
 .../Twig/Tests/Node/Expression/GetAttrTest.php     |   56 +-
 .../test/Twig/Tests/Node/Expression/NameTest.php   |   43 +-
 .../Tests/Node/Expression/NullCoalesceTest.php     |   24 +-
 .../Tests/Node/Expression/PHP53/FilterInclude.php  |    6 -
 .../Node/Expression/PHP53/FunctionInclude.php      |    6 -
 .../Tests/Node/Expression/PHP53/TestInclude.php    |    6 -
 .../test/Twig/Tests/Node/Expression/ParentTest.php |   11 +-
 .../test/Twig/Tests/Node/Expression/TestTest.php   |   77 +-
 .../Twig/Tests/Node/Expression/Unary/NegTest.php   |   22 +-
 .../Twig/Tests/Node/Expression/Unary/NotTest.php   |   20 +-
 .../Twig/Tests/Node/Expression/Unary/PosTest.php   |   20 +-
 vendor/twig/twig/test/Twig/Tests/Node/ForTest.php  |  107 +-
 vendor/twig/twig/test/Twig/Tests/Node/IfTest.php   |   73 +-
 .../twig/twig/test/Twig/Tests/Node/ImportTest.php  |   27 +-
 .../twig/twig/test/Twig/Tests/Node/IncludeTest.php |   74 +-
 .../twig/twig/test/Twig/Tests/Node/MacroTest.php   |   66 +-
 .../twig/twig/test/Twig/Tests/Node/ModuleTest.php  |  211 +-
 .../twig/twig/test/Twig/Tests/Node/PrintTest.php   |   14 +-
 .../twig/twig/test/Twig/Tests/Node/SandboxTest.php |   27 +-
 .../test/Twig/Tests/Node/SandboxedPrintTest.php    |   33 -
 vendor/twig/twig/test/Twig/Tests/Node/SetTest.php  |   67 +-
 .../twig/test/Twig/Tests/Node/SpacelessTest.php    |   25 +-
 vendor/twig/twig/test/Twig/Tests/Node/TextTest.php |   11 +-
 .../test/Twig/Tests/NodeVisitor/OptimizerTest.php  |   86 +-
 vendor/twig/twig/test/Twig/Tests/ParserTest.php    |  187 +-
 .../Twig/Tests/Profiler/Dumper/AbstractTest.php    |   86 +-
 .../Twig/Tests/Profiler/Dumper/BlackfireTest.php   |    4 +-
 .../test/Twig/Tests/Profiler/Dumper/HtmlTest.php   |    4 +-
 .../test/Twig/Tests/Profiler/Dumper/TextTest.php   |    4 +-
 .../twig/test/Twig/Tests/Profiler/ProfileTest.php  |   38 +-
 .../test/Twig/Tests/RuntimeFactoryLoaderTest.php   |   32 -
 vendor/twig/twig/test/Twig/Tests/TemplateTest.php  |  543 ++--
 .../twig/test/Twig/Tests/TemplateWrapperTest.php   |   36 +-
 .../twig/twig/test/Twig/Tests/TokenStreamTest.php  |   55 +-
 .../Twig/Tests/Util/DeprecationCollectorTest.php   |   19 +-
 vendor/twig/twig/test/bootstrap.php                |   13 -
 vendor/webmozart/assert/.composer-auth.json        |    7 -
 vendor/webmozart/assert/.gitignore                 |    2 -
 vendor/webmozart/assert/.styleci.yml               |    8 -
 vendor/webmozart/assert/.travis.yml                |   39 -
 vendor/webmozart/assert/CHANGELOG.md               |   54 +-
 vendor/webmozart/assert/README.md                  |   68 +-
 vendor/webmozart/assert/appveyor.yml               |   40 -
 vendor/webmozart/assert/composer.json              |   19 +-
 vendor/webmozart/assert/phpunit.xml.dist           |   16 -
 vendor/webmozart/assert/src/Assert.php             |  253 +-
 vendor/webmozart/assert/tests/AssertTest.php       |  451 ---
 1942 files changed, 42312 insertions(+), 61723 deletions(-)

diff --git a/vendor/bin/resque b/vendor/bin/resque
index cab69836..658de935 120000
--- a/vendor/bin/resque
+++ b/vendor/bin/resque
@@ -1 +1 @@
-../chrisboulton/php-resque/bin/resque
\ No newline at end of file
+../resque/php-resque/bin/resque
\ No newline at end of file
diff --git a/vendor/chrisboulton/php-resque/composer.lock b/vendor/chrisboulton/php-resque/composer.lock
deleted file mode 100644
index 0f431b90..00000000
--- a/vendor/chrisboulton/php-resque/composer.lock
+++ /dev/null
@@ -1,514 +0,0 @@
-{
-    "_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": "41124ffd15a15b52947e430b92b8f10f",
-    "content-hash": "11906622d4e017ff6807c6dff51f208d",
-    "packages": [
-        {
-            "name": "colinmollenhour/credis",
-            "version": "1.7",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/colinmollenhour/credis.git";,
-                "reference": "74b2b703da5c58dc07fb97e8954bc63280b469bf"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/colinmollenhour/credis/zipball/74b2b703da5c58dc07fb97e8954bc63280b469bf";,
-                "reference": "74b2b703da5c58dc07fb97e8954bc63280b469bf",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.4.0"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "Client.php",
-                    "Cluster.php",
-                    "Sentinel.php"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Colin Mollenhour",
-                    "email": "colin@xxxxxxxxxxxxxx"
-                }
-            ],
-            "description": "Credis is a lightweight interface to the Redis key-value store which wraps the phpredis library when available for better performance.",
-            "homepage": "https://github.com/colinmollenhour/credis";,
-            "time": "2016-03-24 15:50:52"
-        },
-        {
-            "name": "psr/log",
-            "version": "1.0.0",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/php-fig/log.git";,
-                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b";,
-                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
-                "shasum": ""
-            },
-            "type": "library",
-            "autoload": {
-                "psr-0": {
-                    "Psr\\Log\\": ""
-                }
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "PHP-FIG",
-                    "homepage": "http://www.php-fig.org/";
-                }
-            ],
-            "description": "Common interface for logging libraries",
-            "keywords": [
-                "log",
-                "psr",
-                "psr-3"
-            ],
-            "time": "2012-12-21 11:40:51"
-        }
-    ],
-    "packages-dev": [
-        {
-            "name": "phpunit/php-code-coverage",
-            "version": "1.2.18",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-code-coverage.git";,
-                "reference": "fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b";,
-                "reference": "fe2466802556d3fe4e4d1d58ffd3ccfd0a19be0b",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3",
-                "phpunit/php-file-iterator": ">=1.3.0@stable",
-                "phpunit/php-text-template": ">=1.2.0@stable",
-                "phpunit/php-token-stream": ">=1.1.3,<1.3.0"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "3.7.*@dev"
-            },
-            "suggest": {
-                "ext-dom": "*",
-                "ext-xdebug": ">=2.0.5"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.2.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "PHP/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "include-path": [
-                ""
-            ],
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
-                    "role": "lead"
-                }
-            ],
-            "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
-            "homepage": "https://github.com/sebastianbergmann/php-code-coverage";,
-            "keywords": [
-                "coverage",
-                "testing",
-                "xunit"
-            ],
-            "time": "2014-09-02 10:13:14"
-        },
-        {
-            "name": "phpunit/php-file-iterator",
-            "version": "1.4.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-file-iterator.git";,
-                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0";,
-                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.4.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
-                    "role": "lead"
-                }
-            ],
-            "description": "FilterIterator implementation that filters files based on a list of suffixes.",
-            "homepage": "https://github.com/sebastianbergmann/php-file-iterator/";,
-            "keywords": [
-                "filesystem",
-                "iterator"
-            ],
-            "time": "2015-06-21 13:08:43"
-        },
-        {
-            "name": "phpunit/php-text-template",
-            "version": "1.2.1",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-text-template.git";,
-                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686";,
-                "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@xxxxxxxxxx",
-                    "role": "lead"
-                }
-            ],
-            "description": "Simple template engine.",
-            "homepage": "https://github.com/sebastianbergmann/php-text-template/";,
-            "keywords": [
-                "template"
-            ],
-            "time": "2015-06-21 13:50:34"
-        },
-        {
-            "name": "phpunit/php-timer",
-            "version": "1.0.8",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-timer.git";,
-                "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260";,
-                "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3"
-            },
-            "require-dev": {
-                "phpunit/phpunit": "~4|~5"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "src/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
-                    "role": "lead"
-                }
-            ],
-            "description": "Utility class for timing",
-            "homepage": "https://github.com/sebastianbergmann/php-timer/";,
-            "keywords": [
-                "timer"
-            ],
-            "time": "2016-05-12 18:03:57"
-        },
-        {
-            "name": "phpunit/php-token-stream",
-            "version": "1.2.2",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/php-token-stream.git";,
-                "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ad4e1e23ae01b483c16f600ff1bebec184588e32";,
-                "reference": "ad4e1e23ae01b483c16f600ff1bebec184588e32",
-                "shasum": ""
-            },
-            "require": {
-                "ext-tokenizer": "*",
-                "php": ">=5.3.3"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "1.2-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "PHP/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "include-path": [
-                ""
-            ],
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
-                    "role": "lead"
-                }
-            ],
-            "description": "Wrapper around PHP's tokenizer extension.",
-            "homepage": "https://github.com/sebastianbergmann/php-token-stream/";,
-            "keywords": [
-                "tokenizer"
-            ],
-            "time": "2014-03-03 05:10:30"
-        },
-        {
-            "name": "phpunit/phpunit",
-            "version": "3.7.38",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/phpunit.git";,
-                "reference": "38709dc22d519a3d1be46849868aa2ddf822bcf6"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/38709dc22d519a3d1be46849868aa2ddf822bcf6";,
-                "reference": "38709dc22d519a3d1be46849868aa2ddf822bcf6",
-                "shasum": ""
-            },
-            "require": {
-                "ext-ctype": "*",
-                "ext-dom": "*",
-                "ext-json": "*",
-                "ext-pcre": "*",
-                "ext-reflection": "*",
-                "ext-spl": "*",
-                "php": ">=5.3.3",
-                "phpunit/php-code-coverage": "~1.2",
-                "phpunit/php-file-iterator": "~1.3",
-                "phpunit/php-text-template": "~1.1",
-                "phpunit/php-timer": "~1.0",
-                "phpunit/phpunit-mock-objects": "~1.2",
-                "symfony/yaml": "~2.0"
-            },
-            "require-dev": {
-                "pear-pear.php.net/pear": "1.9.4"
-            },
-            "suggest": {
-                "phpunit/php-invoker": "~1.1"
-            },
-            "bin": [
-                "composer/bin/phpunit"
-            ],
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.7.x-dev"
-                }
-            },
-            "autoload": {
-                "classmap": [
-                    "PHPUnit/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "include-path": [
-                "",
-                "../../symfony/yaml/"
-            ],
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sebastian@xxxxxxxxxx",
-                    "role": "lead"
-                }
-            ],
-            "description": "The PHP Unit Testing framework.",
-            "homepage": "http://www.phpunit.de/";,
-            "keywords": [
-                "phpunit",
-                "testing",
-                "xunit"
-            ],
-            "time": "2014-10-17 09:04:17"
-        },
-        {
-            "name": "phpunit/phpunit-mock-objects",
-            "version": "1.2.3",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git";,
-                "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/5794e3c5c5ba0fb037b11d8151add2a07fa82875";,
-                "reference": "5794e3c5c5ba0fb037b11d8151add2a07fa82875",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.3",
-                "phpunit/php-text-template": ">=1.1.1@stable"
-            },
-            "suggest": {
-                "ext-soap": "*"
-            },
-            "type": "library",
-            "autoload": {
-                "classmap": [
-                    "PHPUnit/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "include-path": [
-                ""
-            ],
-            "license": [
-                "BSD-3-Clause"
-            ],
-            "authors": [
-                {
-                    "name": "Sebastian Bergmann",
-                    "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
-                    "role": "lead"
-                }
-            ],
-            "description": "Mock Object library for PHPUnit",
-            "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/";,
-            "keywords": [
-                "mock",
-                "xunit"
-            ],
-            "time": "2013-01-13 10:24:48"
-        },
-        {
-            "name": "symfony/yaml",
-            "version": "v2.8.12",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/yaml.git";,
-                "reference": "e7540734bad981fe59f8ef14b6fc194ae9df8d9c"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/yaml/zipball/e7540734bad981fe59f8ef14b6fc194ae9df8d9c";,
-                "reference": "e7540734bad981fe59f8ef14b6fc194ae9df8d9c",
-                "shasum": ""
-            },
-            "require": {
-                "php": ">=5.3.9"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "2.8-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\Yaml\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/";,
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@xxxxxxxxxxx"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors";
-                }
-            ],
-            "description": "Symfony Yaml Component",
-            "homepage": "https://symfony.com";,
-            "time": "2016-09-02 01:57:56"
-        }
-    ],
-    "aliases": [],
-    "minimum-stability": "stable",
-    "stability-flags": [],
-    "prefer-stable": false,
-    "prefer-lowest": false,
-    "platform": {
-        "php": ">=5.3.0",
-        "ext-pcntl": "*"
-    },
-    "platform-dev": []
-}
diff --git a/vendor/colinmollenhour/credis/.travis.yml b/vendor/colinmollenhour/credis/.travis.yml
index 31cbf106..b44c8295 100644
--- a/vendor/colinmollenhour/credis/.travis.yml
+++ b/vendor/colinmollenhour/credis/.travis.yml
@@ -1,23 +1,22 @@
 language: php
 
 php:
+  - 5.5
   - 5.6
   - 7.0
   - 7.1
   - 7.2
+  - nightly
+allow_failures:
+  - php: nightly
 
-matrix:
-  allow_failures:
-    - php: 7.0
-    - php: 7.1
-    - php: 7.2
 
 install:
   - yes '' | pecl install -f redis
-  - wget http://download.redis.io/releases/redis-3.2.11.tar.gz
-  - tar -xzf redis-3.2.11.tar.gz
-  - make -s -C redis-3.2.11 -j4
-  - export PATH=$PATH:$PWD/redis-3.2.11/src/
+  - wget http://download.redis.io/releases/redis-4.0.11.tar.gz
+  - tar -xzf redis-4.0.11.tar.gz
+  - make -s -C redis-4.0.11 -j4
+  - export PATH=$PATH:$PWD/redis-4.0.11/src/
 
 script:
   - phpunit
diff --git a/vendor/colinmollenhour/credis/Client.php b/vendor/colinmollenhour/credis/Client.php
index e7d67638..92f5ddb3 100755
--- a/vendor/colinmollenhour/credis/Client.php
+++ b/vendor/colinmollenhour/credis/Client.php
@@ -56,6 +56,7 @@ class CredisException extends Exception
  * @method bool|array|Credis_Client    config(string $setGet, string $key, string $value = null)
  * @method array|Credis_Client         role()
  * @method array|Credis_Client         time()
+ * @method array|Credis_Client         ping()
  *
  * Keys:
  * @method int|Credis_Client           del(string $key)
@@ -797,6 +798,7 @@ class Credis_Client {
                     $eArgs = (array) array_shift($args);
                     $args = array($script, count($keys), $keys, $eArgs);
                     break;
+                case 'zinterstore':
                 case 'zunionstore':
                     $dest = array_shift($args);
                     $keys = (array) array_shift($args);
@@ -829,12 +831,12 @@ class Credis_Client {
                     }
                     break;
                 case 'scan':
-                    $ref =& $args[0];
-                    if (empty($ref))
+                    $trackedArgs = array(&$args[0]);
+                    if (empty($trackedArgs[0]))
                     {
-                        $ref = 0;
+                        $trackedArgs[0] = 0;
                     }
-                    $eArgs = array($ref);
+                    $eArgs = array($trackedArgs[0]);
                     if (!empty($args[1]))
                     {
                         $eArgs[] = 'MATCH';
@@ -850,12 +852,12 @@ class Credis_Client {
                 case 'sscan':
                 case 'zscan':
                 case 'hscan':
-					$ref =& $args[1];
-					if (empty($ref))
+					$trackedArgs = array(&$args[1]);
+					if (empty($trackedArgs[0]))
 					{
-						$ref = 0;
+ 						$trackedArgs[0] = 0;
 					}
-					$eArgs = array($args[0],$ref);
+					$eArgs = array($args[0],$trackedArgs[0]);
 					if (!empty($args[2]))
 					{
 						$eArgs[] = 'MATCH';
@@ -1048,6 +1050,7 @@ class Credis_Client {
                     }
                     $args = self::_flattenArguments($args);
                     break;
+                case 'zinterstore':
                 case 'zunionstore':
                     $cArgs = array();
                     $cArgs[] = array_shift($args); // destination
@@ -1186,6 +1189,10 @@ class Credis_Client {
                         throw new CredisException($error);
                     }
                     break;
+                case 'exists':
+                    // smooth over phpredis-v4 vs earlier difference to match documented credis return results
+                    $response = (int) $response;
+                    break;
                 default:
                     $error = $this->redis->getLastError();
                     $this->redis->clearLastError();
@@ -1300,7 +1307,7 @@ class Credis_Client {
         return $response;
     }
 
-    protected function decode_reply($name, $response, array $arguments = array() )
+    protected function decode_reply($name, $response, array &$arguments = array() )
     {
         // Smooth over differences between phpredis and standalone response
         switch ($name)
@@ -1351,12 +1358,12 @@ class Credis_Client {
 
             case 'scan':
             case 'sscan':
-                $ref = array_shift($response);
+                $arguments[0] = intval(array_shift($response));
                 $response = empty($response[0]) ? array() : $response[0];
                 break;
             case 'hscan':
             case 'zscan':
-                $ref = array_shift($response);
+                $arguments[0] = intval(array_shift($response));
                 $response = empty($response[0]) ? array() : $response[0];
                 if (!empty($response) && is_array($response))
                 {
diff --git a/vendor/colinmollenhour/credis/Cluster.php b/vendor/colinmollenhour/credis/Cluster.php
index 827e1eb4..eda43b83 100644
--- a/vendor/colinmollenhour/credis/Cluster.php
+++ b/vendor/colinmollenhour/credis/Cluster.php
@@ -240,7 +240,11 @@ class Credis_Cluster
       $client = $this->clients[0];
     }
     else {
-      $client = $this->byHash($args[0]);
+      $hashKey = $args[0];
+      if (is_array($hashKey)) {
+        $hashKey = join('|', $hashKey);
+      }
+      $client = $this->byHash($hashKey);
     }
     // Ensure that current client is working on the same database as expected.
     if ($client->getSelectedDb() != $this->selectedDb) {
@@ -276,65 +280,64 @@ class Credis_Cluster
     return $this->ring[$server];
   }
 
-  const readOnlyCommands = array(
-    'DBSIZE' => true,
-    'INFO' => true,
-    'MONITOR' => true,
-    'EXISTS' => true,
-    'TYPE' => true,
-    'KEYS' => true,
-    'SCAN' => true,
-    'RANDOMKEY' => true,
-    'TTL' => true,
-    'GET' => true,
-    'MGET' => true,
-    'SUBSTR' => true,
-    'STRLEN' => true,
-    'GETRANGE' => true,
-    'GETBIT' => true,
-    'LLEN' => true,
-    'LRANGE' => true,
-    'LINDEX' => true,
-    'SCARD' => true,
-    'SISMEMBER' => true,
-    'SINTER' => true,
-    'SUNION' => true,
-    'SDIFF' => true,
-    'SMEMBERS' => true,
-    'SSCAN' => true,
-    'SRANDMEMBER' => true,
-    'ZRANGE' => true,
-    'ZREVRANGE' => true,
-    'ZRANGEBYSCORE' => true,
-    'ZREVRANGEBYSCORE' => true,
-    'ZCARD' => true,
-    'ZSCORE' => true,
-    'ZCOUNT' => true,
-    'ZRANK' => true,
-    'ZREVRANK' => true,
-    'ZSCAN' => true,
-    'HGET' => true,
-    'HMGET' => true,
-    'HEXISTS' => true,
-    'HLEN' => true,
-    'HKEYS' => true,
-    'HVALS' => true,
-    'HGETALL' => true,
-    'HSCAN' => true,
-    'PING' => true,
-    'AUTH' => true,
-    'SELECT' => true,
-    'ECHO' => true,
-    'QUIT' => true,
-    'OBJECT' => true,
-    'BITCOUNT' => true,
-    'TIME' => true,
-    'SORT' => true,
-    );
-
   public function isReadOnlyCommand($command)
   {
-      return array_key_exists(strtoupper($command), static::readOnlyCommands);
+      static $readOnlyCommands = array(
+          'DBSIZE' => true,
+          'INFO' => true,
+          'MONITOR' => true,
+          'EXISTS' => true,
+          'TYPE' => true,
+          'KEYS' => true,
+          'SCAN' => true,
+          'RANDOMKEY' => true,
+          'TTL' => true,
+          'GET' => true,
+          'MGET' => true,
+          'SUBSTR' => true,
+          'STRLEN' => true,
+          'GETRANGE' => true,
+          'GETBIT' => true,
+          'LLEN' => true,
+          'LRANGE' => true,
+          'LINDEX' => true,
+          'SCARD' => true,
+          'SISMEMBER' => true,
+          'SINTER' => true,
+          'SUNION' => true,
+          'SDIFF' => true,
+          'SMEMBERS' => true,
+          'SSCAN' => true,
+          'SRANDMEMBER' => true,
+          'ZRANGE' => true,
+          'ZREVRANGE' => true,
+          'ZRANGEBYSCORE' => true,
+          'ZREVRANGEBYSCORE' => true,
+          'ZCARD' => true,
+          'ZSCORE' => true,
+          'ZCOUNT' => true,
+          'ZRANK' => true,
+          'ZREVRANK' => true,
+          'ZSCAN' => true,
+          'HGET' => true,
+          'HMGET' => true,
+          'HEXISTS' => true,
+          'HLEN' => true,
+          'HKEYS' => true,
+          'HVALS' => true,
+          'HGETALL' => true,
+          'HSCAN' => true,
+          'PING' => true,
+          'AUTH' => true,
+          'SELECT' => true,
+          'ECHO' => true,
+          'QUIT' => true,
+          'OBJECT' => true,
+          'BITCOUNT' => true,
+          'TIME' => true,
+          'SORT' => true,
+      );
+      return array_key_exists(strtoupper($command), $readOnlyCommands);
   }
 }
 
diff --git a/vendor/colinmollenhour/credis/tests/CredisClusterTest.php b/vendor/colinmollenhour/credis/tests/CredisClusterTest.php
index 70599281..311ce5fd 100644
--- a/vendor/colinmollenhour/credis/tests/CredisClusterTest.php
+++ b/vendor/colinmollenhour/credis/tests/CredisClusterTest.php
@@ -64,7 +64,7 @@ class CredisClusterTest extends CredisTestCommon
           $this->assertEquals($config['port'],$this->cluster->client($offset)->getPort());
       }
       $alias = "non-existent-alias";
-      $this->expectException('CredisException',"Client $alias does not exist.");
+      $this->setExpectedExceptionShim('CredisException',"Client $alias does not exist.");
       $this->cluster->client($alias);
   }
   public function testMasterSlave()
@@ -92,7 +92,7 @@ class CredisClusterTest extends CredisTestCommon
       $this->waitForSlaveReplication();
       $this->assertEquals('value',$this->cluster->client('slave')->get('key'));
       $this->assertEquals('value',$this->cluster->get('key'));
-      $this->expectException('CredisException','read-only slaves should not be writeable');
+      $this->setExpectedExceptionShim('CredisException');
       $this->assertFalse($this->cluster->client('slave')->set('key2','value'));
   }
   public function testMasterWithoutSlavesAndWriteOnlyFlag()
@@ -185,7 +185,7 @@ class CredisClusterTest extends CredisTestCommon
       $this->cluster = new Credis_Cluster(array($two,$three,$four),2,$this->useStandalone);
       $this->assertTrue($this->cluster->set('key','value'));
       $this->assertEquals('value',$this->cluster->get('key'));
-      $this->expectException('CredisException','Server should either be an array or an instance of Credis_Client');
+      $this->setExpectedExceptionShim('CredisException','Server should either be an array or an instance of Credis_Client');
       new Credis_Cluster(array(new stdClass()),2,$this->useStandalone);
   }
   public function testSetMasterClient()
diff --git a/vendor/colinmollenhour/credis/tests/CredisSentinelTest.php b/vendor/colinmollenhour/credis/tests/CredisSentinelTest.php
index 12e9d149..57e4a36b 100644
--- a/vendor/colinmollenhour/credis/tests/CredisSentinelTest.php
+++ b/vendor/colinmollenhour/credis/tests/CredisSentinelTest.php
@@ -31,6 +31,34 @@ class CredisSentinelTest extends CredisTestCommon
     }
     $this->waitForSlaveReplication();
   }
+
+  public static function setUpBeforeClass()
+  {
+    parent::setUpBeforeClass();
+    if(preg_match('/^WIN/',strtoupper(PHP_OS))){
+      echo "\tredis-server redis-sentinel.conf --sentinel".PHP_EOL.PHP_EOL;
+    } else {
+      sleep(2);
+      chdir(__DIR__);
+      copy('redis-sentinel.conf','redis-sentinel.conf.bak');
+      exec('redis-server redis-sentinel.conf --sentinel');
+      // wait for redis to initialize
+      sleep(1);
+    }
+  }
+
+  public static function tearDownAfterClass()
+  {
+    parent::tearDownAfterClass();
+    if(preg_match('/^WIN/',strtoupper(PHP_OS))){
+      echo "Please kill all Redis instances manually:".PHP_EOL;
+    } else {
+      chdir(__DIR__);
+      @unlink('redis-sentinel.conf');
+      @copy('redis-sentinel.conf.bak','redis-sentinel.conf');
+    }
+  }
+
   protected function tearDown()
   {
     if($this->sentinel) {
@@ -42,7 +70,7 @@ class CredisSentinelTest extends CredisTestCommon
       $master = $this->sentinel->getMasterClient($this->sentinelConfig->clustername);
       $this->assertInstanceOf('Credis_Client',$master);
       $this->assertEquals($this->redisConfig[0]['port'],$master->getPort());
-      $this->expectException('CredisException','Master not found');
+      $this->setExpectedExceptionShim('CredisException','Master not found');
       $this->sentinel->getMasterClient('non-existing-cluster');
   }
   public function testMasters()
@@ -73,7 +101,7 @@ class CredisSentinelTest extends CredisTestCommon
       $this->assertEquals($this->sentinelConfig->clustername,$master[1]);
       $this->assertEquals($this->redisConfig[0]['port'],$master[5]);
 
-      $this->expectException('CredisException','No such master with that name');
+      $this->setExpectedExceptionShim('CredisException','No such master with that name');
       $this->sentinel->master('non-existing-cluster');
   }
   public function testSlaveClient()
@@ -84,7 +112,7 @@ class CredisSentinelTest extends CredisTestCommon
       foreach($slaves as $slave){
           $this->assertInstanceOf('Credis_Client',$slave);
       }
-      $this->expectException('CredisException','No such master with that name');
+      $this->setExpectedExceptionShim('CredisException','No such master with that name');
       $this->sentinel->getSlaveClients('non-existing-cluster');
   }
   public function testSlaves()
@@ -100,12 +128,12 @@ class CredisSentinelTest extends CredisTestCommon
       $this->assertInternalType('array',$slaves);
       $this->assertCount(0,$slaves);
 
-      $this->expectException('CredisException','No such master with that name');
+      $this->setExpectedExceptionShim('CredisException','No such master with that name');
       $this->sentinel->slaves('non-existing-cluster');
   }
   public function testNonExistingClusterNameWhenCreatingSlaves()
   {
-      $this->expectException('CredisException','No such master with that name');
+      $this->setExpectedExceptionShim('CredisException','No such master with that name');
       $this->sentinel->createSlaveClients('non-existing-cluster');
   }
   public function testCreateCluster()
@@ -116,7 +144,7 @@ class CredisSentinelTest extends CredisTestCommon
       $cluster = $this->sentinel->createCluster($this->sentinelConfig->clustername,0,1,false);
       $this->assertInstanceOf('Credis_Cluster',$cluster);
       $this->assertCount(2,$cluster->clients());
-      $this->expectException('CredisException','The master is down');
+      $this->setExpectedExceptionShim('CredisException','The master is down');
       $this->sentinel->createCluster($this->sentinelConfig->downclustername);
   }
   public function testGetCluster()
@@ -155,7 +183,7 @@ class CredisSentinelTest extends CredisTestCommon
       $host = 'localhost';
       $port = '123456';
 
-      $client = $this->createMock('\Credis_Client');
+      $client = $this->createMockShim('\Credis_Client');
       $sentinel = new Credis_Sentinel($client);
 
       $client->expects($this->once())->method('getHost')->willReturn($host);
@@ -166,7 +194,7 @@ class CredisSentinelTest extends CredisTestCommon
   }
   public function testNonExistingMethod()
   {
-      $this->expectException('CredisException','Unknown sentinel subcommand \'bla\'');
+      $this->setExpectedExceptionShim('CredisException','Unknown sentinel subcommand \'bla\'');
       $this->sentinel->bla();
   }
 }
diff --git a/vendor/colinmollenhour/credis/tests/CredisStandaloneClusterTest.php b/vendor/colinmollenhour/credis/tests/CredisStandaloneClusterTest.php
index 886cc35f..4f42b759 100644
--- a/vendor/colinmollenhour/credis/tests/CredisStandaloneClusterTest.php
+++ b/vendor/colinmollenhour/credis/tests/CredisStandaloneClusterTest.php
@@ -24,7 +24,7 @@ class CredisStandaloneClusterTest extends CredisClusterTest
     $this->waitForSlaveReplication();
     $this->assertEquals('value',$this->cluster->client('slave')->get('key'));
     $this->assertEquals('value',$this->cluster->get('key'));
-    $this->expectException('CredisException','READONLY You can\'t write against a read only slave.');
+    $this->setExpectedExceptionShim('CredisException','READONLY You can\'t write against a read only slave.');
     $this->cluster->client('slave')->set('key2','value');
   }
 }
diff --git a/vendor/colinmollenhour/credis/tests/CredisStandaloneTest.php b/vendor/colinmollenhour/credis/tests/CredisStandaloneTest.php
index ac60ebf3..f47514d2 100644
--- a/vendor/colinmollenhour/credis/tests/CredisStandaloneTest.php
+++ b/vendor/colinmollenhour/credis/tests/CredisStandaloneTest.php
@@ -38,7 +38,7 @@ class CredisStandaloneTest extends CredisTest
 
     public function testStandAloneMultiPipelineThrowsException()
     {
-        $this->expectException('CredisException','A pipeline is already in use and only one pipeline is supported.');
+        $this->setExpectedExceptionShim('CredisException','A pipeline is already in use and only one pipeline is supported.');
         $this->credis->pipeline()->pipeline();
     }
 }
diff --git a/vendor/colinmollenhour/credis/tests/CredisTest.php b/vendor/colinmollenhour/credis/tests/CredisTest.php
index e574341c..968000e9 100644
--- a/vendor/colinmollenhour/credis/tests/CredisTest.php
+++ b/vendor/colinmollenhour/credis/tests/CredisTest.php
@@ -65,6 +65,10 @@ class CredisTest extends CredisTestCommon
         $this->assertEquals('FOO', $this->credis->get('foo'));
         $this->assertFalse($this->credis->get('nil'));
 
+        // exists support
+        $this->assertEquals($this->credis->exists('foo'), 1);
+        $this->assertEquals($this->credis->exists('nil'), 0);
+
         // Empty string
         $this->credis->set('empty','');
         $this->assertEquals('', $this->credis->get('empty'));
@@ -622,7 +626,7 @@ class CredisTest extends CredisTestCommon
           $this->credis->forceStandalone();
       }
       $this->credis->setMaxConnectRetries(1);
-      $this->expectException('CredisException','Connection to Redis localhost:12345 failed after 2 failures.');
+      $this->setExpectedExceptionShim('CredisException','Connection to Redis localhost:12345 failed after 2 failures.');
       $this->credis->connect();
   }
 
@@ -664,7 +668,7 @@ class CredisTest extends CredisTestCommon
   public function testInvalidTcpConnectionstring()
   {
       $this->credis->close();
-      $this->expectException('CredisException','Invalid host format; expected tcp://host[:port][/persistence_identifier]');
+      $this->setExpectedExceptionShim('CredisException','Invalid host format; expected tcp://host[:port][/persistence_identifier]');
       $this->credis = new Credis_Client('tcp://'.$this->redisConfig[0]['host'] . ':abc');
       if ($this->useStandalone) {
           $this->credis->forceStandalone();
@@ -674,7 +678,7 @@ class CredisTest extends CredisTestCommon
   public function testInvalidUnixSocketConnectionstring()
   {
       $this->credis->close();
-      $this->expectException('CredisException','Invalid unix socket format; expected unix:///path/to/redis.sock');
+      $this->setExpectedExceptionShim('CredisException','Invalid unix socket format; expected unix:///path/to/redis.sock');
       $this->credis = new Credis_Client('unix://path/to/redis.sock');
       if ($this->useStandalone) {
           $this->credis->forceStandalone();
@@ -685,7 +689,7 @@ class CredisTest extends CredisTestCommon
   {
       $this->credis->connect();
       if ( ! $this->useStandalone) {
-          $this->expectException('CredisException','Cannot force Credis_Client to use standalone PHP driver after a connection has already been established.');
+          $this->setExpectedExceptionShim('CredisException','Cannot force Credis_Client to use standalone PHP driver after a connection has already been established.');
       }
       $this->credis->forceStandalone();
       $this->assertTrue(true);
@@ -718,11 +722,30 @@ class CredisTest extends CredisTestCommon
     }
     public function testscan()
     {
-        $this->credis->set('name','Jack');
-        $this->credis->set('age','33');
+        $seen = array();
+        for($i = 0; $i < 100; $i++)
+        {
+            $this->credis->set('name.' . $i, 'Jack');
+            $this->credis->set('age.' . $i, '33');
+        }
         $iterator = null;
-        $result = $this->credis->scan($iterator,'n*',10);
-        $this->assertEquals($iterator,0);
-        $this->assertEquals($result,['name']);
+        do
+        {
+            $result = $this->credis->scan($iterator, 'n*', 10);
+            if ($result === false)
+            {
+                $this->assertEquals($iterator, 0);
+                break;
+            }
+            else
+            {
+                foreach($result as $key)
+                {
+                    $seen[$key] = true;
+                }
+            }
+        }
+        while($iterator);
+        $this->assertEquals(count($seen), 100);
     }
 }
diff --git a/vendor/colinmollenhour/credis/tests/CredisTestCommon.php b/vendor/colinmollenhour/credis/tests/CredisTestCommon.php
index 8c64371c..af6a811b 100644
--- a/vendor/colinmollenhour/credis/tests/CredisTestCommon.php
+++ b/vendor/colinmollenhour/credis/tests/CredisTestCommon.php
@@ -1,7 +1,7 @@
 <?php
 // backward compatibility (https://stackoverflow.com/a/42828632/187780)
 if (!class_exists('\PHPUnit\Framework\TestCase') && class_exists('\PHPUnit_Framework_TestCase')) {
-    //class_alias('\PHPUnit_Framework_TestCase', '\PHPUnit\Framework\TestCase');
+    class_alias('\PHPUnit_Framework_TestCase', '\PHPUnit\Framework\TestCase');
 }
 
 class CredisTestCommon extends \PHPUnit\Framework\TestCase
@@ -30,7 +30,7 @@ class CredisTestCommon extends \PHPUnit\Framework\TestCase
             $this->redisConfig = $arrayConfig;
         }
 
-        if($this->useStandalone && !extension_loaded('redis')) {
+        if(!$this->useStandalone && !extension_loaded('redis')) {
             $this->fail('The Redis extension is not loaded.');
         }
     }
@@ -65,8 +65,11 @@ class CredisTestCommon extends \PHPUnit\Framework\TestCase
         $slaveConfig = new Credis_Client($this->slaveConfig['host'], $this->slaveConfig['port']);
         $slaveConfig->forceStandalone();
 
-        while (true)
+        $start = microtime(true);
+        $timeout = $start + 60;
+        while (microtime(true) < $timeout)
         {
+            usleep(100);
             $role = $slaveConfig->role();
             if ($role[0] !== 'slave')
             {
@@ -86,9 +89,9 @@ class CredisTestCommon extends \PHPUnit\Framework\TestCase
                     return true;
                 }
             }
-            usleep(100);
         }
         // shouldn't get here
+        $this->fail("Timeout (".(microtime(true) - $start)." seconds) waiting for master-slave replication to finalize");
         return false;
     }
 
@@ -102,8 +105,7 @@ class CredisTestCommon extends \PHPUnit\Framework\TestCase
             echo "\tredis-server redis-3.conf".PHP_EOL;
             echo "\tredis-server redis-4.conf".PHP_EOL;
             echo "\tredis-server redis-auth.conf".PHP_EOL;
-            echo "\tredis-server redis-socket.conf".PHP_EOL;
-            echo "\tredis-sentinel redis-sentinel.conf".PHP_EOL.PHP_EOL;
+            echo "\tredis-server redis-socket.conf".PHP_EOL.PHP_EOL;
         } else {
             chdir(__DIR__);
             $directoryIterator = new DirectoryIterator(__DIR__);
@@ -115,10 +117,8 @@ class CredisTestCommon extends \PHPUnit\Framework\TestCase
             }
             copy('redis-master.conf','redis-master.conf.bak');
             copy('redis-slave.conf','redis-slave.conf.bak');
-            copy('redis-sentinel.conf','redis-sentinel.conf.bak');
-            exec('redis-sentinel redis-sentinel.conf');
-            // wait for redis to initialize
-            usleep(200);
+            // wait for redis instances to initialize
+            sleep(1);
         }
     }
 
@@ -144,10 +144,44 @@ class CredisTestCommon extends \PHPUnit\Framework\TestCase
             @unlink('dump.rdb');
             @unlink('redis-master.conf');
             @unlink('redis-slave.conf');
-            @unlink('redis-sentinel.conf');
             @copy('redis-master.conf.bak','redis-master.conf');
             @copy('redis-slave.conf.bak','redis-slave.conf');
-            @copy('redis-sentinel.conf.bak','redis-sentinel.conf');
+        }
+    }
+
+
+    //
+    /**
+     * php 7.2 compat fix, as directly polyfilling for older PHPUnit causes a function signature compatibility issue
+     * This is due to the defined return type
+     *
+     * Polyfill for older PHPUnit
+     */
+    protected function createMockShim($originalClassName)
+    {
+        if (method_exists($this, 'getMock')) {
+            return $this->getMock($originalClassName);
+        } else {
+            return parent::createMock($originalClassName);
+        }
+    }
+
+    /**
+     * php 7.2 compat fix, as directly polyfilling for older PHPUnit causes a function signature compatibility issue
+     * This is due to the defined return type
+     */
+    public function setExpectedExceptionShim($class, $message = NULL, $code = NULL)
+    {
+        if (method_exists($this, 'setExpectedException')) {
+            $this->setExpectedException($class, $message, $code);
+        } else {
+            parent::expectException($class);
+            if ($message !== null) {
+                $this->expectExceptionMessage($message);
+            }
+            if ($code !== null) {
+                $this->expectExceptionCode($code);
+            }
         }
     }
 }
diff --git a/vendor/colinmollenhour/credis/tests/SetUpBefore.php b/vendor/colinmollenhour/credis/tests/SetUpBefore.php
deleted file mode 100644
index 6b6c9a3c..00000000
--- a/vendor/colinmollenhour/credis/tests/SetUpBefore.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-class SetUpBefore extends PHPUnit_Framework_TestCase
-{
-    public static function setUpBeforeClass()
-    {
-        if(preg_match('/^WIN/',strtoupper(PHP_OS))){
-            echo "Unit tests will not work automatically on Windows. Please setup all Redis instances manually:".PHP_EOL;
-            echo "\tredis-server redis-master.conf".PHP_EOL;
-            echo "\tredis-server redis-slave.conf".PHP_EOL;
-            echo "\tredis-server redis-2.conf".PHP_EOL;
-            echo "\tredis-server redis-3.conf".PHP_EOL;
-            echo "\tredis-server redis-4.conf".PHP_EOL;
-            echo "\tredis-server redis-auth.conf".PHP_EOL;
-            echo "\tredis-server redis-socket.conf".PHP_EOL;
-            echo "\tredis-sentinel redis-sentinel.conf".PHP_EOL.PHP_EOL;
-        } else {
-            chdir(__DIR__);
-            $directoryIterator = new DirectoryIterator(__DIR__);
-            foreach($directoryIterator as $item){
-                if(!$item->isfile() || !preg_match('/^redis\-(.+)\.conf$/',$item->getFilename()) || $item->getFilename() == 'redis-sentinel.conf'){
-                    continue;
-                }
-                exec('redis-server '.$item->getFilename());
-            }
-            copy('redis-master.conf','redis-master.conf.bak');
-            copy('redis-slave.conf','redis-slave.conf.bak');
-            copy('redis-sentinel.conf','redis-sentinel.conf.bak');
-            exec('redis-sentinel redis-sentinel.conf');
-        }
-    }
-    public function testFoo()
-    {
-        $this->assertTrue(true);
-    }
-}
\ No newline at end of file
diff --git a/vendor/colinmollenhour/credis/tests/TearDownAfter.php b/vendor/colinmollenhour/credis/tests/TearDownAfter.php
deleted file mode 100644
index 3574e960..00000000
--- a/vendor/colinmollenhour/credis/tests/TearDownAfter.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-class TearDownAfter extends PHPUnit_Framework_TestCase
-{
-    public static function tearDownAfterClass()
-    {
-        if(preg_match('/^WIN/',strtoupper(PHP_OS))){
-            echo "Please kill all Redis instances manually:".PHP_EOL;
-        } else {
-            chdir(__DIR__);
-            $directoryIterator = new DirectoryIterator(__DIR__);
-            foreach($directoryIterator as $item){
-                if(!$item->isfile() || !preg_match('/^redis\-(.+)\.pid$/',$item->getFilename())){
-                    continue;
-                }
-                $pid = trim(file_get_contents($item->getFilename()));
-                if(function_exists('posix_kill')){
-                    posix_kill($pid,15);
-                } else {
-                    exec('kill '.$pid);
-                }
-            }
-            unlink('dump.rdb');
-            unlink('redis-master.conf');
-            unlink('redis-slave.conf');
-            unlink('redis-sentinel.conf');
-            rename('redis-master.conf.bak','redis-master.conf');
-            rename('redis-slave.conf.bak','redis-slave.conf');
-            rename('redis-sentinel.conf.bak','redis-sentinel.conf');
-        }
-    }
-    public function testFoo()
-    {
-        $this->assertTrue(true);
-    }
-}
\ No newline at end of file
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
index 2c72175e..95f7e097 100644
--- a/vendor/composer/ClassLoader.php
+++ b/vendor/composer/ClassLoader.php
@@ -377,11 +377,11 @@ class ClassLoader
             $subPath = $class;
             while (false !== $lastPos = strrpos($subPath, '\\')) {
                 $subPath = substr($subPath, 0, $lastPos);
-                $search = $subPath.'\\';
+                $search = $subPath . '\\';
                 if (isset($this->prefixDirsPsr4[$search])) {
+                    $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1);
                     foreach ($this->prefixDirsPsr4[$search] as $dir) {
-                        $length = $this->prefixLengthsPsr4[$first][$search];
-                        if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+                        if (file_exists($file = $dir . $pathEnd)) {
                             return $file;
                         }
                     }
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
index e60f8542..d18adb0c 100644
--- a/vendor/composer/autoload_classmap.php
+++ b/vendor/composer/autoload_classmap.php
@@ -6,12 +6,16 @@ $vendorDir = dirname(dirname(__FILE__));
 $baseDir = dirname($vendorDir);
 
 return array(
+    'ArithmeticError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
+    'AssertionError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
     'CredisException' => $vendorDir . '/colinmollenhour/credis/Client.php',
     'Credis_Client' => $vendorDir . '/colinmollenhour/credis/Client.php',
     'Credis_Cluster' => $vendorDir . '/colinmollenhour/credis/Cluster.php',
     'Credis_Module' => $vendorDir . '/colinmollenhour/credis/Module.php',
     'Credis_Sentinel' => $vendorDir . '/colinmollenhour/credis/Sentinel.php',
+    'DivisionByZeroError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
     'EasyPeasyICS' => $vendorDir . '/phpmailer/phpmailer/extras/EasyPeasyICS.php',
+    'Error' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/Error.php',
     'File_Iterator' => $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php',
     'File_Iterator_Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php',
     'File_Iterator_Factory' => $vendorDir . '/phpunit/php-file-iterator/src/Factory.php',
@@ -401,6 +405,7 @@ return array(
     'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
     'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
     'POP3' => $vendorDir . '/phpmailer/phpmailer/class.pop3.php',
+    'ParseError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
     'SMTP' => $vendorDir . '/phpmailer/phpmailer/class.smtp.php',
     'SebastianBergmann\\CodeCoverage\\CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php',
     'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => $vendorDir . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php',
@@ -481,7 +486,9 @@ return array(
     'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php',
     'SebastianBergmann\\ResourceOperations\\ResourceOperations' => $vendorDir . '/sebastian/resource-operations/src/ResourceOperations.php',
     'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php',
+    'SessionUpdateTimestampHandlerInterface' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
     'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php',
+    'TypeError' => $vendorDir . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
     'ntlm_sasl_client_class' => $vendorDir . '/phpmailer/phpmailer/extras/ntlm_sasl_client.php',
     'phpmailerException' => $vendorDir . '/phpmailer/phpmailer/class.phpmailer.php',
 );
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
index 566dc3b1..d3db499e 100644
--- a/vendor/composer/autoload_files.php
+++ b/vendor/composer/autoload_files.php
@@ -6,9 +6,13 @@ $vendorDir = dirname(dirname(__FILE__));
 $baseDir = dirname($vendorDir);
 
 return array(
-    '253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php',
+    '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
     '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
+    '7b11c4dc42b3b3023073cb14e519683c' => $vendorDir . '/ralouphie/getallheaders/src/getallheaders.php',
+    '253c157292f75eb38082b5acb06f3f01' => $vendorDir . '/nikic/fast-route/src/functions.php',
     'c964ee0ededf28c96ebd9db5099ef910' => $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
     'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
+    '023d27dca8066ef29e6739335ea73bad' => $vendorDir . '/symfony/polyfill-php70/bootstrap.php',
+    '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
     '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
 );
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
index afc93351..95de2e8f 100644
--- a/vendor/composer/autoload_namespaces.php
+++ b/vendor/composer/autoload_namespaces.php
@@ -9,9 +9,8 @@ return array(
     'Twig_Extensions_' => array($vendorDir . '/twig/extensions/lib'),
     'Twig_' => array($vendorDir . '/twig/twig/lib'),
     'SecurityLib' => array($vendorDir . '/ircmaxell/security-lib/lib'),
-    'Resque' => array($vendorDir . '/chrisboulton/php-resque/lib'),
+    'Resque' => array($vendorDir . '/resque/php-resque/lib'),
     'RandomLib' => array($vendorDir . '/ircmaxell/random-lib/lib'),
-    'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'),
     'Pimple' => array($vendorDir . '/pimple/pimple/src'),
     'PayPal\\Service' => array($vendorDir . '/paypal/merchant-sdk-php/lib'),
     'PayPal\\PayPalAPI' => array($vendorDir . '/paypal/merchant-sdk-php/lib'),
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 7ea7b298..1d6d66a4 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -7,12 +7,15 @@ $baseDir = dirname($vendorDir);
 
 return array(
     'phpDocumentor\\Reflection\\' => array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'),
+    'cweagans\\Composer\\' => array($vendorDir . '/cweagans/composer-patches/src'),
     'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
     'Twig\\Extensions\\' => array($vendorDir . '/twig/extensions/src'),
     'Twig\\' => array($vendorDir . '/twig/twig/src'),
     'Tor\\' => array($baseDir . '/src'),
     'Tests\\' => array($baseDir . '/tests'),
+    'Symfony\\Polyfill\\Php70\\' => array($vendorDir . '/symfony/polyfill-php70'),
     'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
+    'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'),
     'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
     'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
     'Stripe\\' => array($vendorDir . '/stripe/stripe-php/lib'),
@@ -21,6 +24,7 @@ return array(
     'Psr\\Log\\' => array($vendorDir . '/psr/log/Psr/Log'),
     'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
     'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
+    'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'),
     'Predis\\' => array($vendorDir . '/predis/predis/src'),
     'Monolog\\' => array($vendorDir . '/monolog/monolog/src/Monolog'),
     'Interop\\Container\\' => array($vendorDir . '/container-interop/container-interop/src/Interop/Container'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 0b55e286..e32de4a2 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -7,10 +7,14 @@ namespace Composer\Autoload;
 class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
 {
     public static $files = array (
-        '253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php',
+        '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
         '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
+        '7b11c4dc42b3b3023073cb14e519683c' => __DIR__ . '/..' . '/ralouphie/getallheaders/src/getallheaders.php',
+        '253c157292f75eb38082b5acb06f3f01' => __DIR__ . '/..' . '/nikic/fast-route/src/functions.php',
         'c964ee0ededf28c96ebd9db5099ef910' => __DIR__ . '/..' . '/guzzlehttp/promises/src/functions_include.php',
         'a0edc8309cc5e1d60e3047b5df6b7052' => __DIR__ . '/..' . '/guzzlehttp/psr7/src/functions_include.php',
+        '023d27dca8066ef29e6739335ea73bad' => __DIR__ . '/..' . '/symfony/polyfill-php70/bootstrap.php',
+        '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
         '37a3dc5111fe8f707ab4c132ef1dbc62' => __DIR__ . '/..' . '/guzzlehttp/guzzle/src/functions_include.php',
     );
 
@@ -19,6 +23,10 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
         array (
             'phpDocumentor\\Reflection\\' => 25,
         ),
+        'c' => 
+        array (
+            'cweagans\\Composer\\' => 18,
+        ),
         'W' => 
         array (
             'Webmozart\\Assert\\' => 17,
@@ -32,7 +40,9 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
         ),
         'S' => 
         array (
+            'Symfony\\Polyfill\\Php70\\' => 23,
             'Symfony\\Polyfill\\Mbstring\\' => 26,
+            'Symfony\\Polyfill\\Ctype\\' => 23,
             'Symfony\\Component\\Yaml\\' => 23,
             'Symfony\\Component\\HttpFoundation\\' => 33,
             'Stripe\\' => 7,
@@ -44,6 +54,7 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
             'Psr\\Log\\' => 8,
             'Psr\\Http\\Message\\' => 17,
             'Psr\\Container\\' => 14,
+            'Prophecy\\' => 9,
             'Predis\\' => 7,
         ),
         'M' => 
@@ -78,6 +89,10 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
             1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
             2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
         ),
+        'cweagans\\Composer\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/cweagans/composer-patches/src',
+        ),
         'Webmozart\\Assert\\' => 
         array (
             0 => __DIR__ . '/..' . '/webmozart/assert/src',
@@ -98,10 +113,18 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
         array (
             0 => __DIR__ . '/../..' . '/tests',
         ),
+        'Symfony\\Polyfill\\Php70\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/polyfill-php70',
+        ),
         'Symfony\\Polyfill\\Mbstring\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring',
         ),
+        'Symfony\\Polyfill\\Ctype\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/symfony/polyfill-ctype',
+        ),
         'Symfony\\Component\\Yaml\\' => 
         array (
             0 => __DIR__ . '/..' . '/symfony/yaml',
@@ -134,6 +157,10 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
         array (
             0 => __DIR__ . '/..' . '/psr/container/src',
         ),
+        'Prophecy\\' => 
+        array (
+            0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy',
+        ),
         'Predis\\' => 
         array (
             0 => __DIR__ . '/..' . '/predis/predis/src',
@@ -195,7 +222,7 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
         array (
             'Resque' => 
             array (
-                0 => __DIR__ . '/..' . '/chrisboulton/php-resque/lib',
+                0 => __DIR__ . '/..' . '/resque/php-resque/lib',
             ),
             'RandomLib' => 
             array (
@@ -204,10 +231,6 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
         ),
         'P' => 
         array (
-            'Prophecy\\' => 
-            array (
-                0 => __DIR__ . '/..' . '/phpspec/prophecy/src',
-            ),
             'Pimple' => 
             array (
                 0 => __DIR__ . '/..' . '/pimple/pimple/src',
@@ -240,12 +263,16 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
     );
 
     public static $classMap = array (
+        'ArithmeticError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ArithmeticError.php',
+        'AssertionError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/AssertionError.php',
         'CredisException' => __DIR__ . '/..' . '/colinmollenhour/credis/Client.php',
         'Credis_Client' => __DIR__ . '/..' . '/colinmollenhour/credis/Client.php',
         'Credis_Cluster' => __DIR__ . '/..' . '/colinmollenhour/credis/Cluster.php',
         'Credis_Module' => __DIR__ . '/..' . '/colinmollenhour/credis/Module.php',
         'Credis_Sentinel' => __DIR__ . '/..' . '/colinmollenhour/credis/Sentinel.php',
+        'DivisionByZeroError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/DivisionByZeroError.php',
         'EasyPeasyICS' => __DIR__ . '/..' . '/phpmailer/phpmailer/extras/EasyPeasyICS.php',
+        'Error' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/Error.php',
         'File_Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php',
         'File_Iterator_Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php',
         'File_Iterator_Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php',
@@ -635,6 +662,7 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
         'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
         'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
         'POP3' => __DIR__ . '/..' . '/phpmailer/phpmailer/class.pop3.php',
+        'ParseError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/ParseError.php',
         'SMTP' => __DIR__ . '/..' . '/phpmailer/phpmailer/class.smtp.php',
         'SebastianBergmann\\CodeCoverage\\CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php',
         'SebastianBergmann\\CodeCoverage\\CoveredCodeNotExecutedException' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/Exception/CoveredCodeNotExecutedException.php',
@@ -715,7 +743,9 @@ class ComposerStaticInit03db25c8965eb7fcdca0d6c90029b515
         'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php',
         'SebastianBergmann\\ResourceOperations\\ResourceOperations' => __DIR__ . '/..' . '/sebastian/resource-operations/src/ResourceOperations.php',
         'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php',
+        'SessionUpdateTimestampHandlerInterface' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php',
         'Text_Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php',
+        'TypeError' => __DIR__ . '/..' . '/symfony/polyfill-php70/Resources/stubs/TypeError.php',
         'ntlm_sasl_client_class' => __DIR__ . '/..' . '/phpmailer/phpmailer/extras/ntlm_sasl_client.php',
         'phpmailerException' => __DIR__ . '/..' . '/phpmailer/phpmailer/class.phpmailer.php',
     );
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
index 8b439478..bf1b7194 100644
--- a/vendor/composer/installed.json
+++ b/vendor/composer/installed.json
@@ -1,42 +1,32 @@
 [
     {
-        "name": "chrisboulton/php-resque",
-        "version": "dev-master",
-        "version_normalized": "9999999-dev",
+        "name": "colinmollenhour/credis",
+        "version": "1.10.1",
+        "version_normalized": "1.10.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/chrisboulton/php-resque.git";,
-            "reference": "cf187fae522df085f79837d3763645da066194d6"
+            "url": "https://github.com/colinmollenhour/credis.git";,
+            "reference": "c1cab895f2331a1877738b282d0d8b1ff6d4c92d"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/chrisboulton/php-resque/zipball/cf187fae522df085f79837d3763645da066194d6";,
-            "reference": "cf187fae522df085f79837d3763645da066194d6",
+            "url": "https://api.github.com/repos/colinmollenhour/credis/zipball/c1cab895f2331a1877738b282d0d8b1ff6d4c92d";,
+            "reference": "c1cab895f2331a1877738b282d0d8b1ff6d4c92d",
             "shasum": ""
         },
         "require": {
-            "colinmollenhour/credis": "~1.7",
-            "ext-pcntl": "*",
-            "php": ">=5.3.0",
-            "psr/log": "~1.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "3.7.*"
-        },
-        "suggest": {
-            "ext-proctitle": "Allows php-resque to rename the title of UNIX processes to show the status of a worker.",
-            "ext-redis": "Native PHP extension for Redis connectivity. Credis will automatically utilize when available."
+            "php": ">=5.4.0"
         },
-        "time": "2016-11-03T21:56:00+00:00",
-        "bin": [
-            "bin/resque"
-        ],
+        "time": "2019-03-05T16:29:14+00:00",
         "type": "library",
-        "installation-source": "source",
+        "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Resque": "lib"
-            }
+            "classmap": [
+                "Client.php",
+                "Cluster.php",
+                "Sentinel.php",
+                "Module.php"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
@@ -44,96 +34,130 @@
         ],
         "authors": [
             {
-                "name": "Chris Boulton",
-                "email": "chris@xxxxxxxxxxxxxxx"
+                "name": "Colin Mollenhour",
+                "email": "colin@xxxxxxxxxxxxxx"
             }
         ],
-        "description": "Redis backed library for creating background jobs and processing them later. Based on resque for Ruby.",
-        "homepage": "http://www.github.com/chrisboulton/php-resque/";,
-        "keywords": [
-            "background",
-            "job",
-            "redis",
-            "resque"
-        ]
+        "description": "Credis is a lightweight interface to the Redis key-value store which wraps the phpredis library when available for better performance.",
+        "homepage": "https://github.com/colinmollenhour/credis";
     },
     {
-        "name": "paypal/sdk-core-php",
-        "version": "3.3.2",
-        "version_normalized": "3.3.2.0",
+        "name": "container-interop/container-interop",
+        "version": "1.2.0",
+        "version_normalized": "1.2.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/paypal/sdk-core-php.git";,
-            "reference": "6e4ebde3bc2978f80ddf96441194577f59fe5045"
+            "url": "https://github.com/container-interop/container-interop.git";,
+            "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/paypal/sdk-core-php/zipball/6e4ebde3bc2978f80ddf96441194577f59fe5045";,
-            "reference": "6e4ebde3bc2978f80ddf96441194577f59fe5045",
+            "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8";,
+            "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
             "shasum": ""
         },
         "require": {
-            "ext-curl": "*",
+            "psr/container": "^1.0"
+        },
+        "time": "2017-02-14T19:40:03+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Interop\\Container\\": "src/Interop/Container/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/";,
+        "license": [
+            "MIT"
+        ],
+        "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
+        "homepage": "https://github.com/container-interop/container-interop";
+    },
+    {
+        "name": "cweagans/composer-patches",
+        "version": "1.6.6",
+        "version_normalized": "1.6.6.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/cweagans/composer-patches.git";,
+            "reference": "1d89dcc730e7f42426c434b88261fcfb3bce651e"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/cweagans/composer-patches/zipball/1d89dcc730e7f42426c434b88261fcfb3bce651e";,
+            "reference": "1d89dcc730e7f42426c434b88261fcfb3bce651e",
+            "shasum": ""
+        },
+        "require": {
+            "composer-plugin-api": "^1.0",
             "php": ">=5.3.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "3.7.*"
+            "composer/composer": "~1.0",
+            "phpunit/phpunit": "~4.6"
+        },
+        "time": "2018-10-24T15:51:16+00:00",
+        "type": "composer-plugin",
+        "extra": {
+            "class": "cweagans\\Composer\\Patches"
         },
-        "time": "2016-10-25T17:18:46+00:00",
-        "type": "library",
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "PayPal": "lib/"
+            "psr-4": {
+                "cweagans\\Composer\\": "src"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "Apache-2.0"
+            "BSD-3-Clause"
         ],
         "authors": [
             {
-                "name": "PayPal",
-                "homepage": "https://github.com/paypal/sdk-core-php/contributors";
+                "name": "Cameron Eagans",
+                "email": "me@xxxxxxxxxxxx"
             }
         ],
-        "description": "PayPal Core SDK for PHP",
-        "homepage": "https://github.com/paypal/sdk-core-php";,
-        "keywords": [
-            "paypal",
-            "php",
-            "sdk"
-        ]
+        "description": "Provides a way to patch Composer packages."
     },
     {
-        "name": "psr/http-message",
-        "version": "1.0.1",
-        "version_normalized": "1.0.1.0",
+        "name": "doctrine/instantiator",
+        "version": "1.2.0",
+        "version_normalized": "1.2.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/php-fig/http-message.git";,
-            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+            "url": "https://github.com/doctrine/instantiator.git";,
+            "reference": "a2c590166b2133a4633738648b6b064edae0814a"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363";,
-            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+            "url": "https://api.github.com/repos/doctrine/instantiator/zipball/a2c590166b2133a4633738648b6b064edae0814a";,
+            "reference": "a2c590166b2133a4633738648b6b064edae0814a",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.0"
+            "php": "^7.1"
         },
-        "time": "2016-08-06T14:39:51+00:00",
+        "require-dev": {
+            "doctrine/coding-standard": "^6.0",
+            "ext-pdo": "*",
+            "ext-phar": "*",
+            "phpbench/phpbench": "^0.13",
+            "phpstan/phpstan-phpunit": "^0.11",
+            "phpstan/phpstan-shim": "^0.11",
+            "phpunit/phpunit": "^7.0"
+        },
+        "time": "2019-03-17T17:37:11+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.0.x-dev"
+                "dev-master": "1.2.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Psr\\Http\\Message\\": "src/"
+                "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -142,309 +166,361 @@
         ],
         "authors": [
             {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/";
+                "name": "Marco Pivetta",
+                "email": "ocramius@xxxxxxxxx",
+                "homepage": "http://ocramius.github.com/";
             }
         ],
-        "description": "Common interface for HTTP messages",
-        "homepage": "https://github.com/php-fig/http-message";,
+        "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+        "homepage": "https://www.doctrine-project.org/projects/instantiator.html";,
         "keywords": [
-            "http",
-            "http-message",
-            "psr",
-            "psr-7",
-            "request",
-            "response"
+            "constructor",
+            "instantiate"
         ]
     },
     {
-        "name": "sebastian/version",
-        "version": "2.0.1",
-        "version_normalized": "2.0.1.0",
+        "name": "guzzlehttp/guzzle",
+        "version": "6.3.3",
+        "version_normalized": "6.3.3.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/version.git";,
-            "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+            "url": "https://github.com/guzzle/guzzle.git";,
+            "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019";,
-            "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+            "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba";,
+            "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.6"
+            "guzzlehttp/promises": "^1.0",
+            "guzzlehttp/psr7": "^1.4",
+            "php": ">=5.5"
         },
-        "time": "2016-10-03T07:35:21+00:00",
+        "require-dev": {
+            "ext-curl": "*",
+            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
+            "psr/log": "^1.0"
+        },
+        "suggest": {
+            "psr/log": "Required for using the Log middleware"
+        },
+        "time": "2018-04-22T15:46:56+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.0.x-dev"
+                "dev-master": "6.3-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "src/"
-            ]
+            "files": [
+                "src/functions_include.php"
+            ],
+            "psr-4": {
+                "GuzzleHttp\\": "src/"
+            }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "BSD-3-Clause"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Sebastian Bergmann",
-                "email": "sebastian@xxxxxxxxxx",
-                "role": "lead"
+                "name": "Michael Dowling",
+                "email": "mtdowling@xxxxxxxxx",
+                "homepage": "https://github.com/mtdowling";
             }
         ],
-        "description": "Library that helps with managing the version number of Git-hosted PHP projects",
-        "homepage": "https://github.com/sebastianbergmann/version";
+        "description": "Guzzle is a PHP HTTP client library",
+        "homepage": "http://guzzlephp.org/";,
+        "keywords": [
+            "client",
+            "curl",
+            "framework",
+            "http",
+            "http client",
+            "rest",
+            "web service"
+        ]
     },
     {
-        "name": "sebastian/resource-operations",
-        "version": "1.0.0",
-        "version_normalized": "1.0.0.0",
+        "name": "guzzlehttp/promises",
+        "version": "v1.3.1",
+        "version_normalized": "1.3.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/resource-operations.git";,
-            "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+            "url": "https://github.com/guzzle/promises.git";,
+            "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52";,
-            "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+            "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646";,
+            "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.6.0"
+            "php": ">=5.5.0"
         },
-        "time": "2015-07-28T20:34:47+00:00",
+        "require-dev": {
+            "phpunit/phpunit": "^4.0"
+        },
+        "time": "2016-12-20T10:07:11+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.0.x-dev"
+                "dev-master": "1.4-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "src/"
+            "psr-4": {
+                "GuzzleHttp\\Promise\\": "src/"
+            },
+            "files": [
+                "src/functions_include.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "BSD-3-Clause"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Sebastian Bergmann",
-                "email": "sebastian@xxxxxxxxxx"
+                "name": "Michael Dowling",
+                "email": "mtdowling@xxxxxxxxx",
+                "homepage": "https://github.com/mtdowling";
             }
         ],
-        "description": "Provides a list of PHP built-in functions that operate on resources",
-        "homepage": "https://www.github.com/sebastianbergmann/resource-operations";
+        "description": "Guzzle promises library",
+        "keywords": [
+            "promise"
+        ]
     },
     {
-        "name": "sebastian/recursion-context",
-        "version": "2.0.0",
-        "version_normalized": "2.0.0.0",
+        "name": "guzzlehttp/psr7",
+        "version": "1.5.2",
+        "version_normalized": "1.5.2.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/recursion-context.git";,
-            "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+            "url": "https://github.com/guzzle/psr7.git";,
+            "reference": "9f83dded91781a01c63574e387eaa769be769115"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a";,
-            "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+            "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115";,
+            "reference": "9f83dded91781a01c63574e387eaa769be769115",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.4.0",
+            "psr/http-message": "~1.0",
+            "ralouphie/getallheaders": "^2.0.5"
+        },
+        "provide": {
+            "psr/http-message-implementation": "1.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "~4.4"
+            "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
         },
-        "time": "2016-11-19T07:33:16+00:00",
+        "time": "2018-12-04T20:46:45+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.0.x-dev"
+                "dev-master": "1.5-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "src/"
+            "psr-4": {
+                "GuzzleHttp\\Psr7\\": "src/"
+            },
+            "files": [
+                "src/functions_include.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "BSD-3-Clause"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Jeff Welch",
-                "email": "whatthejeff@xxxxxxxxx"
-            },
-            {
-                "name": "Sebastian Bergmann",
-                "email": "sebastian@xxxxxxxxxx"
+                "name": "Michael Dowling",
+                "email": "mtdowling@xxxxxxxxx",
+                "homepage": "https://github.com/mtdowling";
             },
             {
-                "name": "Adam Harvey",
-                "email": "aharvey@xxxxxxx"
+                "name": "Tobias Schultze",
+                "homepage": "https://github.com/Tobion";
             }
         ],
-        "description": "Provides functionality to recursively process PHP variables",
-        "homepage": "http://www.github.com/sebastianbergmann/recursion-context";
+        "description": "PSR-7 message implementation that also provides common utility methods",
+        "keywords": [
+            "http",
+            "message",
+            "psr-7",
+            "request",
+            "response",
+            "stream",
+            "uri",
+            "url"
+        ]
     },
     {
-        "name": "sebastian/global-state",
-        "version": "1.1.1",
-        "version_normalized": "1.1.1.0",
+        "name": "ircmaxell/random-lib",
+        "version": "v1.2.0",
+        "version_normalized": "1.2.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/global-state.git";,
-            "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+            "url": "https://github.com/ircmaxell/RandomLib.git";,
+            "reference": "e9e0204f40e49fa4419946c677eccd3fa25b8cf4"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4";,
-            "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+            "url": "https://api.github.com/repos/ircmaxell/RandomLib/zipball/e9e0204f40e49fa4419946c677eccd3fa25b8cf4";,
+            "reference": "e9e0204f40e49fa4419946c677eccd3fa25b8cf4",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "ircmaxell/security-lib": "^1.1",
+            "php": ">=5.3.2"
         },
         "require-dev": {
-            "phpunit/phpunit": "~4.2"
-        },
-        "suggest": {
-            "ext-uopz": "*"
+            "friendsofphp/php-cs-fixer": "^1.11",
+            "mikey179/vfsstream": "^1.6",
+            "phpunit/phpunit": "^4.8|^5.0"
         },
-        "time": "2015-10-12T03:26:01+00:00",
+        "time": "2016-09-07T15:52:06+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.0-dev"
+                "dev-master": "1.1.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "src/"
-            ]
+            "psr-0": {
+                "RandomLib": "lib"
+            }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "BSD-3-Clause"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Sebastian Bergmann",
-                "email": "sebastian@xxxxxxxxxx"
+                "name": "Anthony Ferrara",
+                "email": "ircmaxell@xxxxxxxxxxxxx",
+                "homepage": "http://blog.ircmaxell.com";
             }
         ],
-        "description": "Snapshotting of global state",
-        "homepage": "http://www.github.com/sebastianbergmann/global-state";,
+        "description": "A Library For Generating Secure Random Numbers",
+        "homepage": "https://github.com/ircmaxell/RandomLib";,
         "keywords": [
-            "global state"
+            "cryptography",
+            "random",
+            "random-numbers",
+            "random-strings"
         ]
     },
     {
-        "name": "sebastian/exporter",
-        "version": "2.0.0",
-        "version_normalized": "2.0.0.0",
+        "name": "ircmaxell/security-lib",
+        "version": "v1.1.0",
+        "version_normalized": "1.1.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/exporter.git";,
-            "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+            "url": "https://github.com/ircmaxell/SecurityLib.git";,
+            "reference": "f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4";,
-            "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+            "url": "https://api.github.com/repos/ircmaxell/SecurityLib/zipball/f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5";,
+            "reference": "f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3",
-            "sebastian/recursion-context": "~2.0"
+            "php": ">=5.3.2"
         },
         "require-dev": {
-            "ext-mbstring": "*",
-            "phpunit/phpunit": "~4.4"
+            "mikey179/vfsstream": "1.1.*"
         },
-        "time": "2016-11-19T08:54:04+00:00",
+        "time": "2015-03-20T14:31:23+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.0.x-dev"
+                "dev-master": "1.0.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "src/"
-            ]
+            "psr-0": {
+                "SecurityLib": "lib"
+            }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "BSD-3-Clause"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Jeff Welch",
-                "email": "whatthejeff@xxxxxxxxx"
-            },
-            {
-                "name": "Volker Dusch",
-                "email": "github@xxxxxxxxxxxx"
-            },
-            {
-                "name": "Bernhard Schussek",
-                "email": "bschussek@xxxxxxxxxxxxxxx"
-            },
-            {
-                "name": "Sebastian Bergmann",
-                "email": "sebastian@xxxxxxxxxx"
-            },
-            {
-                "name": "Adam Harvey",
-                "email": "aharvey@xxxxxxx"
+                "name": "Anthony Ferrara",
+                "email": "ircmaxell@xxxxxxxxxxxxx",
+                "homepage": "http://blog.ircmaxell.com";
             }
         ],
-        "description": "Provides the functionality to export PHP variables for visualization",
-        "homepage": "http://www.github.com/sebastianbergmann/exporter";,
-        "keywords": [
-            "export",
-            "exporter"
-        ]
+        "description": "A Base Security Library",
+        "homepage": "https://github.com/ircmaxell/SecurityLib";
     },
     {
-        "name": "sebastian/environment",
-        "version": "2.0.0",
-        "version_normalized": "2.0.0.0",
+        "name": "monolog/monolog",
+        "version": "1.24.0",
+        "version_normalized": "1.24.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/environment.git";,
-            "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+            "url": "https://github.com/Seldaek/monolog.git";,
+            "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac";,
-            "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+            "url": "https://api.github.com/repos/Seldaek/monolog/zipball/bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266";,
+            "reference": "bfc9ebb28f97e7a24c45bdc3f0ff482e47bb0266",
             "shasum": ""
         },
         "require": {
-            "php": "^5.6 || ^7.0"
+            "php": ">=5.3.0",
+            "psr/log": "~1.0"
+        },
+        "provide": {
+            "psr/log-implementation": "1.0.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "^5.0"
+            "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+            "doctrine/couchdb": "~1.0@dev",
+            "graylog2/gelf-php": "~1.0",
+            "jakub-onderka/php-parallel-lint": "0.9",
+            "php-amqplib/php-amqplib": "~2.4",
+            "php-console/php-console": "^3.1.3",
+            "phpunit/phpunit": "~4.5",
+            "phpunit/phpunit-mock-objects": "2.3.0",
+            "ruflin/elastica": ">=0.90 <3.0",
+            "sentry/sentry": "^0.13",
+            "swiftmailer/swiftmailer": "^5.3|^6.0"
         },
-        "time": "2016-11-26T07:53:53+00:00",
+        "suggest": {
+            "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
+            "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
+            "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
+            "ext-mongo": "Allow sending log messages to a MongoDB server",
+            "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
+            "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
+            "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
+            "php-console/php-console": "Allow sending log messages to Google Chrome",
+            "rollbar/rollbar": "Allow sending log messages to Rollbar",
+            "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
+            "sentry/sentry": "Allow sending log messages to a Sentry server"
+        },
+        "time": "2018-11-05T09:00:11+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -453,108 +529,109 @@
         },
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "src/"
-            ]
+            "psr-4": {
+                "Monolog\\": "src/Monolog"
+            }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "BSD-3-Clause"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Sebastian Bergmann",
-                "email": "sebastian@xxxxxxxxxx"
+                "name": "Jordi Boggiano",
+                "email": "j.boggiano@xxxxxxx",
+                "homepage": "http://seld.be";
             }
         ],
-        "description": "Provides functionality to handle HHVM/PHP environments",
-        "homepage": "http://www.github.com/sebastianbergmann/environment";,
+        "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
+        "homepage": "http://github.com/Seldaek/monolog";,
         "keywords": [
-            "Xdebug",
-            "environment",
-            "hhvm"
+            "log",
+            "logging",
+            "psr-3"
         ]
     },
     {
-        "name": "doctrine/instantiator",
-        "version": "1.0.5",
-        "version_normalized": "1.0.5.0",
+        "name": "myclabs/deep-copy",
+        "version": "1.9.1",
+        "version_normalized": "1.9.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/doctrine/instantiator.git";,
-            "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+            "url": "https://github.com/myclabs/DeepCopy.git";,
+            "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d";,
-            "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+            "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72";,
+            "reference": "e6828efaba2c9b79f4499dae1d66ef8bfa7b2b72",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3,<8.0-DEV"
+            "php": "^7.1"
+        },
+        "replace": {
+            "myclabs/deep-copy": "self.version"
         },
         "require-dev": {
-            "athletic/athletic": "~0.1.8",
-            "ext-pdo": "*",
-            "ext-phar": "*",
-            "phpunit/phpunit": "~4.0",
-            "squizlabs/php_codesniffer": "~2.0"
+            "doctrine/collections": "^1.0",
+            "doctrine/common": "^2.6",
+            "phpunit/phpunit": "^7.1"
         },
-        "time": "2015-06-14T21:17:01+00:00",
+        "time": "2019-04-07T13:18:21+00:00",
         "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.0.x-dev"
-            }
-        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
-            }
+                "DeepCopy\\": "src/DeepCopy/"
+            },
+            "files": [
+                "src/DeepCopy/deep_copy.php"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
             "MIT"
         ],
-        "authors": [
-            {
-                "name": "Marco Pivetta",
-                "email": "ocramius@xxxxxxxxx",
-                "homepage": "http://ocramius.github.com/";
-            }
-        ],
-        "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
-        "homepage": "https://github.com/doctrine/instantiator";,
+        "description": "Create deep copies (clones) of your objects",
         "keywords": [
-            "constructor",
-            "instantiate"
+            "clone",
+            "copy",
+            "duplicate",
+            "object",
+            "object graph"
         ]
     },
     {
-        "name": "phpunit/php-text-template",
-        "version": "1.2.1",
-        "version_normalized": "1.2.1.0",
+        "name": "nikic/fast-route",
+        "version": "v1.3.0",
+        "version_normalized": "1.3.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/php-text-template.git";,
-            "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+            "url": "https://github.com/nikic/FastRoute.git";,
+            "reference": "181d480e08d9476e61381e04a71b34dc0432e812"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686";,
-            "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+            "url": "https://api.github.com/repos/nikic/FastRoute/zipball/181d480e08d9476e61381e04a71b34dc0432e812";,
+            "reference": "181d480e08d9476e61381e04a71b34dc0432e812",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": ">=5.4.0"
         },
-        "time": "2015-06-21T13:50:34+00:00",
+        "require-dev": {
+            "phpunit/phpunit": "^4.8.35|~5.7"
+        },
+        "time": "2018-02-13T20:26:39+00:00",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "src/"
+            "psr-4": {
+                "FastRoute\\": "src/"
+            },
+            "files": [
+                "src/functions.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -563,192 +640,183 @@
         ],
         "authors": [
             {
-                "name": "Sebastian Bergmann",
-                "email": "sebastian@xxxxxxxxxx",
-                "role": "lead"
+                "name": "Nikita Popov",
+                "email": "nikic@xxxxxxx"
             }
         ],
-        "description": "Simple template engine.",
-        "homepage": "https://github.com/sebastianbergmann/php-text-template/";,
+        "description": "Fast request router for PHP",
         "keywords": [
-            "template"
+            "router",
+            "routing"
         ]
     },
     {
-        "name": "phpunit/php-file-iterator",
-        "version": "1.4.2",
-        "version_normalized": "1.4.2.0",
+        "name": "paragonie/random_compat",
+        "version": "v9.99.99",
+        "version_normalized": "9.99.99.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/php-file-iterator.git";,
-            "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+            "url": "https://github.com/paragonie/random_compat.git";,
+            "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5";,
-            "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+            "url": "https://api.github.com/repos/paragonie/random_compat/zipball/84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95";,
+            "reference": "84b4dfb120c6f9b4ff7b3685f9b8f1aa365a0c95",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
+            "php": "^7"
         },
-        "time": "2016-10-03T07:40:28+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.4.x-dev"
-            }
+        "require-dev": {
+            "phpunit/phpunit": "4.*|5.*",
+            "vimeo/psalm": "^1"
         },
-        "installation-source": "dist",
-        "autoload": {
-            "classmap": [
-                "src/"
-            ]
+        "suggest": {
+            "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
         },
+        "time": "2018-07-02T15:55:56+00:00",
+        "type": "library",
+        "installation-source": "dist",
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "BSD-3-Clause"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Sebastian Bergmann",
-                "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
-                "role": "lead"
+                "name": "Paragon Initiative Enterprises",
+                "email": "security@xxxxxxxxxxxxx",
+                "homepage": "https://paragonie.com";
             }
         ],
-        "description": "FilterIterator implementation that filters files based on a list of suffixes.",
-        "homepage": "https://github.com/sebastianbergmann/php-file-iterator/";,
+        "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
         "keywords": [
-            "filesystem",
-            "iterator"
+            "csprng",
+            "polyfill",
+            "pseudorandom",
+            "random"
         ]
     },
     {
-        "name": "webmozart/assert",
-        "version": "1.2.0",
-        "version_normalized": "1.2.0.0",
+        "name": "paypal/merchant-sdk-php",
+        "version": "v3.12.0",
+        "version_normalized": "3.12.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/webmozart/assert.git";,
-            "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
+            "url": "https://github.com/paypal/merchant-sdk-php.git";,
+            "reference": "f21fe42ad787f98ea5d7186b19e8bec97f1852ed"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f";,
-            "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
+            "url": "https://api.github.com/repos/paypal/merchant-sdk-php/zipball/f21fe42ad787f98ea5d7186b19e8bec97f1852ed";,
+            "reference": "f21fe42ad787f98ea5d7186b19e8bec97f1852ed",
             "shasum": ""
         },
         "require": {
-            "php": "^5.3.3 || ^7.0"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "^4.6",
-            "sebastian/version": "^1.0.1"
+            "ext-curl": "*",
+            "paypal/sdk-core-php": "3.*",
+            "php": ">=5.3.0"
         },
-        "time": "2016-11-23T20:04:58+00:00",
+        "time": "2017-10-10T19:03:05+00:00",
         "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.3-dev"
-            }
-        },
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "Webmozart\\Assert\\": "src/"
+            "psr-0": {
+                "PayPal\\Service": "lib/",
+                "PayPal\\CoreComponentTypes": "lib/",
+                "PayPal\\EBLBaseComponents": "lib/",
+                "PayPal\\EnhancedDataTypes": "lib/",
+                "PayPal\\PayPalAPI": "lib/"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "MIT"
+            "Apache-2.0"
         ],
         "authors": [
             {
-                "name": "Bernhard Schussek",
-                "email": "bschussek@xxxxxxxxx"
+                "name": "PayPal",
+                "homepage": "https://github.com/paypal/merchant-sdk-php/contributors";
             }
         ],
-        "description": "Assertions to validate method input/output with nice error messages.",
+        "description": "PayPal Merchant SDK for PHP",
+        "homepage": "https://developer.paypal.com";,
         "keywords": [
-            "assert",
-            "check",
-            "validate"
+            "paypal",
+            "php",
+            "sdk"
         ]
     },
     {
-        "name": "predis/predis",
-        "version": "v1.1.1",
-        "version_normalized": "1.1.1.0",
+        "name": "paypal/sdk-core-php",
+        "version": "3.4.0",
+        "version_normalized": "3.4.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/nrk/predis.git";,
-            "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1"
+            "url": "https://github.com/paypal/sdk-core-php.git";,
+            "reference": "d2174f69f9811a8f2e79af7498fdf89586457d76"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1";,
-            "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1",
+            "url": "https://api.github.com/repos/paypal/sdk-core-php/zipball/d2174f69f9811a8f2e79af7498fdf89586457d76";,
+            "reference": "d2174f69f9811a8f2e79af7498fdf89586457d76",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.9"
+            "ext-curl": "*",
+            "php": ">=5.3.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "~4.8"
-        },
-        "suggest": {
-            "ext-curl": "Allows access to Webdis when paired with phpiredis",
-            "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
+            "phpunit/phpunit": "3.7.*"
         },
-        "time": "2016-06-16T16:22:20+00:00",
+        "time": "2017-11-13T18:53:13+00:00",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "Predis\\": "src/"
+            "psr-0": {
+                "PayPal": "lib/"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "MIT"
+            "Apache-2.0"
         ],
         "authors": [
             {
-                "name": "Daniele Alessandri",
-                "email": "suppakilla@xxxxxxxxx",
-                "homepage": "http://clorophilla.net";
+                "name": "PayPal",
+                "homepage": "https://github.com/paypal/sdk-core-php/contributors";
             }
         ],
-        "description": "Flexible and feature-complete Redis client for PHP and HHVM",
-        "homepage": "http://github.com/nrk/predis";,
+        "description": "PayPal Core SDK for PHP",
+        "homepage": "https://github.com/paypal/sdk-core-php";,
         "keywords": [
-            "nosql",
-            "predis",
-            "redis"
+            "paypal",
+            "php",
+            "sdk"
         ]
     },
     {
-        "name": "ircmaxell/security-lib",
-        "version": "v1.1.0",
-        "version_normalized": "1.1.0.0",
+        "name": "phpdocumentor/reflection-common",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/ircmaxell/SecurityLib.git";,
-            "reference": "f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5"
+            "url": "https://github.com/phpDocumentor/ReflectionCommon.git";,
+            "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/ircmaxell/SecurityLib/zipball/f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5";,
-            "reference": "f3db6de12c20c9bcd1aa3db4353a1bbe0e44e1b5",
+            "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6";,
+            "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.2"
+            "php": ">=5.5"
         },
         "require-dev": {
-            "mikey179/vfsstream": "1.1.*"
+            "phpunit/phpunit": "^4.6"
         },
-        "time": "2015-03-20T14:31:23+00:00",
+        "time": "2017-09-11T18:02:19+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -757,8 +825,10 @@
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "SecurityLib": "lib"
+            "psr-4": {
+                "phpDocumentor\\Reflection\\": [
+                    "src"
+                ]
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -767,49 +837,59 @@
         ],
         "authors": [
             {
-                "name": "Anthony Ferrara",
-                "email": "ircmaxell@xxxxxxxxxxxxx",
-                "homepage": "http://blog.ircmaxell.com";
+                "name": "Jaap van Otterdijk",
+                "email": "opensource@xxxxxxxx"
             }
         ],
-        "description": "A Base Security Library",
-        "homepage": "https://github.com/ircmaxell/SecurityLib";
+        "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+        "homepage": "http://www.phpdoc.org";,
+        "keywords": [
+            "FQSEN",
+            "phpDocumentor",
+            "phpdoc",
+            "reflection",
+            "static analysis"
+        ]
     },
     {
-        "name": "ircmaxell/random-lib",
-        "version": "v1.2.0",
-        "version_normalized": "1.2.0.0",
+        "name": "phpdocumentor/reflection-docblock",
+        "version": "4.3.1",
+        "version_normalized": "4.3.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/ircmaxell/RandomLib.git";,
-            "reference": "e9e0204f40e49fa4419946c677eccd3fa25b8cf4"
+            "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git";,
+            "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/ircmaxell/RandomLib/zipball/e9e0204f40e49fa4419946c677eccd3fa25b8cf4";,
-            "reference": "e9e0204f40e49fa4419946c677eccd3fa25b8cf4",
+            "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c";,
+            "reference": "bdd9f737ebc2a01c06ea7ff4308ec6697db9b53c",
             "shasum": ""
         },
         "require": {
-            "ircmaxell/security-lib": "^1.1",
-            "php": ">=5.3.2"
+            "php": "^7.0",
+            "phpdocumentor/reflection-common": "^1.0.0",
+            "phpdocumentor/type-resolver": "^0.4.0",
+            "webmozart/assert": "^1.0"
         },
         "require-dev": {
-            "friendsofphp/php-cs-fixer": "^1.11",
-            "mikey179/vfsstream": "^1.6",
-            "phpunit/phpunit": "^4.8|^5.0"
+            "doctrine/instantiator": "~1.0.5",
+            "mockery/mockery": "^1.0",
+            "phpunit/phpunit": "^6.4"
         },
-        "time": "2016-09-07T15:52:06+00:00",
+        "time": "2019-04-30T17:48:53+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.1.x-dev"
+                "dev-master": "4.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "RandomLib": "lib"
+            "psr-4": {
+                "phpDocumentor\\Reflection\\": [
+                    "src/"
+                ]
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -818,39 +898,36 @@
         ],
         "authors": [
             {
-                "name": "Anthony Ferrara",
-                "email": "ircmaxell@xxxxxxxxxxxxx",
-                "homepage": "http://blog.ircmaxell.com";
+                "name": "Mike van Riel",
+                "email": "me@xxxxxxxxxxxxxxx"
             }
         ],
-        "description": "A Library For Generating Secure Random Numbers",
-        "homepage": "https://github.com/ircmaxell/RandomLib";,
-        "keywords": [
-            "cryptography",
-            "random",
-            "random-numbers",
-            "random-strings"
-        ]
+        "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock."
     },
     {
-        "name": "psr/log",
-        "version": "1.0.2",
-        "version_normalized": "1.0.2.0",
+        "name": "phpdocumentor/type-resolver",
+        "version": "0.4.0",
+        "version_normalized": "0.4.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/php-fig/log.git";,
-            "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
+            "url": "https://github.com/phpDocumentor/TypeResolver.git";,
+            "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d";,
-            "reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
+            "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7";,
+            "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.0"
+            "php": "^5.5 || ^7.0",
+            "phpdocumentor/reflection-common": "^1.0"
+        },
+        "require-dev": {
+            "mockery/mockery": "^0.9.4",
+            "phpunit/phpunit": "^5.2||^4.8.24"
         },
-        "time": "2016-10-10T12:19:37+00:00",
+        "time": "2017-07-14T14:27:02+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -860,7 +937,9 @@
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Psr\\Log\\": "Psr/Log/"
+                "phpDocumentor\\Reflection\\": [
+                    "src/"
+                ]
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -869,77 +948,127 @@
         ],
         "authors": [
             {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/";
+                "name": "Mike van Riel",
+                "email": "me@xxxxxxxxxxxxxxx"
             }
-        ],
-        "description": "Common interface for logging libraries",
-        "homepage": "https://github.com/php-fig/log";,
-        "keywords": [
-            "log",
-            "psr",
-            "psr-3"
         ]
     },
     {
-        "name": "monolog/monolog",
-        "version": "1.23.0",
-        "version_normalized": "1.23.0.0",
+        "name": "phpmailer/phpmailer",
+        "version": "v5.2.27",
+        "version_normalized": "5.2.27.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/Seldaek/monolog.git";,
-            "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4"
+            "url": "https://github.com/PHPMailer/PHPMailer.git";,
+            "reference": "dde1db116511aa4956389d75546c5be4c2beb2a6"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd8c787753b3a2ad11bc60c063cff1358a32a3b4";,
-            "reference": "fd8c787753b3a2ad11bc60c063cff1358a32a3b4",
+            "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/dde1db116511aa4956389d75546c5be4c2beb2a6";,
+            "reference": "dde1db116511aa4956389d75546c5be4c2beb2a6",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.0",
-            "psr/log": "~1.0"
-        },
-        "provide": {
-            "psr/log-implementation": "1.0.0"
+            "ext-ctype": "*",
+            "php": ">=5.0.0"
         },
         "require-dev": {
-            "aws/aws-sdk-php": "^2.4.9 || ^3.0",
-            "doctrine/couchdb": "~1.0@dev",
-            "graylog2/gelf-php": "~1.0",
-            "jakub-onderka/php-parallel-lint": "0.9",
-            "php-amqplib/php-amqplib": "~2.4",
-            "php-console/php-console": "^3.1.3",
-            "phpunit/phpunit": "~4.5",
-            "phpunit/phpunit-mock-objects": "2.3.0",
-            "ruflin/elastica": ">=0.90 <3.0",
-            "sentry/sentry": "^0.13",
-            "swiftmailer/swiftmailer": "^5.3|^6.0"
-        },
-        "suggest": {
-            "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB",
-            "doctrine/couchdb": "Allow sending log messages to a CouchDB server",
-            "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)",
-            "ext-mongo": "Allow sending log messages to a MongoDB server",
-            "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server",
-            "mongodb/mongodb": "Allow sending log messages to a MongoDB server via PHP Driver",
-            "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib",
-            "php-console/php-console": "Allow sending log messages to Google Chrome",
-            "rollbar/rollbar": "Allow sending log messages to Rollbar",
-            "ruflin/elastica": "Allow sending log messages to an Elastic Search server",
-            "sentry/sentry": "Allow sending log messages to a Sentry server"
+            "doctrine/annotations": "1.2.*",
+            "jms/serializer": "0.16.*",
+            "phpdocumentor/phpdocumentor": "2.*",
+            "phpunit/phpunit": "4.8.*",
+            "symfony/debug": "2.8.*",
+            "symfony/filesystem": "2.8.*",
+            "symfony/translation": "2.8.*",
+            "symfony/yaml": "2.8.*",
+            "zendframework/zend-cache": "2.5.1",
+            "zendframework/zend-config": "2.5.1",
+            "zendframework/zend-eventmanager": "2.5.1",
+            "zendframework/zend-filter": "2.5.1",
+            "zendframework/zend-i18n": "2.5.1",
+            "zendframework/zend-json": "2.5.1",
+            "zendframework/zend-math": "2.5.1",
+            "zendframework/zend-serializer": "2.5.*",
+            "zendframework/zend-servicemanager": "2.5.*",
+            "zendframework/zend-stdlib": "2.5.1"
+        },
+        "suggest": {
+            "league/oauth2-google": "Needed for Google XOAUTH2 authentication"
+        },
+        "time": "2018-11-15T22:32:31+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "classmap": [
+                "class.phpmailer.php",
+                "class.phpmaileroauth.php",
+                "class.phpmaileroauthgoogle.php",
+                "class.smtp.php",
+                "class.pop3.php",
+                "extras/EasyPeasyICS.php",
+                "extras/ntlm_sasl_client.php"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/";,
+        "license": [
+            "LGPL-2.1"
+        ],
+        "authors": [
+            {
+                "name": "Jim Jagielski",
+                "email": "jimjag@xxxxxxxxx"
+            },
+            {
+                "name": "Marcus Bointon",
+                "email": "phpmailer@xxxxxxxxxxxxxxxxxx"
+            },
+            {
+                "name": "Andy Prevost",
+                "email": "codeworxtech@xxxxxxxxxxxxxxxxxxxxx"
+            },
+            {
+                "name": "Brent R. Matzelle"
+            }
+        ],
+        "description": "PHPMailer is a full-featured email creation and transfer class for PHP"
+    },
+    {
+        "name": "phpspec/prophecy",
+        "version": "1.8.1",
+        "version_normalized": "1.8.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/phpspec/prophecy.git";,
+            "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/phpspec/prophecy/zipball/1927e75f4ed19131ec9bcc3b002e07fb1173ee76";,
+            "reference": "1927e75f4ed19131ec9bcc3b002e07fb1173ee76",
+            "shasum": ""
+        },
+        "require": {
+            "doctrine/instantiator": "^1.0.2",
+            "php": "^5.3|^7.0",
+            "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
+            "sebastian/comparator": "^1.1|^2.0|^3.0",
+            "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+        },
+        "require-dev": {
+            "phpspec/phpspec": "^2.5|^3.2",
+            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
         },
-        "time": "2017-06-19T01:22:40+00:00",
+        "time": "2019-06-13T12:50:23+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.0.x-dev"
+                "dev-master": "1.8.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Monolog\\": "src/Monolog"
+                "Prophecy\\": "src/Prophecy"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -948,180 +1077,410 @@
         ],
         "authors": [
             {
-                "name": "Jordi Boggiano",
-                "email": "j.boggiano@xxxxxxx",
-                "homepage": "http://seld.be";
+                "name": "Konstantin Kudryashov",
+                "email": "ever.zet@xxxxxxxxx",
+                "homepage": "http://everzet.com";
+            },
+            {
+                "name": "Marcello Duarte",
+                "email": "marcello.duarte@xxxxxxxxx"
             }
         ],
-        "description": "Sends your logs to files, sockets, inboxes, databases and various web services",
-        "homepage": "http://github.com/Seldaek/monolog";,
+        "description": "Highly opinionated mocking framework for PHP 5.3+",
+        "homepage": "https://github.com/phpspec/prophecy";,
         "keywords": [
-            "log",
-            "logging",
-            "psr-3"
+            "Double",
+            "Dummy",
+            "fake",
+            "mock",
+            "spy",
+            "stub"
         ]
     },
     {
-        "name": "paypal/merchant-sdk-php",
-        "version": "v3.11.0",
-        "version_normalized": "3.11.0.0",
+        "name": "phpunit/php-code-coverage",
+        "version": "4.0.8",
+        "version_normalized": "4.0.8.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/paypal/merchant-sdk-php.git";,
-            "reference": "32d81255624736e4a7892fecf475a0800736cf72"
+            "url": "https://github.com/sebastianbergmann/php-code-coverage.git";,
+            "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/paypal/merchant-sdk-php/zipball/32d81255624736e4a7892fecf475a0800736cf72";,
-            "reference": "32d81255624736e4a7892fecf475a0800736cf72",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d";,
+            "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
             "shasum": ""
         },
         "require": {
-            "ext-curl": "*",
-            "paypal/sdk-core-php": "3.*",
-            "php": ">=5.3.0"
+            "ext-dom": "*",
+            "ext-xmlwriter": "*",
+            "php": "^5.6 || ^7.0",
+            "phpunit/php-file-iterator": "^1.3",
+            "phpunit/php-text-template": "^1.2",
+            "phpunit/php-token-stream": "^1.4.2 || ^2.0",
+            "sebastian/code-unit-reverse-lookup": "^1.0",
+            "sebastian/environment": "^1.3.2 || ^2.0",
+            "sebastian/version": "^1.0 || ^2.0"
+        },
+        "require-dev": {
+            "ext-xdebug": "^2.1.4",
+            "phpunit/phpunit": "^5.7"
+        },
+        "suggest": {
+            "ext-xdebug": "^2.5.1"
         },
-        "time": "2017-03-07T18:02:13+00:00",
+        "time": "2017-04-02T07:44:40+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "4.0.x-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "PayPal\\Service": "lib/",
-                "PayPal\\CoreComponentTypes": "lib/",
-                "PayPal\\EBLBaseComponents": "lib/",
-                "PayPal\\EnhancedDataTypes": "lib/",
-                "PayPal\\PayPalAPI": "lib/"
+            "classmap": [
+                "src/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/";,
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
+                "role": "lead"
             }
+        ],
+        "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+        "homepage": "https://github.com/sebastianbergmann/php-code-coverage";,
+        "keywords": [
+            "coverage",
+            "testing",
+            "xunit"
+        ]
+    },
+    {
+        "name": "phpunit/php-file-iterator",
+        "version": "1.4.5",
+        "version_normalized": "1.4.5.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/sebastianbergmann/php-file-iterator.git";,
+            "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/730b01bc3e867237eaac355e06a36b85dd93a8b4";,
+            "reference": "730b01bc3e867237eaac355e06a36b85dd93a8b4",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.3"
+        },
+        "time": "2017-11-27T13:52:08+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.4.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "classmap": [
+                "src/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "Apache-2.0"
+            "BSD-3-Clause"
         ],
         "authors": [
             {
-                "name": "PayPal",
-                "homepage": "https://github.com/paypal/merchant-sdk-php/contributors";
+                "name": "Sebastian Bergmann",
+                "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
+                "role": "lead"
             }
         ],
-        "description": "PayPal Merchant SDK for PHP",
-        "homepage": "https://developer.paypal.com";,
+        "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+        "homepage": "https://github.com/sebastianbergmann/php-file-iterator/";,
         "keywords": [
-            "paypal",
-            "php",
-            "sdk"
+            "filesystem",
+            "iterator"
         ]
     },
     {
-        "name": "psr/container",
-        "version": "1.0.0",
-        "version_normalized": "1.0.0.0",
+        "name": "phpunit/php-text-template",
+        "version": "1.2.1",
+        "version_normalized": "1.2.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/php-fig/container.git";,
-            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+            "url": "https://github.com/sebastianbergmann/php-text-template.git";,
+            "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f";,
-            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686";,
+            "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.0"
+            "php": ">=5.3.3"
+        },
+        "time": "2015-06-21T13:50:34+00:00",
+        "type": "library",
+        "installation-source": "dist",
+        "autoload": {
+            "classmap": [
+                "src/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/";,
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sebastian@xxxxxxxxxx",
+                "role": "lead"
+            }
+        ],
+        "description": "Simple template engine.",
+        "homepage": "https://github.com/sebastianbergmann/php-text-template/";,
+        "keywords": [
+            "template"
+        ]
+    },
+    {
+        "name": "phpunit/php-timer",
+        "version": "1.0.9",
+        "version_normalized": "1.0.9.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/sebastianbergmann/php-timer.git";,
+            "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f";,
+            "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+            "shasum": ""
+        },
+        "require": {
+            "php": "^5.3.3 || ^7.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+        },
+        "time": "2017-02-26T11:10:40+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "classmap": [
+                "src/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/";,
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
+                "role": "lead"
+            }
+        ],
+        "description": "Utility class for timing",
+        "homepage": "https://github.com/sebastianbergmann/php-timer/";,
+        "keywords": [
+            "timer"
+        ]
+    },
+    {
+        "name": "phpunit/php-token-stream",
+        "version": "2.0.2",
+        "version_normalized": "2.0.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/sebastianbergmann/php-token-stream.git";,
+            "reference": "791198a2c6254db10131eecfe8c06670700904db"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db";,
+            "reference": "791198a2c6254db10131eecfe8c06670700904db",
+            "shasum": ""
+        },
+        "require": {
+            "ext-tokenizer": "*",
+            "php": "^7.0"
+        },
+        "require-dev": {
+            "phpunit/phpunit": "^6.2.4"
+        },
+        "time": "2017-11-27T05:48:46+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.0-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "classmap": [
+                "src/"
+            ]
+        },
+        "notification-url": "https://packagist.org/downloads/";,
+        "license": [
+            "BSD-3-Clause"
+        ],
+        "authors": [
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sebastian@xxxxxxxxxx"
+            }
+        ],
+        "description": "Wrapper around PHP's tokenizer extension.",
+        "homepage": "https://github.com/sebastianbergmann/php-token-stream/";,
+        "keywords": [
+            "tokenizer"
+        ]
+    },
+    {
+        "name": "phpunit/phpunit",
+        "version": "5.7.27",
+        "version_normalized": "5.7.27.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/sebastianbergmann/phpunit.git";,
+            "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c";,
+            "reference": "b7803aeca3ccb99ad0a506fa80b64cd6a56bbc0c",
+            "shasum": ""
+        },
+        "require": {
+            "ext-dom": "*",
+            "ext-json": "*",
+            "ext-libxml": "*",
+            "ext-mbstring": "*",
+            "ext-xml": "*",
+            "myclabs/deep-copy": "~1.3",
+            "php": "^5.6 || ^7.0",
+            "phpspec/prophecy": "^1.6.2",
+            "phpunit/php-code-coverage": "^4.0.4",
+            "phpunit/php-file-iterator": "~1.4",
+            "phpunit/php-text-template": "~1.2",
+            "phpunit/php-timer": "^1.0.6",
+            "phpunit/phpunit-mock-objects": "^3.2",
+            "sebastian/comparator": "^1.2.4",
+            "sebastian/diff": "^1.4.3",
+            "sebastian/environment": "^1.3.4 || ^2.0",
+            "sebastian/exporter": "~2.0",
+            "sebastian/global-state": "^1.1",
+            "sebastian/object-enumerator": "~2.0",
+            "sebastian/resource-operations": "~1.0",
+            "sebastian/version": "^1.0.6|^2.0.1",
+            "symfony/yaml": "~2.1|~3.0|~4.0"
+        },
+        "conflict": {
+            "phpdocumentor/reflection-docblock": "3.0.2"
+        },
+        "require-dev": {
+            "ext-pdo": "*"
+        },
+        "suggest": {
+            "ext-xdebug": "*",
+            "phpunit/php-invoker": "~1.1"
         },
-        "time": "2017-02-14T16:28:37+00:00",
+        "time": "2018-02-01T05:50:59+00:00",
+        "bin": [
+            "phpunit"
+        ],
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.0.x-dev"
+                "dev-master": "5.7.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "Psr\\Container\\": "src/"
-            }
+            "classmap": [
+                "src/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "MIT"
+            "BSD-3-Clause"
         ],
         "authors": [
             {
-                "name": "PHP-FIG",
-                "homepage": "http://www.php-fig.org/";
+                "name": "Sebastian Bergmann",
+                "email": "sebastian@xxxxxxxxxx",
+                "role": "lead"
             }
         ],
-        "description": "Common Container Interface (PHP FIG PSR-11)",
-        "homepage": "https://github.com/php-fig/container";,
+        "description": "The PHP Unit Testing framework.",
+        "homepage": "https://phpunit.de/";,
         "keywords": [
-            "PSR-11",
-            "container",
-            "container-interface",
-            "container-interop",
-            "psr"
+            "phpunit",
+            "testing",
+            "xunit"
         ]
     },
     {
-        "name": "container-interop/container-interop",
-        "version": "1.2.0",
-        "version_normalized": "1.2.0.0",
+        "name": "phpunit/phpunit-mock-objects",
+        "version": "3.4.4",
+        "version_normalized": "3.4.4.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/container-interop/container-interop.git";,
-            "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8"
+            "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git";,
+            "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/container-interop/container-interop/zipball/79cbf1341c22ec75643d841642dd5d6acd83bdb8";,
-            "reference": "79cbf1341c22ec75643d841642dd5d6acd83bdb8",
+            "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118";,
+            "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
             "shasum": ""
         },
         "require": {
-            "psr/container": "^1.0"
-        },
-        "time": "2017-02-14T19:40:03+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "Interop\\Container\\": "src/Interop/Container/"
-            }
+            "doctrine/instantiator": "^1.0.2",
+            "php": "^5.6 || ^7.0",
+            "phpunit/php-text-template": "^1.2",
+            "sebastian/exporter": "^1.2 || ^2.0"
         },
-        "notification-url": "https://packagist.org/downloads/";,
-        "license": [
-            "MIT"
-        ],
-        "description": "Promoting the interoperability of container objects (DIC, SL, etc.)",
-        "homepage": "https://github.com/container-interop/container-interop";
-    },
-    {
-        "name": "nikic/fast-route",
-        "version": "v1.2.0",
-        "version_normalized": "1.2.0.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/nikic/FastRoute.git";,
-            "reference": "b5f95749071c82a8e0f58586987627054400cdf6"
+        "conflict": {
+            "phpunit/phpunit": "<5.4.0"
         },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/nikic/FastRoute/zipball/b5f95749071c82a8e0f58586987627054400cdf6";,
-            "reference": "b5f95749071c82a8e0f58586987627054400cdf6",
-            "shasum": ""
+        "require-dev": {
+            "phpunit/phpunit": "^5.4"
         },
-        "require": {
-            "php": ">=5.4.0"
+        "suggest": {
+            "ext-soap": "*"
         },
-        "time": "2017-01-19T11:35:12+00:00",
+        "time": "2017-06-30T09:13:00+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "3.2.x-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "FastRoute\\": "src/"
-            },
-            "files": [
-                "src/functions.php"
+            "classmap": [
+                "src/"
             ]
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -1130,29 +1489,31 @@
         ],
         "authors": [
             {
-                "name": "Nikita Popov",
-                "email": "nikic@xxxxxxx"
+                "name": "Sebastian Bergmann",
+                "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
+                "role": "lead"
             }
         ],
-        "description": "Fast request router for PHP",
+        "description": "Mock Object library for PHPUnit",
+        "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/";,
         "keywords": [
-            "router",
-            "routing"
+            "mock",
+            "xunit"
         ]
     },
     {
         "name": "pimple/pimple",
-        "version": "v3.2.2",
-        "version_normalized": "3.2.2.0",
+        "version": "v3.2.3",
+        "version_normalized": "3.2.3.0",
         "source": {
             "type": "git",
             "url": "https://github.com/silexphp/Pimple.git";,
-            "reference": "4d45fb62d96418396ec58ba76e6f065bca16e10a"
+            "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/silexphp/Pimple/zipball/4d45fb62d96418396ec58ba76e6f065bca16e10a";,
-            "reference": "4d45fb62d96418396ec58ba76e6f065bca16e10a",
+            "url": "https://api.github.com/repos/silexphp/Pimple/zipball/9e403941ef9d65d20cba7d54e29fe906db42cf32";,
+            "reference": "9e403941ef9d65d20cba7d54e29fe906db42cf32",
             "shasum": ""
         },
         "require": {
@@ -1162,7 +1523,7 @@
         "require-dev": {
             "symfony/phpunit-bridge": "^3.2"
         },
-        "time": "2017-07-23T07:32:15+00:00",
+        "time": "2018-01-21T07:42:36+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
@@ -1193,41 +1554,36 @@
         ]
     },
     {
-        "name": "slim/slim",
-        "version": "3.8.1",
-        "version_normalized": "3.8.1.0",
+        "name": "predis/predis",
+        "version": "v1.1.1",
+        "version_normalized": "1.1.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/slimphp/Slim.git";,
-            "reference": "5385302707530b2bccee1769613ad769859b826d"
+            "url": "https://github.com/nrk/predis.git";,
+            "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/slimphp/Slim/zipball/5385302707530b2bccee1769613ad769859b826d";,
-            "reference": "5385302707530b2bccee1769613ad769859b826d",
+            "url": "https://api.github.com/repos/nrk/predis/zipball/f0210e38881631afeafb56ab43405a92cafd9fd1";,
+            "reference": "f0210e38881631afeafb56ab43405a92cafd9fd1",
             "shasum": ""
         },
         "require": {
-            "container-interop/container-interop": "^1.2",
-            "nikic/fast-route": "^1.0",
-            "php": ">=5.5.0",
-            "pimple/pimple": "^3.0",
-            "psr/container": "^1.0",
-            "psr/http-message": "^1.0"
-        },
-        "provide": {
-            "psr/http-message-implementation": "1.0"
+            "php": ">=5.3.9"
         },
         "require-dev": {
-            "phpunit/phpunit": "^4.0",
-            "squizlabs/php_codesniffer": "^2.5"
+            "phpunit/phpunit": "~4.8"
+        },
+        "suggest": {
+            "ext-curl": "Allows access to Webdis when paired with phpiredis",
+            "ext-phpiredis": "Allows faster serialization and deserialization of the Redis protocol"
         },
-        "time": "2017-03-19T17:55:20+00:00",
+        "time": "2016-06-16T16:22:20+00:00",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Slim\\": "Slim"
+                "Predis\\": "src/"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -1236,71 +1592,49 @@
         ],
         "authors": [
             {
-                "name": "Rob Allen",
-                "email": "rob@xxxxxxxxxxx",
-                "homepage": "http://akrabat.com";
-            },
-            {
-                "name": "Josh Lockhart",
-                "email": "hello@xxxxxxxxxxxxxxxx",
-                "homepage": "https://joshlockhart.com";
-            },
-            {
-                "name": "Gabriel Manricks",
-                "email": "gmanricks@xxxxxx",
-                "homepage": "http://gabrielmanricks.com";
-            },
-            {
-                "name": "Andrew Smith",
-                "email": "a.smith@xxxxxxxxxxxxxxxxx",
-                "homepage": "http://silentworks.co.uk";
+                "name": "Daniele Alessandri",
+                "email": "suppakilla@xxxxxxxxx",
+                "homepage": "http://clorophilla.net";
             }
         ],
-        "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
-        "homepage": "https://slimframework.com";,
+        "description": "Flexible and feature-complete Redis client for PHP and HHVM",
+        "homepage": "http://github.com/nrk/predis";,
         "keywords": [
-            "api",
-            "framework",
-            "micro",
-            "router"
+            "nosql",
+            "predis",
+            "redis"
         ]
     },
     {
-        "name": "symfony/polyfill-mbstring",
-        "version": "v1.5.0",
-        "version_normalized": "1.5.0.0",
+        "name": "psr/container",
+        "version": "1.0.0",
+        "version_normalized": "1.0.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/polyfill-mbstring.git";,
-            "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803"
+            "url": "https://github.com/php-fig/container.git";,
+            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803";,
-            "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803",
+            "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f";,
+            "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
-        },
-        "suggest": {
-            "ext-mbstring": "For best performance"
+            "php": ">=5.3.0"
         },
-        "time": "2017-06-14T15:44:48+00:00",
+        "time": "2017-02-14T16:28:37+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.5-dev"
+                "dev-master": "1.0.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Polyfill\\Mbstring\\": ""
-            },
-            "files": [
-                "bootstrap.php"
-            ]
+                "Psr\\Container\\": "src/"
+            }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
@@ -1308,121 +1642,150 @@
         ],
         "authors": [
             {
-                "name": "Nicolas Grekas",
-                "email": "p@xxxxxxxxxxx"
-            },
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/";
+            }
+        ],
+        "description": "Common Container Interface (PHP FIG PSR-11)",
+        "homepage": "https://github.com/php-fig/container";,
+        "keywords": [
+            "PSR-11",
+            "container",
+            "container-interface",
+            "container-interop",
+            "psr"
+        ]
+    },
+    {
+        "name": "psr/http-message",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/php-fig/http-message.git";,
+            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363";,
+            "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0"
+        },
+        "time": "2016-08-06T14:39:51+00:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-4": {
+                "Psr\\Http\\Message\\": "src/"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/";,
+        "license": [
+            "MIT"
+        ],
+        "authors": [
             {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors";
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/";
             }
         ],
-        "description": "Symfony polyfill for the Mbstring extension",
-        "homepage": "https://symfony.com";,
+        "description": "Common interface for HTTP messages",
+        "homepage": "https://github.com/php-fig/http-message";,
         "keywords": [
-            "compatibility",
-            "mbstring",
-            "polyfill",
-            "portable",
-            "shim"
+            "http",
+            "http-message",
+            "psr",
+            "psr-7",
+            "request",
+            "response"
         ]
     },
     {
-        "name": "twig/twig",
-        "version": "v1.35.0",
-        "version_normalized": "1.35.0.0",
+        "name": "psr/log",
+        "version": "1.1.0",
+        "version_normalized": "1.1.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/twigphp/Twig.git";,
-            "reference": "daa657073e55b0a78cce8fdd22682fddecc6385f"
+            "url": "https://github.com/php-fig/log.git";,
+            "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/twigphp/Twig/zipball/daa657073e55b0a78cce8fdd22682fddecc6385f";,
-            "reference": "daa657073e55b0a78cce8fdd22682fddecc6385f",
+            "url": "https://api.github.com/repos/php-fig/log/zipball/6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd";,
+            "reference": "6c001f1daafa3a3ac1d8ff69ee4db8e799a654dd",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.3.3"
-        },
-        "require-dev": {
-            "psr/container": "^1.0",
-            "symfony/debug": "~2.7",
-            "symfony/phpunit-bridge": "~3.3@dev"
+            "php": ">=5.3.0"
         },
-        "time": "2017-09-27T18:06:46+00:00",
+        "time": "2018-11-20T15:27:04+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.35-dev"
+                "dev-master": "1.0.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Twig_": "lib/"
-            },
             "psr-4": {
-                "Twig\\": "src/"
+                "Psr\\Log\\": "Psr/Log/"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "BSD-3-Clause"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@xxxxxxxxxxx",
-                "homepage": "http://fabien.potencier.org";,
-                "role": "Lead Developer"
-            },
-            {
-                "name": "Armin Ronacher",
-                "email": "armin.ronacher@xxxxxxxxxxxx",
-                "role": "Project Founder"
-            },
-            {
-                "name": "Twig Team",
-                "homepage": "http://twig.sensiolabs.org/contributors";,
-                "role": "Contributors"
+                "name": "PHP-FIG",
+                "homepage": "http://www.php-fig.org/";
             }
         ],
-        "description": "Twig, the flexible, fast, and secure template language for PHP",
-        "homepage": "http://twig.sensiolabs.org";,
+        "description": "Common interface for logging libraries",
+        "homepage": "https://github.com/php-fig/log";,
         "keywords": [
-            "templating"
+            "log",
+            "psr",
+            "psr-3"
         ]
     },
     {
-        "name": "slim/twig-view",
-        "version": "2.3.0",
-        "version_normalized": "2.3.0.0",
+        "name": "ralouphie/getallheaders",
+        "version": "2.0.5",
+        "version_normalized": "2.0.5.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/slimphp/Twig-View.git";,
-            "reference": "f6ff5ec3a24e11866376b8ffa235fbbb7e1d1301"
+            "url": "https://github.com/ralouphie/getallheaders.git";,
+            "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/slimphp/Twig-View/zipball/f6ff5ec3a24e11866376b8ffa235fbbb7e1d1301";,
-            "reference": "f6ff5ec3a24e11866376b8ffa235fbbb7e1d1301",
+            "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa";,
+            "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.5.0",
-            "psr/http-message": "^1.0",
-            "twig/twig": "^1.18|^2.0"
+            "php": ">=5.3"
         },
         "require-dev": {
-            "phpunit/phpunit": "^4.8|^5.7"
+            "phpunit/phpunit": "~3.7.0",
+            "satooshi/php-coveralls": ">=1.0"
         },
-        "time": "2017-09-20T19:47:37+00:00",
+        "time": "2016-02-11T07:05:27+00:00",
         "type": "library",
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "Slim\\Views\\": "src"
-            }
+            "files": [
+                "src/getallheaders.php"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
@@ -1430,58 +1793,49 @@
         ],
         "authors": [
             {
-                "name": "Josh Lockhart",
-                "email": "hello@xxxxxxxxxxxxxxxx",
-                "homepage": "http://joshlockhart.com";
+                "name": "Ralph Khattar",
+                "email": "ralph.khattar@xxxxxxxxx"
             }
         ],
-        "description": "Slim Framework 3 view helper built on top of the Twig 2 templating component",
-        "homepage": "http://slimframework.com";,
-        "keywords": [
-            "framework",
-            "slim",
-            "template",
-            "twig",
-            "view"
-        ]
+        "description": "A polyfill for getallheaders."
     },
     {
-        "name": "stripe/stripe-php",
-        "version": "v4.13.0",
-        "version_normalized": "4.13.0.0",
+        "name": "resque/php-resque",
+        "version": "v1.3.3",
+        "version_normalized": "1.3.3.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/stripe/stripe-php.git";,
-            "reference": "834681b9cdfa68d88a27e36ec9e356b598a5f0e6"
+            "url": "https://github.com/resque/php-resque.git";,
+            "reference": "0e1f21ed74c611df340c30929f99923bac418aa8"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/stripe/stripe-php/zipball/834681b9cdfa68d88a27e36ec9e356b598a5f0e6";,
-            "reference": "834681b9cdfa68d88a27e36ec9e356b598a5f0e6",
+            "url": "https://api.github.com/repos/resque/php-resque/zipball/0e1f21ed74c611df340c30929f99923bac418aa8";,
+            "reference": "0e1f21ed74c611df340c30929f99923bac418aa8",
             "shasum": ""
         },
         "require": {
-            "ext-curl": "*",
-            "ext-json": "*",
-            "ext-mbstring": "*",
-            "php": ">=5.3.3"
+            "colinmollenhour/credis": "~1.7",
+            "ext-pcntl": "*",
+            "php": ">=5.3.0",
+            "psr/log": "~1.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "~4.0",
-            "satooshi/php-coveralls": "~0.6.1",
-            "squizlabs/php_codesniffer": "~2.0"
+            "phpunit/phpunit": "3.7.*"
         },
-        "time": "2017-06-20T01:39:06+00:00",
-        "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "2.0-dev"
-            }
+        "suggest": {
+            "ext-proctitle": "Allows php-resque to rename the title of UNIX processes to show the status of a worker.",
+            "ext-redis": "Native PHP extension for Redis connectivity. Credis will automatically utilize when available."
         },
+        "time": "2018-12-02T00:59:50+00:00",
+        "bin": [
+            "bin/resque"
+        ],
+        "type": "library",
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "Stripe\\": "lib/"
+            "psr-0": {
+                "Resque": "lib"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -1490,181 +1844,158 @@
         ],
         "authors": [
             {
-                "name": "Stripe and contributors",
-                "homepage": "https://github.com/stripe/stripe-php/contributors";
+                "name": "Chris Boulton",
+                "email": "chris@xxxxxxxxxxxxxxx"
             }
         ],
-        "description": "Stripe PHP Library",
-        "homepage": "https://stripe.com/";,
+        "description": "Redis backed library for creating background jobs and processing them later. Based on resque for Ruby.",
+        "homepage": "http://www.github.com/chrisboulton/php-resque/";,
         "keywords": [
-            "api",
-            "payment processing",
-            "stripe"
+            "background",
+            "job",
+            "redis",
+            "resque"
         ]
     },
     {
-        "name": "phpmailer/phpmailer",
-        "version": "v5.2.25",
-        "version_normalized": "5.2.25.0",
+        "name": "sebastian/code-unit-reverse-lookup",
+        "version": "1.0.1",
+        "version_normalized": "1.0.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/PHPMailer/PHPMailer.git";,
-            "reference": "2baf20b01690fba8cf720c1ebcf9b988eda50915"
+            "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git";,
+            "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/2baf20b01690fba8cf720c1ebcf9b988eda50915";,
-            "reference": "2baf20b01690fba8cf720c1ebcf9b988eda50915",
+            "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18";,
+            "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
             "shasum": ""
         },
         "require": {
-            "ext-ctype": "*",
-            "php": ">=5.0.0"
+            "php": "^5.6 || ^7.0"
         },
         "require-dev": {
-            "doctrine/annotations": "1.2.*",
-            "jms/serializer": "0.16.*",
-            "phpdocumentor/phpdocumentor": "2.*",
-            "phpunit/phpunit": "4.8.*",
-            "symfony/debug": "2.8.*",
-            "symfony/filesystem": "2.8.*",
-            "symfony/translation": "2.8.*",
-            "symfony/yaml": "2.8.*",
-            "zendframework/zend-cache": "2.5.1",
-            "zendframework/zend-config": "2.5.1",
-            "zendframework/zend-eventmanager": "2.5.1",
-            "zendframework/zend-filter": "2.5.1",
-            "zendframework/zend-i18n": "2.5.1",
-            "zendframework/zend-json": "2.5.1",
-            "zendframework/zend-math": "2.5.1",
-            "zendframework/zend-serializer": "2.5.*",
-            "zendframework/zend-servicemanager": "2.5.*",
-            "zendframework/zend-stdlib": "2.5.1"
-        },
-        "suggest": {
-            "league/oauth2-google": "Needed for Google XOAUTH2 authentication"
+            "phpunit/phpunit": "^5.7 || ^6.0"
         },
-        "time": "2017-08-28T11:12:07+00:00",
+        "time": "2017-03-04T06:30:41+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0.x-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
             "classmap": [
-                "class.phpmailer.php",
-                "class.phpmaileroauth.php",
-                "class.phpmaileroauthgoogle.php",
-                "class.smtp.php",
-                "class.pop3.php",
-                "extras/EasyPeasyICS.php",
-                "extras/ntlm_sasl_client.php"
+                "src/"
             ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "LGPL-2.1"
+            "BSD-3-Clause"
         ],
         "authors": [
             {
-                "name": "Jim Jagielski",
-                "email": "jimjag@xxxxxxxxx"
-            },
-            {
-                "name": "Marcus Bointon",
-                "email": "phpmailer@xxxxxxxxxxxxxxxxxx"
-            },
-            {
-                "name": "Andy Prevost",
-                "email": "codeworxtech@xxxxxxxxxxxxxxxxxxxxx"
-            },
-            {
-                "name": "Brent R. Matzelle"
+                "name": "Sebastian Bergmann",
+                "email": "sebastian@xxxxxxxxxx"
             }
         ],
-        "description": "PHPMailer is a full-featured email creation and transfer class for PHP"
+        "description": "Looks up which function or method a line of code belongs to",
+        "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/";
     },
     {
-        "name": "symfony/yaml",
-        "version": "v3.3.9",
-        "version_normalized": "3.3.9.0",
+        "name": "sebastian/comparator",
+        "version": "1.2.4",
+        "version_normalized": "1.2.4.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/yaml.git";,
-            "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0"
+            "url": "https://github.com/sebastianbergmann/comparator.git";,
+            "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/yaml/zipball/1d8c2a99c80862bdc3af94c1781bf70f86bccac0";,
-            "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0",
+            "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be";,
+            "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
             "shasum": ""
         },
         "require": {
-            "php": "^5.5.9|>=7.0.8"
+            "php": ">=5.3.3",
+            "sebastian/diff": "~1.2",
+            "sebastian/exporter": "~1.2 || ~2.0"
         },
         "require-dev": {
-            "symfony/console": "~2.8|~3.0"
-        },
-        "suggest": {
-            "symfony/console": "For validating YAML files using the lint command"
+            "phpunit/phpunit": "~4.4"
         },
-        "time": "2017-07-29T21:54:42+00:00",
+        "time": "2017-01-29T09:50:25+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "3.3-dev"
+                "dev-master": "1.2.x-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "Symfony\\Component\\Yaml\\": ""
-            },
-            "exclude-from-classmap": [
-                "/Tests/"
+            "classmap": [
+                "src/"
             ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "MIT"
+            "BSD-3-Clause"
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@xxxxxxxxxxx"
+                "name": "Jeff Welch",
+                "email": "whatthejeff@xxxxxxxxx"
             },
             {
-                "name": "Symfony Community",
-                "homepage": "https://symfony.com/contributors";
+                "name": "Volker Dusch",
+                "email": "github@xxxxxxxxxxxx"
+            },
+            {
+                "name": "Bernhard Schussek",
+                "email": "bschussek@xxxxxxxxxxxxxxx"
+            },
+            {
+                "name": "Sebastian Bergmann",
+                "email": "sebastian@xxxxxxxxxx"
             }
         ],
-        "description": "Symfony Yaml Component",
-        "homepage": "https://symfony.com";
+        "description": "Provides the functionality to compare PHP values for equality",
+        "homepage": "http://www.github.com/sebastianbergmann/comparator";,
+        "keywords": [
+            "comparator",
+            "compare",
+            "equality"
+        ]
     },
     {
-        "name": "sebastian/object-enumerator",
-        "version": "2.0.1",
-        "version_normalized": "2.0.1.0",
+        "name": "sebastian/diff",
+        "version": "1.4.3",
+        "version_normalized": "1.4.3.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/object-enumerator.git";,
-            "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+            "url": "https://github.com/sebastianbergmann/diff.git";,
+            "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7";,
-            "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+            "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4";,
+            "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.6",
-            "sebastian/recursion-context": "~2.0"
+            "php": "^5.3.3 || ^7.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "~5"
+            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
         },
-        "time": "2017-02-18T15:18:39+00:00",
+        "time": "2017-05-22T07:24:03+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "2.0.x-dev"
+                "dev-master": "1.4-dev"
             }
         },
         "installation-source": "dist",
@@ -1679,39 +2010,46 @@
         ],
         "authors": [
             {
+                "name": "Kore Nordmann",
+                "email": "mail@xxxxxxxxxxxxxxxx"
+            },
+            {
                 "name": "Sebastian Bergmann",
                 "email": "sebastian@xxxxxxxxxx"
             }
         ],
-        "description": "Traverses array structures and object graphs to enumerate all referenced objects",
-        "homepage": "https://github.com/sebastianbergmann/object-enumerator/";
+        "description": "Diff implementation",
+        "homepage": "https://github.com/sebastianbergmann/diff";,
+        "keywords": [
+            "diff"
+        ]
     },
     {
-        "name": "sebastian/diff",
-        "version": "1.4.3",
-        "version_normalized": "1.4.3.0",
+        "name": "sebastian/environment",
+        "version": "2.0.0",
+        "version_normalized": "2.0.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/diff.git";,
-            "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
+            "url": "https://github.com/sebastianbergmann/environment.git";,
+            "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4";,
-            "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+            "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac";,
+            "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
             "shasum": ""
         },
         "require": {
-            "php": "^5.3.3 || ^7.0"
+            "php": "^5.6 || ^7.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+            "phpunit/phpunit": "^5.0"
         },
-        "time": "2017-05-22T07:24:03+00:00",
+        "time": "2016-11-26T07:53:53+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.4-dev"
+                "dev-master": "2.0.x-dev"
             }
         },
         "installation-source": "dist",
@@ -1726,48 +2064,46 @@
         ],
         "authors": [
             {
-                "name": "Kore Nordmann",
-                "email": "mail@xxxxxxxxxxxxxxxx"
-            },
-            {
                 "name": "Sebastian Bergmann",
                 "email": "sebastian@xxxxxxxxxx"
             }
         ],
-        "description": "Diff implementation",
-        "homepage": "https://github.com/sebastianbergmann/diff";,
+        "description": "Provides functionality to handle HHVM/PHP environments",
+        "homepage": "http://www.github.com/sebastianbergmann/environment";,
         "keywords": [
-            "diff"
+            "Xdebug",
+            "environment",
+            "hhvm"
         ]
     },
     {
-        "name": "sebastian/comparator",
-        "version": "1.2.4",
-        "version_normalized": "1.2.4.0",
+        "name": "sebastian/exporter",
+        "version": "2.0.0",
+        "version_normalized": "2.0.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/comparator.git";,
-            "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+            "url": "https://github.com/sebastianbergmann/exporter.git";,
+            "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be";,
-            "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+            "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4";,
+            "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
             "shasum": ""
         },
         "require": {
             "php": ">=5.3.3",
-            "sebastian/diff": "~1.2",
-            "sebastian/exporter": "~1.2 || ~2.0"
+            "sebastian/recursion-context": "~2.0"
         },
         "require-dev": {
+            "ext-mbstring": "*",
             "phpunit/phpunit": "~4.4"
         },
-        "time": "2017-01-29T09:50:25+00:00",
+        "time": "2016-11-19T08:54:04+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.2.x-dev"
+                "dev-master": "2.0.x-dev"
             }
         },
         "installation-source": "dist",
@@ -1796,51 +2132,48 @@
             {
                 "name": "Sebastian Bergmann",
                 "email": "sebastian@xxxxxxxxxx"
+            },
+            {
+                "name": "Adam Harvey",
+                "email": "aharvey@xxxxxxx"
             }
         ],
-        "description": "Provides the functionality to compare PHP values for equality",
-        "homepage": "http://www.github.com/sebastianbergmann/comparator";,
+        "description": "Provides the functionality to export PHP variables for visualization",
+        "homepage": "http://www.github.com/sebastianbergmann/exporter";,
         "keywords": [
-            "comparator",
-            "compare",
-            "equality"
+            "export",
+            "exporter"
         ]
     },
     {
-        "name": "phpunit/phpunit-mock-objects",
-        "version": "3.4.4",
-        "version_normalized": "3.4.4.0",
+        "name": "sebastian/global-state",
+        "version": "1.1.1",
+        "version_normalized": "1.1.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git";,
-            "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
+            "url": "https://github.com/sebastianbergmann/global-state.git";,
+            "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118";,
-            "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
+            "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4";,
+            "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
             "shasum": ""
         },
         "require": {
-            "doctrine/instantiator": "^1.0.2",
-            "php": "^5.6 || ^7.0",
-            "phpunit/php-text-template": "^1.2",
-            "sebastian/exporter": "^1.2 || ^2.0"
-        },
-        "conflict": {
-            "phpunit/phpunit": "<5.4.0"
+            "php": ">=5.3.3"
         },
         "require-dev": {
-            "phpunit/phpunit": "^5.4"
+            "phpunit/phpunit": "~4.2"
         },
         "suggest": {
-            "ext-soap": "*"
+            "ext-uopz": "*"
         },
-        "time": "2017-06-30T09:13:00+00:00",
+        "time": "2015-10-12T03:26:01+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "3.2.x-dev"
+                "dev-master": "1.0-dev"
             }
         },
         "installation-source": "dist",
@@ -1856,43 +2189,42 @@
         "authors": [
             {
                 "name": "Sebastian Bergmann",
-                "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
-                "role": "lead"
+                "email": "sebastian@xxxxxxxxxx"
             }
         ],
-        "description": "Mock Object library for PHPUnit",
-        "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/";,
+        "description": "Snapshotting of global state",
+        "homepage": "http://www.github.com/sebastianbergmann/global-state";,
         "keywords": [
-            "mock",
-            "xunit"
+            "global state"
         ]
     },
     {
-        "name": "phpunit/php-timer",
-        "version": "1.0.9",
-        "version_normalized": "1.0.9.0",
+        "name": "sebastian/object-enumerator",
+        "version": "2.0.1",
+        "version_normalized": "2.0.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/php-timer.git";,
-            "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+            "url": "https://github.com/sebastianbergmann/object-enumerator.git";,
+            "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f";,
-            "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+            "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7";,
+            "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
             "shasum": ""
         },
         "require": {
-            "php": "^5.3.3 || ^7.0"
+            "php": ">=5.6",
+            "sebastian/recursion-context": "~2.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+            "phpunit/phpunit": "~5"
         },
-        "time": "2017-02-26T11:10:40+00:00",
+        "time": "2017-02-18T15:18:39+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.0-dev"
+                "dev-master": "2.0.x-dev"
             }
         },
         "installation-source": "dist",
@@ -1908,42 +2240,38 @@
         "authors": [
             {
                 "name": "Sebastian Bergmann",
-                "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
-                "role": "lead"
+                "email": "sebastian@xxxxxxxxxx"
             }
         ],
-        "description": "Utility class for timing",
-        "homepage": "https://github.com/sebastianbergmann/php-timer/";,
-        "keywords": [
-            "timer"
-        ]
+        "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+        "homepage": "https://github.com/sebastianbergmann/object-enumerator/";
     },
     {
-        "name": "sebastian/code-unit-reverse-lookup",
-        "version": "1.0.1",
-        "version_normalized": "1.0.1.0",
+        "name": "sebastian/recursion-context",
+        "version": "2.0.0",
+        "version_normalized": "2.0.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git";,
-            "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+            "url": "https://github.com/sebastianbergmann/recursion-context.git";,
+            "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18";,
-            "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+            "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a";,
+            "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
             "shasum": ""
         },
         "require": {
-            "php": "^5.6 || ^7.0"
+            "php": ">=5.3.3"
         },
         "require-dev": {
-            "phpunit/phpunit": "^5.7 || ^6.0"
+            "phpunit/phpunit": "~4.4"
         },
-        "time": "2017-03-04T06:30:41+00:00",
+        "time": "2016-11-19T07:33:16+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.0.x-dev"
+                "dev-master": "2.0.x-dev"
             }
         },
         "installation-source": "dist",
@@ -1958,40 +2286,44 @@
         ],
         "authors": [
             {
+                "name": "Jeff Welch",
+                "email": "whatthejeff@xxxxxxxxx"
+            },
+            {
                 "name": "Sebastian Bergmann",
                 "email": "sebastian@xxxxxxxxxx"
+            },
+            {
+                "name": "Adam Harvey",
+                "email": "aharvey@xxxxxxx"
             }
         ],
-        "description": "Looks up which function or method a line of code belongs to",
-        "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/";
+        "description": "Provides functionality to recursively process PHP variables",
+        "homepage": "http://www.github.com/sebastianbergmann/recursion-context";
     },
     {
-        "name": "phpunit/php-token-stream",
-        "version": "1.4.11",
-        "version_normalized": "1.4.11.0",
+        "name": "sebastian/resource-operations",
+        "version": "1.0.0",
+        "version_normalized": "1.0.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/php-token-stream.git";,
-            "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7"
+            "url": "https://github.com/sebastianbergmann/resource-operations.git";,
+            "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/e03f8f67534427a787e21a385a67ec3ca6978ea7";,
-            "reference": "e03f8f67534427a787e21a385a67ec3ca6978ea7",
+            "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52";,
+            "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
             "shasum": ""
         },
         "require": {
-            "ext-tokenizer": "*",
-            "php": ">=5.3.3"
-        },
-        "require-dev": {
-            "phpunit/phpunit": "~4.2"
+            "php": ">=5.6.0"
         },
-        "time": "2017-02-27T10:12:30+00:00",
+        "time": "2015-07-28T20:34:47+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.4-dev"
+                "dev-master": "1.0.x-dev"
             }
         },
         "installation-source": "dist",
@@ -2010,50 +2342,32 @@
                 "email": "sebastian@xxxxxxxxxx"
             }
         ],
-        "description": "Wrapper around PHP's tokenizer extension.",
-        "homepage": "https://github.com/sebastianbergmann/php-token-stream/";,
-        "keywords": [
-            "tokenizer"
-        ]
+        "description": "Provides a list of PHP built-in functions that operate on resources",
+        "homepage": "https://www.github.com/sebastianbergmann/resource-operations";
     },
     {
-        "name": "phpunit/php-code-coverage",
-        "version": "4.0.8",
-        "version_normalized": "4.0.8.0",
+        "name": "sebastian/version",
+        "version": "2.0.1",
+        "version_normalized": "2.0.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/sebastianbergmann/php-code-coverage.git";,
-            "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
+            "url": "https://github.com/sebastianbergmann/version.git";,
+            "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d";,
-            "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+            "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019";,
+            "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
             "shasum": ""
         },
         "require": {
-            "ext-dom": "*",
-            "ext-xmlwriter": "*",
-            "php": "^5.6 || ^7.0",
-            "phpunit/php-file-iterator": "^1.3",
-            "phpunit/php-text-template": "^1.2",
-            "phpunit/php-token-stream": "^1.4.2 || ^2.0",
-            "sebastian/code-unit-reverse-lookup": "^1.0",
-            "sebastian/environment": "^1.3.2 || ^2.0",
-            "sebastian/version": "^1.0 || ^2.0"
-        },
-        "require-dev": {
-            "ext-xdebug": "^2.1.4",
-            "phpunit/phpunit": "^5.7"
-        },
-        "suggest": {
-            "ext-xdebug": "^2.5.1"
+            "php": ">=5.6"
         },
-        "time": "2017-04-02T07:44:40+00:00",
+        "time": "2016-10-03T07:35:21+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "4.0.x-dev"
+                "dev-master": "2.0.x-dev"
             }
         },
         "installation-source": "dist",
@@ -2069,52 +2383,49 @@
         "authors": [
             {
                 "name": "Sebastian Bergmann",
-                "email": "sb@xxxxxxxxxxxxxxxxxxxxx",
+                "email": "sebastian@xxxxxxxxxx",
                 "role": "lead"
             }
         ],
-        "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
-        "homepage": "https://github.com/sebastianbergmann/php-code-coverage";,
-        "keywords": [
-            "coverage",
-            "testing",
-            "xunit"
-        ]
+        "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+        "homepage": "https://github.com/sebastianbergmann/version";
     },
     {
-        "name": "phpdocumentor/reflection-common",
-        "version": "1.0.1",
-        "version_normalized": "1.0.1.0",
+        "name": "slim/slim",
+        "version": "3.12.1",
+        "version_normalized": "3.12.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/phpDocumentor/ReflectionCommon.git";,
-            "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
+            "url": "https://github.com/slimphp/Slim.git";,
+            "reference": "eaee12ef8d0750db62b8c548016d82fb33addb6b"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6";,
-            "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+            "url": "https://api.github.com/repos/slimphp/Slim/zipball/eaee12ef8d0750db62b8c548016d82fb33addb6b";,
+            "reference": "eaee12ef8d0750db62b8c548016d82fb33addb6b",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.5"
+            "container-interop/container-interop": "^1.2",
+            "nikic/fast-route": "^1.0",
+            "php": ">=5.5.0",
+            "pimple/pimple": "^3.0",
+            "psr/container": "^1.0",
+            "psr/http-message": "^1.0"
+        },
+        "provide": {
+            "psr/http-message-implementation": "1.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "^4.6"
+            "phpunit/phpunit": "^4.0",
+            "squizlabs/php_codesniffer": "^2.5"
         },
-        "time": "2017-09-11T18:02:19+00:00",
+        "time": "2019-04-16T16:47:29+00:00",
         "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.0.x-dev"
-            }
-        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "phpDocumentor\\Reflection\\": [
-                    "src"
-                ]
+                "Slim\\": "Slim"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -2123,56 +2434,65 @@
         ],
         "authors": [
             {
-                "name": "Jaap van Otterdijk",
-                "email": "opensource@xxxxxxxx"
+                "name": "Rob Allen",
+                "email": "rob@xxxxxxxxxxx",
+                "homepage": "http://akrabat.com";
+            },
+            {
+                "name": "Josh Lockhart",
+                "email": "hello@xxxxxxxxxxxxxxxx",
+                "homepage": "https://joshlockhart.com";
+            },
+            {
+                "name": "Gabriel Manricks",
+                "email": "gmanricks@xxxxxx",
+                "homepage": "http://gabrielmanricks.com";
+            },
+            {
+                "name": "Andrew Smith",
+                "email": "a.smith@xxxxxxxxxxxxxxxxx",
+                "homepage": "http://silentworks.co.uk";
             }
         ],
-        "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
-        "homepage": "http://www.phpdoc.org";,
+        "description": "Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs",
+        "homepage": "https://slimframework.com";,
         "keywords": [
-            "FQSEN",
-            "phpDocumentor",
-            "phpdoc",
-            "reflection",
-            "static analysis"
+            "api",
+            "framework",
+            "micro",
+            "router"
         ]
     },
     {
-        "name": "phpdocumentor/type-resolver",
-        "version": "0.3.0",
-        "version_normalized": "0.3.0.0",
+        "name": "slim/twig-view",
+        "version": "2.5.0",
+        "version_normalized": "2.5.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/phpDocumentor/TypeResolver.git";,
-            "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773"
+            "url": "https://github.com/slimphp/Twig-View.git";,
+            "reference": "06ef39b58d60b11a9546893fd0b7fff2bd901798"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fb3933512008d8162b3cdf9e18dba9309b7c3773";,
-            "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773",
+            "url": "https://api.github.com/repos/slimphp/Twig-View/zipball/06ef39b58d60b11a9546893fd0b7fff2bd901798";,
+            "reference": "06ef39b58d60b11a9546893fd0b7fff2bd901798",
             "shasum": ""
         },
         "require": {
-            "php": "^5.5 || ^7.0",
-            "phpdocumentor/reflection-common": "^1.0"
+            "php": ">=5.5.0",
+            "psr/http-message": "^1.0",
+            "twig/twig": "^1.38|^2.7"
         },
         "require-dev": {
-            "mockery/mockery": "^0.9.4",
-            "phpunit/phpunit": "^5.2||^4.8.24"
+            "phpunit/phpunit": "^4.8|^5.7",
+            "slim/slim": "^3.10"
         },
-        "time": "2017-06-03T08:32:36+00:00",
+        "time": "2019-04-06T16:34:38+00:00",
         "type": "library",
-        "extra": {
-            "branch-alias": {
-                "dev-master": "1.0.x-dev"
-            }
-        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "phpDocumentor\\Reflection\\": [
-                    "src/"
-                ]
+                "Slim\\Views\\": "src"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -2181,44 +2501,58 @@
         ],
         "authors": [
             {
-                "name": "Mike van Riel",
-                "email": "me@xxxxxxxxxxxxxxx"
+                "name": "Josh Lockhart",
+                "email": "hello@xxxxxxxxxxxxxxxx",
+                "homepage": "http://joshlockhart.com";
             }
+        ],
+        "description": "Slim Framework 3 view helper built on top of the Twig 2 templating component",
+        "homepage": "http://slimframework.com";,
+        "keywords": [
+            "framework",
+            "slim",
+            "template",
+            "twig",
+            "view"
         ]
     },
     {
-        "name": "phpdocumentor/reflection-docblock",
-        "version": "3.2.2",
-        "version_normalized": "3.2.2.0",
+        "name": "stripe/stripe-php",
+        "version": "v4.13.0",
+        "version_normalized": "4.13.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git";,
-            "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157"
+            "url": "https://github.com/stripe/stripe-php.git";,
+            "reference": "834681b9cdfa68d88a27e36ec9e356b598a5f0e6"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/4aada1f93c72c35e22fb1383b47fee43b8f1d157";,
-            "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157",
+            "url": "https://api.github.com/repos/stripe/stripe-php/zipball/834681b9cdfa68d88a27e36ec9e356b598a5f0e6";,
+            "reference": "834681b9cdfa68d88a27e36ec9e356b598a5f0e6",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.5",
-            "phpdocumentor/reflection-common": "^1.0@dev",
-            "phpdocumentor/type-resolver": "^0.3.0",
-            "webmozart/assert": "^1.0"
+            "ext-curl": "*",
+            "ext-json": "*",
+            "ext-mbstring": "*",
+            "php": ">=5.3.3"
         },
         "require-dev": {
-            "mockery/mockery": "^0.9.4",
-            "phpunit/phpunit": "^4.4"
+            "phpunit/phpunit": "~4.0",
+            "satooshi/php-coveralls": "~0.6.1",
+            "squizlabs/php_codesniffer": "~2.0"
         },
-        "time": "2017-08-08T06:39:58+00:00",
+        "time": "2017-06-20T01:39:06+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "2.0-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "phpDocumentor\\Reflection\\": [
-                    "src/"
-                ]
+                "Stripe\\": "lib/"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -2227,50 +2561,56 @@
         ],
         "authors": [
             {
-                "name": "Mike van Riel",
-                "email": "me@xxxxxxxxxxxxxxx"
+                "name": "Stripe and contributors",
+                "homepage": "https://github.com/stripe/stripe-php/contributors";
             }
         ],
-        "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock."
+        "description": "Stripe PHP Library",
+        "homepage": "https://stripe.com/";,
+        "keywords": [
+            "api",
+            "payment processing",
+            "stripe"
+        ]
     },
     {
-        "name": "phpspec/prophecy",
-        "version": "v1.7.2",
-        "version_normalized": "1.7.2.0",
+        "name": "symfony/http-foundation",
+        "version": "v3.4.28",
+        "version_normalized": "3.4.28.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/phpspec/prophecy.git";,
-            "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6"
+            "url": "https://github.com/symfony/http-foundation.git";,
+            "reference": "677ae5e892b081e71a665bfa7dd90fe61800c00e"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6";,
-            "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6",
+            "url": "https://api.github.com/repos/symfony/http-foundation/zipball/677ae5e892b081e71a665bfa7dd90fe61800c00e";,
+            "reference": "677ae5e892b081e71a665bfa7dd90fe61800c00e",
             "shasum": ""
         },
         "require": {
-            "doctrine/instantiator": "^1.0.2",
-            "php": "^5.3|^7.0",
-            "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
-            "sebastian/comparator": "^1.1|^2.0",
-            "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+            "php": "^5.5.9|>=7.0.8",
+            "symfony/polyfill-mbstring": "~1.1",
+            "symfony/polyfill-php70": "~1.6"
         },
         "require-dev": {
-            "phpspec/phpspec": "^2.5|^3.2",
-            "phpunit/phpunit": "^4.8 || ^5.6.5"
+            "symfony/expression-language": "~2.8|~3.0|~4.0"
         },
-        "time": "2017-09-04T11:05:03+00:00",
+        "time": "2019-05-27T05:50:24+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.7.x-dev"
+                "dev-master": "3.4-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Prophecy\\": "src/"
-            }
+            "psr-4": {
+                "Symfony\\Component\\HttpFoundation\\": ""
+            },
+            "exclude-from-classmap": [
+                "/Tests/"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
@@ -2278,181 +2618,112 @@
         ],
         "authors": [
             {
-                "name": "Konstantin Kudryashov",
-                "email": "ever.zet@xxxxxxxxx",
-                "homepage": "http://everzet.com";
+                "name": "Fabien Potencier",
+                "email": "fabien@xxxxxxxxxxx"
             },
             {
-                "name": "Marcello Duarte",
-                "email": "marcello.duarte@xxxxxxxxx"
-            }
-        ],
-        "description": "Highly opinionated mocking framework for PHP 5.3+",
-        "homepage": "https://github.com/phpspec/prophecy";,
-        "keywords": [
-            "Double",
-            "Dummy",
-            "fake",
-            "mock",
-            "spy",
-            "stub"
-        ]
-    },
-    {
-        "name": "myclabs/deep-copy",
-        "version": "1.6.1",
-        "version_normalized": "1.6.1.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/myclabs/DeepCopy.git";,
-            "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102";,
-            "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102",
-            "shasum": ""
-        },
-        "require": {
-            "php": ">=5.4.0"
-        },
-        "require-dev": {
-            "doctrine/collections": "1.*",
-            "phpunit/phpunit": "~4.1"
-        },
-        "time": "2017-04-12T18:52:22+00:00",
-        "type": "library",
-        "installation-source": "dist",
-        "autoload": {
-            "psr-4": {
-                "DeepCopy\\": "src/DeepCopy/"
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors";
             }
-        },
-        "notification-url": "https://packagist.org/downloads/";,
-        "license": [
-            "MIT"
         ],
-        "description": "Create deep copies (clones) of your objects",
-        "homepage": "https://github.com/myclabs/DeepCopy";,
-        "keywords": [
-            "clone",
-            "copy",
-            "duplicate",
-            "object",
-            "object graph"
-        ]
+        "description": "Symfony HttpFoundation Component",
+        "homepage": "https://symfony.com";
     },
-    {
-        "name": "phpunit/phpunit",
-        "version": "5.7.22",
-        "version_normalized": "5.7.22.0",
-        "source": {
-            "type": "git",
-            "url": "https://github.com/sebastianbergmann/phpunit.git";,
-            "reference": "10df877596c9906d4110b5b905313829043f2ada"
-        },
-        "dist": {
-            "type": "zip",
-            "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/10df877596c9906d4110b5b905313829043f2ada";,
-            "reference": "10df877596c9906d4110b5b905313829043f2ada",
-            "shasum": ""
-        },
-        "require": {
-            "ext-dom": "*",
-            "ext-json": "*",
-            "ext-libxml": "*",
-            "ext-mbstring": "*",
-            "ext-xml": "*",
-            "myclabs/deep-copy": "~1.3",
-            "php": "^5.6 || ^7.0",
-            "phpspec/prophecy": "^1.6.2",
-            "phpunit/php-code-coverage": "^4.0.4",
-            "phpunit/php-file-iterator": "~1.4",
-            "phpunit/php-text-template": "~1.2",
-            "phpunit/php-timer": "^1.0.6",
-            "phpunit/phpunit-mock-objects": "^3.2",
-            "sebastian/comparator": "^1.2.4",
-            "sebastian/diff": "^1.4.3",
-            "sebastian/environment": "^1.3.4 || ^2.0",
-            "sebastian/exporter": "~2.0",
-            "sebastian/global-state": "^1.1",
-            "sebastian/object-enumerator": "~2.0",
-            "sebastian/resource-operations": "~1.0",
-            "sebastian/version": "~1.0.3|~2.0",
-            "symfony/yaml": "~2.1|~3.0"
+    {
+        "name": "symfony/polyfill-ctype",
+        "version": "v1.11.0",
+        "version_normalized": "1.11.0.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/symfony/polyfill-ctype.git";,
+            "reference": "82ebae02209c21113908c229e9883c419720738a"
         },
-        "conflict": {
-            "phpdocumentor/reflection-docblock": "3.0.2"
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/82ebae02209c21113908c229e9883c419720738a";,
+            "reference": "82ebae02209c21113908c229e9883c419720738a",
+            "shasum": ""
         },
-        "require-dev": {
-            "ext-pdo": "*"
+        "require": {
+            "php": ">=5.3.3"
         },
         "suggest": {
-            "ext-xdebug": "*",
-            "phpunit/php-invoker": "~1.1"
+            "ext-ctype": "For best performance"
         },
-        "time": "2017-09-24T07:23:38+00:00",
-        "bin": [
-            "phpunit"
-        ],
+        "time": "2019-02-06T07:57:58+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "5.7.x-dev"
+                "dev-master": "1.11-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "src/"
+            "psr-4": {
+                "Symfony\\Polyfill\\Ctype\\": ""
+            },
+            "files": [
+                "bootstrap.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "BSD-3-Clause"
+            "MIT"
         ],
         "authors": [
             {
-                "name": "Sebastian Bergmann",
-                "email": "sebastian@xxxxxxxxxx",
-                "role": "lead"
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors";
+            },
+            {
+                "name": "Gert de Pagter",
+                "email": "BackEndTea@xxxxxxxxx"
             }
         ],
-        "description": "The PHP Unit Testing framework.",
-        "homepage": "https://phpunit.de/";,
+        "description": "Symfony polyfill for ctype functions",
+        "homepage": "https://symfony.com";,
         "keywords": [
-            "phpunit",
-            "testing",
-            "xunit"
+            "compatibility",
+            "ctype",
+            "polyfill",
+            "portable"
         ]
     },
     {
-        "name": "colinmollenhour/credis",
-        "version": "1.9.0",
-        "version_normalized": "1.9.0.0",
+        "name": "symfony/polyfill-mbstring",
+        "version": "v1.11.0",
+        "version_normalized": "1.11.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/colinmollenhour/credis.git";,
-            "reference": "e8e9b2081fb9b61097486dcaf8b6c11a7399da2d"
+            "url": "https://github.com/symfony/polyfill-mbstring.git";,
+            "reference": "fe5e94c604826c35a32fa832f35bd036b6799609"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/colinmollenhour/credis/zipball/e8e9b2081fb9b61097486dcaf8b6c11a7399da2d";,
-            "reference": "e8e9b2081fb9b61097486dcaf8b6c11a7399da2d",
+            "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fe5e94c604826c35a32fa832f35bd036b6799609";,
+            "reference": "fe5e94c604826c35a32fa832f35bd036b6799609",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.4.0"
+            "php": ">=5.3.3"
+        },
+        "suggest": {
+            "ext-mbstring": "For best performance"
         },
-        "time": "2017-09-26T05:03:25+00:00",
+        "time": "2019-02-06T07:57:58+00:00",
         "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.11-dev"
+            }
+        },
         "installation-source": "dist",
         "autoload": {
-            "classmap": [
-                "Client.php",
-                "Cluster.php",
-                "Sentinel.php",
-                "Module.php"
+            "psr-4": {
+                "Symfony\\Polyfill\\Mbstring\\": ""
+            },
+            "files": [
+                "bootstrap.php"
             ]
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -2461,53 +2732,61 @@
         ],
         "authors": [
             {
-                "name": "Colin Mollenhour",
-                "email": "colin@xxxxxxxxxxxxxx"
+                "name": "Nicolas Grekas",
+                "email": "p@xxxxxxxxxxx"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors";
             }
         ],
-        "description": "Credis is a lightweight interface to the Redis key-value store which wraps the phpredis library when available for better performance.",
-        "homepage": "https://github.com/colinmollenhour/credis";
+        "description": "Symfony polyfill for the Mbstring extension",
+        "homepage": "https://symfony.com";,
+        "keywords": [
+            "compatibility",
+            "mbstring",
+            "polyfill",
+            "portable",
+            "shim"
+        ]
     },
     {
-        "name": "twig/extensions",
-        "version": "v1.5.1",
-        "version_normalized": "1.5.1.0",
+        "name": "symfony/polyfill-php70",
+        "version": "v1.11.0",
+        "version_normalized": "1.11.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/twigphp/Twig-extensions.git";,
-            "reference": "d188c76168b853481cc75879ea045bf93d718e9c"
+            "url": "https://github.com/symfony/polyfill-php70.git";,
+            "reference": "bc4858fb611bda58719124ca079baff854149c89"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/d188c76168b853481cc75879ea045bf93d718e9c";,
-            "reference": "d188c76168b853481cc75879ea045bf93d718e9c",
+            "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/bc4858fb611bda58719124ca079baff854149c89";,
+            "reference": "bc4858fb611bda58719124ca079baff854149c89",
             "shasum": ""
         },
         "require": {
-            "twig/twig": "~1.27|~2.0"
-        },
-        "require-dev": {
-            "symfony/phpunit-bridge": "~3.3@dev",
-            "symfony/translation": "~2.3|~3.0"
-        },
-        "suggest": {
-            "symfony/translation": "Allow the time_diff output to be translated"
+            "paragonie/random_compat": "~1.0|~2.0|~9.99",
+            "php": ">=5.3.3"
         },
-        "time": "2017-06-08T18:19:53+00:00",
+        "time": "2019-02-06T07:57:58+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.5-dev"
+                "dev-master": "1.11-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-0": {
-                "Twig_Extensions_": "lib/"
-            },
             "psr-4": {
-                "Twig\\Extensions\\": "src/"
-            }
+                "Symfony\\Polyfill\\Php70\\": ""
+            },
+            "files": [
+                "bootstrap.php"
+            ],
+            "classmap": [
+                "Resources/stubs"
+            ]
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
@@ -2515,50 +2794,62 @@
         ],
         "authors": [
             {
-                "name": "Fabien Potencier",
-                "email": "fabien@xxxxxxxxxxx"
+                "name": "Nicolas Grekas",
+                "email": "p@xxxxxxxxxxx"
+            },
+            {
+                "name": "Symfony Community",
+                "homepage": "https://symfony.com/contributors";
             }
         ],
-        "description": "Common additional features for Twig that do not directly belong in core",
-        "homepage": "http://twig.sensiolabs.org/doc/extensions/index.html";,
+        "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions",
+        "homepage": "https://symfony.com";,
         "keywords": [
-            "i18n",
-            "text"
+            "compatibility",
+            "polyfill",
+            "portable",
+            "shim"
         ]
     },
     {
-        "name": "symfony/http-foundation",
-        "version": "v3.3.9",
-        "version_normalized": "3.3.9.0",
+        "name": "symfony/yaml",
+        "version": "v4.3.1",
+        "version_normalized": "4.3.1.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/symfony/http-foundation.git";,
-            "reference": "2cdc7de1921d1a1c805a13dc05e44a2cd58f5ad3"
+            "url": "https://github.com/symfony/yaml.git";,
+            "reference": "c60ecf5ba842324433b46f58dc7afc4487dbab99"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2cdc7de1921d1a1c805a13dc05e44a2cd58f5ad3";,
-            "reference": "2cdc7de1921d1a1c805a13dc05e44a2cd58f5ad3",
+            "url": "https://api.github.com/repos/symfony/yaml/zipball/c60ecf5ba842324433b46f58dc7afc4487dbab99";,
+            "reference": "c60ecf5ba842324433b46f58dc7afc4487dbab99",
             "shasum": ""
         },
         "require": {
-            "php": "^5.5.9|>=7.0.8",
-            "symfony/polyfill-mbstring": "~1.1"
+            "php": "^7.1.3",
+            "symfony/polyfill-ctype": "~1.8"
+        },
+        "conflict": {
+            "symfony/console": "<3.4"
         },
         "require-dev": {
-            "symfony/expression-language": "~2.8|~3.0"
+            "symfony/console": "~3.4|~4.0"
+        },
+        "suggest": {
+            "symfony/console": "For validating YAML files using the lint command"
         },
-        "time": "2017-09-06T17:07:39+00:00",
+        "time": "2019-04-06T14:04:46+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "3.3-dev"
+                "dev-master": "4.3-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
             "psr-4": {
-                "Symfony\\Component\\HttpFoundation\\": ""
+                "Symfony\\Component\\Yaml\\": ""
             },
             "exclude-from-classmap": [
                 "/Tests/"
@@ -2578,45 +2869,49 @@
                 "homepage": "https://symfony.com/contributors";
             }
         ],
-        "description": "Symfony HttpFoundation Component",
+        "description": "Symfony Yaml Component",
         "homepage": "https://symfony.com";
     },
     {
-        "name": "guzzlehttp/promises",
-        "version": "v1.3.1",
-        "version_normalized": "1.3.1.0",
+        "name": "twig/extensions",
+        "version": "v1.5.4",
+        "version_normalized": "1.5.4.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/guzzle/promises.git";,
-            "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+            "url": "https://github.com/twigphp/Twig-extensions.git";,
+            "reference": "57873c8b0c1be51caa47df2cdb824490beb16202"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646";,
-            "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+            "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/57873c8b0c1be51caa47df2cdb824490beb16202";,
+            "reference": "57873c8b0c1be51caa47df2cdb824490beb16202",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.5.0"
+            "twig/twig": "^1.27|^2.0"
         },
         "require-dev": {
-            "phpunit/phpunit": "^4.0"
+            "symfony/phpunit-bridge": "^3.4",
+            "symfony/translation": "^2.7|^3.4"
         },
-        "time": "2016-12-20T10:07:11+00:00",
+        "suggest": {
+            "symfony/translation": "Allow the time_diff output to be translated"
+        },
+        "time": "2018-12-05T18:34:18+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.4-dev"
+                "dev-master": "1.5-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "GuzzleHttp\\Promise\\": "src/"
+            "psr-0": {
+                "Twig_Extensions_": "lib/"
             },
-            "files": [
-                "src/functions_include.php"
-            ]
+            "psr-4": {
+                "Twig\\Extensions\\": "src/"
+            }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
@@ -2624,125 +2919,119 @@
         ],
         "authors": [
             {
-                "name": "Michael Dowling",
-                "email": "mtdowling@xxxxxxxxx",
-                "homepage": "https://github.com/mtdowling";
+                "name": "Fabien Potencier",
+                "email": "fabien@xxxxxxxxxxx"
             }
         ],
-        "description": "Guzzle promises library",
+        "description": "Common additional features for Twig that do not directly belong in core",
         "keywords": [
-            "promise"
+            "i18n",
+            "text"
         ]
     },
     {
-        "name": "guzzlehttp/psr7",
-        "version": "1.4.2",
-        "version_normalized": "1.4.2.0",
+        "name": "twig/twig",
+        "version": "v2.11.3",
+        "version_normalized": "2.11.3.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/guzzle/psr7.git";,
-            "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+            "url": "https://github.com/twigphp/Twig.git";,
+            "reference": "699ed2342557c88789a15402de5eb834dedd6792"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c";,
-            "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+            "url": "https://api.github.com/repos/twigphp/Twig/zipball/699ed2342557c88789a15402de5eb834dedd6792";,
+            "reference": "699ed2342557c88789a15402de5eb834dedd6792",
             "shasum": ""
         },
         "require": {
-            "php": ">=5.4.0",
-            "psr/http-message": "~1.0"
-        },
-        "provide": {
-            "psr/http-message-implementation": "1.0"
+            "php": "^7.0",
+            "symfony/polyfill-ctype": "^1.8",
+            "symfony/polyfill-mbstring": "^1.3"
         },
         "require-dev": {
-            "phpunit/phpunit": "~4.0"
+            "psr/container": "^1.0",
+            "symfony/debug": "^2.7",
+            "symfony/phpunit-bridge": "^3.4.19|^4.1.8|^5.0"
         },
-        "time": "2017-03-20T17:10:46+00:00",
+        "time": "2019-06-18T15:37:11+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "1.4-dev"
+                "dev-master": "2.11-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "psr-4": {
-                "GuzzleHttp\\Psr7\\": "src/"
+            "psr-0": {
+                "Twig_": "lib/"
             },
-            "files": [
-                "src/functions_include.php"
-            ]
+            "psr-4": {
+                "Twig\\": "src/"
+            }
         },
         "notification-url": "https://packagist.org/downloads/";,
         "license": [
-            "MIT"
+            "BSD-3-Clause"
         ],
         "authors": [
             {
-                "name": "Michael Dowling",
-                "email": "mtdowling@xxxxxxxxx",
-                "homepage": "https://github.com/mtdowling";
+                "name": "Fabien Potencier",
+                "email": "fabien@xxxxxxxxxxx",
+                "homepage": "http://fabien.potencier.org";,
+                "role": "Lead Developer"
             },
             {
-                "name": "Tobias Schultze",
-                "homepage": "https://github.com/Tobion";
+                "name": "Armin Ronacher",
+                "email": "armin.ronacher@xxxxxxxxxxxx",
+                "role": "Project Founder"
+            },
+            {
+                "name": "Twig Team",
+                "homepage": "https://twig.symfony.com/contributors";,
+                "role": "Contributors"
             }
         ],
-        "description": "PSR-7 message implementation that also provides common utility methods",
+        "description": "Twig, the flexible, fast, and secure template language for PHP",
+        "homepage": "https://twig.symfony.com";,
         "keywords": [
-            "http",
-            "message",
-            "request",
-            "response",
-            "stream",
-            "uri",
-            "url"
+            "templating"
         ]
     },
     {
-        "name": "guzzlehttp/guzzle",
-        "version": "6.3.0",
-        "version_normalized": "6.3.0.0",
+        "name": "webmozart/assert",
+        "version": "1.4.0",
+        "version_normalized": "1.4.0.0",
         "source": {
             "type": "git",
-            "url": "https://github.com/guzzle/guzzle.git";,
-            "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699"
+            "url": "https://github.com/webmozart/assert.git";,
+            "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9"
         },
         "dist": {
             "type": "zip",
-            "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699";,
-            "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699",
+            "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9";,
+            "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9",
             "shasum": ""
         },
         "require": {
-            "guzzlehttp/promises": "^1.0",
-            "guzzlehttp/psr7": "^1.4",
-            "php": ">=5.5"
+            "php": "^5.3.3 || ^7.0",
+            "symfony/polyfill-ctype": "^1.8"
         },
         "require-dev": {
-            "ext-curl": "*",
-            "phpunit/phpunit": "^4.0 || ^5.0",
-            "psr/log": "^1.0"
-        },
-        "suggest": {
-            "psr/log": "Required for using the Log middleware"
+            "phpunit/phpunit": "^4.6",
+            "sebastian/version": "^1.0.1"
         },
-        "time": "2017-06-22T18:50:49+00:00",
+        "time": "2018-12-25T11:19:39+00:00",
         "type": "library",
         "extra": {
             "branch-alias": {
-                "dev-master": "6.2-dev"
+                "dev-master": "1.3-dev"
             }
         },
         "installation-source": "dist",
         "autoload": {
-            "files": [
-                "src/functions_include.php"
-            ],
             "psr-4": {
-                "GuzzleHttp\\": "src/"
+                "Webmozart\\Assert\\": "src/"
             }
         },
         "notification-url": "https://packagist.org/downloads/";,
@@ -2751,21 +3040,15 @@
         ],
         "authors": [
             {
-                "name": "Michael Dowling",
-                "email": "mtdowling@xxxxxxxxx",
-                "homepage": "https://github.com/mtdowling";
+                "name": "Bernhard Schussek",
+                "email": "bschussek@xxxxxxxxx"
             }
         ],
-        "description": "Guzzle is a PHP HTTP client library",
-        "homepage": "http://guzzlephp.org/";,
+        "description": "Assertions to validate method input/output with nice error messages.",
         "keywords": [
-            "client",
-            "curl",
-            "framework",
-            "http",
-            "http client",
-            "rest",
-            "web service"
+            "assert",
+            "check",
+            "validate"
         ]
     }
 ]
diff --git a/vendor/cweagans/composer-patches/.editorconfig b/vendor/cweagans/composer-patches/.editorconfig
new file mode 100644
index 00000000..8e825941
--- /dev/null
+++ b/vendor/cweagans/composer-patches/.editorconfig
@@ -0,0 +1,11 @@
+# This is the top-most .editorconfig file; do not search in parent directories.
+root = true
+
+# All files.
+[*]
+end_of_line = LF
+indent_style = space
+indent_size = 2
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
diff --git a/vendor/cweagans/composer-patches/.gitignore b/vendor/cweagans/composer-patches/.gitignore
new file mode 100644
index 00000000..48b8bf90
--- /dev/null
+++ b/vendor/cweagans/composer-patches/.gitignore
@@ -0,0 +1 @@
+vendor/
diff --git a/vendor/cweagans/composer-patches/LICENSE.md b/vendor/cweagans/composer-patches/LICENSE.md
new file mode 100644
index 00000000..d0dad3df
--- /dev/null
+++ b/vendor/cweagans/composer-patches/LICENSE.md
@@ -0,0 +1,9 @@
+Copyright 2013 Cameron Eagans
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/vendor/cweagans/composer-patches/README.md b/vendor/cweagans/composer-patches/README.md
new file mode 100644
index 00000000..97269402
--- /dev/null
+++ b/vendor/cweagans/composer-patches/README.md
@@ -0,0 +1,178 @@
+# composer-patches
+
+Simple patches plugin for Composer. Applies a patch from a local or remote file to any package required with composer.
+
+Note that the 1.x versions of Composer Patches are supported on a best-effort
+basis due to the imminent release of 2.0.0. You may still be interested in
+using 1.x if you need Composer to cooperate with earlier PHP versions. No new
+features will be added to 1.x releases, but any security or bug fixes will
+still be accepted.
+
+## Usage
+
+Example composer.json:
+
+```json
+{
+  "require": {
+    "cweagans/composer-patches": "~1.0",
+    "drupal/drupal": "~8.2"
+  },
+  "config": {
+    "preferred-install": "source"
+  },
+  "extra": {
+    "patches": {
+      "drupal/drupal": {
+        "Add startup configuration for PHP server": "https://www.drupal.org/files/issues/add_a_startup-1543858-30.patch";
+      }
+    }
+  }
+}
+
+```
+
+## Using an external patch file
+
+Instead of a patches key in your root composer.json, use a patches-file key.
+
+```json
+{
+  "require": {
+    "cweagans/composer-patches": "~1.0",
+    "drupal/drupal": "~8.2"
+  },
+  "config": {
+    "preferred-install": "source"
+  },
+  "extra": {
+    "patches-file": "local/path/to/your/composer.patches.json"
+  }
+}
+
+```
+
+Then your `composer.patches.json` should look like this:
+
+```
+{
+  "patches": {
+    "vendor/project": {
+      "Patch title": "http://example.com/url/to/patch.patch";
+    }
+  }
+}
+```
+
+## Allowing patches to be applied from dependencies
+
+If your project doesn't supply any patches of its own, but you still want to accept patches from dependencies, you must have the following in your composer file:
+
+```json
+{
+  "require": {
+      "cweagans/composer-patches": "^1.5.0"
+  },
+  "extra": {
+      "enable-patching": true
+  }
+}
+```
+
+If you do have a `patches` section in your composer file that defines your own set of patches then the `enable-patching` setting will be ignored and patches from dependencies will always be applied.
+
+## Ignoring patches
+
+There may be situations in which you want to ignore a patch supplied by a dependency. For example:
+
+- You use a different more recent version of a dependency, and now a patch isn't applying.
+- You have a more up to date patch than the dependency, and want to use yours instead of theirs.
+- A dependency's patch adds a feature to a project that you don't need.
+- Your patches conflict with a dependency's patches.
+
+```json
+{
+  "require": {
+    "cweagans/composer-patches": "~1.0",
+    "drupal/drupal": "~8.2",
+    "drupal/lightning": "~8.1"
+  },
+  "config": {
+    "preferred-install": "source"
+  },
+  "extra": {
+    "patches": {
+      "drupal/drupal": {
+        "Add startup configuration for PHP server": "https://www.drupal.org/files/issues/add_a_startup-1543858-30.patch";
+      }
+    },
+    "patches-ignore": {
+      "drupal/lightning": {
+        "drupal/panelizer": {
+          "This patch has known conflicts with our Quick Edit integration": "https://www.drupal.org/files/issues/2664682-49.patch";
+        }
+      }
+    }
+  }
+}
+```
+
+## Allowing to force the patch level (-pX)
+
+Some situations require to force the patchLevel used to apply patches on a particular package.
+Its useful for packages like drupal/core which packages only a subdir of the original upstream project on which patches are based.
+
+```json
+{
+  "extra": {
+    "patchLevel": {
+      "drupal/core": "-p2"
+    }
+  }
+}
+```
+
+## Using patches from HTTP URLs
+
+Composer [blocks](https://getcomposer.org/doc/06-config.md#secure-http) you from downloading anything from HTTP URLs, you can disable this for your project by adding a `secure-http` setting in the config section of your `composer.json`. Note that the `config` section should be under the root of your `composer.json`.
+
+```json
+{
+  "config": {
+    "secure-http": false
+  }
+}
+```
+
+However, it's always advised to setup HTTPS to prevent MITM code injection.
+
+## Patches containing modifications to composer.json files
+
+Because patching occurs _after_ Composer calculates dependencies and installs packages, changes to an underlying dependency's `composer.json` file introduced in a patch will have _no effect_ on installed packages.
+
+If you need to modify a dependency's `composer.json` or its underlying dependencies, you cannot use this plugin. Instead, you must do one of the following:
+- Work to get the underlying issue resolved in the upstream package.
+- Fork the package and [specify your fork as the package repository](https://getcomposer.org/doc/05-repositories.md#vcs) in your root `composer.json`
+- Specify compatible package version requirements in your root `composer.json`
+
+## Error handling
+
+If a patch cannot be applied (hunk failed, different line endings, etc.) a message will be shown and the patch will be skipped.
+
+To enforce throwing an error and stopping package installation/update immediately, you have two available options:
+
+1. Add `"composer-exit-on-patch-failure": true` option to the `extra` section of your composer.json file.
+1. Export `COMPOSER_EXIT_ON_PATCH_FAILURE=1`
+
+By default, failed patches are skipped.
+
+## Difference between this and netresearch/composer-patches-plugin
+
+- This plugin is much more simple to use and maintain
+- This plugin doesn't require you to specify which package version you're patching
+- This plugin is easy to use with Drupal modules (which don't use semantic versioning).
+- This plugin will gather patches from all dependencies and apply them as if they were in the root composer.json
+
+## Credits
+
+A ton of this code is adapted or taken straight from https://github.com/jpstacey/composer-patcher, which is abandoned in favor of https://github.com/netresearch/composer-patches-plugin, which is (IMHO) overly complex and difficult to use.
diff --git a/vendor/cweagans/composer-patches/composer.json b/vendor/cweagans/composer-patches/composer.json
new file mode 100644
index 00000000..1cdcd766
--- /dev/null
+++ b/vendor/cweagans/composer-patches/composer.json
@@ -0,0 +1,30 @@
+{
+  "name": "cweagans/composer-patches",
+  "description": "Provides a way to patch Composer packages.",
+  "minimum-stability": "dev",
+  "license": "BSD-3-Clause",
+  "type": "composer-plugin",
+  "extra": {
+    "class": "cweagans\\Composer\\Patches"
+  },
+  "authors": [
+    {
+      "name": "Cameron Eagans",
+      "email": "me@xxxxxxxxxxxx"
+    }
+  ],
+  "require": {
+    "php": ">=5.3.0",
+    "composer-plugin-api": "^1.0"
+  },
+  "require-dev": {
+    "composer/composer": "~1.0",
+    "phpunit/phpunit": "~4.6"
+  },
+  "autoload": {
+    "psr-4": {"cweagans\\Composer\\": "src"}
+  },
+  "autoload-dev": {
+    "psr-4": {"cweagans\\Composer\\Tests\\": "tests"}
+  }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/composer.lock b/vendor/cweagans/composer-patches/composer.lock
similarity index 53%
rename from vendor/phpdocumentor/reflection-docblock/composer.lock
rename to vendor/cweagans/composer-patches/composer.lock
index b4da3c1b..2ca41b42 100644
--- a/vendor/phpdocumentor/reflection-docblock/composer.lock
+++ b/vendor/cweagans/composer-patches/composer.lock
@@ -4,40 +4,57 @@
         "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file";,
         "This file is @generated automatically"
     ],
-    "hash": "9dfabded4193c3fd2ec85874de3b2e3c",
-    "content-hash": "69f6ae6608b8524fa04ddb0264bbf091",
-    "packages": [
+    "hash": "a2cd6826c202b7ebefe3050efc2a7b7f",
+    "content-hash": "0ed9361502c0f5f22a5b440c16640193",
+    "packages": [],
+    "packages-dev": [
         {
-            "name": "phpdocumentor/reflection-common",
+            "name": "composer/composer",
             "version": "dev-master",
             "source": {
                 "type": "git",
-                "url": "https://github.com/phpDocumentor/ReflectionCommon.git";,
-                "reference": "9969bd1c9661a73fdab104df7dbf132639d5c4d8"
+                "url": "https://github.com/composer/composer.git";,
+                "reference": "a54f84f05f915c6d42bed94de0cdcb4406a4707b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/9969bd1c9661a73fdab104df7dbf132639d5c4d8";,
-                "reference": "9969bd1c9661a73fdab104df7dbf132639d5c4d8",
+                "url": "https://api.github.com/repos/composer/composer/zipball/f2d606ae0c705907d8bfa1c6f884bced1255b827";,
+                "reference": "a54f84f05f915c6d42bed94de0cdcb4406a4707b",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.5"
+                "composer/semver": "^1.0",
+                "composer/spdx-licenses": "^1.0",
+                "justinrainbow/json-schema": "^1.4.4",
+                "php": ">=5.3.2",
+                "seld/cli-prompt": "~1.0",
+                "seld/jsonlint": "~1.0",
+                "seld/phar-utils": "~1.0",
+                "symfony/console": "~2.5",
+                "symfony/filesystem": "~2.5",
+                "symfony/finder": "~2.2",
+                "symfony/process": "~2.1"
             },
             "require-dev": {
-                "phpunit/phpunit": "^4.6"
+                "phpunit/phpunit": "~4.5|^5.0.5",
+                "phpunit/phpunit-mock-objects": "2.3.0|~3.0"
+            },
+            "suggest": {
+                "ext-openssl": "Enabling the openssl extension allows you to access https URLs for repositories and packages",
+                "ext-zip": "Enabling the zip extension allows you to unzip archives, and allows gzip compression of all internet traffic"
             },
+            "bin": [
+                "bin/composer"
+            ],
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "1.0-dev"
                 }
             },
             "autoload": {
-                "psr-4": {
-                    "phpDocumentor\\Reflection\\": [
-                        "src"
-                    ]
+                "psr-0": {
+                    "Composer": "src/"
                 }
             },
             "notification-url": "https://packagist.org/downloads/";,
@@ -46,54 +63,55 @@
             ],
             "authors": [
                 {
-                    "name": "Jaap van Otterdijk",
-                    "email": "opensource@xxxxxxxx"
+                    "name": "Nils Adermann",
+                    "email": "naderman@xxxxxxxxxxx",
+                    "homepage": "http://www.naderman.de";
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@xxxxxxx",
+                    "homepage": "http://seld.be";
                 }
             ],
-            "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
-            "homepage": "http://www.phpdoc.org";,
+            "description": "Composer helps you declare, manage and install dependencies of PHP projects, ensuring you have the right stack everywhere.",
+            "homepage": "https://getcomposer.org/";,
             "keywords": [
-                "FQSEN",
-                "phpDocumentor",
-                "phpdoc",
-                "reflection",
-                "static analysis"
+                "autoload",
+                "dependency",
+                "package"
             ],
-            "time": "2015-06-12 22:21:38"
+            "time": "2015-10-13 13:09:04"
         },
         {
-            "name": "phpdocumentor/type-resolver",
-            "version": "0.2",
+            "name": "composer/semver",
+            "version": "1.0.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/phpDocumentor/TypeResolver.git";,
-                "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+                "url": "https://github.com/composer/semver.git";,
+                "reference": "d0e1ccc6d44ab318b758d709e19176037da6b1ba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443";,
-                "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+                "url": "https://api.github.com/repos/composer/semver/zipball/d0e1ccc6d44ab318b758d709e19176037da6b1ba";,
+                "reference": "d0e1ccc6d44ab318b758d709e19176037da6b1ba",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.5",
-                "phpdocumentor/reflection-common": "^1.0"
+                "php": ">=5.3.2"
             },
             "require-dev": {
-                "mockery/mockery": "^0.9.4",
-                "phpunit/phpunit": "^5.2||^4.8.24"
+                "phpunit/phpunit": "~4.5",
+                "phpunit/phpunit-mock-objects": "~2.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0.x-dev"
+                    "dev-master": "0.1-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "phpDocumentor\\Reflection\\": [
-                        "src/"
-                    ]
+                    "Composer\\Semver\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/";,
@@ -102,38 +120,59 @@
             ],
             "authors": [
                 {
-                    "name": "Mike van Riel",
-                    "email": "me@xxxxxxxxxxxxxxx"
+                    "name": "Rob Bast",
+                    "email": "rob.bast@xxxxxxxxx"
+                },
+                {
+                    "name": "Nils Adermann",
+                    "email": "naderman@xxxxxxxxxxx",
+                    "homepage": "http://www.naderman.de";
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@xxxxxxx",
+                    "homepage": "http://seld.be";
                 }
             ],
-            "time": "2016-06-10 07:14:17"
+            "description": "Semver library that offers utilities, version constraint parsing and validation.",
+            "keywords": [
+                "semantic",
+                "semver",
+                "validation",
+                "versioning"
+            ],
+            "time": "2015-09-21 09:42:36"
         },
         {
-            "name": "webmozart/assert",
-            "version": "1.0.1",
+            "name": "composer/spdx-licenses",
+            "version": "dev-master",
             "source": {
                 "type": "git",
-                "url": "https://github.com/webmozart/assert.git";,
-                "reference": "b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab"
+                "url": "https://github.com/composer/spdx-licenses.git";,
+                "reference": "b2dbc76d1c3f81f33857cdd49c0be6ce7b87897d"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/webmozart/assert/zipball/b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab";,
-                "reference": "b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab",
+                "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/022fc25ca664f612b1e7007e0d87642ef489f000";,
+                "reference": "b2dbc76d1c3f81f33857cdd49c0be6ce7b87897d",
                 "shasum": ""
             },
             "require": {
-                "php": ">=5.3.3"
+                "php": ">=5.3.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.5",
+                "phpunit/phpunit-mock-objects": "~2.3"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.0-dev"
+                    "dev-master": "1.x-dev"
                 }
             },
             "autoload": {
                 "psr-4": {
-                    "Webmozart\\Assert\\": "src/"
+                    "Composer\\Spdx\\": "src"
                 }
             },
             "notification-url": "https://packagist.org/downloads/";,
@@ -142,23 +181,32 @@
             ],
             "authors": [
                 {
-                    "name": "Bernhard Schussek",
-                    "email": "bschussek@xxxxxxxxx"
+                    "name": "Nils Adermann",
+                    "email": "naderman@xxxxxxxxxxx",
+                    "homepage": "http://www.naderman.de";
+                },
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@xxxxxxx",
+                    "homepage": "http://seld.be";
+                },
+                {
+                    "name": "Rob Bast",
+                    "email": "rob.bast@xxxxxxxxx",
+                    "homepage": "http://robbast.nl";
                 }
             ],
-            "description": "Assertions to validate method input/output with nice error messages.",
+            "description": "SPDX licenses list and validation library.",
             "keywords": [
-                "assert",
-                "check",
-                "validate"
+                "license",
+                "spdx",
+                "validator"
             ],
-            "time": "2015-05-12 15:19:25"
-        }
-    ],
-    "packages-dev": [
+            "time": "2015-10-05 11:33:06"
+        },
         {
             "name": "doctrine/instantiator",
-            "version": "1.0.5",
+            "version": "dev-master",
             "source": {
                 "type": "git",
                 "url": "https://github.com/doctrine/instantiator.git";,
@@ -211,127 +259,192 @@
             "time": "2015-06-14 21:17:01"
         },
         {
-            "name": "hamcrest/hamcrest-php",
-            "version": "v1.2.2",
+            "name": "justinrainbow/json-schema",
+            "version": "1.5.0",
             "source": {
                 "type": "git",
-                "url": "https://github.com/hamcrest/hamcrest-php.git";,
-                "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c"
+                "url": "https://github.com/justinrainbow/json-schema.git";,
+                "reference": "a4bee9f4b344b66e0a0d96c7afae1e92edf385fe"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c";,
-                "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c",
+                "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/a4bee9f4b344b66e0a0d96c7afae1e92edf385fe";,
+                "reference": "a4bee9f4b344b66e0a0d96c7afae1e92edf385fe",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.2"
             },
-            "replace": {
-                "cordoval/hamcrest-php": "*",
-                "davedevelopment/hamcrest-php": "*",
-                "kodova/hamcrest-php": "*"
-            },
             "require-dev": {
-                "phpunit/php-file-iterator": "1.3.3",
-                "satooshi/php-coveralls": "dev-master"
+                "json-schema/json-schema-test-suite": "1.1.0",
+                "phpdocumentor/phpdocumentor": "~2",
+                "phpunit/phpunit": "~3.7"
             },
+            "bin": [
+                "bin/validate-json"
+            ],
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
             "autoload": {
-                "classmap": [
-                    "hamcrest"
-                ],
-                "files": [
-                    "hamcrest/Hamcrest.php"
-                ]
+                "psr-4": {
+                    "JsonSchema\\": "src/JsonSchema/"
+                }
             },
             "notification-url": "https://packagist.org/downloads/";,
             "license": [
-                "BSD"
+                "BSD-3-Clause"
             ],
-            "description": "This is the PHP port of Hamcrest Matchers",
+            "authors": [
+                {
+                    "name": "Bruno Prieto Reis",
+                    "email": "bruno.p.reis@xxxxxxxxx"
+                },
+                {
+                    "name": "Justin Rainbow",
+                    "email": "justin.rainbow@xxxxxxxxx"
+                },
+                {
+                    "name": "Igor Wiedler",
+                    "email": "igor@xxxxxxxxxx"
+                },
+                {
+                    "name": "Robert Schönthal",
+                    "email": "seroscho@xxxxxxxxxxxxxx"
+                }
+            ],
+            "description": "A library to validate a json schema.",
+            "homepage": "https://github.com/justinrainbow/json-schema";,
             "keywords": [
-                "test"
+                "json",
+                "schema"
             ],
-            "time": "2015-05-11 14:41:42"
+            "time": "2015-09-08 22:28:04"
         },
         {
-            "name": "mockery/mockery",
-            "version": "0.9.4",
+            "name": "phpdocumentor/reflection-docblock",
+            "version": "2.0.4",
             "source": {
                 "type": "git",
-                "url": "https://github.com/padraic/mockery.git";,
-                "reference": "70bba85e4aabc9449626651f48b9018ede04f86b"
+                "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git";,
+                "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/padraic/mockery/zipball/70bba85e4aabc9449626651f48b9018ede04f86b";,
-                "reference": "70bba85e4aabc9449626651f48b9018ede04f86b",
+                "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8";,
+                "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
                 "shasum": ""
             },
             "require": {
-                "hamcrest/hamcrest-php": "~1.1",
-                "lib-pcre": ">=7.0",
-                "php": ">=5.3.2"
+                "php": ">=5.3.3"
             },
             "require-dev": {
                 "phpunit/phpunit": "~4.0"
             },
+            "suggest": {
+                "dflydev/markdown": "~1.0",
+                "erusev/parsedown": "~1.0"
+            },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "0.9.x-dev"
+                    "dev-master": "2.0.x-dev"
                 }
             },
             "autoload": {
                 "psr-0": {
-                    "Mockery": "library/"
+                    "phpDocumentor": [
+                        "src/"
+                    ]
                 }
             },
             "notification-url": "https://packagist.org/downloads/";,
             "license": [
-                "BSD-3-Clause"
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Mike van Riel",
+                    "email": "mike.vanriel@xxxxxxxxxxx"
+                }
+            ],
+            "time": "2015-02-03 12:10:50"
+        },
+        {
+            "name": "phpspec/prophecy",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/phpspec/prophecy.git";,
+                "reference": "4f9b1eaf0a7da77c362f8d91cbc68ab1f4718d62"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/phpspec/prophecy/zipball/b02221e42163be673f9b44a0bc92a8b4907a7c6d";,
+                "reference": "4f9b1eaf0a7da77c362f8d91cbc68ab1f4718d62",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "^1.0.2",
+                "phpdocumentor/reflection-docblock": "~2.0",
+                "sebastian/comparator": "~1.1"
+            },
+            "require-dev": {
+                "phpspec/phpspec": "~2.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.5.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Prophecy\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/";,
+            "license": [
+                "MIT"
             ],
             "authors": [
                 {
-                    "name": "Pádraic Brady",
-                    "email": "padraic.brady@xxxxxxxxx",
-                    "homepage": "http://blog.astrumfutura.com";
+                    "name": "Konstantin Kudryashov",
+                    "email": "ever.zet@xxxxxxxxx",
+                    "homepage": "http://everzet.com";
                 },
                 {
-                    "name": "Dave Marshall",
-                    "email": "dave.marshall@xxxxxxxxxxxxxxxxxxx",
-                    "homepage": "http://davedevelopment.co.uk";
+                    "name": "Marcello Duarte",
+                    "email": "marcello.duarte@xxxxxxxxx"
                 }
             ],
-            "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.",
-            "homepage": "http://github.com/padraic/mockery";,
+            "description": "Highly opinionated mocking framework for PHP 5.3+",
+            "homepage": "https://github.com/phpspec/prophecy";,
             "keywords": [
-                "BDD",
-                "TDD",
-                "library",
+                "Double",
+                "Dummy",
+                "fake",
                 "mock",
-                "mock objects",
-                "mockery",
-                "stub",
-                "test",
-                "test double",
-                "testing"
-            ],
-            "time": "2015-04-02 19:54:00"
+                "spy",
+                "stub"
+            ],
+            "time": "2015-09-22 14:49:23"
         },
         {
             "name": "phpunit/php-code-coverage",
-            "version": "2.1.6",
+            "version": "2.2.x-dev",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-code-coverage.git";,
-                "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44"
+                "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/631e365cf26bb2c078683e8d9bcf8bc631ac4d44";,
-                "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979";,
+                "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
                 "shasum": ""
             },
             "require": {
@@ -339,7 +452,7 @@
                 "phpunit/php-file-iterator": "~1.3",
                 "phpunit/php-text-template": "~1.2",
                 "phpunit/php-token-stream": "~1.3",
-                "sebastian/environment": "~1.0",
+                "sebastian/environment": "^1.3.2",
                 "sebastian/version": "~1.0"
             },
             "require-dev": {
@@ -354,7 +467,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.1.x-dev"
+                    "dev-master": "2.2.x-dev"
                 }
             },
             "autoload": {
@@ -380,35 +493,37 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2015-06-19 07:11:55"
+            "time": "2015-10-06 15:47:00"
         },
         {
             "name": "phpunit/php-file-iterator",
-            "version": "1.3.4",
+            "version": "dev-master",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-file-iterator.git";,
-                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb"
+                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb";,
-                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0";,
+                "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.3"
             },
             "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4.x-dev"
+                }
+            },
             "autoload": {
                 "classmap": [
-                    "File/"
+                    "src/"
                 ]
             },
             "notification-url": "https://packagist.org/downloads/";,
-            "include-path": [
-                ""
-            ],
             "license": [
                 "BSD-3-Clause"
             ],
@@ -425,7 +540,7 @@
                 "filesystem",
                 "iterator"
             ],
-            "time": "2013-10-10 15:34:57"
+            "time": "2015-06-21 13:08:43"
         },
         {
             "name": "phpunit/php-text-template",
@@ -470,16 +585,16 @@
         },
         {
             "name": "phpunit/php-timer",
-            "version": "1.0.6",
+            "version": "dev-master",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-timer.git";,
-                "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d"
+                "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d";,
-                "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b";,
+                "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
                 "shasum": ""
             },
             "require": {
@@ -507,20 +622,20 @@
             "keywords": [
                 "timer"
             ],
-            "time": "2015-06-13 07:35:30"
+            "time": "2015-06-21 08:01:12"
         },
         {
             "name": "phpunit/php-token-stream",
-            "version": "1.4.3",
+            "version": "dev-master",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/php-token-stream.git";,
-                "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9"
+                "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9";,
-                "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/cab6c6fefee93d7b7c3a01292a0fe0884ea66644";,
+                "reference": "cab6c6fefee93d7b7c3a01292a0fe0884ea66644",
                 "shasum": ""
             },
             "require": {
@@ -556,20 +671,20 @@
             "keywords": [
                 "tokenizer"
             ],
-            "time": "2015-06-19 03:43:16"
+            "time": "2015-09-23 14:46:55"
         },
         {
             "name": "phpunit/phpunit",
-            "version": "4.4.5",
+            "version": "4.8.x-dev",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit.git";,
-                "reference": "2e8580deebb7d1ac92ac878595e6bffe01069c2a"
+                "reference": "be067d6105286b74272facefc2697038f8807b77"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2e8580deebb7d1ac92ac878595e6bffe01069c2a";,
-                "reference": "2e8580deebb7d1ac92ac878595e6bffe01069c2a",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/264188ddf4d3586c80ea615f8ec8eaea34e652a1";,
+                "reference": "be067d6105286b74272facefc2697038f8807b77",
                 "shasum": ""
             },
             "require": {
@@ -579,19 +694,19 @@
                 "ext-reflection": "*",
                 "ext-spl": "*",
                 "php": ">=5.3.3",
-                "phpunit/php-code-coverage": "~2.0",
-                "phpunit/php-file-iterator": "~1.3.2",
+                "phpspec/prophecy": "^1.3.1",
+                "phpunit/php-code-coverage": "~2.1",
+                "phpunit/php-file-iterator": "~1.4",
                 "phpunit/php-text-template": "~1.2",
-                "phpunit/php-timer": "~1.0.2",
+                "phpunit/php-timer": ">=1.0.6",
                 "phpunit/phpunit-mock-objects": "~2.3",
-                "sebastian/comparator": "~1.0",
-                "sebastian/diff": "~1.1",
-                "sebastian/environment": "~1.1",
-                "sebastian/exporter": "~1.1",
+                "sebastian/comparator": "~1.1",
+                "sebastian/diff": "~1.2",
+                "sebastian/environment": "~1.3",
+                "sebastian/exporter": "~1.2",
                 "sebastian/global-state": "~1.0",
-                "sebastian/recursion-context": "~1.0",
                 "sebastian/version": "~1.0",
-                "symfony/yaml": "~2.0"
+                "symfony/yaml": "~2.1|~3.0"
             },
             "suggest": {
                 "phpunit/php-invoker": "~1.1"
@@ -602,7 +717,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "4.4.x-dev"
+                    "dev-master": "4.8.x-dev"
                 }
             },
             "autoload": {
@@ -628,26 +743,27 @@
                 "testing",
                 "xunit"
             ],
-            "time": "2015-01-27 16:06:15"
+            "time": "2015-10-14 13:49:40"
         },
         {
             "name": "phpunit/phpunit-mock-objects",
-            "version": "2.3.4",
+            "version": "2.3.x-dev",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git";,
-                "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35"
+                "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/92408bb1968a81b3217a6fdf6c1a198da83caa35";,
-                "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983";,
+                "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
                 "shasum": ""
             },
             "require": {
-                "doctrine/instantiator": "~1.0,>=1.0.2",
+                "doctrine/instantiator": "^1.0.2",
                 "php": ">=5.3.3",
-                "phpunit/php-text-template": "~1.2"
+                "phpunit/php-text-template": "~1.2",
+                "sebastian/exporter": "~1.2"
             },
             "require-dev": {
                 "phpunit/phpunit": "~4.4"
@@ -683,20 +799,20 @@
                 "mock",
                 "xunit"
             ],
-            "time": "2015-06-11 15:55:48"
+            "time": "2015-10-02 06:51:40"
         },
         {
             "name": "sebastian/comparator",
-            "version": "1.1.1",
+            "version": "dev-master",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/comparator.git";,
-                "reference": "1dd8869519a225f7f2b9eb663e225298fade819e"
+                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e";,
-                "reference": "1dd8869519a225f7f2b9eb663e225298fade819e",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22";,
+                "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
                 "shasum": ""
             },
             "require": {
@@ -710,7 +826,7 @@
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.1.x-dev"
+                    "dev-master": "1.2.x-dev"
                 }
             },
             "autoload": {
@@ -747,20 +863,20 @@
                 "compare",
                 "equality"
             ],
-            "time": "2015-01-29 16:28:08"
+            "time": "2015-07-26 15:48:44"
         },
         {
             "name": "sebastian/diff",
-            "version": "1.3.0",
+            "version": "dev-master",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/diff.git";,
-                "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
+                "reference": "6899b3e33bfbd386d88b5eea5f65f563e8793051"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3";,
-                "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e";,
+                "reference": "6899b3e33bfbd386d88b5eea5f65f563e8793051",
                 "shasum": ""
             },
             "require": {
@@ -799,20 +915,20 @@
             "keywords": [
                 "diff"
             ],
-            "time": "2015-02-22 15:13:53"
+            "time": "2015-06-22 14:15:55"
         },
         {
             "name": "sebastian/environment",
-            "version": "1.2.2",
+            "version": "dev-master",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/environment.git";,
-                "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e"
+                "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e";,
-                "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/dc7a29032cf72b54f36dac15a1ca5b3a1b6029bf";,
+                "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44",
                 "shasum": ""
             },
             "require": {
@@ -849,20 +965,20 @@
                 "environment",
                 "hhvm"
             ],
-            "time": "2015-01-01 10:01:08"
+            "time": "2015-08-03 06:14:51"
         },
         {
             "name": "sebastian/exporter",
-            "version": "1.2.0",
+            "version": "dev-master",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/exporter.git";,
-                "reference": "84839970d05254c73cde183a721c7af13aede943"
+                "reference": "f88f8936517d54ae6d589166810877fb2015d0a2"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943";,
-                "reference": "84839970d05254c73cde183a721c7af13aede943",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/f88f8936517d54ae6d589166810877fb2015d0a2";,
+                "reference": "f88f8936517d54ae6d589166810877fb2015d0a2",
                 "shasum": ""
             },
             "require": {
@@ -870,12 +986,13 @@
                 "sebastian/recursion-context": "~1.0"
             },
             "require-dev": {
+                "ext-mbstring": "*",
                 "phpunit/phpunit": "~4.4"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "1.2.x-dev"
+                    "dev-master": "1.3.x-dev"
                 }
             },
             "autoload": {
@@ -915,20 +1032,20 @@
                 "export",
                 "exporter"
             ],
-            "time": "2015-01-27 07:23:06"
+            "time": "2015-08-09 04:23:41"
         },
         {
             "name": "sebastian/global-state",
-            "version": "1.0.0",
+            "version": "1.1.1",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/global-state.git";,
-                "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01"
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01";,
-                "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+                "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4";,
+                "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
                 "shasum": ""
             },
             "require": {
@@ -966,20 +1083,20 @@
             "keywords": [
                 "global state"
             ],
-            "time": "2014-10-06 09:23:50"
+            "time": "2015-10-12 03:26:01"
         },
         {
             "name": "sebastian/recursion-context",
-            "version": "1.0.0",
+            "version": "dev-master",
             "source": {
                 "type": "git",
                 "url": "https://github.com/sebastianbergmann/recursion-context.git";,
-                "reference": "3989662bbb30a29d20d9faa04a846af79b276252"
+                "reference": "994d4a811bafe801fb06dccbee797863ba2792ba"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252";,
-                "reference": "3989662bbb30a29d20d9faa04a846af79b276252",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/7ff5b1b3dcc55b8ab8ae61ef99d4730940856ee7";,
+                "reference": "994d4a811bafe801fb06dccbee797863ba2792ba",
                 "shasum": ""
             },
             "require": {
@@ -1019,7 +1136,7 @@
             ],
             "description": "Provides functionality to recursively process PHP variables",
             "homepage": "http://www.github.com/sebastianbergmann/recursion-context";,
-            "time": "2015-01-24 09:48:32"
+            "time": "2015-06-21 08:04:50"
         },
         {
             "name": "sebastian/version",
@@ -1057,29 +1174,358 @@
             "time": "2015-06-21 13:59:46"
         },
         {
-            "name": "symfony/yaml",
-            "version": "v2.7.1",
+            "name": "seld/cli-prompt",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/cli-prompt.git";,
+                "reference": "fe114c7a6ac5cb0ce76932ae4017024d9842a49c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/cli-prompt/zipball/b27db1514f7d7bb7a366ad95d4eb2b17140a0691";,
+                "reference": "fe114c7a6ac5cb0ce76932ae4017024d9842a49c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Seld\\CliPrompt\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/";,
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@xxxxxxx"
+                }
+            ],
+            "description": "Allows you to prompt for user input on the command line, and optionally hide the characters they type",
+            "keywords": [
+                "cli",
+                "console",
+                "hidden",
+                "input",
+                "prompt"
+            ],
+            "time": "2015-04-30 20:24:49"
+        },
+        {
+            "name": "seld/jsonlint",
+            "version": "1.3.1",
             "source": {
                 "type": "git",
-                "url": "https://github.com/symfony/Yaml.git";,
-                "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160"
+                "url": "https://github.com/Seldaek/jsonlint.git";,
+                "reference": "863ae85c6d3ef60ca49cb12bd051c4a0648c40c4"
             },
             "dist": {
                 "type": "zip",
-                "url": "https://api.github.com/repos/symfony/Yaml/zipball/9808e75c609a14f6db02f70fccf4ca4aab53c160";,
-                "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160",
+                "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/863ae85c6d3ef60ca49cb12bd051c4a0648c40c4";,
+                "reference": "863ae85c6d3ef60ca49cb12bd051c4a0648c40c4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "bin": [
+                "bin/jsonlint"
+            ],
+            "type": "library",
+            "autoload": {
+                "psr-4": {
+                    "Seld\\JsonLint\\": "src/Seld/JsonLint/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/";,
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@xxxxxxx",
+                    "homepage": "http://seld.be";
+                }
+            ],
+            "description": "JSON Linter",
+            "keywords": [
+                "json",
+                "linter",
+                "parser",
+                "validator"
+            ],
+            "time": "2015-01-04 21:18:15"
+        },
+        {
+            "name": "seld/phar-utils",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/Seldaek/phar-utils.git";,
+                "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/7009b5139491975ef6486545a39f3e6dad5ac30a";,
+                "reference": "7009b5139491975ef6486545a39f3e6dad5ac30a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Seld\\PharUtils\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/";,
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Jordi Boggiano",
+                    "email": "j.boggiano@xxxxxxx"
+                }
+            ],
+            "description": "PHAR file format utilities, for when PHP phars you up",
+            "keywords": [
+                "phra"
+            ],
+            "time": "2015-10-13 18:44:15"
+        },
+        {
+            "name": "symfony/console",
+            "version": "2.8.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/console.git";,
+                "reference": "89a795226477f66745e8ea10415e769304114920"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/console/zipball/56cc5caf051189720b8de974e4746090aaa10d44";,
+                "reference": "89a795226477f66745e8ea10415e769304114920",
                 "shasum": ""
             },
             "require": {
                 "php": ">=5.3.9"
             },
             "require-dev": {
-                "symfony/phpunit-bridge": "~2.7"
+                "psr/log": "~1.0",
+                "symfony/event-dispatcher": "~2.1|~3.0.0",
+                "symfony/process": "~2.1|~3.0.0"
+            },
+            "suggest": {
+                "psr/log": "For using the console logger",
+                "symfony/event-dispatcher": "",
+                "symfony/process": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Console\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/";,
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@xxxxxxxxxxx"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors";
+                }
+            ],
+            "description": "Symfony Console Component",
+            "homepage": "https://symfony.com";,
+            "time": "2015-10-12 10:31:17"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "2.8.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/filesystem.git";,
+                "reference": "fc3fe52fef85e1f3e7775ffad92539e16c20e0af"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/filesystem/zipball/65cb36b6539b1d446527d60457248f30d045464d";,
+                "reference": "fc3fe52fef85e1f3e7775ffad92539e16c20e0af",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
             },
             "type": "library",
             "extra": {
                 "branch-alias": {
-                    "dev-master": "2.7-dev"
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/";,
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@xxxxxxxxxxx"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors";
+                }
+            ],
+            "description": "Symfony Filesystem Component",
+            "homepage": "https://symfony.com";,
+            "time": "2015-10-11 08:29:26"
+        },
+        {
+            "name": "symfony/finder",
+            "version": "2.8.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/finder.git";,
+                "reference": "dcd5aaba34ca332abb7f33ec554ebd4d829cb202"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/finder/zipball/877bb4b16ea573cc8c024e9590888fcf7eb7e0f7";,
+                "reference": "dcd5aaba34ca332abb7f33ec554ebd4d829cb202",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Finder\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/";,
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@xxxxxxxxxxx"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors";
+                }
+            ],
+            "description": "Symfony Finder Component",
+            "homepage": "https://symfony.com";,
+            "time": "2015-10-11 08:29:26"
+        },
+        {
+            "name": "symfony/process",
+            "version": "2.8.x-dev",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/process.git";,
+                "reference": "4e1daf58b375ea7c506d525dc7801df1c9a6ebbd"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/process/zipball/7dedd5b60550f33dca16dd7e94ef8aca8b67bbfe";,
+                "reference": "4e1daf58b375ea7c506d525dc7801df1c9a6ebbd",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.8-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Symfony\\Component\\Process\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/";,
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@xxxxxxxxxxx"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "https://symfony.com/contributors";
+                }
+            ],
+            "description": "Symfony Process Component",
+            "homepage": "https://symfony.com";,
+            "time": "2015-10-11 08:29:26"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/yaml.git";,
+                "reference": "8d32eb597b531eb915b4fee3dc582ade5ae1fe6a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/yaml/zipball/ab0314f7544d600ea7917f02cdad774358b81113";,
+                "reference": "8d32eb597b531eb915b4fee3dc582ade5ae1fe6a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.9"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
                 }
             },
             "autoload": {
@@ -1103,18 +1549,16 @@
             ],
             "description": "Symfony Yaml Component",
             "homepage": "https://symfony.com";,
-            "time": "2015-06-10 15:30:22"
+            "time": "2015-10-13 16:01:35"
         }
     ],
     "aliases": [],
-    "minimum-stability": "stable",
-    "stability-flags": {
-        "phpdocumentor/reflection-common": 20
-    },
+    "minimum-stability": "dev",
+    "stability-flags": [],
     "prefer-stable": false,
     "prefer-lowest": false,
     "platform": {
-        "php": ">=5.5"
+        "php": ">=5.3.0"
     },
     "platform-dev": []
 }
diff --git a/vendor/cweagans/composer-patches/phpunit.xml.dist b/vendor/cweagans/composer-patches/phpunit.xml.dist
new file mode 100644
index 00000000..62409b3b
--- /dev/null
+++ b/vendor/cweagans/composer-patches/phpunit.xml.dist
@@ -0,0 +1,18 @@
+<!--?xml version="1.0" encoding="UTF-8"?-->
+
+<phpunit colors="true" bootstrap="vendor/autoload.php">
+  <testsuites>
+    <testsuite name="composer-patches">
+        <directory>./tests/</directory>
+    </testsuite>
+  </testsuites>
+  <!-- Filter for coverage reports. -->
+  <filter>
+    <whitelist>
+      <directory>src/</directory>
+    </whitelist>
+    <blacklist>
+      <directory>vendor/</directory>
+    </blacklist>
+  </filter>
+</phpunit>
diff --git a/vendor/cweagans/composer-patches/src/PatchEvent.php b/vendor/cweagans/composer-patches/src/PatchEvent.php
new file mode 100644
index 00000000..31d36f89
--- /dev/null
+++ b/vendor/cweagans/composer-patches/src/PatchEvent.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * @file
+ * Dispatch events when patches are applied.
+ */
+
+namespace cweagans\Composer;
+
+use Composer\EventDispatcher\Event;
+use Composer\Package\PackageInterface;
+
+class PatchEvent extends Event {
+
+ /**
+  * @var PackageInterface $package
+  */
+ protected $package;
+ /**
+  * @var string $url
+  */
+ protected $url;
+ /**
+  * @var string $description
+  */
+ protected $description;
+
+  /**
+   * Constructs a PatchEvent object.
+   *
+   * @param string $eventName
+   * @param PackageInterface $package
+   * @param string $url
+   * @param string $description
+   */
+  public function __construct($eventName, PackageInterface $package, $url, $description) {
+    parent::__construct($eventName);
+    $this->package = $package;
+    $this->url = $url;
+    $this->description = $description;
+  }
+
+  /**
+   * Returns the package that is patched.
+   *
+   * @return PackageInterface
+   */
+  public function getPackage() {
+    return $this->package;
+  }
+
+  /**
+   * Returns the url of the patch.
+   *
+   * @return string
+   */
+  public function getUrl() {
+    return $this->url;
+  }
+
+  /**
+   * Returns the description of the patch.
+   *
+   * @return string
+   */
+  public function getDescription() {
+    return $this->description;
+  }
+
+}
diff --git a/vendor/cweagans/composer-patches/src/PatchEvents.php b/vendor/cweagans/composer-patches/src/PatchEvents.php
new file mode 100644
index 00000000..ecee9476
--- /dev/null
+++ b/vendor/cweagans/composer-patches/src/PatchEvents.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Dispatch events when patches are applied.
+ */
+
+namespace cweagans\Composer;
+
+class PatchEvents {
+
+  /**
+   * The PRE_PATCH_APPLY event occurs before a patch is applied.
+   *
+   * The event listener method receives a cweagans\Composer\PatchEvent instance.
+   *
+   * @var string
+   */
+  const PRE_PATCH_APPLY = 'pre-patch-apply';
+
+  /**
+   * The POST_PATCH_APPLY event occurs after a patch is applied.
+   *
+   * The event listener method receives a cweagans\Composer\PatchEvent instance.
+   *
+   * @var string
+   */
+  const POST_PATCH_APPLY = 'post-patch-apply';
+
+}
diff --git a/vendor/cweagans/composer-patches/src/Patches.php b/vendor/cweagans/composer-patches/src/Patches.php
new file mode 100644
index 00000000..d51fac15
--- /dev/null
+++ b/vendor/cweagans/composer-patches/src/Patches.php
@@ -0,0 +1,551 @@
+<?php
+
+/**
+ * @file
+ * Provides a way to patch Composer packages after installation.
+ */
+
+namespace cweagans\Composer;
+
+use Composer\Composer;
+use Composer\DependencyResolver\Operation\InstallOperation;
+use Composer\DependencyResolver\Operation\UninstallOperation;
+use Composer\DependencyResolver\Operation\UpdateOperation;
+use Composer\DependencyResolver\Operation\OperationInterface;
+use Composer\EventDispatcher\EventSubscriberInterface;
+use Composer\IO\IOInterface;
+use Composer\Package\AliasPackage;
+use Composer\Package\PackageInterface;
+use Composer\Plugin\PluginInterface;
+use Composer\Installer\PackageEvents;
+use Composer\Script\Event;
+use Composer\Script\ScriptEvents;
+use Composer\Installer\PackageEvent;
+use Composer\Util\ProcessExecutor;
+use Composer\Util\RemoteFilesystem;
+use Symfony\Component\Process\Process;
+
+class Patches implements PluginInterface, EventSubscriberInterface {
+
+  /**
+   * @var Composer $composer
+   */
+  protected $composer;
+  /**
+   * @var IOInterface $io
+   */
+  protected $io;
+  /**
+   * @var EventDispatcher $eventDispatcher
+   */
+  protected $eventDispatcher;
+  /**
+   * @var ProcessExecutor $executor
+   */
+  protected $executor;
+  /**
+   * @var array $patches
+   */
+  protected $patches;
+
+  /**
+   * Apply plugin modifications to composer
+   *
+   * @param Composer    $composer
+   * @param IOInterface $io
+   */
+  public function activate(Composer $composer, IOInterface $io) {
+    $this->composer = $composer;
+    $this->io = $io;
+    $this->eventDispatcher = $composer->getEventDispatcher();
+    $this->executor = new ProcessExecutor($this->io);
+    $this->patches = array();
+    $this->installedPatches = array();
+  }
+
+  /**
+   * Returns an array of event names this subscriber wants to listen to.
+   */
+  public static function getSubscribedEvents() {
+    return array(
+      ScriptEvents::PRE_INSTALL_CMD => array('checkPatches'),
+      ScriptEvents::PRE_UPDATE_CMD => array('checkPatches'),
+      PackageEvents::PRE_PACKAGE_INSTALL => array('gatherPatches'),
+      PackageEvents::PRE_PACKAGE_UPDATE => array('gatherPatches'),
+      // The following is a higher weight for compatibility with
+      // https://github.com/AydinHassan/magento-core-composer-installer and more generally for compatibility with
+      // every Composer plugin which deploys downloaded packages to other locations.
+      // In such cases you want that those plugins deploy patched files so they have to run after
+      // the "composer-patches" plugin.
+      // @see: https://github.com/cweagans/composer-patches/pull/153
+      PackageEvents::POST_PACKAGE_INSTALL => array('postInstall', 10),
+      PackageEvents::POST_PACKAGE_UPDATE => array('postInstall', 10),
+    );
+  }
+
+  /**
+   * Before running composer install,
+   * @param Event $event
+   */
+  public function checkPatches(Event $event) {
+    if (!$this->isPatchingEnabled()) {
+      return;
+    }
+
+    try {
+      $repositoryManager = $this->composer->getRepositoryManager();
+      $localRepository = $repositoryManager->getLocalRepository();
+      $installationManager = $this->composer->getInstallationManager();
+      $packages = $localRepository->getPackages();
+
+      $extra = $this->composer->getPackage()->getExtra();
+      $patches_ignore = isset($extra['patches-ignore']) ? $extra['patches-ignore'] : array();
+
+      $tmp_patches = $this->grabPatches();
+      foreach ($packages as $package) {
+        $extra = $package->getExtra();
+        if (isset($extra['patches'])) {
+          if (isset($patches_ignore[$package->getName()])) {
+            foreach ($patches_ignore[$package->getName()] as $package_name => $patches) {
+              if (isset($extra['patches'][$package_name])) {
+                $extra['patches'][$package_name] = array_diff($extra['patches'][$package_name], $patches);
+              }
+            }
+          }
+          $this->installedPatches[$package->getName()] = $extra['patches'];
+        }
+        $patches = isset($extra['patches']) ? $extra['patches'] : array();
+        $tmp_patches = $this->arrayMergeRecursiveDistinct($tmp_patches, $patches);
+      }
+
+      if ($tmp_patches == FALSE) {
+        $this->io->write('<info>No patches supplied.</info>');
+        return;
+      }
+
+      // Remove packages for which the patch set has changed.
+      foreach ($packages as $package) {
+        if (!($package instanceof AliasPackage)) {
+          $package_name = $package->getName();
+          $extra = $package->getExtra();
+          $has_patches = isset($tmp_patches[$package_name]);
+          $has_applied_patches = isset($extra['patches_applied']) && count($extra['patches_applied']) > 0;
+          if (($has_patches && !$has_applied_patches)
+            || (!$has_patches && $has_applied_patches)
+            || ($has_patches && $has_applied_patches && $tmp_patches[$package_name] !== $extra['patches_applied'])) {
+            $uninstallOperation = new UninstallOperation($package, 'Removing package so it can be re-installed and re-patched.');
+            $this->io->write('<info>Removing package ' . $package_name . ' so that it can be re-installed and re-patched.</info>');
+            $installationManager->uninstall($localRepository, $uninstallOperation);
+          }
+        }
+      }
+    }
+    // If the Locker isn't available, then we don't need to do this.
+    // It's the first time packages have been installed.
+    catch (\LogicException $e) {
+      return;
+    }
+  }
+
+  /**
+   * Gather patches from dependencies and store them for later use.
+   *
+   * @param PackageEvent $event
+   */
+  public function gatherPatches(PackageEvent $event) {
+    // If we've already done this, then don't do it again.
+    if (isset($this->patches['_patchesGathered'])) {
+      $this->io->write('<info>Patches already gathered. Skipping</info>', TRUE, IOInterface::VERBOSE);
+      return;
+    }
+    // If patching has been disabled, bail out here.
+    elseif (!$this->isPatchingEnabled()) {
+      $this->io->write('<info>Patching is disabled. Skipping.</info>', TRUE, IOInterface::VERBOSE);
+      return;
+    }
+
+    $this->patches = $this->grabPatches();
+    if (empty($this->patches)) {
+      $this->io->write('<info>No patches supplied.</info>');
+    }
+
+    $extra = $this->composer->getPackage()->getExtra();
+    $patches_ignore = isset($extra['patches-ignore']) ? $extra['patches-ignore'] : array();
+
+    // Now add all the patches from dependencies that will be installed.
+    $operations = $event->getOperations();
+    $this->io->write('<info>Gathering patches for dependencies. This might take a minute.</info>');
+    foreach ($operations as $operation) {
+      if ($operation->getJobType() == 'install' || $operation->getJobType() == 'update') {
+        $package = $this->getPackageFromOperation($operation);
+        $extra = $package->getExtra();
+        if (isset($extra['patches'])) {
+          if (isset($patches_ignore[$package->getName()])) {
+            foreach ($patches_ignore[$package->getName()] as $package_name => $patches) {
+              if (isset($extra['patches'][$package_name])) {
+                $extra['patches'][$package_name] = array_diff($extra['patches'][$package_name], $patches);
+              }
+            }
+          }
+          $this->patches = $this->arrayMergeRecursiveDistinct($this->patches, $extra['patches']);
+        }
+        // Unset installed patches for this package
+        if(isset($this->installedPatches[$package->getName()])) {
+          unset($this->installedPatches[$package->getName()]);
+        }
+      }
+    }
+
+    // Merge installed patches from dependencies that did not receive an update.
+    foreach ($this->installedPatches as $patches) {
+      $this->patches = $this->arrayMergeRecursiveDistinct($this->patches, $patches);
+    }
+
+    // If we're in verbose mode, list the projects we're going to patch.
+    if ($this->io->isVerbose()) {
+      foreach ($this->patches as $package => $patches) {
+        $number = count($patches);
+        $this->io->write('<info>Found ' . $number . ' patches for ' . $package . '.</info>');
+      }
+    }
+
+    // Make sure we don't gather patches again. Extra keys in $this->patches
+    // won't hurt anything, so we'll just stash it there.
+    $this->patches['_patchesGathered'] = TRUE;
+  }
+
+  /**
+   * Get the patches from root composer or external file
+   * @return Patches
+   * @throws \Exception
+   */
+  public function grabPatches() {
+      // First, try to get the patches from the root composer.json.
+    $extra = $this->composer->getPackage()->getExtra();
+    if (isset($extra['patches'])) {
+      $this->io->write('<info>Gathering patches for root package.</info>');
+      $patches = $extra['patches'];
+      return $patches;
+    }
+    // If it's not specified there, look for a patches-file definition.
+    elseif (isset($extra['patches-file'])) {
+      $this->io->write('<info>Gathering patches from patch file.</info>');
+      $patches = file_get_contents($extra['patches-file']);
+      $patches = json_decode($patches, TRUE);
+      $error = json_last_error();
+      if ($error != 0) {
+        switch ($error) {
+          case JSON_ERROR_DEPTH:
+            $msg = ' - Maximum stack depth exceeded';
+            break;
+          case JSON_ERROR_STATE_MISMATCH:
+            $msg =  ' - Underflow or the modes mismatch';
+            break;
+          case JSON_ERROR_CTRL_CHAR:
+            $msg = ' - Unexpected control character found';
+            break;
+          case JSON_ERROR_SYNTAX:
+            $msg =  ' - Syntax error, malformed JSON';
+            break;
+          case JSON_ERROR_UTF8:
+            $msg =  ' - Malformed UTF-8 characters, possibly incorrectly encoded';
+            break;
+          default:
+            $msg =  ' - Unknown error';
+            break;
+          }
+          throw new \Exception('There was an error in the supplied patches file:' . $msg);
+        }
+      if (isset($patches['patches'])) {
+        $patches = $patches['patches'];
+        return $patches;
+      }
+      elseif(!$patches) {
+        throw new \Exception('There was an error in the supplied patch file');
+      }
+    }
+    else {
+      return array();
+    }
+  }
+
+  /**
+   * @param PackageEvent $event
+   * @throws \Exception
+   */
+  public function postInstall(PackageEvent $event) {
+
+    // Check if we should exit in failure.
+    $extra = $this->composer->getPackage()->getExtra();
+    $exitOnFailure = getenv('COMPOSER_EXIT_ON_PATCH_FAILURE') || !empty($extra['composer-exit-on-patch-failure']);
+
+    // Get the package object for the current operation.
+    $operation = $event->getOperation();
+    /** @var PackageInterface $package */
+    $package = $this->getPackageFromOperation($operation);
+    $package_name = $package->getName();
+
+    if (!isset($this->patches[$package_name])) {
+      if ($this->io->isVerbose()) {
+        $this->io->write('<info>No patches found for ' . $package_name . '.</info>');
+      }
+      return;
+    }
+    $this->io->write('  - Applying patches for <info>' . $package_name . '</info>');
+
+    // Get the install path from the package object.
+    $manager = $event->getComposer()->getInstallationManager();
+    $install_path = $manager->getInstaller($package->getType())->getInstallPath($package);
+
+    // Set up a downloader.
+    $downloader = new RemoteFilesystem($this->io, $this->composer->getConfig());
+
+    // Track applied patches in the package info in installed.json
+    $localRepository = $this->composer->getRepositoryManager()->getLocalRepository();
+    $localPackage = $localRepository->findPackage($package_name, $package->getVersion());
+    $extra = $localPackage->getExtra();
+    $extra['patches_applied'] = array();
+
+    foreach ($this->patches[$package_name] as $description => $url) {
+      $this->io->write('    <info>' . $url . '</info> (<comment>' . $description. '</comment>)');
+      try {
+        $this->eventDispatcher->dispatch(NULL, new PatchEvent(PatchEvents::PRE_PATCH_APPLY, $package, $url, $description));
+        $this->getAndApplyPatch($downloader, $install_path, $url, $package);
+        $this->eventDispatcher->dispatch(NULL, new PatchEvent(PatchEvents::POST_PATCH_APPLY, $package, $url, $description));
+        $extra['patches_applied'][$description] = $url;
+      }
+      catch (\Exception $e) {
+        $this->io->write('   <error>Could not apply patch! Skipping. The error was: ' . $e->getMessage() . '</error>');
+        if ($exitOnFailure) {
+          throw new \Exception("Cannot apply patch $description ($url)!");
+        }
+      }
+    }
+    $localPackage->setExtra($extra);
+
+    $this->io->write('');
+    $this->writePatchReport($this->patches[$package_name], $install_path);
+  }
+
+  /**
+   * Get a Package object from an OperationInterface object.
+   *
+   * @param OperationInterface $operation
+   * @return PackageInterface
+   * @throws \Exception
+   */
+  protected function getPackageFromOperation(OperationInterface $operation) {
+    if ($operation instanceof InstallOperation) {
+      $package = $operation->getPackage();
+    }
+    elseif ($operation instanceof UpdateOperation) {
+      $package = $operation->getTargetPackage();
+    }
+    else {
+      throw new \Exception('Unknown operation: ' . get_class($operation));
+    }
+
+    return $package;
+  }
+
+  /**
+   * Apply a patch on code in the specified directory.
+   *
+   * @param RemoteFilesystem $downloader
+   * @param $install_path
+   * @param $patch_url
+   * @param PackageInterface $package
+   * @throws \Exception
+   */
+  protected function getAndApplyPatch(RemoteFilesystem $downloader, $install_path, $patch_url, PackageInterface $package) {
+
+    // Local patch file.
+    if (file_exists($patch_url)) {
+      $filename = realpath($patch_url);
+    }
+    else {
+      // Generate random (but not cryptographically so) filename.
+      $filename = uniqid(sys_get_temp_dir().'/') . ".patch";
+
+      // Download file from remote filesystem to this location.
+      $hostname = parse_url($patch_url, PHP_URL_HOST);
+      $downloader->copy($hostname, $patch_url, $filename, FALSE);
+    }
+
+    // The order here is intentional. p1 is most likely to apply with git apply.
+    // p0 is next likely. p2 is extremely unlikely, but for some special cases,
+    // it might be useful. p4 is useful for Magento 2 patches
+    $patch_levels = array('-p1', '-p0', '-p2', '-p4');
+
+    // Check for specified patch level for this package.
+    $extra = $this->composer->getPackage()->getExtra();
+    if (!empty($extra['patchLevel'][$package->getName()])){
+      $patch_levels = array($extra['patchLevel'][$package->getName()]);
+    }
+    // Attempt to apply with git apply.
+    $patched = $this->applyPatchWithGit($install_path, $patch_levels, $filename);
+
+    // In some rare cases, git will fail to apply a patch, fallback to using
+    // the 'patch' command.
+    if (!$patched) {
+      foreach ($patch_levels as $patch_level) {
+        // --no-backup-if-mismatch here is a hack that fixes some
+        // differences between how patch works on windows and unix.
+        if ($patched = $this->executeCommand("patch %s --no-backup-if-mismatch -d %s < %s", $patch_level, $install_path, $filename)) {
+          break;
+        }
+      }
+    }
+
+    // Clean up the temporary patch file.
+    if (isset($hostname)) {
+      unlink($filename);
+    }
+    // If the patch *still* isn't applied, then give up and throw an Exception.
+    // Otherwise, let the user know it worked.
+    if (!$patched) {
+      throw new \Exception("Cannot apply patch $patch_url");
+    }
+  }
+
+  /**
+   * Checks if the root package enables patching.
+   *
+   * @return bool
+   *   Whether patching is enabled. Defaults to TRUE.
+   */
+  protected function isPatchingEnabled() {
+    $extra = $this->composer->getPackage()->getExtra();
+
+    if (empty($extra['patches']) && empty($extra['patches-ignore']) && !isset($extra['patches-file'])) {
+      // The root package has no patches of its own, so only allow patching if
+      // it has specifically opted in.
+      return isset($extra['enable-patching']) ? $extra['enable-patching'] : FALSE;
+    }
+    else {
+      return TRUE;
+    }
+  }
+
+  /**
+   * Writes a patch report to the target directory.
+   *
+   * @param array $patches
+   * @param string $directory
+   */
+  protected function writePatchReport($patches, $directory) {
+    $output = "This file was automatically generated by Composer Patches (https://github.com/cweagans/composer-patches)\n";
+    $output .= "Patches applied to this directory:\n\n";
+    foreach ($patches as $description => $url) {
+      $output .= $description . "\n";
+      $output .= 'Source: ' . $url . "\n\n\n";
+    }
+    file_put_contents($directory . "/PATCHES.txt", $output);
+  }
+
+  /**
+   * Executes a shell command with escaping.
+   *
+   * @param string $cmd
+   * @return bool
+   */
+  protected function executeCommand($cmd) {
+    // Shell-escape all arguments except the command.
+    $args = func_get_args();
+    foreach ($args as $index => $arg) {
+      if ($index !== 0) {
+        $args[$index] = escapeshellarg($arg);
+      }
+    }
+
+    // And replace the arguments.
+    $command = call_user_func_array('sprintf', $args);
+    $output = '';
+    if ($this->io->isVerbose()) {
+      $this->io->write('<comment>' . $command . '</comment>');
+      $io = $this->io;
+      $output = function ($type, $data) use ($io) {
+        if ($type == Process::ERR) {
+          $io->write('<error>' . $data . '</error>');
+        }
+        else {
+          $io->write('<comment>' . $data . '</comment>');
+        }
+      };
+    }
+    return ($this->executor->execute($command, $output) == 0);
+  }
+
+  /**
+   * Recursively merge arrays without changing data types of values.
+   *
+   * Does not change the data types of the values in the arrays. Matching keys'
+   * values in the second array overwrite those in the first array, as is the
+   * case with array_merge.
+   *
+   * @param array $array1
+   *   The first array.
+   * @param array $array2
+   *   The second array.
+   * @return array
+   *   The merged array.
+   *
+   * @see http://php.net/manual/en/function.array-merge-recursive.php#92195
+   */
+  protected function arrayMergeRecursiveDistinct(array $array1, array $array2) {
+    $merged = $array1;
+
+    foreach ($array2 as $key => &$value) {
+      if (is_array($value) && isset($merged[$key]) && is_array($merged[$key])) {
+        $merged[$key] = $this->arrayMergeRecursiveDistinct($merged[$key], $value);
+      }
+      else {
+        $merged[$key] = $value;
+      }
+    }
+
+    return $merged;
+  }
+
+  /**
+   * Attempts to apply a patch with git apply.
+   *
+   * @param $install_path
+   * @param $patch_levels
+   * @param $filename
+   *
+   * @return bool
+   *   TRUE if patch was applied, FALSE otherwise.
+   */
+  protected function applyPatchWithGit($install_path, $patch_levels, $filename) {
+    // Do not use git apply unless the install path is itself a git repo
+    // @see https://stackoverflow.com/a/27283285
+    if (!is_dir($install_path . '/.git')) {
+      return FALSE;
+    }
+
+    $patched = FALSE;
+    foreach ($patch_levels as $patch_level) {
+      if ($this->io->isVerbose()) {
+        $comment = 'Testing ability to patch with git apply.';
+        $comment .= ' This command may produce errors that can be safely ignored.';
+        $this->io->write('<comment>' . $comment . '</comment>');
+      }
+      $checked = $this->executeCommand('git -C %s apply --check -v %s %s', $install_path, $patch_level, $filename);
+      $output = $this->executor->getErrorOutput();
+      if (substr($output, 0, 7) == 'Skipped') {
+        // Git will indicate success but silently skip patches in some scenarios.
+        //
+        // @see https://github.com/cweagans/composer-patches/pull/165
+        $checked = FALSE;
+      }
+      if ($checked) {
+        // Apply the first successful style.
+        $patched = $this->executeCommand('git -C %s apply %s %s', $install_path, $patch_level, $filename);
+        break;
+      }
+    }
+    return $patched;
+  }
+
+}
diff --git a/vendor/cweagans/composer-patches/tests/PatchEventTest.php b/vendor/cweagans/composer-patches/tests/PatchEventTest.php
new file mode 100644
index 00000000..0f6adb7a
--- /dev/null
+++ b/vendor/cweagans/composer-patches/tests/PatchEventTest.php
@@ -0,0 +1,39 @@
+<?php
+
+/**
+ * @file
+ * Tests event dispatching.
+ */
+
+namespace cweagans\Composer\Tests;
+
+use cweagans\Composer\PatchEvent;
+use cweagans\Composer\PatchEvents;
+use Composer\Package\PackageInterface;
+
+class PatchEventTest extends \PHPUnit_Framework_TestCase {
+
+  /**
+   * Tests all the getters.
+   *
+   * @dataProvider patchEventDataProvider
+   */
+  public function testGetters($event_name, PackageInterface $package, $url, $description) {
+    $patch_event = new PatchEvent($event_name, $package, $url, $description);
+    $this->assertEquals($event_name, $patch_event->getName());
+    $this->assertEquals($package, $patch_event->getPackage());
+    $this->assertEquals($url, $patch_event->getUrl());
+    $this->assertEquals($description, $patch_event->getDescription());
+  }
+
+  public function patchEventDataProvider() {
+    $prophecy = $this->prophesize('Composer\Package\PackageInterface');
+    $package = $prophecy->reveal();
+
+    return array(
+      array(PatchEvents::PRE_PATCH_APPLY, $package, 'https://www.drupal.org', 'A test patch'),
+      array(PatchEvents::POST_PATCH_APPLY, $package, 'https://www.drupal.org', 'A test patch'),
+    );
+  }
+
+}
diff --git a/vendor/doctrine/instantiator/.doctrine-project.json b/vendor/doctrine/instantiator/.doctrine-project.json
new file mode 100644
index 00000000..4fe86ee8
--- /dev/null
+++ b/vendor/doctrine/instantiator/.doctrine-project.json
@@ -0,0 +1,26 @@
+{
+    "active": true,
+    "name": "Instantiator",
+    "slug": "instantiator",
+    "docsSlug": "doctrine-instantiator",
+    "codePath": "/src",
+    "versions": [
+        {
+            "name": "1.1",
+            "branchName": "master",
+            "slug": "latest",
+            "aliases": [
+                "current",
+                "stable"
+            ],
+            "maintained": true,
+            "current": true
+        },
+        {
+            "name": "1.0",
+            "branchName": "1.0.x",
+            "slug": "1.0"
+        }
+    ]
+}
+
diff --git a/vendor/doctrine/instantiator/.gitignore b/vendor/doctrine/instantiator/.gitignore
deleted file mode 100644
index e3e368dd..00000000
--- a/vendor/doctrine/instantiator/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-phpunit.xml
-composer.lock
-build
-vendor
-coverage.clover
diff --git a/vendor/doctrine/instantiator/.scrutinizer.yml b/vendor/doctrine/instantiator/.scrutinizer.yml
deleted file mode 100644
index aad5e403..00000000
--- a/vendor/doctrine/instantiator/.scrutinizer.yml
+++ /dev/null
@@ -1,46 +0,0 @@
-before_commands:
-    - "composer install --prefer-source"
-
-tools:
-    external_code_coverage:
-        timeout: 600
-    php_code_coverage:
-        enabled: true
-        test_command: ./vendor/bin/phpunit
-    php_code_sniffer:
-        enabled: true
-        config:
-            standard: PSR2
-        filter:
-            paths: ["src/*", "tests/*"]
-    php_cpd:
-        enabled: true
-        excluded_dirs: ["build/*", "tests", "vendor"]
-    php_cs_fixer:
-        enabled: true
-        config:
-            level: all
-        filter:
-            paths: ["src/*", "tests/*"]
-    php_loc:
-        enabled: true
-        excluded_dirs: ["build", "tests", "vendor"]
-    php_mess_detector:
-        enabled: true
-        config:
-            ruleset: phpmd.xml.dist
-            design_rules: { eval_expression: false }
-        filter:
-            paths: ["src/*"]
-    php_pdepend:
-        enabled: true
-        excluded_dirs: ["build", "tests", "vendor"]
-    php_analyzer:
-        enabled: true
-        filter:
-            paths: ["src/*", "tests/*"]
-    php_hhvm:
-        enabled: true
-        filter:
-            paths: ["src/*", "tests/*"]
-    sensiolabs_security_checker: true
diff --git a/vendor/doctrine/instantiator/.travis.install.sh b/vendor/doctrine/instantiator/.travis.install.sh
deleted file mode 100755
index 2819188c..00000000
--- a/vendor/doctrine/instantiator/.travis.install.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-set -x
-if [ "$TRAVIS_PHP_VERSION" = 'hhvm' ] || [ "$TRAVIS_PHP_VERSION" = 'hhvm-nightly' ] ; then
-    curl -sS https://getcomposer.org/installer > composer-installer.php
-    hhvm composer-installer.php
-    hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 composer.phar update --prefer-source
-elif [ "$TRAVIS_PHP_VERSION" = '5.3.3' ] ; then
-    composer self-update
-    composer update --prefer-source --no-dev
-    composer dump-autoload
-else
-    composer self-update
-    composer update --prefer-source
-fi
diff --git a/vendor/doctrine/instantiator/.travis.yml b/vendor/doctrine/instantiator/.travis.yml
deleted file mode 100644
index 7f1ec5f9..00000000
--- a/vendor/doctrine/instantiator/.travis.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-language: php
-
-php:
-  - 5.3.3
-  - 5.3
-  - 5.4
-  - 5.5
-  - 5.6
-  - hhvm
-
-before_script:
-  - ./.travis.install.sh
-  - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then PHPUNIT_FLAGS="--coverage-clover coverage.clover"; else PHPUNIT_FLAGS=""; fi
-
-script:
-  - if [ $TRAVIS_PHP_VERSION = '5.3.3' ]; then phpunit; fi
-  - if [ $TRAVIS_PHP_VERSION != '5.3.3' ]; then ./vendor/bin/phpunit $PHPUNIT_FLAGS; fi
-  - if [ $TRAVIS_PHP_VERSION != '5.3.3' ]; then ./vendor/bin/phpcs --standard=PSR2 ./src/ ./tests/; fi
-  - if [[ $TRAVIS_PHP_VERSION != '5.3.3' && $TRAVIS_PHP_VERSION != '5.4.29' && $TRAVIS_PHP_VERSION != '5.5.13' ]]; then php -n ./vendor/bin/athletic -p ./tests/DoctrineTest/InstantiatorPerformance/ -f GroupedFormatter; fi
-
-after_script:
-  - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
diff --git a/vendor/doctrine/instantiator/CONTRIBUTING.md b/vendor/doctrine/instantiator/CONTRIBUTING.md
index 75b84b2a..c1a2c42e 100644
--- a/vendor/doctrine/instantiator/CONTRIBUTING.md
+++ b/vendor/doctrine/instantiator/CONTRIBUTING.md
@@ -1,6 +1,6 @@
 # Contributing
 
- * Coding standard for the project is [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
+ * Follow the [Doctrine Coding Standard](https://github.com/doctrine/coding-standard)
  * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php)
  * Any contribution must provide tests for additional introduced conditions
  * Any un-confirmed issue needs a failing test case before being accepted
diff --git a/vendor/doctrine/instantiator/README.md b/vendor/doctrine/instantiator/README.md
index 393ec7ca..eff5a0ca 100644
--- a/vendor/doctrine/instantiator/README.md
+++ b/vendor/doctrine/instantiator/README.md
@@ -6,7 +6,6 @@ This library provides a way of avoiding usage of constructors when instantiating
 [![Code Coverage](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master)
 [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master)
 [![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator)
-[![HHVM Status](http://hhvm.h4cc.de/badge/doctrine/instantiator.png)](http://hhvm.h4cc.de/package/doctrine/instantiator)
 
 [![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator)
 [![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator)
@@ -27,7 +26,7 @@ itself:
 ```php
 $instantiator = new \Doctrine\Instantiator\Instantiator();
 
-$instance = $instantiator->instantiate('My\\ClassName\\Here');
+$instance = $instantiator->instantiate(\My\ClassName\Here::class);
 ```
 
 ## Contributing
diff --git a/vendor/doctrine/instantiator/composer.json b/vendor/doctrine/instantiator/composer.json
index 4823890b..9002a91a 100644
--- a/vendor/doctrine/instantiator/composer.json
+++ b/vendor/doctrine/instantiator/composer.json
@@ -3,7 +3,7 @@
     "description":       "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
     "type":              "library",
     "license":           "MIT",
-    "homepage":          "https://github.com/doctrine/instantiator";,
+    "homepage":          "https://www.doctrine-project.org/projects/instantiator.html";,
     "keywords":          [
         "instantiate",
         "constructor"
@@ -16,14 +16,16 @@
         }
     ],
     "require": {
-        "php": ">=5.3,<8.0-DEV"
+        "php": "^7.1"
     },
     "require-dev": {
         "ext-phar":                  "*",
         "ext-pdo":                   "*",
-        "phpunit/phpunit":           "~4.0",
-        "squizlabs/php_codesniffer": "~2.0",
-        "athletic/athletic":         "~0.1.8"
+        "doctrine/coding-standard":  "^6.0",
+        "phpbench/phpbench":         "^0.13",
+        "phpstan/phpstan-phpunit":   "^0.11",
+        "phpstan/phpstan-shim":      "^0.11",
+        "phpunit/phpunit":           "^7.0"
     },
     "autoload": {
         "psr-4": {
@@ -39,7 +41,7 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "1.0.x-dev"
+            "dev-master": "1.2.x-dev"
         }
     }
 }
diff --git a/vendor/doctrine/instantiator/docs/en/index.rst b/vendor/doctrine/instantiator/docs/en/index.rst
new file mode 100644
index 00000000..0c85da0b
--- /dev/null
+++ b/vendor/doctrine/instantiator/docs/en/index.rst
@@ -0,0 +1,68 @@
+Introduction
+============
+
+This library provides a way of avoiding usage of constructors when instantiating PHP classes.
+
+Installation
+============
+
+The suggested installation method is via `composer`_:
+
+.. code-block:: console
+
+   $ composer require doctrine/instantiator
+
+Usage
+=====
+
+The instantiator is able to create new instances of any class without
+using the constructor or any API of the class itself:
+
+.. code-block:: php
+
+    <?php
+
+    use Doctrine\Instantiator\Instantiator;
+    use App\Entities\User;
+
+    $instantiator = new Instantiator();
+
+    $user = $instantiator->instantiate(User::class);
+
+Contributing
+============
+
+-  Follow the `Doctrine Coding Standard`_
+-  The project will follow strict `object calisthenics`_
+-  Any contribution must provide tests for additional introduced
+   conditions
+-  Any un-confirmed issue needs a failing test case before being
+   accepted
+-  Pull requests must be sent from a new hotfix/feature branch, not from
+   ``master``.
+
+Testing
+=======
+
+The PHPUnit version to be used is the one installed as a dev- dependency
+via composer:
+
+.. code-block:: console
+
+   $ ./vendor/bin/phpunit
+
+Accepted coverage for new contributions is 80%. Any contribution not
+satisfying this requirement wonâ??t be merged.
+
+Credits
+=======
+
+This library was migrated from `ocramius/instantiator`_, which has been
+donated to the doctrine organization, and which is now deprecated in
+favour of this package.
+
+.. _composer: https://getcomposer.org/
+.. _CONTRIBUTING.md: CONTRIBUTING.md
+.. _ocramius/instantiator: https://github.com/Ocramius/Instantiator
+.. _Doctrine Coding Standard: https://github.com/doctrine/coding-standard
+.. _object calisthenics: http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php
diff --git a/vendor/doctrine/instantiator/docs/en/sidebar.rst b/vendor/doctrine/instantiator/docs/en/sidebar.rst
new file mode 100644
index 00000000..0c364791
--- /dev/null
+++ b/vendor/doctrine/instantiator/docs/en/sidebar.rst
@@ -0,0 +1,4 @@
+.. toctree::
+    :depth: 3
+
+    index
diff --git a/vendor/doctrine/instantiator/phpbench.json b/vendor/doctrine/instantiator/phpbench.json
new file mode 100644
index 00000000..fce5dd60
--- /dev/null
+++ b/vendor/doctrine/instantiator/phpbench.json
@@ -0,0 +1,4 @@
+{
+    "bootstrap": "vendor/autoload.php",
+    "path": "tests/DoctrineTest/InstantiatorPerformance"
+}
diff --git a/vendor/doctrine/instantiator/phpcs.xml.dist b/vendor/doctrine/instantiator/phpcs.xml.dist
new file mode 100644
index 00000000..1fcac4ab
--- /dev/null
+++ b/vendor/doctrine/instantiator/phpcs.xml.dist
@@ -0,0 +1,35 @@
+<?xml version="1.0"?>
+<ruleset>
+    <arg name="basepath" value="."/>
+    <arg name="extensions" value="php"/>
+    <arg name="parallel" value="80"/>
+    <arg name="cache" value=".phpcs-cache"/>
+    <arg name="colors"/>
+
+    <!-- Ignore warnings, show progress of the run and show sniff names -->
+    <arg value="nps"/>
+
+    <file>src</file>
+    <file>tests</file>
+
+    <rule ref="Doctrine">
+        <exclude name="SlevomatCodingStandard.TypeHints.DeclareStrictTypes"/>
+        <exclude name="SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingParameterTypeHint"/>
+        <exclude name="SlevomatCodingStandard.TypeHints.TypeHintDeclaration.MissingReturnTypeHint"/>
+        <exclude name="SlevomatCodingStandard.Exceptions.ReferenceThrowableOnly.ReferencedGeneralException"/>
+    </rule>
+
+    <rule ref="SlevomatCodingStandard.Classes.SuperfluousAbstractClassNaming">
+        <exclude-pattern>tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php</exclude-pattern>
+    </rule>
+
+    <rule ref="SlevomatCodingStandard.Classes.SuperfluousExceptionNaming">
+        <exclude-pattern>src/Doctrine/Instantiator/Exception/UnexpectedValueException.php</exclude-pattern>
+        <exclude-pattern>src/Doctrine/Instantiator/Exception/InvalidArgumentException.php</exclude-pattern>
+    </rule>
+
+    <rule ref="SlevomatCodingStandard.Classes.SuperfluousInterfaceNaming">
+        <exclude-pattern>src/Doctrine/Instantiator/Exception/ExceptionInterface.php</exclude-pattern>
+        <exclude-pattern>src/Doctrine/Instantiator/InstantiatorInterface.php</exclude-pattern>
+    </rule>
+</ruleset>
diff --git a/vendor/doctrine/instantiator/phpmd.xml.dist b/vendor/doctrine/instantiator/phpmd.xml.dist
deleted file mode 100644
index 82541056..00000000
--- a/vendor/doctrine/instantiator/phpmd.xml.dist
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<ruleset
-    name="Instantiator rules"
-    xmlns="http://pmd.sf.net/ruleset/1.0.0";
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd";
-    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd";
->
-    <rule ref="rulesets/cleancode.xml">
-        <!-- static access is used for caching purposes -->
-        <exclude name="StaticAccess"/>
-    </rule>
-    <rule ref="rulesets/codesize.xml"/>
-    <rule ref="rulesets/controversial.xml"/>
-    <rule ref="rulesets/design.xml"/>
-    <rule ref="rulesets/naming.xml"/>
-    <rule ref="rulesets/unusedcode.xml"/>
-    <rule
-        name="NPathComplexity"
-        message="The {0} {1}() has an NPath complexity of {2}. The configured NPath complexity threshold is {3}."
-        class="PHP_PMD_Rule_Design_NpathComplexity"
-    >
-        <properties>
-            <property name="minimum" description="The npath reporting threshold" value="10"/>
-        </properties>
-    </rule>
-</ruleset>
diff --git a/vendor/doctrine/instantiator/phpstan.neon.dist b/vendor/doctrine/instantiator/phpstan.neon.dist
new file mode 100644
index 00000000..ecc38eff
--- /dev/null
+++ b/vendor/doctrine/instantiator/phpstan.neon.dist
@@ -0,0 +1,19 @@
+includes:
+    - vendor/phpstan/phpstan-phpunit/extension.neon
+    - vendor/phpstan/phpstan-phpunit/rules.neon
+
+parameters:
+    level: max
+    paths:
+        - src
+        - tests
+
+    ignoreErrors:
+        -
+            message: '#::__construct\(\) does not call parent constructor from#'
+            path: '*/tests/DoctrineTest/InstantiatorTestAsset/*.php'
+
+        # dynamic properties confuse static analysis
+        -
+            message: '#Access to an undefined property object::\$foo\.#'
+            path: '*/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php'
diff --git a/vendor/doctrine/instantiator/phpunit.xml.dist b/vendor/doctrine/instantiator/phpunit.xml.dist
deleted file mode 100644
index 0a8d5709..00000000
--- a/vendor/doctrine/instantiator/phpunit.xml.dist
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0"?>
-<phpunit
-    bootstrap="./vendor/autoload.php"
-    colors="true"
-    convertErrorsToExceptions="true"
-    convertNoticesToExceptions="true"
-    convertWarningsToExceptions="true"
-    verbose="true"
-    stopOnFailure="false"
-    processIsolation="false"
-    backupGlobals="false"
-    syntaxCheck="true"
->
-    <testsuite name="Doctrine\Instantiator tests">
-        <directory>./tests/DoctrineTest/InstantiatorTest</directory>
-    </testsuite>
-    <filter>
-        <whitelist addUncoveredFilesFromWhitelist="true">
-            <directory suffix=".php">./src</directory>
-        </whitelist>
-    </filter>
-</phpunit>
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
index 3065375a..e6a5195f 100644
--- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
@@ -1,29 +1,12 @@
 <?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
 
 namespace Doctrine\Instantiator\Exception;
 
+use Throwable;
+
 /**
  * Base exception marker interface for the instantiator component
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
  */
-interface ExceptionInterface
+interface ExceptionInterface extends Throwable
 {
 }
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
index ea8d28c5..9188f0ba 100644
--- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
@@ -1,40 +1,20 @@
 <?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
 
 namespace Doctrine\Instantiator\Exception;
 
 use InvalidArgumentException as BaseInvalidArgumentException;
 use ReflectionClass;
+use const PHP_VERSION_ID;
+use function interface_exists;
+use function sprintf;
+use function trait_exists;
 
 /**
  * Exception for invalid arguments provided to the instantiator
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
  */
 class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface
 {
-    /**
-     * @param string $className
-     *
-     * @return self
-     */
-    public static function fromNonExistingClass($className)
+    public static function fromNonExistingClass(string $className) : self
     {
         if (interface_exists($className)) {
             return new self(sprintf('The provided type "%s" is an interface, and can not be instantiated', $className));
@@ -47,12 +27,7 @@ class InvalidArgumentException extends BaseInvalidArgumentException implements E
         return new self(sprintf('The provided class "%s" does not exist', $className));
     }
 
-    /**
-     * @param ReflectionClass $reflectionClass
-     *
-     * @return self
-     */
-    public static function fromAbstractClass(ReflectionClass $reflectionClass)
+    public static function fromAbstractClass(ReflectionClass $reflectionClass) : self
     {
         return new self(sprintf(
             'The provided class "%s" is abstract, and can not be instantiated',
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
index 1681e56e..d946731b 100644
--- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
@@ -1,43 +1,21 @@
 <?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
 
 namespace Doctrine\Instantiator\Exception;
 
 use Exception;
 use ReflectionClass;
 use UnexpectedValueException as BaseUnexpectedValueException;
+use function sprintf;
 
 /**
  * Exception for given parameters causing invalid/unexpected state on instantiation
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
  */
 class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface
 {
-    /**
-     * @param ReflectionClass $reflectionClass
-     * @param Exception       $exception
-     *
-     * @return self
-     */
-    public static function fromSerializationTriggeredException(ReflectionClass $reflectionClass, Exception $exception)
-    {
+    public static function fromSerializationTriggeredException(
+        ReflectionClass $reflectionClass,
+        Exception $exception
+    ) : self {
         return new self(
             sprintf(
                 'An exception was raised while trying to instantiate an instance of "%s" via un-serialization',
@@ -48,22 +26,13 @@ class UnexpectedValueException extends BaseUnexpectedValueException implements E
         );
     }
 
-    /**
-     * @param ReflectionClass $reflectionClass
-     * @param string          $errorString
-     * @param int             $errorCode
-     * @param string          $errorFile
-     * @param int             $errorLine
-     *
-     * @return UnexpectedValueException
-     */
     public static function fromUncleanUnSerialization(
         ReflectionClass $reflectionClass,
-        $errorString,
-        $errorCode,
-        $errorFile,
-        $errorLine
-    ) {
+        string $errorString,
+        int $errorCode,
+        string $errorFile,
+        int $errorLine
+    ) : self {
         return new self(
             sprintf(
                 'Could not produce an instance of "%s" via un-serialization, since an error was triggered '
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
index 6d5b3b65..4364190e 100644
--- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
@@ -1,34 +1,21 @@
 <?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
 
 namespace Doctrine\Instantiator;
 
-use Closure;
 use Doctrine\Instantiator\Exception\InvalidArgumentException;
 use Doctrine\Instantiator\Exception\UnexpectedValueException;
 use Exception;
 use ReflectionClass;
+use ReflectionException;
+use function class_exists;
+use function restore_error_handler;
+use function set_error_handler;
+use function sprintf;
+use function strlen;
+use function unserialize;
 
 /**
  * {@inheritDoc}
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
  */
 final class Instantiator implements InstantiatorInterface
 {
@@ -37,18 +24,22 @@ final class Instantiator implements InstantiatorInterface
      * the method {@see \Serializable::unserialize()} when dealing with classes implementing
      * the {@see \Serializable} interface.
      */
-    const SERIALIZATION_FORMAT_USE_UNSERIALIZER   = 'C';
-    const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O';
+    public const SERIALIZATION_FORMAT_USE_UNSERIALIZER   = 'C';
+    public const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O';
 
     /**
-     * @var \Closure[] of {@see \Closure} instances used to instantiate specific classes
+     * Used to instantiate specific classes, indexed by class name.
+     *
+     * @var callable[]
      */
-    private static $cachedInstantiators = array();
+    private static $cachedInstantiators = [];
 
     /**
-     * @var object[] of objects that can directly be cloned
+     * Array of objects that can directly be cloned, indexed by class name.
+     *
+     * @var object[]
      */
-    private static $cachedCloneables = array();
+    private static $cachedCloneables = [];
 
     /**
      * {@inheritDoc}
@@ -71,11 +62,9 @@ final class Instantiator implements InstantiatorInterface
     /**
      * Builds the requested object and caches it in static properties for performance
      *
-     * @param string $className
-     *
      * @return object
      */
-    private function buildAndCacheFromFactory($className)
+    private function buildAndCacheFromFactory(string $className)
     {
         $factory  = self::$cachedInstantiators[$className] = $this->buildFactory($className);
         $instance = $factory();
@@ -88,33 +77,31 @@ final class Instantiator implements InstantiatorInterface
     }
 
     /**
-     * Builds a {@see \Closure} capable of instantiating the given $className without
+     * Builds a callable capable of instantiating the given $className without
      * invoking its constructor.
      *
-     * @param string $className
-     *
-     * @return Closure
+     * @throws InvalidArgumentException
+     * @throws UnexpectedValueException
+     * @throws ReflectionException
      */
-    private function buildFactory($className)
+    private function buildFactory(string $className) : callable
     {
         $reflectionClass = $this->getReflectionClass($className);
 
         if ($this->isInstantiableViaReflection($reflectionClass)) {
-            return function () use ($reflectionClass) {
-                return $reflectionClass->newInstanceWithoutConstructor();
-            };
+            return [$reflectionClass, 'newInstanceWithoutConstructor'];
         }
 
         $serializedString = sprintf(
             '%s:%d:"%s":0:{}',
-            $this->getSerializationFormat($reflectionClass),
+            self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER,
             strlen($className),
             $className
         );
 
         $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString);
 
-        return function () use ($serializedString) {
+        return static function () use ($serializedString) {
             return unserialize($serializedString);
         };
     }
@@ -122,11 +109,10 @@ final class Instantiator implements InstantiatorInterface
     /**
      * @param string $className
      *
-     * @return ReflectionClass
-     *
      * @throws InvalidArgumentException
+     * @throws ReflectionException
      */
-    private function getReflectionClass($className)
+    private function getReflectionClass($className) : ReflectionClass
     {
         if (! class_exists($className)) {
             throw InvalidArgumentException::fromNonExistingClass($className);
@@ -142,16 +128,11 @@ final class Instantiator implements InstantiatorInterface
     }
 
     /**
-     * @param ReflectionClass $reflectionClass
-     * @param string          $serializedString
-     *
      * @throws UnexpectedValueException
-     *
-     * @return void
      */
-    private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, $serializedString)
+    private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, string $serializedString) : void
     {
-        set_error_handler(function ($code, $message, $file, $line) use ($reflectionClass, & $error) {
+        set_error_handler(static function ($code, $message, $file, $line) use ($reflectionClass, & $error) : void {
             $error = UnexpectedValueException::fromUncleanUnSerialization(
                 $reflectionClass,
                 $message,
@@ -161,9 +142,11 @@ final class Instantiator implements InstantiatorInterface
             );
         });
 
-        $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString);
-
-        restore_error_handler();
+        try {
+            $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString);
+        } finally {
+            restore_error_handler();
+        }
 
         if ($error) {
             throw $error;
@@ -171,103 +154,45 @@ final class Instantiator implements InstantiatorInterface
     }
 
     /**
-     * @param ReflectionClass $reflectionClass
-     * @param string          $serializedString
-     *
      * @throws UnexpectedValueException
-     *
-     * @return void
      */
-    private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, $serializedString)
+    private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, string $serializedString) : void
     {
         try {
             unserialize($serializedString);
         } catch (Exception $exception) {
-            restore_error_handler();
-
             throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception);
         }
     }
 
-    /**
-     * @param ReflectionClass $reflectionClass
-     *
-     * @return bool
-     */
-    private function isInstantiableViaReflection(ReflectionClass $reflectionClass)
+    private function isInstantiableViaReflection(ReflectionClass $reflectionClass) : bool
     {
-        if (\PHP_VERSION_ID >= 50600) {
-            return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal());
-        }
-
-        return \PHP_VERSION_ID >= 50400 && ! $this->hasInternalAncestors($reflectionClass);
+        return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal());
     }
 
     /**
      * Verifies whether the given class is to be considered internal
-     *
-     * @param ReflectionClass $reflectionClass
-     *
-     * @return bool
      */
-    private function hasInternalAncestors(ReflectionClass $reflectionClass)
+    private function hasInternalAncestors(ReflectionClass $reflectionClass) : bool
     {
         do {
             if ($reflectionClass->isInternal()) {
                 return true;
             }
-        } while ($reflectionClass = $reflectionClass->getParentClass());
 
-        return false;
-    }
+            $reflectionClass = $reflectionClass->getParentClass();
+        } while ($reflectionClass);
 
-    /**
-     * Verifies if the given PHP version implements the `Serializable` interface serialization
-     * with an incompatible serialization format. If that's the case, use serialization marker
-     * "C" instead of "O".
-     *
-     * @link http://news.php.net/php.internals/74654
-     *
-     * @param ReflectionClass $reflectionClass
-     *
-     * @return string the serialization format marker, either self::SERIALIZATION_FORMAT_USE_UNSERIALIZER
-     *                or self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER
-     */
-    private function getSerializationFormat(ReflectionClass $reflectionClass)
-    {
-        if ($this->isPhpVersionWithBrokenSerializationFormat()
-            && $reflectionClass->implementsInterface('Serializable')
-        ) {
-            return self::SERIALIZATION_FORMAT_USE_UNSERIALIZER;
-        }
-
-        return self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER;
-    }
-
-    /**
-     * Checks whether the current PHP runtime uses an incompatible serialization format
-     *
-     * @return bool
-     */
-    private function isPhpVersionWithBrokenSerializationFormat()
-    {
-        return PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513;
+        return false;
     }
 
     /**
      * Checks if a class is cloneable
      *
-     * @param ReflectionClass $reflection
-     *
-     * @return bool
+     * Classes implementing `__clone` cannot be safely cloned, as that may cause side-effects.
      */
-    private function isSafeToClone(ReflectionClass $reflection)
+    private function isSafeToClone(ReflectionClass $reflection) : bool
     {
-        if (method_exists($reflection, 'isCloneable') && ! $reflection->isCloneable()) {
-            return false;
-        }
-
-        // not cloneable if it implements `__clone`, as we want to avoid calling it
-        return ! $reflection->hasMethod('__clone');
+        return $reflection->isCloneable() && ! $reflection->hasMethod('__clone');
     }
 }
diff --git a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
index b665bea8..95299f4a 100644
--- a/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
+++ b/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
@@ -1,28 +1,11 @@
 <?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
 
 namespace Doctrine\Instantiator;
 
+use Doctrine\Instantiator\Exception\ExceptionInterface;
+
 /**
  * Instantiator provides utility methods to build objects without invoking their constructors
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
  */
 interface InstantiatorInterface
 {
@@ -31,7 +14,7 @@ interface InstantiatorInterface
      *
      * @return object
      *
-     * @throws \Doctrine\Instantiator\Exception\ExceptionInterface
+     * @throws ExceptionInterface
      */
     public function instantiate($className);
 }
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php
deleted file mode 100644
index 3e8fc6ff..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorPerformance;
-
-use Athletic\AthleticEvent;
-use Doctrine\Instantiator\Instantiator;
-
-/**
- * Performance tests for {@see \Doctrine\Instantiator\Instantiator}
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class InstantiatorPerformanceEvent extends AthleticEvent
-{
-    /**
-     * @var \Doctrine\Instantiator\Instantiator
-     */
-    private $instantiator;
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function setUp()
-    {
-        $this->instantiator = new Instantiator();
-
-        $this->instantiator->instantiate(__CLASS__);
-        $this->instantiator->instantiate('ArrayObject');
-        $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset');
-        $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset');
-        $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset');
-    }
-
-    /**
-     * @iterations 20000
-     * @baseline
-     * @group instantiation
-     */
-    public function testInstantiateSelf()
-    {
-        $this->instantiator->instantiate(__CLASS__);
-    }
-
-    /**
-     * @iterations 20000
-     * @group instantiation
-     */
-    public function testInstantiateInternalClass()
-    {
-        $this->instantiator->instantiate('ArrayObject');
-    }
-
-    /**
-     * @iterations 20000
-     * @group instantiation
-     */
-    public function testInstantiateSimpleSerializableAssetClass()
-    {
-        $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset');
-    }
-
-    /**
-     * @iterations 20000
-     * @group instantiation
-     */
-    public function testInstantiateSerializableArrayObjectAsset()
-    {
-        $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset');
-    }
-
-    /**
-     * @iterations 20000
-     * @group instantiation
-     */
-    public function testInstantiateUnCloneableAsset()
-    {
-        $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php
deleted file mode 100644
index 39d9b94d..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTest\Exception;
-
-use Doctrine\Instantiator\Exception\InvalidArgumentException;
-use PHPUnit_Framework_TestCase;
-use ReflectionClass;
-
-/**
- * Tests for {@see \Doctrine\Instantiator\Exception\InvalidArgumentException}
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- *
- * @covers \Doctrine\Instantiator\Exception\InvalidArgumentException
- */
-class InvalidArgumentExceptionTest extends PHPUnit_Framework_TestCase
-{
-    public function testFromNonExistingTypeWithNonExistingClass()
-    {
-        $className = __CLASS__ . uniqid();
-        $exception = InvalidArgumentException::fromNonExistingClass($className);
-
-        $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\InvalidArgumentException', $exception);
-        $this->assertSame('The provided class "' . $className . '" does not exist', $exception->getMessage());
-    }
-
-    public function testFromNonExistingTypeWithTrait()
-    {
-        if (PHP_VERSION_ID < 50400) {
-            $this->markTestSkipped('Need at least PHP 5.4.0, as this test requires traits support to run');
-        }
-
-        $exception = InvalidArgumentException::fromNonExistingClass(
-            'DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset'
-        );
-
-        $this->assertSame(
-            'The provided type "DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset" is a trait, '
-            . 'and can not be instantiated',
-            $exception->getMessage()
-        );
-    }
-
-    public function testFromNonExistingTypeWithInterface()
-    {
-        $exception = InvalidArgumentException::fromNonExistingClass('Doctrine\\Instantiator\\InstantiatorInterface');
-
-        $this->assertSame(
-            'The provided type "Doctrine\\Instantiator\\InstantiatorInterface" is an interface, '
-            . 'and can not be instantiated',
-            $exception->getMessage()
-        );
-    }
-
-    public function testFromAbstractClass()
-    {
-        $reflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset');
-        $exception  = InvalidArgumentException::fromAbstractClass($reflection);
-
-        $this->assertSame(
-            'The provided class "DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset" is abstract, '
-            . 'and can not be instantiated',
-            $exception->getMessage()
-        );
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php
deleted file mode 100644
index 84154e73..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTest\Exception;
-
-use Doctrine\Instantiator\Exception\UnexpectedValueException;
-use Exception;
-use PHPUnit_Framework_TestCase;
-use ReflectionClass;
-
-/**
- * Tests for {@see \Doctrine\Instantiator\Exception\UnexpectedValueException}
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- *
- * @covers \Doctrine\Instantiator\Exception\UnexpectedValueException
- */
-class UnexpectedValueExceptionTest extends PHPUnit_Framework_TestCase
-{
-    public function testFromSerializationTriggeredException()
-    {
-        $reflectionClass = new ReflectionClass($this);
-        $previous        = new Exception();
-        $exception       = UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $previous);
-
-        $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\UnexpectedValueException', $exception);
-        $this->assertSame($previous, $exception->getPrevious());
-        $this->assertSame(
-            'An exception was raised while trying to instantiate an instance of "'
-            . __CLASS__  . '" via un-serialization',
-            $exception->getMessage()
-        );
-    }
-
-    public function testFromUncleanUnSerialization()
-    {
-        $reflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset');
-        $exception  = UnexpectedValueException::fromUncleanUnSerialization($reflection, 'foo', 123, 'bar', 456);
-
-        $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\UnexpectedValueException', $exception);
-        $this->assertSame(
-            'Could not produce an instance of "DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset" '
-            . 'via un-serialization, since an error was triggered in file "bar" at line "456"',
-            $exception->getMessage()
-        );
-
-        $previous = $exception->getPrevious();
-
-        $this->assertInstanceOf('Exception', $previous);
-        $this->assertSame('foo', $previous->getMessage());
-        $this->assertSame(123, $previous->getCode());
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php
deleted file mode 100644
index 0a2cb931..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php
+++ /dev/null
@@ -1,219 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTest;
-
-use Doctrine\Instantiator\Exception\UnexpectedValueException;
-use Doctrine\Instantiator\Instantiator;
-use PHPUnit_Framework_TestCase;
-use ReflectionClass;
-
-/**
- * Tests for {@see \Doctrine\Instantiator\Instantiator}
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- *
- * @covers \Doctrine\Instantiator\Instantiator
- */
-class InstantiatorTest extends PHPUnit_Framework_TestCase
-{
-    /**
-     * @var Instantiator
-     */
-    private $instantiator;
-
-    /**
-     * {@inheritDoc}
-     */
-    protected function setUp()
-    {
-        $this->instantiator = new Instantiator();
-    }
-
-    /**
-     * @param string $className
-     *
-     * @dataProvider getInstantiableClasses
-     */
-    public function testCanInstantiate($className)
-    {
-        $this->assertInstanceOf($className, $this->instantiator->instantiate($className));
-    }
-
-    /**
-     * @param string $className
-     *
-     * @dataProvider getInstantiableClasses
-     */
-    public function testInstantiatesSeparateInstances($className)
-    {
-        $instance1 = $this->instantiator->instantiate($className);
-        $instance2 = $this->instantiator->instantiate($className);
-
-        $this->assertEquals($instance1, $instance2);
-        $this->assertNotSame($instance1, $instance2);
-    }
-
-    public function testExceptionOnUnSerializationException()
-    {
-        if (defined('HHVM_VERSION')) {
-            $this->markTestSkipped(
-                'As of facebook/hhvm#3432, HHVM has no PDORow, and therefore '
-                . ' no internal final classes that cannot be instantiated'
-            );
-        }
-
-        $className = 'DoctrineTest\\InstantiatorTestAsset\\UnserializeExceptionArrayObjectAsset';
-
-        if (\PHP_VERSION_ID >= 50600) {
-            $className = 'PDORow';
-        }
-
-        if (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513) {
-            $className = 'DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset';
-        }
-
-        $this->setExpectedException('Doctrine\\Instantiator\\Exception\\UnexpectedValueException');
-
-        $this->instantiator->instantiate($className);
-    }
-
-    public function testNoticeOnUnSerializationException()
-    {
-        if (\PHP_VERSION_ID >= 50600) {
-            $this->markTestSkipped(
-                'PHP 5.6 supports `ReflectionClass#newInstanceWithoutConstructor()` for some internal classes'
-            );
-        }
-
-        try {
-            $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset');
-
-            $this->fail('No exception was raised');
-        } catch (UnexpectedValueException $exception) {
-            $wakeUpNoticesReflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset');
-            $previous                = $exception->getPrevious();
-
-            $this->assertInstanceOf('Exception', $previous);
-
-            // in PHP 5.4.29 and PHP 5.5.13, this case is not a notice, but an exception being thrown
-            if (! (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513)) {
-                $this->assertSame(
-                    'Could not produce an instance of "DoctrineTest\\InstantiatorTestAsset\WakeUpNoticesAsset" '
-                    . 'via un-serialization, since an error was triggered in file "'
-                    . $wakeUpNoticesReflection->getFileName() . '" at line "36"',
-                    $exception->getMessage()
-                );
-
-                $this->assertSame('Something went bananas while un-serializing this instance', $previous->getMessage());
-                $this->assertSame(\E_USER_NOTICE, $previous->getCode());
-            }
-        }
-    }
-
-    /**
-     * @param string $invalidClassName
-     *
-     * @dataProvider getInvalidClassNames
-     */
-    public function testInstantiationFromNonExistingClass($invalidClassName)
-    {
-        $this->setExpectedException('Doctrine\\Instantiator\\Exception\\InvalidArgumentException');
-
-        $this->instantiator->instantiate($invalidClassName);
-    }
-
-    public function testInstancesAreNotCloned()
-    {
-        $className = 'TemporaryClass' . uniqid();
-
-        eval('namespace ' . __NAMESPACE__ . '; class ' . $className . '{}');
-
-        $instance = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className);
-
-        $instance->foo = 'bar';
-
-        $instance2 = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className);
-
-        $this->assertObjectNotHasAttribute('foo', $instance2);
-    }
-
-    /**
-     * Provides a list of instantiable classes (existing)
-     *
-     * @return string[][]
-     */
-    public function getInstantiableClasses()
-    {
-        $classes = array(
-            array('stdClass'),
-            array(__CLASS__),
-            array('Doctrine\\Instantiator\\Instantiator'),
-            array('Exception'),
-            array('PharException'),
-            array('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset'),
-            array('DoctrineTest\\InstantiatorTestAsset\\ExceptionAsset'),
-            array('DoctrineTest\\InstantiatorTestAsset\\FinalExceptionAsset'),
-            array('DoctrineTest\\InstantiatorTestAsset\\PharExceptionAsset'),
-            array('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset'),
-            array('DoctrineTest\\InstantiatorTestAsset\\XMLReaderAsset'),
-        );
-
-        if (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513) {
-            return $classes;
-        }
-
-        $classes = array_merge(
-            $classes,
-            array(
-                array('PharException'),
-                array('ArrayObject'),
-                array('DoctrineTest\\InstantiatorTestAsset\\ArrayObjectAsset'),
-                array('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset'),
-            )
-        );
-
-        if (\PHP_VERSION_ID >= 50600) {
-            $classes[] = array('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset');
-            $classes[] = array('DoctrineTest\\InstantiatorTestAsset\\UnserializeExceptionArrayObjectAsset');
-        }
-
-        return $classes;
-    }
-
-    /**
-     * Provides a list of instantiable classes (existing)
-     *
-     * @return string[][]
-     */
-    public function getInvalidClassNames()
-    {
-        $classNames = array(
-            array(__CLASS__ . uniqid()),
-            array('Doctrine\\Instantiator\\InstantiatorInterface'),
-            array('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset'),
-        );
-
-        if (\PHP_VERSION_ID >= 50400) {
-            $classNames[] = array('DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset');
-        }
-
-        return $classNames;
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php
deleted file mode 100644
index fbe28ddd..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-/**
- * A simple asset for an abstract class
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-abstract class AbstractClassAsset
-{
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php
deleted file mode 100644
index 56146d70..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use ArrayObject;
-use BadMethodCallException;
-
-/**
- * Test asset that extends an internal PHP class
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class ArrayObjectAsset extends ArrayObject
-{
-    /**
-     * Constructor - should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function __construct()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php
deleted file mode 100644
index 43bbe46b..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use BadMethodCallException;
-use Exception;
-
-/**
- * Test asset that extends an internal PHP base exception
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class ExceptionAsset extends Exception
-{
-    /**
-     * Constructor - should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function __construct()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php
deleted file mode 100644
index 7d268f5b..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use BadMethodCallException;
-use Exception;
-
-/**
- * Test asset that extends an internal PHP base exception
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-final class FinalExceptionAsset extends Exception
-{
-    /**
-     * Constructor - should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function __construct()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php
deleted file mode 100644
index 553fd561..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use BadMethodCallException;
-use Phar;
-
-/**
- * Test asset that extends an internal PHP class
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class PharAsset extends Phar
-{
-    /**
-     * Constructor - should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function __construct()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php
deleted file mode 100644
index 42bf73e7..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use BadMethodCallException;
-use PharException;
-
-/**
- * Test asset that extends an internal PHP class
- * This class should be serializable without problems
- * and without getting the "Erroneous data format for unserializing"
- * error
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class PharExceptionAsset extends PharException
-{
-    /**
-     * Constructor - should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function __construct()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php
deleted file mode 100644
index ba19aaf6..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use ArrayObject;
-use BadMethodCallException;
-use Serializable;
-
-/**
- * Serializable test asset that also extends an internal class
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class SerializableArrayObjectAsset extends ArrayObject implements Serializable
-{
-    /**
-     * Constructor - should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function __construct()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public function serialize()
-    {
-        return '';
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * Should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function unserialize($serialized)
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php
deleted file mode 100644
index 39f84a6c..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use BadMethodCallException;
-use Serializable;
-
-/**
- * Base serializable test asset
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class SimpleSerializableAsset implements Serializable
-{
-    /**
-     * Constructor - should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function __construct()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public function serialize()
-    {
-        return '';
-    }
-
-    /**
-     * {@inheritDoc}
-     *
-     * Should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function unserialize($serialized)
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php
deleted file mode 100644
index 04e78069..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-/**
- * A simple trait with no attached logic
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-trait SimpleTraitAsset
-{
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php
deleted file mode 100644
index 7d03bdab..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use BadMethodCallException;
-
-/**
- * Base un-cloneable asset
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class UnCloneableAsset
-{
-    /**
-     * Constructor - should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function __construct()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-
-    /**
-     * Magic `__clone` - should not be invoked
-     *
-     * @throws BadMethodCallException
-     */
-    public function __clone()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php
deleted file mode 100644
index b348a405..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use ArrayObject;
-use BadMethodCallException;
-
-/**
- * A simple asset for an abstract class
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class UnserializeExceptionArrayObjectAsset extends ArrayObject
-{
-    /**
-     * {@inheritDoc}
-     */
-    public function __wakeup()
-    {
-        throw new BadMethodCallException();
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php
deleted file mode 100644
index 18dc6711..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use ArrayObject;
-
-/**
- * A simple asset for an abstract class
- *
- * @author Marco Pivetta <ocramius@xxxxxxxxx>
- */
-class WakeUpNoticesAsset extends ArrayObject
-{
-    /**
-     * Wakeup method called after un-serialization
-     */
-    public function __wakeup()
-    {
-        trigger_error('Something went bananas while un-serializing this instance');
-    }
-}
diff --git a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php b/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php
deleted file mode 100644
index 39ee6992..00000000
--- a/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/*
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * This software consists of voluntary contributions made by many individuals
- * and is licensed under the MIT license. For more information, see
- * <http://www.doctrine-project.org>.
- */
-
-namespace DoctrineTest\InstantiatorTestAsset;
-
-use BadMethodCallException;
-use XMLReader;
-
-/**
- * Test asset that extends an internal PHP class
- *
- * @author Dave Marshall <dave@xxxxxxx>
- */
-class XMLReaderAsset extends XMLReader
-{
-    /**
-     * Constructor - should not be called
-     *
-     * @throws BadMethodCallException
-     */
-    public function __construct()
-    {
-        throw new BadMethodCallException('Not supposed to be called!');
-    }
-}
diff --git a/vendor/guzzlehttp/guzzle/CHANGELOG.md b/vendor/guzzlehttp/guzzle/CHANGELOG.md
index b265cbcd..17badd75 100644
--- a/vendor/guzzlehttp/guzzle/CHANGELOG.md
+++ b/vendor/guzzlehttp/guzzle/CHANGELOG.md
@@ -1,4 +1,27 @@
-# CHANGELOG
+# Change Log
+
+## 6.3.3 - 2018-04-22
+
+* Fix: Default headers when decode_content is specified
+
+
+## 6.3.2 - 2018-03-26
+
+* Fix: Release process
+
+
+## 6.3.1 - 2018-03-26
+
+* Bug fix: Parsing 0 epoch expiry times in cookies [#2014](https://github.com/guzzle/guzzle/pull/2014)
+* Improvement: Better ConnectException detection [#2012](https://github.com/guzzle/guzzle/pull/2012)
+* Bug fix: Malformed domain that contains a "/" [#1999](https://github.com/guzzle/guzzle/pull/1999)
+* Bug fix: Undefined offset when a cookie has no first key-value pair [#1998](https://github.com/guzzle/guzzle/pull/1998)
+* Improvement: Support PHPUnit 6 [#1953](https://github.com/guzzle/guzzle/pull/1953)
+* Bug fix: Support empty headers [#1915](https://github.com/guzzle/guzzle/pull/1915)
+* Bug fix: Ignore case during header modifications [#1916](https://github.com/guzzle/guzzle/pull/1916)
+
++ Minor code cleanups, documentation fixes and clarifications.
+
 
 ## 6.3.0 - 2017-06-22
 
diff --git a/vendor/guzzlehttp/guzzle/LICENSE b/vendor/guzzlehttp/guzzle/LICENSE
index ea7f07c5..50a177b0 100644
--- a/vendor/guzzlehttp/guzzle/LICENSE
+++ b/vendor/guzzlehttp/guzzle/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2016 Michael Dowling, https://github.com/mtdowling <mtdowling@xxxxxxxxx>
+Copyright (c) 2011-2018 Michael Dowling, https://github.com/mtdowling <mtdowling@xxxxxxxxx>
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/guzzlehttp/guzzle/README.md b/vendor/guzzlehttp/guzzle/README.md
index 2f614d6f..bcd18b8e 100644
--- a/vendor/guzzlehttp/guzzle/README.md
+++ b/vendor/guzzlehttp/guzzle/README.md
@@ -1,7 +1,9 @@
 Guzzle, PHP HTTP client
 =======================
 
-[![Build Status](https://travis-ci.org/guzzle/guzzle.svg?branch=master)](https://travis-ci.org/guzzle/guzzle)
+[![Latest Version](https://img.shields.io/github/release/guzzle/guzzle.svg?style=flat-square)](https://github.com/guzzle/guzzle/releases)
+[![Build Status](https://img.shields.io/travis/guzzle/guzzle.svg?style=flat-square)](https://travis-ci.org/guzzle/guzzle)
+[![Total Downloads](https://img.shields.io/packagist/dt/guzzlehttp/guzzle.svg?style=flat-square)](https://packagist.org/packages/guzzlehttp/guzzle)
 
 Guzzle is a PHP HTTP client that makes it easy to send HTTP requests and
 trivial to integrate with web services.
diff --git a/vendor/guzzlehttp/guzzle/composer.json b/vendor/guzzlehttp/guzzle/composer.json
index 65687a58..1f328e30 100644
--- a/vendor/guzzlehttp/guzzle/composer.json
+++ b/vendor/guzzlehttp/guzzle/composer.json
@@ -19,7 +19,7 @@
     },
     "require-dev": {
         "ext-curl": "*",
-        "phpunit/phpunit": "^4.0 || ^5.0",
+        "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
         "psr/log": "^1.0"
     },
     "autoload": {
@@ -38,7 +38,7 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "6.2-dev"
+            "dev-master": "6.3-dev"
         }
     }
 }
diff --git a/vendor/guzzlehttp/guzzle/src/Client.php b/vendor/guzzlehttp/guzzle/src/Client.php
index de4df8a5..80417918 100644
--- a/vendor/guzzlehttp/guzzle/src/Client.php
+++ b/vendor/guzzlehttp/guzzle/src/Client.php
@@ -290,7 +290,14 @@ class Client implements ClientInterface
      */
     private function applyOptions(RequestInterface $request, array &$options)
     {
-        $modify = [];
+        $modify = [
+            'set_headers' => [],
+        ];
+
+        if (isset($options['headers'])) {
+            $modify['set_headers'] = $options['headers'];
+            unset($options['headers']);
+        }
 
         if (isset($options['form_params'])) {
             if (isset($options['multipart'])) {
@@ -302,6 +309,8 @@ class Client implements ClientInterface
             }
             $options['body'] = http_build_query($options['form_params'], '', '&');
             unset($options['form_params']);
+            // Ensure that we don't have the header in different case and set the new value.
+            $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']);
             $options['_conditional']['Content-Type'] = 'application/x-www-form-urlencoded';
         }
 
@@ -313,24 +322,19 @@ class Client implements ClientInterface
         if (isset($options['json'])) {
             $options['body'] = \GuzzleHttp\json_encode($options['json']);
             unset($options['json']);
+            // Ensure that we don't have the header in different case and set the new value.
+            $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']);
             $options['_conditional']['Content-Type'] = 'application/json';
         }
 
         if (!empty($options['decode_content'])
             && $options['decode_content'] !== true
         ) {
+            // Ensure that we don't have the header in different case and set the new value.
+            $options['_conditional'] = Psr7\_caseless_remove(['Accept-Encoding'], $options['_conditional']);
             $modify['set_headers']['Accept-Encoding'] = $options['decode_content'];
         }
 
-        if (isset($options['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();
@@ -344,6 +348,8 @@ class Client implements ClientInterface
             $type = isset($value[2]) ? strtolower($value[2]) : 'basic';
             switch ($type) {
                 case 'basic':
+                    // Ensure that we don't have the header in different case and set the new value.
+                    $modify['set_headers'] = Psr7\_caseless_remove(['Authorization'], $modify['set_headers']);
                     $modify['set_headers']['Authorization'] = 'Basic '
                         . base64_encode("$value[0]:$value[1]");
                     break;
@@ -382,6 +388,8 @@ class Client implements ClientInterface
         $request = Psr7\modify_request($request, $modify);
         if ($request->getBody() instanceof Psr7\MultipartStream) {
             // Use a multipart/form-data POST if a Content-Type is not set.
+            // Ensure that we don't have the header in different case and set the new value.
+            $options['_conditional'] = Psr7\_caseless_remove(['Content-Type'], $options['_conditional']);
             $options['_conditional']['Content-Type'] = 'multipart/form-data; boundary='
                 . $request->getBody()->getBoundary();
         }
diff --git a/vendor/guzzlehttp/guzzle/src/ClientInterface.php b/vendor/guzzlehttp/guzzle/src/ClientInterface.php
index 5a67b66b..2dbcffa4 100644
--- a/vendor/guzzlehttp/guzzle/src/ClientInterface.php
+++ b/vendor/guzzlehttp/guzzle/src/ClientInterface.php
@@ -12,7 +12,7 @@ use Psr\Http\Message\UriInterface;
  */
 interface ClientInterface
 {
-    const VERSION = '6.2.1';
+    const VERSION = '6.3.3';
 
     /**
      * Send an HTTP request.
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
index 1c17b5a4..78f2b79f 100644
--- a/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/CookieJar.php
@@ -95,11 +95,11 @@ class CookieJar implements CookieJarInterface
     public function getCookieByName($name)
     {
         // don't allow a null name
-        if($name === null) {
+        if ($name === null) {
             return null;
         }
-        foreach($this->cookies as $cookie) {
-            if($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) {
+        foreach ($this->cookies as $cookie) {
+            if ($cookie->getName() !== null && strcasecmp($cookie->getName(), $name) === 0) {
                 return $cookie;
             }
         }
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
index e4bfafd4..4497bcf0 100644
--- a/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/SessionCookieJar.php
@@ -15,7 +15,7 @@ class SessionCookieJar extends CookieJar
     /**
      * Create a new SessionCookieJar object
      *
-     * @param string $sessionKey        Session key name to store the cookie 
+     * @param string $sessionKey        Session key name to store the cookie
      *                                  data in session
      * @param bool $storeSessionCookies Set to true to store session cookies
      *                                  in the cookie jar.
diff --git a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
index c911e2a3..f6993943 100644
--- a/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
+++ b/vendor/guzzlehttp/guzzle/src/Cookie/SetCookie.php
@@ -35,14 +35,13 @@ class SetCookie
         $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], '=')) {
+        // The name of the cookie (first kvp) must exist and include an equal sign.
+        if (empty($pieces[0]) || !strpos($pieces[0], '=')) {
             return new self($data);
         }
 
         // Add the cookie pieces into the parsed data array
         foreach ($pieces as $part) {
-
             $cookieParts = explode('=', $part, 2);
             $key = trim($cookieParts[0]);
             $value = isset($cookieParts[1])
@@ -349,7 +348,7 @@ class SetCookie
             return false;
         }
 
-        return (bool) preg_match('/\.' . preg_quote($cookieDomain) . '$/', $domain);
+        return (bool) preg_match('/\.' . preg_quote($cookieDomain, '/') . '$/', $domain);
     }
 
     /**
@@ -359,7 +358,7 @@ class SetCookie
      */
     public function isExpired()
     {
-        return $this->getExpires() && time() > $this->getExpires();
+        return $this->getExpires() !== null && time() > $this->getExpires();
     }
 
     /**
@@ -378,8 +377,8 @@ class SetCookie
         // 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)
-        ) {
+            $name
+        )) {
             return 'Cookie name must not contain invalid characters: ASCII '
                 . 'Control characters (0-31;127), space, tab and the '
                 . 'following characters: ()<>@,;:\"/?={}';
diff --git a/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php b/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
index c82998e0..510778f6 100644
--- a/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
+++ b/vendor/guzzlehttp/guzzle/src/Exception/GuzzleException.php
@@ -1,4 +1,13 @@
 <?php
 namespace GuzzleHttp\Exception;
 
+/**
+ * @method string getMessage()
+ * @method \Throwable|null getPrevious()
+ * @method mixed getCode()
+ * @method string getFile()
+ * @method int getLine()
+ * @method array getTrace()
+ * @method string getTraceAsString()
+ */
 interface GuzzleException {}
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
index 49808e5c..e0923714 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php
@@ -4,7 +4,6 @@ namespace GuzzleHttp\Handler;
 use GuzzleHttp\Exception\RequestException;
 use GuzzleHttp\Exception\ConnectException;
 use GuzzleHttp\Promise\FulfilledPromise;
-use GuzzleHttp\Promise\RejectedPromise;
 use GuzzleHttp\Psr7;
 use GuzzleHttp\Psr7\LazyOpenStream;
 use GuzzleHttp\TransferStats;
@@ -288,7 +287,14 @@ class CurlFactory implements CurlFactoryInterface
     {
         foreach ($conf['_headers'] as $name => $values) {
             foreach ($values as $value) {
-                $conf[CURLOPT_HTTPHEADER][] = "$name: $value";
+                $value = (string) $value;
+                if ($value === '') {
+                    // cURL requires a special format for empty headers.
+                    // See https://github.com/guzzle/guzzle/issues/1882 for more details.
+                    $conf[CURLOPT_HTTPHEADER][] = "$name;";
+                } else {
+                    $conf[CURLOPT_HTTPHEADER][] = "$name: $value";
+                }
             }
         }
 
@@ -388,7 +394,7 @@ class CurlFactory implements CurlFactoryInterface
         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']) {
+            } elseif ('v6' === $options['force_ip_resolve']) {
                 $conf[CURLOPT_IPRESOLVE] = CURL_IPRESOLVE_V6;
             }
         }
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
index 945d06ee..2754d8e4 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/CurlMultiHandler.php
@@ -65,7 +65,9 @@ class CurlMultiHandler
 
         $promise = new Promise(
             [$this, 'execute'],
-            function () use ($id) { return $this->cancel($id); }
+            function () use ($id) {
+                return $this->cancel($id);
+            }
         );
 
         $this->addRequest(['easy' => $easy, 'deferred' => $promise]);
diff --git a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
index b12bfd94..b686545e 100644
--- a/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
+++ b/vendor/guzzlehttp/guzzle/src/Handler/StreamHandler.php
@@ -4,7 +4,6 @@ namespace GuzzleHttp\Handler;
 use GuzzleHttp\Exception\RequestException;
 use GuzzleHttp\Exception\ConnectException;
 use GuzzleHttp\Promise\FulfilledPromise;
-use GuzzleHttp\Promise\RejectedPromise;
 use GuzzleHttp\Promise\PromiseInterface;
 use GuzzleHttp\Psr7;
 use GuzzleHttp\TransferStats;
@@ -61,6 +60,7 @@ class StreamHandler
             if (strpos($message, 'getaddrinfo') // DNS lookup failed
                 || strpos($message, 'Connection refused')
                 || strpos($message, "couldn't connect to host") // error on HHVM
+                || strpos($message, "connection attempt failed")
             ) {
                 $e = new ConnectException($e->getMessage(), $request, $e);
             }
@@ -103,7 +103,7 @@ class StreamHandler
         $status = $parts[1];
         $reason = isset($parts[2]) ? $parts[2] : null;
         $headers = \GuzzleHttp\headers_from_lines($hdrs);
-        list ($stream, $headers) = $this->checkDecode($options, $headers, $stream);
+        list($stream, $headers) = $this->checkDecode($options, $headers, $stream);
         $stream = Psr7\stream_for($stream);
         $sink = $stream;
 
@@ -276,7 +276,7 @@ class StreamHandler
         }
 
         $params = [];
-        $context = $this->getDefaultContext($request, $options);
+        $context = $this->getDefaultContext($request);
 
         if (isset($options['on_headers']) && !is_callable($options['on_headers'])) {
             throw new \InvalidArgumentException('on_headers must be callable');
@@ -307,7 +307,6 @@ class StreamHandler
             && isset($options['auth'][2])
             && 'ntlm' == $options['auth'][2]
         ) {
-
             throw new \InvalidArgumentException('Microsoft NTLM authentication only supported with curl handler');
         }
 
diff --git a/vendor/guzzlehttp/guzzle/src/HandlerStack.php b/vendor/guzzlehttp/guzzle/src/HandlerStack.php
index a72e38a5..24c46fd9 100644
--- a/vendor/guzzlehttp/guzzle/src/HandlerStack.php
+++ b/vendor/guzzlehttp/guzzle/src/HandlerStack.php
@@ -22,7 +22,7 @@ class HandlerStack
      * Creates a default handler stack that can be used by clients.
      *
      * The returned handler will wrap the provided handler or use the most
-     * appropriate default handler for you system. The returned HandlerStack has
+     * appropriate default handler for your system. The returned HandlerStack has
      * support for cookies, redirects, HTTP error exceptions, and preparing a body
      * before sending.
      *
diff --git a/vendor/guzzlehttp/guzzle/src/MessageFormatter.php b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
index 6b090a97..663ac739 100644
--- a/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
+++ b/vendor/guzzlehttp/guzzle/src/MessageFormatter.php
@@ -19,7 +19,6 @@ use Psr\Http\Message\ResponseInterface;
  * - {host}:           Host of the request
  * - {method}:         Method of the request
  * - {uri}:            URI of the request
- * - {host}:           Host of the request
  * - {version}:        Protocol version
  * - {target}:         Request target of the request (path + query + fragment)
  * - {hostname}:       Hostname of the machine that sent the request
@@ -74,7 +73,6 @@ class MessageFormatter
         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]];
                 }
diff --git a/vendor/guzzlehttp/guzzle/src/Middleware.php b/vendor/guzzlehttp/guzzle/src/Middleware.php
index 9d79bd26..d4ad75c9 100644
--- a/vendor/guzzlehttp/guzzle/src/Middleware.php
+++ b/vendor/guzzlehttp/guzzle/src/Middleware.php
@@ -34,10 +34,11 @@ final class Middleware
                 $cookieJar = $options['cookies'];
                 $request = $cookieJar->withCookieHeader($request);
                 return $handler($request, $options)
-                    ->then(function ($response) use ($cookieJar, $request) {
-                        $cookieJar->extractCookies($request, $response);
-                        return $response;
-                    }
+                    ->then(
+                        function ($response) use ($cookieJar, $request) {
+                            $cookieJar->extractCookies($request, $response);
+                            return $response;
+                        }
                 );
             };
         };
@@ -72,7 +73,7 @@ final class Middleware
     /**
      * Middleware that pushes history data to an ArrayAccess container.
      *
-     * @param array $container Container to hold the history (by reference).
+     * @param array|\ArrayAccess $container Container to hold the history (by reference).
      *
      * @return callable Returns a function that accepts the next handler.
      * @throws \InvalidArgumentException if container is not an array or ArrayAccess.
diff --git a/vendor/guzzlehttp/guzzle/src/UriTemplate.php b/vendor/guzzlehttp/guzzle/src/UriTemplate.php
index 0b1623ec..96dcfd09 100644
--- a/vendor/guzzlehttp/guzzle/src/UriTemplate.php
+++ b/vendor/guzzlehttp/guzzle/src/UriTemplate.php
@@ -107,7 +107,6 @@ class UriTemplate
         $useQuery = self::$operatorHash[$parsed['operator']]['query'];
 
         foreach ($parsed['values'] as $value) {
-
             if (!isset($this->variables[$value['value']])) {
                 continue;
             }
@@ -117,11 +116,9 @@ class UriTemplate
             $expanded = '';
 
             if (is_array($variable)) {
-
                 $isAssoc = $this->isAssoc($variable);
                 $kvp = [];
                 foreach ($variable as $key => $var) {
-
                     if ($isAssoc) {
                         $key = rawurlencode($key);
                         $isNestedArray = is_array($var);
@@ -179,7 +176,6 @@ class UriTemplate
                     }
                     $expanded = implode(',', $kvp);
                 }
-
             } else {
                 if ($value['modifier'] === ':') {
                     $variable = substr($variable, 0, $value['position']);
diff --git a/vendor/guzzlehttp/guzzle/src/functions.php b/vendor/guzzlehttp/guzzle/src/functions.php
index 59e212ed..a3ac450d 100644
--- a/vendor/guzzlehttp/guzzle/src/functions.php
+++ b/vendor/guzzlehttp/guzzle/src/functions.php
@@ -302,7 +302,8 @@ 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());
+            'json_decode error: ' . json_last_error_msg()
+        );
     }
 
     return $data;
@@ -324,7 +325,8 @@ 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());
+            'json_encode error: ' . json_last_error_msg()
+        );
     }
 
     return $json;
diff --git a/vendor/guzzlehttp/psr7/.editorconfig b/vendor/guzzlehttp/psr7/.editorconfig
new file mode 100644
index 00000000..677e36e2
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/.editorconfig
@@ -0,0 +1,9 @@
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 4
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/vendor/guzzlehttp/psr7/CHANGELOG.md b/vendor/guzzlehttp/psr7/CHANGELOG.md
index 5c252b3a..27b65f09 100644
--- a/vendor/guzzlehttp/psr7/CHANGELOG.md
+++ b/vendor/guzzlehttp/psr7/CHANGELOG.md
@@ -1,32 +1,82 @@
-# CHANGELOG
+# Change Log
 
-## 1.4.2 - 2017-03-20
 
-* Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing 
+All notable changes to this project will be documented in this file.
+
+The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
+and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
+
+
+## [Unreleased]
+
+
+## [1.5.2] - 2018-12-04
+
+### Fixed
+
+- Check body size when getting the message summary
+
+
+## [1.5.1] - 2018-12-04
+
+### Fixed
+
+- Get the summary of a body only if it is readable
+
+
+## [1.5.0] - 2018-12-03
+
+### Added
+
+- Response first-line to response string exception (fixes #145)
+- A test for #129 behavior
+- `get_message_body_summary` function in order to get the message summary
+- `3gp` and `mkv` mime types
+
+### Changed
+
+- Clarify exception message when stream is detached
+
+### Deprecated
+
+- Deprecated parsing folded header lines as per RFC 7230
+
+### Fixed
+
+- Fix `AppendStream::detach` to not close streams
+- `InflateStream` preserves `isSeekable` attribute of the underlying stream
+- `ServerRequest::getUriFromGlobals` to support URLs in query parameters
+
+
+Several other fixes and improvements.
+
+
+## [1.4.2] - 2017-03-20
+
+### Fixed
+
+- Reverted BC break to `Uri::resolve` and `Uri::removeDotSegments` by removing
   calls to `trigger_error` when deprecated methods are invoked.
 
-## 1.4.1 - 2017-02-27
 
-* Reverted BC break by reintroducing behavior to automagically fix a URI with a
+## [1.4.1] - 2017-02-27
+
+### Added
+
+- Rriggering of silenced deprecation warnings.
+
+### Fixed
+
+- Reverted BC break by reintroducing behavior to automagically fix a URI with a
   relative path and an authority by adding a leading slash to the path. It's only
   deprecated now.
-* Added triggering of silenced deprecation warnings.
 
-## 1.4.0 - 2017-02-21
 
-* Fix `Stream::read` when length parameter <= 0.
-* `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory.
-* Fix `ServerRequest::getUriFromGlobals` when `Host` header contains port.
-* Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form.
-* Allow `parse_response` to parse a response without delimiting space and reason.
-* Ensure each URI modification results in a valid URI according to PSR-7 discussions.
-  Invalid modifications will throw an exception instead of returning a wrong URI or
-  doing some magic.
-  - `(new Uri)->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):
+## [1.4.0] - 2017-02-21
+
+### Added
+
+- Added common URI utility methods based on RFC 3986 (see documentation in the readme):
   - `Uri::isDefaultPort`
   - `Uri::isAbsolute`
   - `Uri::isNetworkPathReference`
@@ -37,69 +87,117 @@
   - `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
+### Changed
+
+- Ensure `ServerRequest::getUriFromGlobals` returns a URI in absolute form.
+- Allow `parse_response` to parse a response without delimiting space and reason.
+- Ensure each URI modification results in a valid URI according to PSR-7 discussions.
+  Invalid modifications will throw an exception instead of returning a wrong URI or
+  doing some magic.
+  - `(new Uri)->withPath('foo')->withHost('example.com')` will throw an exception
+    because the path of a URI with an authority must start with a slash "/" or be empty
+  - `(new Uri())->withScheme('http')` will return `'http://localhost'`
+
+### Deprecated
+
+- `Uri::resolve` in favor of `UriResolver::resolve`
+- `Uri::removeDotSegments` in favor of `UriResolver::removeDotSegments`
+
+### Fixed
+
+- `Stream::read` when length parameter <= 0.
+- `copy_to_stream` reads bytes in chunks instead of `maxLen` into memory.
+- `ServerRequest::getUriFromGlobals` when `Host` header contains port.
+- Compatibility of URIs with `file` scheme and empty host.
+
 
-* 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,
+## [1.3.1] - 2016-06-25
+
+### Fixed
+
+- `Uri::__toString` for network path references, e.g. `//example.org`.
+- Missing lowercase normalization for host.
+- Handling of URI components in case they are `'0'` in a lot of places,
   e.g. as a user info password.
-* Fix `Uri::withAddedHeader` to correctly merge headers with different case.
-* Fix trimming of header values in `Uri::withAddedHeader`. Header values may
+- `Uri::withAddedHeader` to correctly merge headers with different case.
+- Trimming of header values in `Uri::withAddedHeader`. Header values may
   be surrounded by whitespace which should be ignored according to RFC 7230
   Section 3.2.4. This does not apply to header names.
-* 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
+- `Uri::withAddedHeader` with an array of header values.
+- `Uri::resolve` when base path has no slash and handling of fragment.
+- Handling of encoding in `Uri::with(out)QueryValue` so one can pass the
   key/value both in encoded as well as decoded form to those methods. This is
   consistent with withPath, withQuery etc.
-* Fix `ServerRequest::withoutAttribute` when attribute value is null.
+- `ServerRequest::withoutAttribute` when attribute value is null.
+
+
+## [1.3.0] - 2016-04-13
 
-## 1.3.0 - 2016-04-13
+### Added
 
-* Added remaining interfaces needed for full PSR7 compatibility
+- 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.
+- Support for stream_for from scalars.
 
-## 1.2.3 - 2016-02-18
+### Changed
 
-* Fixed support in `GuzzleHttp\Psr7\CachingStream` for seeking forward on remote
+- 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.
+- Handling of gzipped responses with FNAME headers.
+
+
+## [1.2.2] - 2016-01-22
+
+### Added
+
+- Support for URIs without any authority.
+- Support for HTTP 451 'Unavailable For Legal Reasons.'
+- Support for using '0' as a filename.
+- Support for including non-standard ports in Host headers.
 
-## 1.2.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
 
-## 1.2.1 - 2015-11-02
+### Changes
 
-* Now supporting negative offsets when seeking to SEEK_END.
+- 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
+## [1.2.0] - 2015-08-15
+
+### Changed
+
+- Body as `"0"` is now properly added to a response.
+- Now allowing forward seeking in CachingStream.
+- Now properly parsing HTTP requests that contain proxy targets in
   `parse_request`.
-* functions.php is now conditionally required.
-* user-info is no longer dropped when resolving URIs.
+- functions.php is now conditionally required.
+- user-info is no longer dropped when resolving URIs.
+
+
+## [1.1.0] - 2015-06-24
 
-## 1.1.0 - 2015-06-24
+### Changed
 
-* URIs can now be relative.
-* `multipart/form-data` headers are now overridden case-insensitively.
-* URI paths no longer encode the following characters because they are allowed
+- 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
+- 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.
@@ -108,3 +206,20 @@ Currently unsupported:
 
 - `Psr\Http\Message\ServerRequestInterface`
 - `Psr\Http\Message\UploadedFileInterface`
+
+
+
+[Unreleased]: https://github.com/guzzle/psr7/compare/1.5.2...HEAD
+[1.5.2]: https://github.com/guzzle/psr7/compare/1.5.1...1.5.2
+[1.5.1]: https://github.com/guzzle/psr7/compare/1.5.0...1.5.1
+[1.5.0]: https://github.com/guzzle/psr7/compare/1.4.2...1.5.0
+[1.4.2]: https://github.com/guzzle/psr7/compare/1.4.1...1.4.2
+[1.4.1]: https://github.com/guzzle/psr7/compare/1.4.0...1.4.1
+[1.4.0]: https://github.com/guzzle/psr7/compare/1.3.1...1.4.0
+[1.3.1]: https://github.com/guzzle/psr7/compare/1.3.0...1.3.1
+[1.3.0]: https://github.com/guzzle/psr7/compare/1.2.3...1.3.0
+[1.2.3]: https://github.com/guzzle/psr7/compare/1.2.2...1.2.3
+[1.2.2]: https://github.com/guzzle/psr7/compare/1.2.1...1.2.2
+[1.2.1]: https://github.com/guzzle/psr7/compare/1.2.0...1.2.1
+[1.2.0]: https://github.com/guzzle/psr7/compare/1.1.0...1.2.0
+[1.1.0]: https://github.com/guzzle/psr7/compare/1.0.0...1.1.0
diff --git a/vendor/guzzlehttp/psr7/README.md b/vendor/guzzlehttp/psr7/README.md
index 16499358..c60a6a38 100644
--- a/vendor/guzzlehttp/psr7/README.md
+++ b/vendor/guzzlehttp/psr7/README.md
@@ -372,7 +372,7 @@ This method accepts the following `$resource` types:
 $stream = GuzzleHttp\Psr7\stream_for('foo');
 $stream = GuzzleHttp\Psr7\stream_for(fopen('/path/to/file', 'r'));
 
-$generator function ($bytes) {
+$generator = function ($bytes) {
     for ($i = 0; $i < $bytes; $i++) {
         yield ' ';
     }
@@ -606,6 +606,12 @@ Creates a new URI with a specific query string value. Any existing query string
 provided key are removed and replaced with the given key value pair. A value of null will set the query string
 key without a value, e.g. "key" instead of "key=value".
 
+### `GuzzleHttp\Psr7\Uri::withQueryValues`
+
+`public static function withQueryValues(UriInterface $uri, array $keyValueArray): UriInterface`
+
+Creates a new URI with multiple query string values. It has the same behavior as `withQueryValue()` but for an
+associative array of key => value.
 
 ### `GuzzleHttp\Psr7\Uri::withoutQueryValue`
 
diff --git a/vendor/guzzlehttp/psr7/composer.json b/vendor/guzzlehttp/psr7/composer.json
index b1c5a90b..2add153e 100644
--- a/vendor/guzzlehttp/psr7/composer.json
+++ b/vendor/guzzlehttp/psr7/composer.json
@@ -2,7 +2,7 @@
     "name": "guzzlehttp/psr7",
     "type": "library",
     "description": "PSR-7 message implementation that also provides common utility methods",
-    "keywords": ["request", "response", "message", "stream", "http", "uri", "url"],
+    "keywords": ["request", "response", "message", "stream", "http", "uri", "url", "psr-7"],
     "license": "MIT",
     "authors": [
         {
@@ -17,10 +17,11 @@
     ],
     "require": {
         "php": ">=5.4.0",
-        "psr/http-message": "~1.0"
+        "psr/http-message": "~1.0",
+        "ralouphie/getallheaders": "^2.0.5"
     },
     "require-dev": {
-        "phpunit/phpunit": "~4.0"
+        "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8"
     },
     "provide": {
         "psr/http-message-implementation": "1.0"
@@ -31,9 +32,14 @@
         },
         "files": ["src/functions_include.php"]
     },
+    "autoload-dev": {
+        "psr-4": {
+            "GuzzleHttp\\Tests\\Psr7\\": "tests/"
+        }
+    },
     "extra": {
         "branch-alias": {
-            "dev-master": "1.4-dev"
+            "dev-master": "1.5-dev"
         }
     }
 }
diff --git a/vendor/guzzlehttp/psr7/src/AppendStream.php b/vendor/guzzlehttp/psr7/src/AppendStream.php
index 23039fd7..472a0d61 100644
--- a/vendor/guzzlehttp/psr7/src/AppendStream.php
+++ b/vendor/guzzlehttp/psr7/src/AppendStream.php
@@ -16,7 +16,6 @@ class AppendStream implements StreamInterface
     private $seekable = true;
     private $current = 0;
     private $pos = 0;
-    private $detached = false;
 
     /**
      * @param StreamInterface[] $streams Streams to decorate. Each stream must
@@ -73,6 +72,7 @@ class AppendStream implements StreamInterface
     public function close()
     {
         $this->pos = $this->current = 0;
+        $this->seekable = true;
 
         foreach ($this->streams as $stream) {
             $stream->close();
@@ -82,14 +82,22 @@ class AppendStream implements StreamInterface
     }
 
     /**
-     * Detaches each attached stream
+     * Detaches each attached stream.
+     *
+     * Returns null as it's not clear which underlying stream resource to return.
      *
      * {@inheritdoc}
      */
     public function detach()
     {
-        $this->close();
-        $this->detached = true;
+        $this->pos = $this->current = 0;
+        $this->seekable = true;
+
+        foreach ($this->streams as $stream) {
+            $stream->detach();
+        }
+
+        $this->streams = [];
     }
 
     public function tell()
diff --git a/vendor/guzzlehttp/psr7/src/FnStream.php b/vendor/guzzlehttp/psr7/src/FnStream.php
index cc9b4453..73daea6f 100644
--- a/vendor/guzzlehttp/psr7/src/FnStream.php
+++ b/vendor/guzzlehttp/psr7/src/FnStream.php
@@ -53,6 +53,15 @@ class FnStream implements StreamInterface
     }
 
     /**
+     * An unserialize would allow the __destruct to run when the unserialized value goes out of scope.
+     * @throws \LogicException
+     */
+    public function __wakeup()
+    {
+        throw new \LogicException('FnStream should never be unserialized');
+    }
+
+    /**
      * Adds custom functionality to an underlying stream by intercepting
      * specific method calls.
      *
diff --git a/vendor/guzzlehttp/psr7/src/InflateStream.php b/vendor/guzzlehttp/psr7/src/InflateStream.php
index 0051d3fe..5e4f6028 100644
--- a/vendor/guzzlehttp/psr7/src/InflateStream.php
+++ b/vendor/guzzlehttp/psr7/src/InflateStream.php
@@ -27,7 +27,7 @@ class InflateStream implements StreamInterface
         $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);
+        $this->stream = $stream->isSeekable() ? new Stream($resource) : new NoSeekStream(new Stream($resource));
     }
 
     /**
diff --git a/vendor/guzzlehttp/psr7/src/Request.php b/vendor/guzzlehttp/psr7/src/Request.php
index 08285484..00066424 100644
--- a/vendor/guzzlehttp/psr7/src/Request.php
+++ b/vendor/guzzlehttp/psr7/src/Request.php
@@ -45,7 +45,7 @@ class Request implements RequestInterface
         $this->setHeaders($headers);
         $this->protocol = $version;
 
-        if (!$this->hasHeader('Host')) {
+        if (!isset($this->headerNames['host'])) {
             $this->updateHostFromUri();
         }
 
@@ -110,7 +110,7 @@ class Request implements RequestInterface
         $new = clone $this;
         $new->uri = $uri;
 
-        if (!$preserveHost) {
+        if (!$preserveHost || !isset($this->headerNames['host'])) {
             $new->updateHostFromUri();
         }
 
diff --git a/vendor/guzzlehttp/psr7/src/Response.php b/vendor/guzzlehttp/psr7/src/Response.php
index 2830c6c9..6e72c06b 100644
--- a/vendor/guzzlehttp/psr7/src/Response.php
+++ b/vendor/guzzlehttp/psr7/src/Response.php
@@ -93,6 +93,10 @@ class Response implements ResponseInterface
         $version = '1.1',
         $reason = null
     ) {
+        if (filter_var($status, FILTER_VALIDATE_INT) === false) {
+            throw new \InvalidArgumentException('Status code must be an integer value.');
+        }
+
         $this->statusCode = (int) $status;
 
         if ($body !== '' && $body !== null) {
diff --git a/vendor/guzzlehttp/psr7/src/Rfc7230.php b/vendor/guzzlehttp/psr7/src/Rfc7230.php
new file mode 100644
index 00000000..505e4742
--- /dev/null
+++ b/vendor/guzzlehttp/psr7/src/Rfc7230.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace GuzzleHttp\Psr7;
+
+final class Rfc7230
+{
+    /**
+     * Header related regular expressions (copied from amphp/http package)
+     * (Note: once we require PHP 7.x we could just depend on the upstream package)
+     *
+     * Note: header delimiter (\r\n) is modified to \r?\n to accept line feed only delimiters for BC reasons.
+     *
+     * @link    https://github.com/amphp/http/blob/v1.0.1/src/Rfc7230.php#L12-L15
+     * @license https://github.com/amphp/http/blob/v1.0.1/LICENSE
+     */
+    const HEADER_REGEX = "(^([^()<>@,;:\\\"/[\]?={}\x01-\x20\x7F]++):[ \t]*+((?:[ \t]*+[\x21-\x7E\x80-\xFF]++)*+)[ \t]*+\r?\n)m";
+    const HEADER_FOLD_REGEX = "(\r?\n[ \t]++)";
+}
diff --git a/vendor/guzzlehttp/psr7/src/ServerRequest.php b/vendor/guzzlehttp/psr7/src/ServerRequest.php
index 575aab84..99f453a5 100644
--- a/vendor/guzzlehttp/psr7/src/ServerRequest.php
+++ b/vendor/guzzlehttp/psr7/src/ServerRequest.php
@@ -166,7 +166,7 @@ class ServerRequest extends Request implements ServerRequestInterface
     public static function fromGlobals()
     {
         $method = isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : 'GET';
-        $headers = function_exists('getallheaders') ? getallheaders() : [];
+        $headers = getallheaders();
         $uri = self::getUriFromGlobals();
         $body = new LazyOpenStream('php://input', 'r+');
         $protocol = isset($_SERVER['SERVER_PROTOCOL']) ? str_replace('HTTP/', '', $_SERVER['SERVER_PROTOCOL']) : '1.1';
@@ -180,23 +180,41 @@ class ServerRequest extends Request implements ServerRequestInterface
             ->withUploadedFiles(self::normalizeFiles($_FILES));
     }
 
+    private static function extractHostAndPortFromAuthority($authority)
+    {
+        $uri = 'http://'.$authority;
+        $parts = parse_url($uri);
+        if (false === $parts) {
+            return [null, null];
+        }
+
+        $host = isset($parts['host']) ? $parts['host'] : null;
+        $port = isset($parts['port']) ? $parts['port'] : null;
+
+        return [$host, $port];
+    }
+
     /**
      * Get a Uri populated with values from $_SERVER.
      *
      * @return UriInterface
      */
-    public static function getUriFromGlobals() {
+    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])) {
+            list($host, $port) = self::extractHostAndPortFromAuthority($_SERVER['HTTP_HOST']);
+            if ($host !== null) {
+                $uri = $uri->withHost($host);
+            }
+
+            if ($port !== null) {
                 $hasPort = true;
-                $uri = $uri->withPort($hostHeaderParts[1]);
+                $uri = $uri->withPort($port);
             }
         } elseif (isset($_SERVER['SERVER_NAME'])) {
             $uri = $uri->withHost($_SERVER['SERVER_NAME']);
@@ -210,7 +228,7 @@ class ServerRequest extends Request implements ServerRequestInterface
 
         $hasQuery = false;
         if (isset($_SERVER['REQUEST_URI'])) {
-            $requestUriParts = explode('?', $_SERVER['REQUEST_URI']);
+            $requestUriParts = explode('?', $_SERVER['REQUEST_URI'], 2);
             $uri = $uri->withPath($requestUriParts[0]);
             if (isset($requestUriParts[1])) {
                 $hasQuery = true;
diff --git a/vendor/guzzlehttp/psr7/src/Stream.php b/vendor/guzzlehttp/psr7/src/Stream.php
index e3366287..111795eb 100644
--- a/vendor/guzzlehttp/psr7/src/Stream.php
+++ b/vendor/guzzlehttp/psr7/src/Stream.php
@@ -24,11 +24,11 @@ class Stream implements StreamInterface
             '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
+            'x+t' => true, 'c+t' => true, 'a+' => true, 'rb+' => true,
         ],
         'write' => [
             'w' => true, 'w+' => true, 'rw' => true, 'r+' => true, 'x+' => true,
-            'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true,
+            'c+' => true, 'wb' => true, 'w+b' => true, 'r+b' => true, 'rb+' => true,
             'x+b' => true, 'c+b' => true, 'w+t' => true, 'r+t' => true,
             'x+t' => true, 'c+t' => true, 'a' => true, 'a+' => true
         ]
@@ -70,15 +70,6 @@ class Stream implements StreamInterface
         $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
      */
@@ -99,6 +90,10 @@ class Stream implements StreamInterface
 
     public function getContents()
     {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
+
         $contents = stream_get_contents($this->stream);
 
         if ($contents === false) {
@@ -173,11 +168,19 @@ class Stream implements StreamInterface
 
     public function eof()
     {
-        return !$this->stream || feof($this->stream);
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
+
+        return feof($this->stream);
     }
 
     public function tell()
     {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
+
         $result = ftell($this->stream);
 
         if ($result === false) {
@@ -194,9 +197,13 @@ class Stream implements StreamInterface
 
     public function seek($offset, $whence = SEEK_SET)
     {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
         if (!$this->seekable) {
             throw new \RuntimeException('Stream is not seekable');
-        } elseif (fseek($this->stream, $offset, $whence) === -1) {
+        }
+        if (fseek($this->stream, $offset, $whence) === -1) {
             throw new \RuntimeException('Unable to seek to stream position '
                 . $offset . ' with whence ' . var_export($whence, true));
         }
@@ -204,6 +211,9 @@ class Stream implements StreamInterface
 
     public function read($length)
     {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
         if (!$this->readable) {
             throw new \RuntimeException('Cannot read from non-readable stream');
         }
@@ -225,6 +235,9 @@ class Stream implements StreamInterface
 
     public function write($string)
     {
+        if (!isset($this->stream)) {
+            throw new \RuntimeException('Stream is detached');
+        }
         if (!$this->writable) {
             throw new \RuntimeException('Cannot write to a non-writable stream');
         }
diff --git a/vendor/guzzlehttp/psr7/src/StreamWrapper.php b/vendor/guzzlehttp/psr7/src/StreamWrapper.php
index cf7b2232..0f3a2856 100644
--- a/vendor/guzzlehttp/psr7/src/StreamWrapper.php
+++ b/vendor/guzzlehttp/psr7/src/StreamWrapper.php
@@ -38,9 +38,21 @@ class StreamWrapper
                 . 'writable, or both.');
         }
 
-        return fopen('guzzle://stream', $mode, null, stream_context_create([
+        return fopen('guzzle://stream', $mode, null, self::createStreamContext($stream));
+    }
+
+    /**
+     * Creates a stream context that can be used to open a stream as a php stream resource.
+     *
+     * @param StreamInterface $stream
+     *
+     * @return resource
+     */
+    public static function createStreamContext(StreamInterface $stream)
+    {
+        return stream_context_create([
             'guzzle' => ['stream' => $stream]
-        ]));
+        ]);
     }
 
     /**
@@ -94,12 +106,21 @@ class StreamWrapper
         return true;
     }
 
+    public function stream_cast($cast_as)
+    {
+        $stream = clone($this->stream);
+
+        return $stream->detach();
+    }
+
     public function stream_stat()
     {
         static $modeMap = [
             'r'  => 33060,
+            'rb' => 33060,
             'r+' => 33206,
-            'w'  => 33188
+            'w'  => 33188,
+            'wb' => 33188
         ];
 
         return [
@@ -118,4 +139,23 @@ class StreamWrapper
             'blocks'  => 0
         ];
     }
+
+    public function url_stat($path, $flags)
+    {
+        return [
+            'dev'     => 0,
+            'ino'     => 0,
+            'mode'    => 0,
+            'nlink'   => 0,
+            'uid'     => 0,
+            'gid'     => 0,
+            'rdev'    => 0,
+            'size'    => 0,
+            'atime'   => 0,
+            'mtime'   => 0,
+            'ctime'   => 0,
+            'blksize' => 0,
+            'blocks'  => 0
+        ];
+    }
 }
diff --git a/vendor/guzzlehttp/psr7/src/Uri.php b/vendor/guzzlehttp/psr7/src/Uri.php
index f46c1db9..36219568 100644
--- a/vendor/guzzlehttp/psr7/src/Uri.php
+++ b/vendor/guzzlehttp/psr7/src/Uri.php
@@ -301,15 +301,7 @@ class Uri implements 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;
-        });
+        $result = self::getFilteredQueryString($uri, [$key]);
 
         return $uri->withQuery(implode('&', $result));
     }
@@ -331,26 +323,29 @@ class Uri implements UriInterface
      */
     public static function withQueryValue(UriInterface $uri, $key, $value)
     {
-        $current = $uri->getQuery();
+        $result = self::getFilteredQueryString($uri, [$key]);
 
-        if ($current === '') {
-            $result = [];
-        } else {
-            $decodedKey = rawurldecode($key);
-            $result = array_filter(explode('&', $current), function ($part) use ($decodedKey) {
-                return rawurldecode(explode('=', $part)[0]) !== $decodedKey;
-            });
-        }
+        $result[] = self::generateQueryString($key, $value);
 
-        // Query string separators ("=", "&") within the key or value need to be encoded
-        // (while preventing double-encoding) before setting the query string. All other
-        // chars that need percent-encoding will be encoded by withQuery().
-        $key = strtr($key, self::$replaceQuery);
+        return $uri->withQuery(implode('&', $result));
+    }
 
-        if ($value !== null) {
-            $result[] = $key . '=' . strtr($value, self::$replaceQuery);
-        } else {
-            $result[] = $key;
+    /**
+     * Creates a new URI with multiple specific query string values.
+     *
+     * It has the same behavior as withQueryValue() but for an associative array of key => value.
+     *
+     * @param UriInterface $uri           URI to use as a base.
+     * @param array        $keyValueArray Associative array of key and values
+     *
+     * @return UriInterface
+     */
+    public static function withQueryValues(UriInterface $uri, array $keyValueArray)
+    {
+        $result = self::getFilteredQueryString($uri, array_keys($keyValueArray));
+
+        foreach ($keyValueArray as $key => $value) {
+            $result[] = self::generateQueryString($key, $value);
         }
 
         return $uri->withQuery(implode('&', $result));
@@ -620,6 +615,47 @@ class Uri implements UriInterface
         return $port;
     }
 
+    /**
+     * @param UriInterface $uri
+     * @param array        $keys
+     * 
+     * @return array
+     */
+    private static function getFilteredQueryString(UriInterface $uri, array $keys)
+    {
+        $current = $uri->getQuery();
+
+        if ($current === '') {
+            return [];
+        }
+
+        $decodedKeys = array_map('rawurldecode', $keys);
+
+        return array_filter(explode('&', $current), function ($part) use ($decodedKeys) {
+            return !in_array(rawurldecode(explode('=', $part)[0]), $decodedKeys, true);
+        });
+    }
+
+    /**
+     * @param string      $key
+     * @param string|null $value
+     * 
+     * @return string
+     */
+    private static function generateQueryString($key, $value)
+    {
+        // Query string separators ("=", "&") within the key or value need to be encoded
+        // (while preventing double-encoding) before setting the query string. All other
+        // chars that need percent-encoding will be encoded by withQuery().
+        $queryString = strtr($key, self::$replaceQuery);
+
+        if ($value !== null) {
+            $queryString .= '=' . strtr($value, self::$replaceQuery);
+        }
+
+        return $queryString;
+    }
+
     private function removeDefaultPort()
     {
         if ($this->port !== null && self::isDefaultPort($this)) {
diff --git a/vendor/guzzlehttp/psr7/src/functions.php b/vendor/guzzlehttp/psr7/src/functions.php
index e40348d6..957bfb42 100644
--- a/vendor/guzzlehttp/psr7/src/functions.php
+++ b/vendor/guzzlehttp/psr7/src/functions.php
@@ -69,10 +69,10 @@ function uri_for($uri)
  * - 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
+ * @param resource|string|null|int|float|bool|StreamInterface|callable|\Iterator $resource Entity body data
+ * @param array                                                                  $options  Additional options
  *
- * @return Stream
+ * @return StreamInterface
  * @throws \InvalidArgumentException if the $resource arg is not valid.
  */
 function stream_for($resource = '', array $options = [])
@@ -238,7 +238,7 @@ function modify_request(RequestInterface $request, array $changes)
     }
 
     if ($request instanceof ServerRequestInterface) {
-        return new ServerRequest(
+        return (new ServerRequest(
             isset($changes['method']) ? $changes['method'] : $request->getMethod(),
             $uri,
             $headers,
@@ -247,7 +247,11 @@ function modify_request(RequestInterface $request, array $changes)
                 ? $changes['version']
                 : $request->getProtocolVersion(),
             $request->getServerParams()
-        );
+        ))
+        ->withParsedBody($request->getParsedBody())
+        ->withQueryParams($request->getQueryParams())
+        ->withCookieParams($request->getCookieParams())
+        ->withUploadedFiles($request->getUploadedFiles());
     }
 
     return new Request(
@@ -431,7 +435,7 @@ function hash(
  * @param StreamInterface $stream    Stream to read from
  * @param int             $maxLength Maximum buffer length
  *
- * @return string|bool
+ * @return string
  */
 function readline(StreamInterface $stream, $maxLength = null)
 {
@@ -495,7 +499,7 @@ function parse_response($message)
     // 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');
+        throw new \InvalidArgumentException('Invalid response string: ' . $data['start-line']);
     }
     $parts = explode(' ', $data['start-line'], 3);
 
@@ -516,8 +520,8 @@ function parse_response($message)
  * 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
+ * @param string   $str         Query string to parse
+ * @param int|bool $urlEncoding How the query string is encoded
  *
  * @return array
  */
@@ -533,9 +537,9 @@ function parse_query($str, $urlEncoding = true)
         $decoder = function ($value) {
             return rawurldecode(str_replace('+', ' ', $value));
         };
-    } elseif ($urlEncoding == PHP_QUERY_RFC3986) {
+    } elseif ($urlEncoding === PHP_QUERY_RFC3986) {
         $decoder = 'rawurldecode';
-    } elseif ($urlEncoding == PHP_QUERY_RFC1738) {
+    } elseif ($urlEncoding === PHP_QUERY_RFC1738) {
         $decoder = 'urldecode';
     } else {
         $decoder = function ($str) { return $str; };
@@ -633,6 +637,7 @@ function mimetype_from_filename($filename)
 function mimetype_from_extension($extension)
 {
     static $mimetypes = [
+        '3gp' => 'video/3gpp',
         '7z' => 'application/x-7z-compressed',
         'aac' => 'audio/x-aac',
         'ai' => 'application/postscript',
@@ -680,6 +685,7 @@ function mimetype_from_extension($extension)
         'mid' => 'audio/midi',
         'midi' => 'audio/midi',
         'mov' => 'video/quicktime',
+        'mkv' => 'video/x-matroska',
         'mp3' => 'audio/mpeg',
         'mp4' => 'video/mp4',
         'mp4a' => 'audio/mp4',
@@ -758,29 +764,53 @@ function _parse_message($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);
+    $message = ltrim($message, "\r\n");
 
-    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;
+    $messageParts = preg_split("/\r?\n\r?\n/", $message, 2);
+
+    if ($messageParts === false || count($messageParts) !== 2) {
+        throw new \InvalidArgumentException('Invalid message: Missing header delimiter');
+    }
+
+    list($rawHeaders, $body) = $messageParts;
+    $rawHeaders .= "\r\n"; // Put back the delimiter we split previously
+    $headerParts = preg_split("/\r?\n/", $rawHeaders, 2);
+
+    if ($headerParts === false || count($headerParts) !== 2) {
+        throw new \InvalidArgumentException('Invalid message: Missing status line');
+    }
+
+    list($startLine, $rawHeaders) = $headerParts;
+
+    if (preg_match("/(?:^HTTP\/|^[A-Z]+ \S+ HTTP\/)(\d+(?:\.\d+)?)/i", $startLine, $matches) && $matches[1] === '1.0') {
+        // Header folding is deprecated for HTTP/1.1, but allowed in HTTP/1.0
+        $rawHeaders = preg_replace(Rfc7230::HEADER_FOLD_REGEX, ' ', $rawHeaders);
+    }
+
+    /** @var array[] $headerLines */
+    $count = preg_match_all(Rfc7230::HEADER_REGEX, $rawHeaders, $headerLines, PREG_SET_ORDER);
+
+    // If these aren't the same, then one line didn't match and there's an invalid header.
+    if ($count !== substr_count($rawHeaders, "\n")) {
+        // Folding is deprecated, see https://tools.ietf.org/html/rfc7230#section-3.2.4
+        if (preg_match(Rfc7230::HEADER_FOLD_REGEX, $rawHeaders)) {
+            throw new \InvalidArgumentException('Invalid header syntax: Obsolete line folding');
         }
+
+        throw new \InvalidArgumentException('Invalid header syntax');
     }
 
-    return $result;
+    $headers = [];
+
+    foreach ($headerLines as $headerLine) {
+        $headers[$headerLine[1]][] = $headerLine[2];
+    }
+
+    return [
+        'start-line' => $startLine,
+        'headers' => $headers,
+        'body' => $body,
+    ];
 }
 
 /**
@@ -809,6 +839,46 @@ function _parse_request_uri($path, array $headers)
     return $scheme . '://' . $host . '/' . ltrim($path, '/');
 }
 
+/**
+ * Get a short summary of the message body
+ *
+ * Will return `null` if the response is not printable.
+ *
+ * @param MessageInterface $message    The message to get the body summary
+ * @param int              $truncateAt The maximum allowed size of the summary
+ *
+ * @return null|string
+ */
+function get_message_body_summary(MessageInterface $message, $truncateAt = 120)
+{
+    $body = $message->getBody();
+
+    if (!$body->isSeekable() || !$body->isReadable()) {
+        return null;
+    }
+
+    $size = $body->getSize();
+
+    if ($size === 0) {
+        return null;
+    }
+
+    $summary = $body->read($truncateAt);
+    $body->rewind();
+
+    if ($size > $truncateAt) {
+        $summary .= ' (truncated...)';
+    }
+
+    // Matches any printable character, including unicode characters:
+    // letters, marks, numbers, punctuation, spacing, and separators.
+    if (preg_match('/[^\pL\pM\pN\pP\pS\pZ\n\r\t]/', $summary)) {
+        return null;
+    }
+
+    return $summary;
+}
+
 /** @internal */
 function _caseless_remove($keys, array $data)
 {
diff --git a/vendor/monolog/monolog/CHANGELOG.md b/vendor/monolog/monolog/CHANGELOG.md
index cd1142d1..bcf679c4 100644
--- a/vendor/monolog/monolog/CHANGELOG.md
+++ b/vendor/monolog/monolog/CHANGELOG.md
@@ -1,3 +1,31 @@
+### 1.24.0 (2018-11-05)
+
+  * Added a `ResettableInterface` in order to reset/reset/clear/flush handlers and processors
+  * Added a `ProcessorInterface` as an optional way to label a class as being a processor (mostly useful for autowiring dependency containers)
+  * Added a way to log signals being received using Monolog\SignalHandler
+  * Added ability to customize error handling at the Logger level using Logger::setExceptionHandler
+  * Added InsightOpsHandler to migrate users of the LogEntriesHandler
+  * Added protection to NormalizerHandler against circular and very deep structures, it now stops normalizing at a depth of 9
+  * Added capture of stack traces to ErrorHandler when logging PHP errors
+  * Added RavenHandler support for a `contexts` context or extra key to forward that to Sentry's contexts
+  * Added forwarding of context info to FluentdFormatter
+  * Added SocketHandler::setChunkSize to override the default chunk size in case you must send large log lines to rsyslog for example
+  * Added ability to extend/override BrowserConsoleHandler
+  * Added SlackWebhookHandler::getWebhookUrl and SlackHandler::getToken to enable class extensibility
+  * Added SwiftMailerHandler::getSubjectFormatter to enable class extensibility
+  * Dropped official support for HHVM in test builds
+  * Fixed normalization of exception traces when call_user_func is used to avoid serializing objects and the data they contain
+  * Fixed naming of fields in Slack handler, all field names are now capitalized in all cases
+  * Fixed HipChatHandler bug where slack dropped messages randomly
+  * Fixed normalization of objects in Slack handlers
+  * Fixed support for PHP7's Throwable in NewRelicHandler
+  * Fixed race bug when StreamHandler sometimes incorrectly reported it failed to create a directory
+  * Fixed table row styling issues in HtmlFormatter
+  * Fixed RavenHandler dropping the message when logging exception
+  * Fixed WhatFailureGroupHandler skipping processors when using handleBatch
+    and implement it where possible
+  * Fixed display of anonymous class names
+
 ### 1.23.0 (2017-06-19)
 
   * Improved SyslogUdpHandler's support for RFC5424 and added optional `$ident` argument
diff --git a/vendor/monolog/monolog/CHANGELOG.mdown b/vendor/monolog/monolog/CHANGELOG.mdown
deleted file mode 100644
index 76ea0ead..00000000
--- a/vendor/monolog/monolog/CHANGELOG.mdown
+++ /dev/null
@@ -1,328 +0,0 @@
-### 1.22.0 (2016-11-26)
-
-  * Added SlackbotHandler and SlackWebhookHandler to set up Slack integration more easily
-  * Added MercurialProcessor to add mercurial revision and branch names to log records
-  * Added support for AWS SDK v3 in DynamoDbHandler
-  * Fixed fatal errors occuring when normalizing generators that have been fully consumed
-  * Fixed RollbarHandler to include a level (rollbar level), monolog_level (original name), channel and datetime (unix)
-  * Fixed RollbarHandler not flushing records automatically, calling close() explicitly is not necessary anymore
-  * Fixed SyslogUdpHandler to avoid sending empty frames
-  * Fixed a few PHP 7.0 and 7.1 compatibility issues
-
-### 1.21.0 (2016-07-29)
-
-  * Break: Reverted the addition of $context when the ErrorHandler handles regular php errors from 1.20.0 as it was causing issues
-  * Added support for more formats in RotatingFileHandler::setFilenameFormat as long as they have Y, m and d in order
-  * Added ability to format the main line of text the SlackHandler sends by explictly setting a formatter on the handler
-  * Added information about SoapFault instances in NormalizerFormatter
-  * Added $handleOnlyReportedErrors option on ErrorHandler::registerErrorHandler (default true) to allow logging of all errors no matter the error_reporting level
-
-### 1.20.0 (2016-07-02)
-
-  * Added FingersCrossedHandler::activate() to manually trigger the handler regardless of the activation policy
-  * Added StreamHandler::getUrl to retrieve the stream's URL
-  * Added ability to override addRow/addTitle in HtmlFormatter
-  * Added the $context to context information when the ErrorHandler handles a regular php error
-  * Deprecated RotatingFileHandler::setFilenameFormat to only support 3 formats: Y, Y-m and Y-m-d
-  * Fixed WhatFailureGroupHandler to work with PHP7 throwables
-  * Fixed a few minor bugs
-
-### 1.19.0 (2016-04-12)
-
-  * Break: StreamHandler will not close streams automatically that it does not own. If you pass in a stream (not a path/url), then it will not close it for you. You can retrieve those using getStream() if needed
-  * Added DeduplicationHandler to remove duplicate records from notifications across multiple requests, useful for email or other notifications on errors
-  * Added ability to use `%message%` and other LineFormatter replacements in the subject line of emails sent with NativeMailHandler and SwiftMailerHandler
-  * Fixed HipChatHandler handling of long messages
-
-### 1.18.2 (2016-04-02)
-
-  * Fixed ElasticaFormatter to use more precise dates
-  * Fixed GelfMessageFormatter sending too long messages
-
-### 1.18.1 (2016-03-13)
-
-  * Fixed SlackHandler bug where slack dropped messages randomly
-  * Fixed RedisHandler issue when using with the PHPRedis extension
-  * Fixed AmqpHandler content-type being incorrectly set when using with the AMQP extension
-  * Fixed BrowserConsoleHandler regression
-
-### 1.18.0 (2016-03-01)
-
-  * Added optional reduction of timestamp precision via `Logger->useMicrosecondTimestamps(false)`, disabling it gets you a bit of performance boost but reduces the precision to the second instead of microsecond
-  * Added possibility to skip some extra stack frames in IntrospectionProcessor if you have some library wrapping Monolog that is always adding frames
-  * Added `Logger->withName` to clone a logger (keeping all handlers) with a new name
-  * Added FluentdFormatter for the Fluentd unix socket protocol
-  * Added HandlerWrapper base class to ease the creation of handler wrappers, just extend it and override as needed
-  * Added support for replacing context sub-keys using `%context.*%` in LineFormatter
-  * Added support for `payload` context value in RollbarHandler
-  * Added setRelease to RavenHandler to describe the application version, sent with every log
-  * Added support for `fingerprint` context value in RavenHandler
-  * Fixed JSON encoding errors that would gobble up the whole log record, we now handle those more gracefully by dropping chars as needed
-  * Fixed write timeouts in SocketHandler and derivatives, set to 10sec by default, lower it with `setWritingTimeout()`
-  * Fixed PHP7 compatibility with regard to Exception/Throwable handling in a few places
-
-### 1.17.2 (2015-10-14)
-
-  * Fixed ErrorHandler compatibility with non-Monolog PSR-3 loggers
-  * Fixed SlackHandler handling to use slack functionalities better
-  * Fixed SwiftMailerHandler bug when sending multiple emails they all had the same id
-  * Fixed 5.3 compatibility regression
-
-### 1.17.1 (2015-08-31)
-
-  * Fixed RollbarHandler triggering PHP notices
-
-### 1.17.0 (2015-08-30)
-
-  * Added support for `checksum` and `release` context/extra values in RavenHandler
-  * Added better support for exceptions in RollbarHandler
-  * Added UidProcessor::getUid
-  * Added support for showing the resource type in NormalizedFormatter
-  * Fixed IntrospectionProcessor triggering PHP notices
-
-### 1.16.0 (2015-08-09)
-
-  * Added IFTTTHandler to notify ifttt.com triggers
-  * Added Logger::setHandlers() to allow setting/replacing all handlers
-  * Added $capSize in RedisHandler to cap the log size
-  * Fixed StreamHandler creation of directory to only trigger when the first log write happens
-  * Fixed bug in the handling of curl failures
-  * Fixed duplicate logging of fatal errors when both error and fatal error handlers are registered in monolog's ErrorHandler
-  * Fixed missing fatal errors records with handlers that need to be closed to flush log records
-  * Fixed TagProcessor::addTags support for associative arrays
-
-### 1.15.0 (2015-07-12)
-
-  * Added addTags and setTags methods to change a TagProcessor
-  * Added automatic creation of directories if they are missing for a StreamHandler to open a log file
-  * Added retry functionality to Loggly, Cube and Mandrill handlers so they retry up to 5 times in case of network failure
-  * Fixed process exit code being incorrectly reset to 0 if ErrorHandler::registerExceptionHandler was used
-  * Fixed HTML/JS escaping in BrowserConsoleHandler
-  * Fixed JSON encoding errors being silently suppressed (PHP 5.5+ only)
-
-### 1.14.0 (2015-06-19)
-
-  * Added PHPConsoleHandler to send record to Chrome's PHP Console extension and library
-  * Added support for objects implementing __toString in the NormalizerFormatter
-  * Added support for HipChat's v2 API in HipChatHandler
-  * Added Logger::setTimezone() to initialize the timezone monolog should use in case date.timezone isn't correct for your app
-  * Added an option to send formatted message instead of the raw record on PushoverHandler via ->useFormattedMessage(true)
-  * Fixed curl errors being silently suppressed
-
-### 1.13.1 (2015-03-09)
-
-  * Fixed regression in HipChat requiring a new token to be created
-
-### 1.13.0 (2015-03-05)
-
-  * Added Registry::hasLogger to check for the presence of a logger instance
-  * Added context.user support to RavenHandler
-  * Added HipChat API v2 support in the HipChatHandler
-  * Added NativeMailerHandler::addParameter to pass params to the mail() process
-  * Added context data to SlackHandler when $includeContextAndExtra is true
-  * Added ability to customize the Swift_Message per-email in SwiftMailerHandler
-  * Fixed SwiftMailerHandler to lazily create message instances if a callback is provided
-  * Fixed serialization of INF and NaN values in Normalizer and LineFormatter
-
-### 1.12.0 (2014-12-29)
-
-  * Break: HandlerInterface::isHandling now receives a partial record containing only a level key. This was always the intent and does not break any Monolog handler but is strictly speaking a BC break and you should check if you relied on any other field in your own handlers.
-  * Added PsrHandler to forward records to another PSR-3 logger
-  * Added SamplingHandler to wrap around a handler and include only every Nth record
-  * Added MongoDBFormatter to support better storage with MongoDBHandler (it must be enabled manually for now)
-  * Added exception codes in the output of most formatters
-  * Added LineFormatter::includeStacktraces to enable exception stack traces in logs (uses more than one line)
-  * Added $useShortAttachment to SlackHandler to minify attachment size and $includeExtra to append extra data
-  * Added $host to HipChatHandler for users of private instances
-  * Added $transactionName to NewRelicHandler and support for a transaction_name context value
-  * Fixed MandrillHandler to avoid outputing API call responses
-  * Fixed some non-standard behaviors in SyslogUdpHandler
-
-### 1.11.0 (2014-09-30)
-
-  * Break: The NewRelicHandler extra and context data are now prefixed with extra_ and context_ to avoid clashes. Watch out if you have scripts reading those from the API and rely on names
-  * Added WhatFailureGroupHandler to suppress any exception coming from the wrapped handlers and avoid chain failures if a logging service fails
-  * Added MandrillHandler to send emails via the Mandrillapp.com API
-  * Added SlackHandler to log records to a Slack.com account
-  * Added FleepHookHandler to log records to a Fleep.io account
-  * Added LogglyHandler::addTag to allow adding tags to an existing handler
-  * Added $ignoreEmptyContextAndExtra to LineFormatter to avoid empty [] at the end
-  * Added $useLocking to StreamHandler and RotatingFileHandler to enable flock() while writing
-  * Added support for PhpAmqpLib in the AmqpHandler
-  * Added FingersCrossedHandler::clear and BufferHandler::clear to reset them between batches in long running jobs
-  * Added support for adding extra fields from $_SERVER in the WebProcessor
-  * Fixed support for non-string values in PrsLogMessageProcessor
-  * Fixed SwiftMailer messages being sent with the wrong date in long running scripts
-  * Fixed minor PHP 5.6 compatibility issues
-  * Fixed BufferHandler::close being called twice
-
-### 1.10.0 (2014-06-04)
-
-  * Added Logger::getHandlers() and Logger::getProcessors() methods
-  * Added $passthruLevel argument to FingersCrossedHandler to let it always pass some records through even if the trigger level is not reached
-  * Added support for extra data in NewRelicHandler
-  * Added $expandNewlines flag to the ErrorLogHandler to create multiple log entries when a message has multiple lines
-
-### 1.9.1 (2014-04-24)
-
-  * Fixed regression in RotatingFileHandler file permissions
-  * Fixed initialization of the BufferHandler to make sure it gets flushed after receiving records
-  * Fixed ChromePHPHandler and FirePHPHandler's activation strategies to be more conservative
-
-### 1.9.0 (2014-04-20)
-
-  * Added LogEntriesHandler to send logs to a LogEntries account
-  * Added $filePermissions to tweak file mode on StreamHandler and RotatingFileHandler
-  * Added $useFormatting flag to MemoryProcessor to make it send raw data in bytes
-  * Added support for table formatting in FirePHPHandler via the table context key
-  * Added a TagProcessor to add tags to records, and support for tags in RavenHandler
-  * Added $appendNewline flag to the JsonFormatter to enable using it when logging to files
-  * Added sound support to the PushoverHandler
-  * Fixed multi-threading support in StreamHandler
-  * Fixed empty headers issue when ChromePHPHandler received no records
-  * Fixed default format of the ErrorLogHandler
-
-### 1.8.0 (2014-03-23)
-
-  * Break: the LineFormatter now strips newlines by default because this was a bug, set $allowInlineLineBreaks to true if you need them
-  * Added BrowserConsoleHandler to send logs to any browser's console via console.log() injection in the output
-  * Added FilterHandler to filter records and only allow those of a given list of levels through to the wrapped handler
-  * Added FlowdockHandler to send logs to a Flowdock account
-  * Added RollbarHandler to send logs to a Rollbar account
-  * Added HtmlFormatter to send prettier log emails with colors for each log level
-  * Added GitProcessor to add the current branch/commit to extra record data
-  * Added a Monolog\Registry class to allow easier global access to pre-configured loggers
-  * Added support for the new official graylog2/gelf-php lib for GelfHandler, upgrade if you can by replacing the mlehner/gelf-php requirement
-  * Added support for HHVM
-  * Added support for Loggly batch uploads
-  * Added support for tweaking the content type and encoding in NativeMailerHandler
-  * Added $skipClassesPartials to tweak the ignored classes in the IntrospectionProcessor
-  * Fixed batch request support in GelfHandler
-
-### 1.7.0 (2013-11-14)
-
-  * Added ElasticSearchHandler to send logs to an Elastic Search server
-  * Added DynamoDbHandler and ScalarFormatter to send logs to Amazon's Dynamo DB
-  * Added SyslogUdpHandler to send logs to a remote syslogd server
-  * Added LogglyHandler to send logs to a Loggly account
-  * Added $level to IntrospectionProcessor so it only adds backtraces when needed
-  * Added $version to LogstashFormatter to allow using the new v1 Logstash format
-  * Added $appName to NewRelicHandler
-  * Added configuration of Pushover notification retries/expiry
-  * Added $maxColumnWidth to NativeMailerHandler to change the 70 chars default
-  * Added chainability to most setters for all handlers
-  * Fixed RavenHandler batch processing so it takes the message from the record with highest priority
-  * Fixed HipChatHandler batch processing so it sends all messages at once
-  * Fixed issues with eAccelerator
-  * Fixed and improved many small things
-
-### 1.6.0 (2013-07-29)
-
-  * Added HipChatHandler to send logs to a HipChat chat room
-  * Added ErrorLogHandler to send logs to PHP's error_log function
-  * Added NewRelicHandler to send logs to NewRelic's service
-  * Added Monolog\ErrorHandler helper class to register a Logger as exception/error/fatal handler
-  * Added ChannelLevelActivationStrategy for the FingersCrossedHandler to customize levels by channel
-  * Added stack traces output when normalizing exceptions (json output & co)
-  * Added Monolog\Logger::API constant (currently 1)
-  * Added support for ChromePHP's v4.0 extension
-  * Added support for message priorities in PushoverHandler, see $highPriorityLevel and $emergencyLevel
-  * Added support for sending messages to multiple users at once with the PushoverHandler
-  * Fixed RavenHandler's support for batch sending of messages (when behind a Buffer or FingersCrossedHandler)
-  * Fixed normalization of Traversables with very large data sets, only the first 1000 items are shown now
-  * Fixed issue in RotatingFileHandler when an open_basedir restriction is active
-  * Fixed minor issues in RavenHandler and bumped the API to Raven 0.5.0
-  * Fixed SyslogHandler issue when many were used concurrently with different facilities
-
-### 1.5.0 (2013-04-23)
-
-  * Added ProcessIdProcessor to inject the PID in log records
-  * Added UidProcessor to inject a unique identifier to all log records of one request/run
-  * Added support for previous exceptions in the LineFormatter exception serialization
-  * Added Monolog\Logger::getLevels() to get all available levels
-  * Fixed ChromePHPHandler so it avoids sending headers larger than Chrome can handle
-
-### 1.4.1 (2013-04-01)
-
-  * Fixed exception formatting in the LineFormatter to be more minimalistic
-  * Fixed RavenHandler's handling of context/extra data, requires Raven client >0.1.0
-  * Fixed log rotation in RotatingFileHandler to work with long running scripts spanning multiple days
-  * Fixed WebProcessor array access so it checks for data presence
-  * Fixed Buffer, Group and FingersCrossed handlers to make use of their processors
-
-### 1.4.0 (2013-02-13)
-
-  * Added RedisHandler to log to Redis via the Predis library or the phpredis extension
-  * Added ZendMonitorHandler to log to the Zend Server monitor
-  * Added the possibility to pass arrays of handlers and processors directly in the Logger constructor
-  * Added `$useSSL` option to the PushoverHandler which is enabled by default
-  * Fixed ChromePHPHandler and FirePHPHandler issue when multiple instances are used simultaneously
-  * Fixed header injection capability in the NativeMailHandler
-
-### 1.3.1 (2013-01-11)
-
-  * Fixed LogstashFormatter to be usable with stream handlers
-  * Fixed GelfMessageFormatter levels on Windows
-
-### 1.3.0 (2013-01-08)
-
-  * Added PSR-3 compliance, the `Monolog\Logger` class is now an instance of `Psr\Log\LoggerInterface`
-  * Added PsrLogMessageProcessor that you can selectively enable for full PSR-3 compliance
-  * Added LogstashFormatter (combine with SocketHandler or StreamHandler to send logs to Logstash)
-  * Added PushoverHandler to send mobile notifications
-  * Added CouchDBHandler and DoctrineCouchDBHandler
-  * Added RavenHandler to send data to Sentry servers
-  * Added support for the new MongoClient class in MongoDBHandler
-  * Added microsecond precision to log records' timestamps
-  * Added `$flushOnOverflow` param to BufferHandler to flush by batches instead of losing
-    the oldest entries
-  * Fixed normalization of objects with cyclic references
-
-### 1.2.1 (2012-08-29)
-
-  * Added new $logopts arg to SyslogHandler to provide custom openlog options
-  * Fixed fatal error in SyslogHandler
-
-### 1.2.0 (2012-08-18)
-
-  * Added AmqpHandler (for use with AMQP servers)
-  * Added CubeHandler
-  * Added NativeMailerHandler::addHeader() to send custom headers in mails
-  * Added the possibility to specify more than one recipient in NativeMailerHandler
-  * Added the possibility to specify float timeouts in SocketHandler
-  * Added NOTICE and EMERGENCY levels to conform with RFC 5424
-  * Fixed the log records to use the php default timezone instead of UTC
-  * Fixed BufferHandler not being flushed properly on PHP fatal errors
-  * Fixed normalization of exotic resource types
-  * Fixed the default format of the SyslogHandler to avoid duplicating datetimes in syslog
-
-### 1.1.0 (2012-04-23)
-
-  * Added Monolog\Logger::isHandling() to check if a handler will
-    handle the given log level
-  * Added ChromePHPHandler
-  * Added MongoDBHandler
-  * Added GelfHandler (for use with Graylog2 servers)
-  * Added SocketHandler (for use with syslog-ng for example)
-  * Added NormalizerFormatter
-  * Added the possibility to change the activation strategy of the FingersCrossedHandler
-  * Added possibility to show microseconds in logs
-  * Added `server` and `referer` to WebProcessor output
-
-### 1.0.2 (2011-10-24)
-
-  * Fixed bug in IE with large response headers and FirePHPHandler
-
-### 1.0.1 (2011-08-25)
-
-  * Added MemoryPeakUsageProcessor and MemoryUsageProcessor
-  * Added Monolog\Logger::getName() to get a logger's channel name
-
-### 1.0.0 (2011-07-06)
-
-  * Added IntrospectionProcessor to get info from where the logger was called
-  * Fixed WebProcessor in CLI
-
-### 1.0.0-RC1 (2011-07-01)
-
-  * Initial release
diff --git a/vendor/monolog/monolog/README.md b/vendor/monolog/monolog/README.md
index 7d8ade52..d7569446 100644
--- a/vendor/monolog/monolog/README.md
+++ b/vendor/monolog/monolog/README.md
@@ -2,7 +2,6 @@
 
 [![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
 [![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
-[![Reference Status](https://www.versioneye.com/php/monolog:monolog/reference_badge.svg)](https://www.versioneye.com/php/monolog:monolog/references)
 
 
 Monolog sends your logs to files, sockets, inboxes, databases and various
diff --git a/vendor/monolog/monolog/README.mdown b/vendor/monolog/monolog/README.mdown
deleted file mode 100644
index 7d8ade52..00000000
--- a/vendor/monolog/monolog/README.mdown
+++ /dev/null
@@ -1,95 +0,0 @@
-# Monolog - Logging for PHP [![Build Status](https://img.shields.io/travis/Seldaek/monolog.svg)](https://travis-ci.org/Seldaek/monolog)
-
-[![Total Downloads](https://img.shields.io/packagist/dt/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
-[![Latest Stable Version](https://img.shields.io/packagist/v/monolog/monolog.svg)](https://packagist.org/packages/monolog/monolog)
-[![Reference Status](https://www.versioneye.com/php/monolog:monolog/reference_badge.svg)](https://www.versioneye.com/php/monolog:monolog/references)
-
-
-Monolog sends your logs to files, sockets, inboxes, databases and various
-web services. See the complete list of handlers below. Special handlers
-allow you to build advanced logging strategies.
-
-This library implements the [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
-interface that you can type-hint against in your own libraries to keep
-a maximum of interoperability. You can also use it in your applications to
-make sure you can always use another compatible logger at a later time.
-As of 1.11.0 Monolog public APIs will also accept PSR-3 log levels.
-Internally Monolog still uses its own level scheme since it predates PSR-3.
-
-## Installation
-
-Install the latest version with
-
-```bash
-$ composer require monolog/monolog
-```
-
-## Basic Usage
-
-```php
-<?php
-
-use Monolog\Logger;
-use Monolog\Handler\StreamHandler;
-
-// create a log channel
-$log = new Logger('name');
-$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING));
-
-// add records to the log
-$log->addWarning('Foo');
-$log->addError('Bar');
-```
-
-## Documentation
-
-- [Usage Instructions](doc/01-usage.md)
-- [Handlers, Formatters and Processors](doc/02-handlers-formatters-processors.md)
-- [Utility classes](doc/03-utilities.md)
-- [Extending Monolog](doc/04-extending.md)
-
-## Third Party Packages
-
-Third party handlers, formatters and processors are
-[listed in the wiki](https://github.com/Seldaek/monolog/wiki/Third-Party-Packages). You
-can also add your own there if you publish one.
-
-## About
-
-### Requirements
-
-- Monolog works with PHP 5.3 or above, and is also tested to work with HHVM.
-
-### Submitting bugs and feature requests
-
-Bugs and feature request are tracked on [GitHub](https://github.com/Seldaek/monolog/issues)
-
-### Framework Integrations
-
-- Frameworks and libraries using [PSR-3](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md)
-  can be used very easily with Monolog since it implements the interface.
-- [Symfony2](http://symfony.com) comes out of the box with Monolog.
-- [Silex](http://silex.sensiolabs.org/) comes out of the box with Monolog.
-- [Laravel 4 & 5](http://laravel.com/) come out of the box with Monolog.
-- [Lumen](http://lumen.laravel.com/) comes out of the box with Monolog.
-- [PPI](http://www.ppi.io/) comes out of the box with Monolog.
-- [CakePHP](http://cakephp.org/) is usable with Monolog via the [cakephp-monolog](https://github.com/jadb/cakephp-monolog) plugin.
-- [Slim](http://www.slimframework.com/) is usable with Monolog via the [Slim-Monolog](https://github.com/Flynsarmy/Slim-Monolog) log writer.
-- [XOOPS 2.6](http://xoops.org/) comes out of the box with Monolog.
-- [Aura.Web_Project](https://github.com/auraphp/Aura.Web_Project) comes out of the box with Monolog.
-- [Nette Framework](http://nette.org/en/) can be used with Monolog via [Kdyby/Monolog](https://github.com/Kdyby/Monolog) extension.
-- [Proton Micro Framework](https://github.com/alexbilbie/Proton) comes out of the box with Monolog.
-
-### Author
-
-Jordi Boggiano - <j.boggiano@xxxxxxx> - <http://twitter.com/seldaek><br />
-See also the list of [contributors](https://github.com/Seldaek/monolog/contributors) which participated in this project.
-
-### License
-
-Monolog is licensed under the MIT License - see the `LICENSE` file for details
-
-### Acknowledgements
-
-This library is heavily inspired by Python's [Logbook](http://packages.python.org/Logbook/)
-library, although most concepts have been adjusted to fit to the PHP world.
diff --git a/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md b/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md
index bea968ac..af45913a 100644
--- a/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md
+++ b/vendor/monolog/monolog/doc/02-handlers-formatters-processors.md
@@ -55,6 +55,7 @@
 - _RollbarHandler_: Logs records to a [Rollbar](https://rollbar.com/) account.
 - _SyslogUdpHandler_: Logs records to a remote [Syslogd](http://www.rsyslog.com/) server.
 - _LogEntriesHandler_: Logs records to a [LogEntries](http://logentries.com/) account.
+- _InsightOpsHandler_: Logs records to a [InsightOps](https://www.rapid7.com/products/insightops/) account.
 
 ### Logging in development
 
diff --git a/vendor/monolog/monolog/doc/03-utilities.md b/vendor/monolog/monolog/doc/03-utilities.md
index c62aa416..fd3fd0e7 100644
--- a/vendor/monolog/monolog/doc/03-utilities.md
+++ b/vendor/monolog/monolog/doc/03-utilities.md
@@ -5,6 +5,8 @@
   help in some older codebases or for ease of use.
 - _ErrorHandler_: The `Monolog\ErrorHandler` class allows you to easily register
   a Logger instance as an exception handler, error handler or fatal error handler.
+- _SignalHandler_: The `Monolog\SignalHandler` class allows you to easily register
+  a Logger instance as a POSIX signal handler.
 - _ErrorLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain log
   level is reached.
 - _ChannelLevelActivationStrategy_: Activates a FingersCrossedHandler when a certain
diff --git a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php
index 7bfcd833..adc55bdf 100644
--- a/vendor/monolog/monolog/src/Monolog/ErrorHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/ErrorHandler.php
@@ -14,6 +14,7 @@ namespace Monolog;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LogLevel;
 use Monolog\Handler\AbstractHandler;
+use Monolog\Registry;
 
 /**
  * Monolog error handler
@@ -38,6 +39,7 @@ class ErrorHandler
     private $hasFatalErrorHandler;
     private $fatalLevel;
     private $reservedMemory;
+    private $lastFatalTrace;
     private static $fatalErrors = array(E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR);
 
     public function __construct(LoggerInterface $logger)
@@ -132,7 +134,7 @@ class ErrorHandler
     {
         $this->logger->log(
             $this->uncaughtExceptionLevel === null ? LogLevel::ERROR : $this->uncaughtExceptionLevel,
-            sprintf('Uncaught Exception %s: "%s" at %s line %s', get_class($e), $e->getMessage(), $e->getFile(), $e->getLine()),
+            sprintf('Uncaught Exception %s: "%s" at %s line %s', Utils::getClass($e), $e->getMessage(), $e->getFile(), $e->getLine()),
             array('exception' => $e)
         );
 
@@ -156,6 +158,13 @@ class ErrorHandler
         if (!$this->hasFatalErrorHandler || !in_array($code, self::$fatalErrors, true)) {
             $level = isset($this->errorLevelMap[$code]) ? $this->errorLevelMap[$code] : LogLevel::CRITICAL;
             $this->logger->log($level, self::codeToString($code).': '.$message, array('code' => $code, 'message' => $message, 'file' => $file, 'line' => $line));
+        } else {
+            // http://php.net/manual/en/function.debug-backtrace.php
+            // As of 5.3.6, DEBUG_BACKTRACE_IGNORE_ARGS option was added.
+            // Any version less than 5.3.6 must use the DEBUG_BACKTRACE_IGNORE_ARGS constant value '2'.
+            $trace = debug_backtrace((PHP_VERSION_ID < 50306) ? 2 : DEBUG_BACKTRACE_IGNORE_ARGS);
+            array_shift($trace); // Exclude handleError from trace
+            $this->lastFatalTrace = $trace;
         }
 
         if ($this->previousErrorHandler === true) {
@@ -177,7 +186,7 @@ class ErrorHandler
             $this->logger->log(
                 $this->fatalLevel === null ? LogLevel::ALERT : $this->fatalLevel,
                 'Fatal Error ('.self::codeToString($lastError['type']).'): '.$lastError['message'],
-                array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'])
+                array('code' => $lastError['type'], 'message' => $lastError['message'], 'file' => $lastError['file'], 'line' => $lastError['line'], 'trace' => $this->lastFatalTrace)
             );
 
             if ($this->logger instanceof Logger) {
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php
index 02632bb5..46a91ffe 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/FluentdFormatter.php
@@ -62,6 +62,7 @@ class FluentdFormatter implements FormatterInterface
 
         $message = array(
             'message' => $record['message'],
+            'context' => $record['context'],
             'extra' => $record['extra'],
         );
 
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php
index 3eec95f6..dfc0b4a3 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/HtmlFormatter.php
@@ -58,7 +58,7 @@ class HtmlFormatter extends NormalizerFormatter
             $td = '<pre>'.htmlspecialchars($td, ENT_NOQUOTES, 'UTF-8').'</pre>';
         }
 
-        return "<tr style=\"padding: 4px;spacing: 0;text-align: left;\">\n<th style=\"background: #cccccc\" width=\"100px\">$th:</th>\n<td style=\"padding: 4px;spacing: 0;text-align: left;background: #eeeeee\">".$td."</td>\n</tr>";
+        return "<tr style=\"padding: 4px;text-align: left;\">\n<th style=\"vertical-align: top;background: #ccc;color: #000\" width=\"100\">$th:</th>\n<td style=\"padding: 4px;text-align: left;vertical-align: top;background: #eee;color: #000\">".$td."</td>\n</tr>";
     }
 
     /**
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
index 0782f149..9bd305f2 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/JsonFormatter.php
@@ -12,6 +12,7 @@
 namespace Monolog\Formatter;
 
 use Exception;
+use Monolog\Utils;
 use Throwable;
 
 /**
@@ -138,18 +139,23 @@ class JsonFormatter extends NormalizerFormatter
      *
      * @return mixed
      */
-    protected function normalize($data)
+    protected function normalize($data, $depth = 0)
     {
+        if ($depth > 9) {
+            return 'Over 9 levels deep, aborting normalization';
+        }
+
         if (is_array($data) || $data instanceof \Traversable) {
             $normalized = array();
 
             $count = 1;
             foreach ($data as $key => $value) {
-                if ($count++ >= 1000) {
-                    $normalized['...'] = 'Over 1000 items, aborting normalization';
+                if ($count++ > 1000) {
+                    $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization';
                     break;
                 }
-                $normalized[$key] = $this->normalize($value);
+
+                $normalized[$key] = $this->normalize($value, $depth+1);
             }
 
             return $normalized;
@@ -174,11 +180,11 @@ class JsonFormatter extends NormalizerFormatter
     {
         // TODO 2.0 only check for Throwable
         if (!$e instanceof Exception && !$e instanceof Throwable) {
-            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));
+            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e));
         }
 
         $data = array(
-            'class' => get_class($e),
+            'class' => Utils::getClass($e),
             'message' => $e->getMessage(),
             'code' => $e->getCode(),
             'file' => $e->getFile().':'.$e->getLine(),
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
index d3e209e6..f98e1a6f 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/LineFormatter.php
@@ -11,6 +11,8 @@
 
 namespace Monolog\Formatter;
 
+use Monolog\Utils;
+
 /**
  * Formats incoming records into a one-line string
  *
@@ -129,17 +131,17 @@ class LineFormatter extends NormalizerFormatter
     {
         // TODO 2.0 only check for Throwable
         if (!$e instanceof \Exception && !$e instanceof \Throwable) {
-            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));
+            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e));
         }
 
         $previousText = '';
         if ($previous = $e->getPrevious()) {
             do {
-                $previousText .= ', '.get_class($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine();
+                $previousText .= ', '.Utils::getClass($previous).'(code: '.$previous->getCode().'): '.$previous->getMessage().' at '.$previous->getFile().':'.$previous->getLine();
             } while ($previous = $previous->getPrevious());
         }
 
-        $str = '[object] ('.get_class($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')';
+        $str = '[object] ('.Utils::getClass($e).'(code: '.$e->getCode().'): '.$e->getMessage().' at '.$e->getFile().':'.$e->getLine().$previousText.')';
         if ($this->includeStacktraces) {
             $str .= "\n[stacktrace]\n".$e->getTraceAsString()."\n";
         }
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php
index eb067bb7..eb7be849 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/MongoDBFormatter.php
@@ -11,6 +11,8 @@
 
 namespace Monolog\Formatter;
 
+use Monolog\Utils;
+
 /**
  * Formats a record for use with the MongoDBHandler.
  *
@@ -75,7 +77,7 @@ class MongoDBFormatter implements FormatterInterface
     protected function formatObject($value, $nestingLevel)
     {
         $objectVars = get_object_vars($value);
-        $objectVars['class'] = get_class($value);
+        $objectVars['class'] = Utils::getClass($value);
 
         return $this->formatArray($objectVars, $nestingLevel);
     }
@@ -83,7 +85,7 @@ class MongoDBFormatter implements FormatterInterface
     protected function formatException(\Exception $exception, $nestingLevel)
     {
         $formattedException = array(
-            'class' => get_class($exception),
+            'class' => Utils::getClass($exception),
             'message' => $exception->getMessage(),
             'code' => $exception->getCode(),
             'file' => $exception->getFile() . ':' . $exception->getLine(),
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
index d4414882..66866578 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/NormalizerFormatter.php
@@ -12,6 +12,7 @@
 namespace Monolog\Formatter;
 
 use Exception;
+use Monolog\Utils;
 
 /**
  * Normalizes incoming records to remove objects/resources so it's easier to dump to various targets
@@ -55,8 +56,12 @@ class NormalizerFormatter implements FormatterInterface
         return $records;
     }
 
-    protected function normalize($data)
+    protected function normalize($data, $depth = 0)
     {
+        if ($depth > 9) {
+            return 'Over 9 levels deep, aborting normalization';
+        }
+
         if (null === $data || is_scalar($data)) {
             if (is_float($data)) {
                 if (is_infinite($data)) {
@@ -75,11 +80,12 @@ class NormalizerFormatter implements FormatterInterface
 
             $count = 1;
             foreach ($data as $key => $value) {
-                if ($count++ >= 1000) {
+                if ($count++ > 1000) {
                     $normalized['...'] = 'Over 1000 items ('.count($data).' total), aborting normalization';
                     break;
                 }
-                $normalized[$key] = $this->normalize($value);
+
+                $normalized[$key] = $this->normalize($value, $depth+1);
             }
 
             return $normalized;
@@ -103,7 +109,7 @@ class NormalizerFormatter implements FormatterInterface
                 $value = $this->toJson($data, true);
             }
 
-            return sprintf("[object] (%s: %s)", get_class($data), $value);
+            return sprintf("[object] (%s: %s)", Utils::getClass($data), $value);
         }
 
         if (is_resource($data)) {
@@ -117,11 +123,11 @@ class NormalizerFormatter implements FormatterInterface
     {
         // TODO 2.0 only check for Throwable
         if (!$e instanceof Exception && !$e instanceof \Throwable) {
-            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.get_class($e));
+            throw new \InvalidArgumentException('Exception/Throwable expected, got '.gettype($e).' / '.Utils::getClass($e));
         }
 
         $data = array(
-            'class' => get_class($e),
+            'class' => Utils::getClass($e),
             'message' => $e->getMessage(),
             'code' => $e->getCode(),
             'file' => $e->getFile().':'.$e->getLine(),
@@ -146,9 +152,20 @@ class NormalizerFormatter implements FormatterInterface
             if (isset($frame['file'])) {
                 $data['trace'][] = $frame['file'].':'.$frame['line'];
             } elseif (isset($frame['function']) && $frame['function'] === '{closure}') {
-                // We should again normalize the frames, because it might contain invalid items
+                // Simplify closures handling
                 $data['trace'][] = $frame['function'];
             } else {
+                if (isset($frame['args'])) {
+                    // Make sure that objects present as arguments are not serialized nicely but rather only
+                    // as a class name to avoid any unexpected leak of sensitive information
+                    $frame['args'] = array_map(function ($arg) {
+                        if (is_object($arg) && !($arg instanceof \DateTime || $arg instanceof \DateTimeInterface)) {
+                            return sprintf("[object] (%s)", Utils::getClass($arg));
+                        }
+
+                        return $arg;
+                    }, $frame['args']);
+                }
                 // We should again normalize the frames, because it might contain invalid items
                 $data['trace'][] = $this->toJson($this->normalize($frame), true);
             }
diff --git a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php
index 654710a8..65dba99c 100644
--- a/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php
+++ b/vendor/monolog/monolog/src/Monolog/Formatter/WildfireFormatter.php
@@ -102,12 +102,12 @@ class WildfireFormatter extends NormalizerFormatter
         throw new \BadMethodCallException('Batch formatting does not make sense for the WildfireFormatter');
     }
 
-    protected function normalize($data)
+    protected function normalize($data, $depth = 0)
     {
         if (is_object($data) && !$data instanceof \DateTime) {
             return $data;
         }
 
-        return parent::normalize($data);
+        return parent::normalize($data, $depth);
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php
index 758a425c..92b9d458 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractHandler.php
@@ -11,16 +11,17 @@
 
 namespace Monolog\Handler;
 
-use Monolog\Logger;
 use Monolog\Formatter\FormatterInterface;
 use Monolog\Formatter\LineFormatter;
+use Monolog\Logger;
+use Monolog\ResettableInterface;
 
 /**
  * Base Handler class providing the Handler structure
  *
  * @author Jordi Boggiano <j.boggiano@xxxxxxx>
  */
-abstract class AbstractHandler implements HandlerInterface
+abstract class AbstractHandler implements HandlerInterface, ResettableInterface
 {
     protected $level = Logger::DEBUG;
     protected $bubble = true;
@@ -32,8 +33,8 @@ abstract class AbstractHandler implements HandlerInterface
     protected $processors = array();
 
     /**
-     * @param int     $level  The minimum logging level at which this handler will be triggered
-     * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
+     * @param int  $level  The minimum logging level at which this handler will be triggered
+     * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct($level = Logger::DEBUG, $bubble = true)
     {
@@ -141,8 +142,8 @@ abstract class AbstractHandler implements HandlerInterface
     /**
      * Sets the bubbling behavior.
      *
-     * @param  Boolean $bubble true means that this handler allows bubbling.
-     *                         false means that bubbling is not permitted.
+     * @param  bool $bubble true means that this handler allows bubbling.
+     *                      false means that bubbling is not permitted.
      * @return self
      */
     public function setBubble($bubble)
@@ -155,8 +156,8 @@ abstract class AbstractHandler implements HandlerInterface
     /**
      * Gets the bubbling behavior.
      *
-     * @return Boolean true means that this handler allows bubbling.
-     *                 false means that bubbling is not permitted.
+     * @return bool true means that this handler allows bubbling.
+     *              false means that bubbling is not permitted.
      */
     public function getBubble()
     {
@@ -174,6 +175,15 @@ abstract class AbstractHandler implements HandlerInterface
         }
     }
 
+    public function reset()
+    {
+        foreach ($this->processors as $processor) {
+            if ($processor instanceof ResettableInterface) {
+                $processor->reset();
+            }
+        }
+    }
+
     /**
      * Gets the default formatter.
      *
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php
index 6f18f72e..e1e89530 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractProcessingHandler.php
@@ -11,6 +11,8 @@
 
 namespace Monolog\Handler;
 
+use Monolog\ResettableInterface;
+
 /**
  * Base Handler class providing the Handler structure
  *
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php
index e2b2832d..8c76aca0 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/AbstractSyslogHandler.php
@@ -53,9 +53,9 @@ abstract class AbstractSyslogHandler extends AbstractProcessingHandler
     );
 
     /**
-     * @param mixed   $facility
-     * @param int     $level    The minimum logging level at which this handler will be triggered
-     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
+     * @param mixed $facility
+     * @param int   $level The minimum logging level at which this handler will be triggered
+     * @param bool  $bubble Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct($facility = LOG_USER, $level = Logger::DEBUG, $bubble = true)
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php
index b3a21bd4..23cf23ba 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/BrowserConsoleHandler.php
@@ -43,11 +43,11 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
     protected function write(array $record)
     {
         // Accumulate records
-        self::$records[] = $record;
+        static::$records[] = $record;
 
         // Register shutdown handler if not already done
-        if (!self::$initialized) {
-            self::$initialized = true;
+        if (!static::$initialized) {
+            static::$initialized = true;
             $this->registerShutdownFunction();
         }
     }
@@ -58,27 +58,37 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
      */
     public static function send()
     {
-        $format = self::getResponseFormat();
+        $format = static::getResponseFormat();
         if ($format === 'unknown') {
             return;
         }
 
-        if (count(self::$records)) {
+        if (count(static::$records)) {
             if ($format === 'html') {
-                self::writeOutput('<script>' . self::generateScript() . '</script>');
+                static::writeOutput('<script>' . static::generateScript() . '</script>');
             } elseif ($format === 'js') {
-                self::writeOutput(self::generateScript());
+                static::writeOutput(static::generateScript());
             }
-            self::reset();
+            static::resetStatic();
         }
     }
 
+    public function close()
+    {
+        self::resetStatic();
+    }
+
+    public function reset()
+    {
+        self::resetStatic();
+    }
+
     /**
      * Forget all logged records
      */
-    public static function reset()
+    public static function resetStatic()
     {
-        self::$records = array();
+        static::$records = array();
     }
 
     /**
@@ -133,18 +143,18 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
     private static function generateScript()
     {
         $script = array();
-        foreach (self::$records as $record) {
-            $context = self::dump('Context', $record['context']);
-            $extra = self::dump('Extra', $record['extra']);
+        foreach (static::$records as $record) {
+            $context = static::dump('Context', $record['context']);
+            $extra = static::dump('Extra', $record['extra']);
 
             if (empty($context) && empty($extra)) {
-                $script[] = self::call_array('log', self::handleStyles($record['formatted']));
+                $script[] = static::call_array('log', static::handleStyles($record['formatted']));
             } else {
                 $script = array_merge($script,
-                    array(self::call_array('groupCollapsed', self::handleStyles($record['formatted']))),
+                    array(static::call_array('groupCollapsed', static::handleStyles($record['formatted']))),
                     $context,
                     $extra,
-                    array(self::call('groupEnd'))
+                    array(static::call('groupEnd'))
                 );
             }
         }
@@ -154,19 +164,19 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
 
     private static function handleStyles($formatted)
     {
-        $args = array(self::quote('font-weight: normal'));
+        $args = array(static::quote('font-weight: normal'));
         $format = '%c' . $formatted;
         preg_match_all('/\[\[(.*?)\]\]\{([^}]*)\}/s', $format, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
 
         foreach (array_reverse($matches) as $match) {
-            $args[] = self::quote(self::handleCustomStyles($match[2][0], $match[1][0]));
+            $args[] = static::quote(static::handleCustomStyles($match[2][0], $match[1][0]));
             $args[] = '"font-weight: normal"';
 
             $pos = $match[0][1];
             $format = substr($format, 0, $pos) . '%c' . $match[1][0] . '%c' . substr($format, $pos + strlen($match[0][0]));
         }
 
-        array_unshift($args, self::quote($format));
+        array_unshift($args, static::quote($format));
 
         return $args;
     }
@@ -198,13 +208,13 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
         if (empty($dict)) {
             return $script;
         }
-        $script[] = self::call('log', self::quote('%c%s'), self::quote('font-weight: bold'), self::quote($title));
+        $script[] = static::call('log', static::quote('%c%s'), static::quote('font-weight: bold'), static::quote($title));
         foreach ($dict as $key => $value) {
             $value = json_encode($value);
             if (empty($value)) {
-                $value = self::quote('');
+                $value = static::quote('');
             }
-            $script[] = self::call('log', self::quote('%s: %o'), self::quote($key), $value);
+            $script[] = static::call('log', static::quote('%s: %o'), static::quote($key), $value);
         }
 
         return $script;
@@ -220,7 +230,7 @@ class BrowserConsoleHandler extends AbstractProcessingHandler
         $args = func_get_args();
         $method = array_shift($args);
 
-        return self::call_array($method, $args);
+        return static::call_array($method, $args);
     }
 
     private static function call_array($method, array $args)
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php
index 72f89535..61d1b50c 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/BufferHandler.php
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\ResettableInterface;
 
 /**
  * Buffers all records until closing the handler and then pass them as batch.
@@ -34,8 +35,8 @@ class BufferHandler extends AbstractHandler
      * @param HandlerInterface $handler         Handler.
      * @param int              $bufferLimit     How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
      * @param int              $level           The minimum logging level at which this handler will be triggered
-     * @param Boolean          $bubble          Whether the messages that are handled can bubble up the stack or not
-     * @param Boolean          $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded
+     * @param bool             $bubble          Whether the messages that are handled can bubble up the stack or not
+     * @param bool             $flushOnOverflow If true, the buffer is flushed when the max size has been reached, by default oldest entries are discarded
      */
     public function __construct(HandlerInterface $handler, $bufferLimit = 0, $level = Logger::DEBUG, $bubble = true, $flushOnOverflow = false)
     {
@@ -114,4 +115,15 @@ class BufferHandler extends AbstractHandler
         $this->bufferSize = 0;
         $this->buffer = array();
     }
+
+    public function reset()
+    {
+        $this->flush();
+
+        parent::reset();
+
+        if ($this->handler instanceof ResettableInterface) {
+            $this->handler->reset();
+        }
+    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
index 785cb0c9..37419a06 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/ChromePHPHandler.php
@@ -32,7 +32,7 @@ class ChromePHPHandler extends AbstractProcessingHandler
      * Header name
      */
     const HEADER_NAME = 'X-ChromeLogger-Data';
-    
+
     /**
      * Regular expression to detect supported browsers (matches any Chrome, or Firefox 43+)
      */
@@ -45,7 +45,7 @@ class ChromePHPHandler extends AbstractProcessingHandler
      *
      * Chrome limits the headers to 256KB, so when we sent 240KB we stop sending
      *
-     * @var Boolean
+     * @var bool
      */
     protected static $overflowed = false;
 
@@ -58,8 +58,8 @@ class ChromePHPHandler extends AbstractProcessingHandler
     protected static $sendHeaders = true;
 
     /**
-     * @param int     $level  The minimum logging level at which this handler will be triggered
-     * @param Boolean $bubble Whether the messages that are handled can bubble up the stack or not
+     * @param int  $level  The minimum logging level at which this handler will be triggered
+     * @param bool $bubble Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct($level = Logger::DEBUG, $bubble = true)
     {
@@ -174,7 +174,7 @@ class ChromePHPHandler extends AbstractProcessingHandler
     /**
      * Verifies if the headers are accepted by the current user agent
      *
-     * @return Boolean
+     * @return bool
      */
     protected function headersAccepted()
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php
index 7778c22a..35b55cb4 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/DeduplicationHandler.php
@@ -60,7 +60,7 @@ class DeduplicationHandler extends BufferHandler
      * @param string           $deduplicationStore The file/path where the deduplication log should be kept
      * @param int              $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes
      * @param int              $time               The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through
-     * @param Boolean          $bubble             Whether the messages that are handled can bubble up the stack or not
+     * @param bool             $bubble             Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct(HandlerInterface $handler, $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, $time = 60, $bubble = true)
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php
index 81967406..bb0f83eb 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/ElasticSearchHandler.php
@@ -46,10 +46,10 @@ class ElasticSearchHandler extends AbstractProcessingHandler
     protected $options = array();
 
     /**
-     * @param Client  $client  Elastica Client object
-     * @param array   $options Handler configuration
-     * @param int     $level   The minimum logging level at which this handler will be triggered
-     * @param Boolean $bubble  Whether the messages that are handled can bubble up the stack or not
+     * @param Client $client  Elastica Client object
+     * @param array  $options Handler configuration
+     * @param int    $level   The minimum logging level at which this handler will be triggered
+     * @param bool   $bubble  Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct(Client $client, array $options = array(), $level = Logger::DEBUG, $bubble = true)
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php
index 1447a584..b2986b0f 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/ErrorLogHandler.php
@@ -28,10 +28,10 @@ class ErrorLogHandler extends AbstractProcessingHandler
     protected $expandNewlines;
 
     /**
-     * @param int     $messageType    Says where the error should go.
-     * @param int     $level          The minimum logging level at which this handler will be triggered
-     * @param Boolean $bubble         Whether the messages that are handled can bubble up the stack or not
-     * @param Boolean $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries
+     * @param int  $messageType    Says where the error should go.
+     * @param int  $level          The minimum logging level at which this handler will be triggered
+     * @param bool $bubble         Whether the messages that are handled can bubble up the stack or not
+     * @param bool $expandNewlines If set to true, newlines in the message will be expanded to be take multiple log entries
      */
     public function __construct($messageType = self::OPERATING_SYSTEM, $level = Logger::DEBUG, $bubble = true, $expandNewlines = false)
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php
index 2a0f7fd1..938c1a7e 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FilterHandler.php
@@ -40,7 +40,7 @@ class FilterHandler extends AbstractHandler
     /**
      * Whether the messages that are handled can bubble up the stack or not
      *
-     * @var Boolean
+     * @var bool
      */
     protected $bubble;
 
@@ -48,7 +48,7 @@ class FilterHandler extends AbstractHandler
      * @param callable|HandlerInterface $handler        Handler or factory callable($record, $this).
      * @param int|array                 $minLevelOrList A list of levels to accept or a minimum level if maxLevel is provided
      * @param int                       $maxLevel       Maximum level to accept, only used if $minLevelOrList is not an array
-     * @param Boolean                   $bubble         Whether the messages that are handled can bubble up the stack or not
+     * @param bool                      $bubble         Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct($handler, $minLevelOrList = Logger::DEBUG, $maxLevel = Logger::EMERGENCY, $bubble = true)
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
index c3e42efe..aaca12cc 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossed/ActivationStrategyInterface.php
@@ -22,7 +22,7 @@ interface ActivationStrategyInterface
      * Returns whether the given record activates the handler.
      *
      * @param  array   $record
-     * @return Boolean
+     * @return bool
      */
     public function isHandlerActivated(array $record);
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
index d1dcaacf..275fd513 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FingersCrossedHandler.php
@@ -14,6 +14,7 @@ namespace Monolog\Handler;
 use Monolog\Handler\FingersCrossed\ErrorLevelActivationStrategy;
 use Monolog\Handler\FingersCrossed\ActivationStrategyInterface;
 use Monolog\Logger;
+use Monolog\ResettableInterface;
 
 /**
  * Buffers all records until a certain level is reached
@@ -41,8 +42,8 @@ class FingersCrossedHandler extends AbstractHandler
      * @param callable|HandlerInterface       $handler            Handler or factory callable($record, $fingersCrossedHandler).
      * @param int|ActivationStrategyInterface $activationStrategy Strategy which determines when this handler takes action
      * @param int                             $bufferSize         How many entries should be buffered at most, beyond that the oldest items are removed from the buffer.
-     * @param Boolean                         $bubble             Whether the messages that are handled can bubble up the stack or not
-     * @param Boolean                         $stopBuffering      Whether the handler should stop buffering after being triggered (default true)
+     * @param bool                            $bubble             Whether the messages that are handled can bubble up the stack or not
+     * @param bool                            $stopBuffering      Whether the handler should stop buffering after being triggered (default true)
      * @param int                             $passthruLevel      Minimum level to always flush to handler on close, even if strategy not triggered
      */
     public function __construct($handler, $activationStrategy = null, $bufferSize = 0, $bubble = true, $stopBuffering = true, $passthruLevel = null)
@@ -130,24 +131,18 @@ class FingersCrossedHandler extends AbstractHandler
      */
     public function close()
     {
-        if (null !== $this->passthruLevel) {
-            $level = $this->passthruLevel;
-            $this->buffer = array_filter($this->buffer, function ($record) use ($level) {
-                return $record['level'] >= $level;
-            });
-            if (count($this->buffer) > 0) {
-                $this->handler->handleBatch($this->buffer);
-                $this->buffer = array();
-            }
-        }
+        $this->flushBuffer();
     }
 
-    /**
-     * Resets the state of the handler. Stops forwarding records to the wrapped handler.
-     */
     public function reset()
     {
-        $this->buffering = true;
+        $this->flushBuffer();
+
+        parent::reset();
+
+        if ($this->handler instanceof ResettableInterface) {
+            $this->handler->reset();
+        }
     }
 
     /**
@@ -160,4 +155,23 @@ class FingersCrossedHandler extends AbstractHandler
         $this->buffer = array();
         $this->reset();
     }
+
+    /**
+     * Resets the state of the handler. Stops forwarding records to the wrapped handler.
+     */
+    private function flushBuffer()
+    {
+        if (null !== $this->passthruLevel) {
+            $level = $this->passthruLevel;
+            $this->buffer = array_filter($this->buffer, function ($record) use ($level) {
+                return $record['level'] >= $level;
+            });
+            if (count($this->buffer) > 0) {
+                $this->handler->handleBatch($this->buffer);
+            }
+        }
+
+        $this->buffer = array();
+        $this->buffering = true;
+    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php
index fee47950..c30b1843 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/FirePHPHandler.php
@@ -158,7 +158,7 @@ class FirePHPHandler extends AbstractProcessingHandler
     /**
      * Verifies if the headers are accepted by the current user agent
      *
-     * @return Boolean
+     * @return bool
      */
     protected function headersAccepted()
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
index d3847d82..71e46693 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/GelfHandler.php
@@ -50,14 +50,6 @@ class GelfHandler extends AbstractProcessingHandler
     /**
      * {@inheritdoc}
      */
-    public function close()
-    {
-        $this->publisher = null;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
     protected function write(array $record)
     {
         $this->publisher->publish($record['formatted']);
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php
index 663f5a92..28e5c564 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/GroupHandler.php
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Formatter\FormatterInterface;
+use Monolog\ResettableInterface;
 
 /**
  * Forwards records to multiple handlers
@@ -23,8 +24,8 @@ class GroupHandler extends AbstractHandler
     protected $handlers;
 
     /**
-     * @param array   $handlers Array of Handlers.
-     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
+     * @param array $handlers Array of Handlers.
+     * @param bool  $bubble   Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct(array $handlers, $bubble = true)
     {
@@ -90,6 +91,17 @@ class GroupHandler extends AbstractHandler
         }
     }
 
+    public function reset()
+    {
+        parent::reset();
+
+        foreach ($this->handlers as $handler) {
+            if ($handler instanceof ResettableInterface) {
+                $handler->reset();
+            }
+        }
+    }
+
     /**
      * {@inheritdoc}
      */
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php
index d920c4ba..8d5a4a09 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerInterface.php
@@ -31,7 +31,7 @@ interface HandlerInterface
      *
      * @param array $record Partial log record containing only a level key
      *
-     * @return Boolean
+     * @return bool
      */
     public function isHandling(array $record);
 
@@ -46,7 +46,7 @@ interface HandlerInterface
      * calling further handlers in the stack with a given log record.
      *
      * @param  array   $record The record to handle
-     * @return Boolean true means that this handler handled the record, and that bubbling is not permitted.
+     * @return bool true means that this handler handled the record, and that bubbling is not permitted.
      *                        false means the record was either not processed or that this handler allows bubbling.
      */
     public function handle(array $record);
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php
index e540d80f..55e64986 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/HandlerWrapper.php
@@ -11,6 +11,7 @@
 
 namespace Monolog\Handler;
 
+use Monolog\ResettableInterface;
 use Monolog\Formatter\FormatterInterface;
 
 /**
@@ -30,7 +31,7 @@ use Monolog\Formatter\FormatterInterface;
  *
  * @author Alexey Karapetov <alexey@xxxxxxxxxxxxx>
  */
-class HandlerWrapper implements HandlerInterface
+class HandlerWrapper implements HandlerInterface, ResettableInterface
 {
     /**
      * @var HandlerInterface
@@ -105,4 +106,11 @@ class HandlerWrapper implements HandlerInterface
     {
         return $this->handler->getFormatter();
     }
+
+    public function reset()
+    {
+        if ($this->handler instanceof ResettableInterface) {
+            return $this->handler->reset();
+        }
+    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php
index 73049f36..73233c95 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/HipChatHandler.php
@@ -219,6 +219,21 @@ class HipChatHandler extends SocketHandler
     protected function write(array $record)
     {
         parent::write($record);
+        $this->finalizeWrite();
+    }
+
+    /**
+     * Finalizes the request by reading some bytes and then closing the socket
+     *
+     * If we do not read some but close the socket too early, hipchat sometimes
+     * drops the request entirely.
+     */
+    protected function finalizeWrite()
+    {
+        $res = $this->getResource();
+        if (is_resource($res)) {
+            @fread($res, 2048);
+        }
         $this->closeSocket();
     }
 
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php
index d60a3c82..7f226220 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/IFTTTHandler.php
@@ -30,10 +30,10 @@ class IFTTTHandler extends AbstractProcessingHandler
     private $secretKey;
 
     /**
-     * @param string  $eventName The name of the IFTTT Maker event that should be triggered
-     * @param string  $secretKey A valid IFTTT secret key
-     * @param int     $level     The minimum logging level at which this handler will be triggered
-     * @param Boolean $bubble    Whether the messages that are handled can bubble up the stack or not
+     * @param string $eventName The name of the IFTTT Maker event that should be triggered
+     * @param string $secretKey A valid IFTTT secret key
+     * @param int    $level     The minimum logging level at which this handler will be triggered
+     * @param bool   $bubble    Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct($eventName, $secretKey, $level = Logger::ERROR, $bubble = true)
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php
new file mode 100644
index 00000000..a12e3de5
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Handler/InsightOpsHandler.php
@@ -0,0 +1,62 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@xxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+ namespace Monolog\Handler;
+ 
+ use Monolog\Logger;
+
+/**
+ * Inspired on LogEntriesHandler.
+ *
+ * @author Robert Kaufmann III <rok3@xxxxxxx>
+ * @author Gabriel Machado <gabriel.ms1@xxxxxxxxxxx>
+ */
+class InsightOpsHandler extends SocketHandler
+{
+    /**
+     * @var string
+     */
+    protected $logToken;
+
+    /**
+     * @param string $token  Log token supplied by InsightOps
+     * @param string $region Region where InsightOps account is hosted. Could be 'us' or 'eu'.
+     * @param bool   $useSSL Whether or not SSL encryption should be used
+     * @param int    $level  The minimum logging level to trigger this handler
+     * @param bool   $bubble Whether or not messages that are handled should bubble up the stack.
+     *
+     * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing
+     */
+    public function __construct($token, $region = 'us', $useSSL = true, $level = Logger::DEBUG, $bubble = true)
+    {
+        if ($useSSL && !extension_loaded('openssl')) {
+            throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler');
+        }
+
+        $endpoint = $useSSL
+            ? 'ssl://' . $region . '.data.logs.insight.rapid7.com:443'
+            : $region . '.data.logs.insight.rapid7.com:80';
+
+        parent::__construct($endpoint, $level, $bubble);
+        $this->logToken = $token;
+    }
+
+    /**
+     * {@inheritdoc}
+     *
+     * @param  array  $record
+     * @return string
+     */
+    protected function generateDataStream($record)
+    {
+        return $this->logToken . ' ' . $record['formatted'];
+    }
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php
index 494c605b..ea89fb3e 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/LogEntriesHandler.php
@@ -31,13 +31,13 @@ class LogEntriesHandler extends SocketHandler
      *
      * @throws MissingExtensionException If SSL encryption is set to true and OpenSSL is missing
      */
-    public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true)
+    public function __construct($token, $useSSL = true, $level = Logger::DEBUG, $bubble = true, $host = 'data.logentries.com')
     {
         if ($useSSL && !extension_loaded('openssl')) {
             throw new MissingExtensionException('The OpenSSL PHP plugin is required to use SSL encrypted connection for LogEntriesHandler');
         }
 
-        $endpoint = $useSSL ? 'ssl://data.logentries.com:443' : 'data.logentries.com:80';
+        $endpoint = $useSSL ? 'ssl://' . $host . ':443' : $host . ':80';
         parent::__construct($endpoint, $level, $bubble);
         $this->logToken = $token;
     }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php
index ab95924f..3f0956a9 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/MandrillHandler.php
@@ -27,7 +27,7 @@ class MandrillHandler extends MailHandler
      * @param string                  $apiKey  A valid Mandrill API key
      * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced
      * @param int                     $level   The minimum logging level at which this handler will be triggered
-     * @param Boolean                 $bubble  Whether the messages that are handled can bubble up the stack or not
+     * @param bool                    $bubble  Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct($apiKey, $message, $level = Logger::ERROR, $bubble = true)
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php
index 6718e9e0..f911997a 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/NewRelicHandler.php
@@ -18,6 +18,8 @@ use Monolog\Formatter\NormalizerFormatter;
  * Class to record a log on a NewRelic application.
  * Enabling New Relic High Security mode may prevent capture of useful information.
  *
+ * This handler requires a NormalizerFormatter to function and expects an array in $record['formatted']
+ *
  * @see https://docs.newrelic.com/docs/agents/php-agent
  * @see https://docs.newrelic.com/docs/accounts-partnerships/accounts/security/high-security
  */
@@ -84,7 +86,7 @@ class NewRelicHandler extends AbstractProcessingHandler
             unset($record['formatted']['context']['transaction_name']);
         }
 
-        if (isset($record['context']['exception']) && $record['context']['exception'] instanceof \Exception) {
+        if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) {
             newrelic_notice_error($record['message'], $record['context']['exception']);
             unset($record['formatted']['context']['exception']);
         } else {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php
index 1ae85845..a99e6ab7 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/PsrHandler.php
@@ -31,7 +31,7 @@ class PsrHandler extends AbstractHandler
     /**
      * @param LoggerInterface $logger The underlying PSR-3 compliant logger to which messages will be proxied
      * @param int             $level  The minimum logging level at which this handler will be triggered
-     * @param Boolean         $bubble Whether the messages that are handled can bubble up the stack or not
+     * @param bool            $bubble Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct(LoggerInterface $logger, $level = Logger::DEBUG, $bubble = true)
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php
index bba72005..f27bb3da 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/PushoverHandler.php
@@ -69,8 +69,8 @@ class PushoverHandler extends SocketHandler
      * @param string|array $users             Pushover user id or array of ids the message will be sent to
      * @param string       $title             Title sent to the Pushover API
      * @param int          $level             The minimum logging level at which this handler will be triggered
-     * @param Boolean      $bubble            Whether the messages that are handled can bubble up the stack or not
-     * @param Boolean      $useSSL            Whether to connect via SSL. Required when pushing messages to users that are not
+     * @param bool         $bubble            Whether the messages that are handled can bubble up the stack or not
+     * @param bool         $useSSL            Whether to connect via SSL. Required when pushing messages to users that are not
      *                                        the pushover.net app owner. OpenSSL is required for this option.
      * @param int          $highPriorityLevel The minimum logging level at which this handler will start
      *                                        sending "high priority" requests to the Pushover API
@@ -180,6 +180,6 @@ class PushoverHandler extends SocketHandler
      */
     public function useFormattedMessage($value)
     {
-        $this->useFormattedMessage = (boolean) $value;
+        $this->useFormattedMessage = (bool) $value;
     }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php
index 53a8b391..10d7f43b 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/RavenHandler.php
@@ -18,7 +18,7 @@ use Raven_Client;
 
 /**
  * Handler to send messages to a Sentry (https://github.com/getsentry/sentry) server
- * using raven-php (https://github.com/getsentry/raven-php)
+ * using sentry-php (https://github.com/getsentry/sentry-php)
  *
  * @author Marc Abramowitz <marc@xxxxxxxxxxxxxxxxxxx>
  */
@@ -27,7 +27,7 @@ class RavenHandler extends AbstractProcessingHandler
     /**
      * Translates Monolog log levels to Raven log levels.
      */
-    private $logLevels = array(
+    protected $logLevels = array(
         Logger::DEBUG     => Raven_Client::DEBUG,
         Logger::INFO      => Raven_Client::INFO,
         Logger::NOTICE    => Raven_Client::INFO,
@@ -42,7 +42,7 @@ class RavenHandler extends AbstractProcessingHandler
      * @var string should represent the current version of the calling
      *             software. Can be any string (git commit, version number)
      */
-    private $release;
+    protected $release;
 
     /**
      * @var Raven_Client the client object that sends the message to the server
@@ -57,7 +57,7 @@ class RavenHandler extends AbstractProcessingHandler
     /**
      * @param Raven_Client $ravenClient
      * @param int          $level       The minimum logging level at which this handler will be triggered
-     * @param Boolean      $bubble      Whether the messages that are handled can bubble up the stack or not
+     * @param bool         $bubble      Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct(Raven_Client $ravenClient, $level = Logger::DEBUG, $bubble = true)
     {
@@ -180,7 +180,7 @@ class RavenHandler extends AbstractProcessingHandler
         }
 
         if (isset($record['context']['exception']) && ($record['context']['exception'] instanceof \Exception || (PHP_VERSION_ID >= 70000 && $record['context']['exception'] instanceof \Throwable))) {
-            $options['extra']['message'] = $record['formatted'];
+            $options['message'] = $record['formatted'];
             $this->ravenClient->captureException($record['context']['exception'], $options);
         } else {
             $this->ravenClient->captureMessage($record['formatted'], array(), $options);
@@ -216,7 +216,7 @@ class RavenHandler extends AbstractProcessingHandler
      */
     protected function getExtraParameters()
     {
-        return array('checksum', 'release', 'event_id');
+        return array('contexts', 'checksum', 'release', 'event_id');
     }
 
     /**
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php
index 6c8a3e3e..65073ffe 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/RollbarHandler.php
@@ -129,4 +129,16 @@ class RollbarHandler extends AbstractProcessingHandler
     {
         $this->flush();
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        $this->flush();
+
+        parent::reset();
+    }
+
+
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
index 3b60b3d1..ae2309f8 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/RotatingFileHandler.php
@@ -39,9 +39,9 @@ class RotatingFileHandler extends StreamHandler
      * @param string   $filename
      * @param int      $maxFiles       The maximal amount of files to keep (0 means unlimited)
      * @param int      $level          The minimum logging level at which this handler will be triggered
-     * @param Boolean  $bubble         Whether the messages that are handled can bubble up the stack or not
+     * @param bool     $bubble         Whether the messages that are handled can bubble up the stack or not
      * @param int|null $filePermission Optional file permissions (default (0644) are only for owner read/write)
-     * @param Boolean  $useLocking     Try to lock log file before doing any writes
+     * @param bool     $useLocking     Try to lock log file before doing any writes
      */
     public function __construct($filename, $maxFiles = 0, $level = Logger::DEBUG, $bubble = true, $filePermission = null, $useLocking = false)
     {
@@ -66,6 +66,18 @@ class RotatingFileHandler extends StreamHandler
         }
     }
 
+    /**
+     * {@inheritdoc}
+     */
+    public function reset()
+    {
+        parent::reset();
+
+        if (true === $this->mustRotate) {
+            $this->rotate();
+        }
+    }
+
     public function setFilenameFormat($filenameFormat, $dateFormat)
     {
         if (!preg_match('{^Y(([/_.-]?m)([/_.-]?d)?)?$}', $dateFormat)) {
@@ -166,7 +178,7 @@ class RotatingFileHandler extends StreamHandler
         $fileInfo = pathinfo($this->filename);
         $glob = str_replace(
             array('{filename}', '{date}'),
-            array($fileInfo['filename'], '*'),
+            array($fileInfo['filename'], '[0-9][0-9][0-9][0-9]*'),
             $fileInfo['dirname'] . '/' . $this->filenameFormat
         );
         if (!empty($fileInfo['extension'])) {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php
old mode 100644
new mode 100755
index 38bc838a..e55e0e2e
--- a/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/Slack/SlackRecord.php
@@ -146,7 +146,7 @@ class SlackRecord
 
                     if ($this->useShortAttachment) {
                         $attachment['fields'][] = $this->generateAttachmentField(
-                            ucfirst($key),
+                            $key,
                             $record[$key]
                         );
                     } else {
@@ -229,8 +229,8 @@ class SlackRecord
     /**
      * Generates attachment field
      *
-     * @param string $title
-     * @param string|array $value\
+     * @param string       $title
+     * @param string|array $value
      *
      * @return array
      */
@@ -241,7 +241,7 @@ class SlackRecord
             : $value;
 
         return array(
-            'title' => $title,
+            'title' => ucfirst($title),
             'value' => $value,
             'short' => false
         );
@@ -257,7 +257,7 @@ class SlackRecord
     private function generateAttachmentFields(array $data)
     {
         $fields = array();
-        foreach ($data as $key => $value) {
+        foreach ($this->normalizerFormatter->format($data) as $key => $value) {
             $fields[] = $this->generateAttachmentField($key, $value);
         }
 
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php
index 3ac4d836..45d634f4 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackHandler.php
@@ -75,6 +75,11 @@ class SlackHandler extends SocketHandler
         return $this->slackRecord;
     }
 
+    public function getToken()
+    {
+        return $this->token;
+    }
+
     /**
      * {@inheritdoc}
      *
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php
index 9a1bbb44..1ef85fae 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SlackWebhookHandler.php
@@ -70,6 +70,11 @@ class SlackWebhookHandler extends AbstractProcessingHandler
         return $this->slackRecord;
     }
 
+    public function getWebhookUrl()
+    {
+        return $this->webhookUrl;
+    }
+
     /**
      * {@inheritdoc}
      *
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php
index 7a61bf4e..db50d97f 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SocketHandler.php
@@ -27,15 +27,16 @@ class SocketHandler extends AbstractProcessingHandler
     private $timeout = 0;
     private $writingTimeout = 10;
     private $lastSentBytes = null;
+    private $chunkSize = null;
     private $persistent = false;
     private $errno;
     private $errstr;
     private $lastWritingAt;
 
     /**
-     * @param string  $connectionString Socket connection string
-     * @param int     $level            The minimum logging level at which this handler will be triggered
-     * @param Boolean $bubble           Whether the messages that are handled can bubble up the stack or not
+     * @param string $connectionString Socket connection string
+     * @param int    $level            The minimum logging level at which this handler will be triggered
+     * @param bool   $bubble           Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct($connectionString, $level = Logger::DEBUG, $bubble = true)
     {
@@ -87,7 +88,7 @@ class SocketHandler extends AbstractProcessingHandler
      */
     public function setPersistent($persistent)
     {
-        $this->persistent = (boolean) $persistent;
+        $this->persistent = (bool) $persistent;
     }
 
     /**
@@ -128,6 +129,16 @@ class SocketHandler extends AbstractProcessingHandler
     }
 
     /**
+     * Set chunk size. Only has effect during connection in the writing cycle.
+     *
+     * @param float $bytes
+     */
+    public function setChunkSize($bytes)
+    {
+        $this->chunkSize = $bytes;
+    }
+
+    /**
      * Get current connection string
      *
      * @return string
@@ -178,6 +189,16 @@ class SocketHandler extends AbstractProcessingHandler
     }
 
     /**
+     * Get current chunk size
+     *
+     * @return float
+     */
+    public function getChunkSize()
+    {
+        return $this->chunkSize;
+    }
+
+    /**
      * Check to see if the socket is currently available.
      *
      * UDP might appear to be connected but might fail when writing.  See http://php.net/fsockopen for details.
@@ -221,6 +242,16 @@ class SocketHandler extends AbstractProcessingHandler
 
     /**
      * Wrapper to allow mocking
+     *
+     * @see http://php.net/manual/en/function.stream-set-chunk-size.php
+     */
+    protected function streamSetChunkSize()
+    {
+        return stream_set_chunk_size($this->resource, $this->chunkSize);
+    }
+
+    /**
+     * Wrapper to allow mocking
      */
     protected function fwrite($data)
     {
@@ -268,6 +299,7 @@ class SocketHandler extends AbstractProcessingHandler
     {
         $this->createSocketResource();
         $this->setSocketTimeout();
+        $this->setStreamChunkSize();
     }
 
     private function createSocketResource()
@@ -290,6 +322,13 @@ class SocketHandler extends AbstractProcessingHandler
         }
     }
 
+    private function setStreamChunkSize()
+    {
+        if ($this->chunkSize && !$this->streamSetChunkSize()) {
+            throw new \UnexpectedValueException("Failed setting chunk size with stream_set_chunk_size()");
+        }
+    }
+
     private function writeToSocket($data)
     {
         $length = strlen($data);
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
index 09a15738..a35b7e4c 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/StreamHandler.php
@@ -32,9 +32,9 @@ class StreamHandler extends AbstractProcessingHandler
     /**
      * @param resource|string $stream
      * @param int             $level          The minimum logging level at which this handler will be triggered
-     * @param Boolean         $bubble         Whether the messages that are handled can bubble up the stack or not
+     * @param bool            $bubble         Whether the messages that are handled can bubble up the stack or not
      * @param int|null        $filePermission Optional file permissions (default (0644) are only for owner read/write)
-     * @param Boolean         $useLocking     Try to lock log file before doing any writes
+     * @param bool            $useLocking     Try to lock log file before doing any writes
      *
      * @throws \Exception                If a missing directory is not buildable
      * @throws \InvalidArgumentException If stream is not a resource or string
@@ -167,7 +167,7 @@ class StreamHandler extends AbstractProcessingHandler
             set_error_handler(array($this, 'customErrorHandler'));
             $status = mkdir($dir, 0777, true);
             restore_error_handler();
-            if (false === $status) {
+            if (false === $status && !is_dir($dir)) {
                 throw new \UnexpectedValueException(sprintf('There is no existing directory at "%s" and its not buildable: '.$this->errorMessage, $dir));
             }
         }
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
index 72f44a53..ac7b16ff 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SwiftMailerHandler.php
@@ -12,6 +12,7 @@
 namespace Monolog\Handler;
 
 use Monolog\Logger;
+use Monolog\Formatter\FormatterInterface;
 use Monolog\Formatter\LineFormatter;
 use Swift;
 
@@ -29,7 +30,7 @@ class SwiftMailerHandler extends MailHandler
      * @param \Swift_Mailer           $mailer  The mailer to use
      * @param callable|\Swift_Message $message An example message for real messages, only the body will be replaced
      * @param int                     $level   The minimum logging level at which this handler will be triggered
-     * @param Boolean                 $bubble  Whether the messages that are handled can bubble up the stack or not
+     * @param bool                    $bubble  Whether the messages that are handled can bubble up the stack or not
      */
     public function __construct(\Swift_Mailer $mailer, $message, $level = Logger::ERROR, $bubble = true)
     {
@@ -48,6 +49,17 @@ class SwiftMailerHandler extends MailHandler
     }
 
     /**
+     * Gets the formatter for the Swift_Message subject.
+     *
+     * @param  string             $format The format of the subject
+     * @return FormatterInterface
+     */
+    protected function getSubjectFormatter($format)
+    {
+        return new LineFormatter($format);
+    }
+
+    /**
      * Creates instance of Swift_Message to be sent
      *
      * @param  string         $content formatted email body to be sent
@@ -69,7 +81,7 @@ class SwiftMailerHandler extends MailHandler
         }
 
         if ($records) {
-            $subjectFormatter = new LineFormatter($message->getSubject());
+            $subjectFormatter = $this->getSubjectFormatter($message->getSubject());
             $message->setSubject($subjectFormatter->format($this->getHighestRecord($records)));
         }
 
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php
index 376bc3b2..f770c802 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogHandler.php
@@ -32,11 +32,11 @@ class SyslogHandler extends AbstractSyslogHandler
     protected $logopts;
 
     /**
-     * @param string  $ident
-     * @param mixed   $facility
-     * @param int     $level    The minimum logging level at which this handler will be triggered
-     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
-     * @param int     $logopts  Option flags for the openlog() call, defaults to LOG_PID
+     * @param string $ident
+     * @param mixed  $facility
+     * @param int    $level    The minimum logging level at which this handler will be triggered
+     * @param bool   $bubble   Whether the messages that are handled can bubble up the stack or not
+     * @param int    $logopts  Option flags for the openlog() call, defaults to LOG_PID
      */
     public function __construct($ident, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $logopts = LOG_PID)
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php
index 4718711b..e14b378c 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/SyslogUdpHandler.php
@@ -25,12 +25,12 @@ class SyslogUdpHandler extends AbstractSyslogHandler
     protected $ident;
 
     /**
-     * @param string  $host
-     * @param int     $port
-     * @param mixed   $facility
-     * @param int     $level    The minimum logging level at which this handler will be triggered
-     * @param Boolean $bubble   Whether the messages that are handled can bubble up the stack or not
-     * @param string  $ident    Program name or tag for each log message.
+     * @param string $host
+     * @param int    $port
+     * @param mixed  $facility
+     * @param int    $level    The minimum logging level at which this handler will be triggered
+     * @param bool   $bubble   Whether the messages that are handled can bubble up the stack or not
+     * @param string $ident    Program name or tag for each log message.
      */
     public function __construct($host, $port = 514, $facility = LOG_USER, $level = Logger::DEBUG, $bubble = true, $ident = 'php')
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
index e39cfc66..b6b1343b 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/TestHandler.php
@@ -84,14 +84,24 @@ class TestHandler extends AbstractProcessingHandler
         return isset($this->recordsByLevel[$level]);
     }
 
+    /**
+     * @param string|array $record Either a message string or an array containing message and optionally context keys that will be checked against all records
+     * @param int          $level  Logger::LEVEL constant value
+     */
     public function hasRecord($record, $level)
     {
-        if (is_array($record)) {
-            $record = $record['message'];
+        if (is_string($record)) {
+            $record = array('message' => $record);
         }
 
         return $this->hasRecordThatPasses(function ($rec) use ($record) {
-            return $rec['message'] === $record;
+            if ($rec['message'] !== $record['message']) {
+                return false;
+            }
+            if (isset($record['context']) && $rec['context'] !== $record['context']) {
+                return false;
+            }
+            return true;
         }, $level);
     }
 
diff --git a/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php
index 2732ba3d..6bc4671c 100644
--- a/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php
+++ b/vendor/monolog/monolog/src/Monolog/Handler/WhatFailureGroupHandler.php
@@ -48,6 +48,16 @@ class WhatFailureGroupHandler extends GroupHandler
      */
     public function handleBatch(array $records)
     {
+        if ($this->processors) {
+            $processed = array();
+            foreach ($records as $record) {
+                foreach ($this->processors as $processor) {
+                    $processed[] = call_user_func($processor, $record);
+                }
+            }
+            $records = $processed;
+        }
+
         foreach ($this->handlers as $handler) {
             try {
                 $handler->handleBatch($records);
diff --git a/vendor/monolog/monolog/src/Monolog/Logger.php b/vendor/monolog/monolog/src/Monolog/Logger.php
index 49d00af1..05dfc817 100644
--- a/vendor/monolog/monolog/src/Monolog/Logger.php
+++ b/vendor/monolog/monolog/src/Monolog/Logger.php
@@ -15,6 +15,7 @@ use Monolog\Handler\HandlerInterface;
 use Monolog\Handler\StreamHandler;
 use Psr\Log\LoggerInterface;
 use Psr\Log\InvalidArgumentException;
+use Exception;
 
 /**
  * Monolog log channel
@@ -24,7 +25,7 @@ use Psr\Log\InvalidArgumentException;
  *
  * @author Jordi Boggiano <j.boggiano@xxxxxxx>
  */
-class Logger implements LoggerInterface
+class Logger implements LoggerInterface, ResettableInterface
 {
     /**
      * Detailed debug information
@@ -134,6 +135,11 @@ class Logger implements LoggerInterface
     protected $microsecondTimestamps = true;
 
     /**
+     * @var callable
+     */
+    protected $exceptionHandler;
+
+    /**
      * @param string             $name       The logging channel
      * @param HandlerInterface[] $handlers   Optional stack of handlers, the first one in the array is called first, etc.
      * @param callable[]         $processors Optional array of processors
@@ -141,7 +147,7 @@ class Logger implements LoggerInterface
     public function __construct($name, array $handlers = array(), array $processors = array())
     {
         $this->name = $name;
-        $this->handlers = $handlers;
+        $this->setHandlers($handlers);
         $this->processors = $processors;
     }
 
@@ -281,7 +287,7 @@ class Logger implements LoggerInterface
      * @param  int     $level   The logging level
      * @param  string  $message The log message
      * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @return bool Whether the record has been processed
      */
     public function addRecord($level, $message, array $context = array())
     {
@@ -329,27 +335,75 @@ class Logger implements LoggerInterface
             'extra' => array(),
         );
 
-        foreach ($this->processors as $processor) {
-            $record = call_user_func($processor, $record);
+        try {
+            foreach ($this->processors as $processor) {
+                $record = call_user_func($processor, $record);
+            }
+
+            while ($handler = current($this->handlers)) {
+                if (true === $handler->handle($record)) {
+                    break;
+                }
+
+                next($this->handlers);
+            }
+        } catch (Exception $e) {
+            $this->handleException($e, $record);
         }
 
-        while ($handler = current($this->handlers)) {
-            if (true === $handler->handle($record)) {
-                break;
+        return true;
+    }
+
+    /**
+     * Ends a log cycle and frees all resources used by handlers.
+     *
+     * Closing a Handler means flushing all buffers and freeing any open resources/handles.
+     * Handlers that have been closed should be able to accept log records again and re-open
+     * themselves on demand, but this may not always be possible depending on implementation.
+     *
+     * This is useful at the end of a request and will be called automatically on every handler
+     * when they get destructed.
+     */
+    public function close()
+    {
+        foreach ($this->handlers as $handler) {
+            if (method_exists($handler, 'close')) {
+                $handler->close();
             }
+        }
+    }
 
-            next($this->handlers);
+    /**
+     * Ends a log cycle and resets all handlers and processors to their initial state.
+     *
+     * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal
+     * state, and getting it back to a state in which it can receive log records again.
+     *
+     * This is useful in case you want to avoid logs leaking between two requests or jobs when you
+     * have a long running process like a worker or an application server serving multiple requests
+     * in one process.
+     */
+    public function reset()
+    {
+        foreach ($this->handlers as $handler) {
+            if ($handler instanceof ResettableInterface) {
+                $handler->reset();
+            }
         }
 
-        return true;
+        foreach ($this->processors as $processor) {
+            if ($processor instanceof ResettableInterface) {
+                $processor->reset();
+            }
+        }
     }
 
     /**
      * Adds a log record at the DEBUG level.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function addDebug($message, array $context = array())
     {
@@ -359,9 +413,9 @@ class Logger implements LoggerInterface
     /**
      * Adds a log record at the INFO level.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function addInfo($message, array $context = array())
     {
@@ -371,9 +425,9 @@ class Logger implements LoggerInterface
     /**
      * Adds a log record at the NOTICE level.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function addNotice($message, array $context = array())
     {
@@ -383,9 +437,9 @@ class Logger implements LoggerInterface
     /**
      * Adds a log record at the WARNING level.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function addWarning($message, array $context = array())
     {
@@ -395,9 +449,9 @@ class Logger implements LoggerInterface
     /**
      * Adds a log record at the ERROR level.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function addError($message, array $context = array())
     {
@@ -407,9 +461,9 @@ class Logger implements LoggerInterface
     /**
      * Adds a log record at the CRITICAL level.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function addCritical($message, array $context = array())
     {
@@ -419,9 +473,9 @@ class Logger implements LoggerInterface
     /**
      * Adds a log record at the ALERT level.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function addAlert($message, array $context = array())
     {
@@ -431,9 +485,9 @@ class Logger implements LoggerInterface
     /**
      * Adds a log record at the EMERGENCY level.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function addEmergency($message, array $context = array())
     {
@@ -484,7 +538,7 @@ class Logger implements LoggerInterface
      * Checks whether the Logger has a handler that listens on the given level
      *
      * @param  int     $level
-     * @return Boolean
+     * @return bool
      */
     public function isHandling($level)
     {
@@ -502,14 +556,51 @@ class Logger implements LoggerInterface
     }
 
     /**
+     * Set a custom exception handler
+     *
+     * @param  callable $callback
+     * @return $this
+     */
+    public function setExceptionHandler($callback)
+    {
+        if (!is_callable($callback)) {
+            throw new \InvalidArgumentException('Exception handler must be valid callable (callback or object with an __invoke method), '.var_export($callback, true).' given');
+        }
+        $this->exceptionHandler = $callback;
+
+        return $this;
+    }
+
+    /**
+     * @return callable
+     */
+    public function getExceptionHandler()
+    {
+        return $this->exceptionHandler;
+    }
+
+    /**
+     * Delegates exception management to the custom exception handler,
+     * or throws the exception if no custom handler is set.
+     */
+    protected function handleException(Exception $e, array $record)
+    {
+        if (!$this->exceptionHandler) {
+            throw $e;
+        }
+
+        call_user_func($this->exceptionHandler, $e, $record);
+    }
+
+    /**
      * Adds a log record at an arbitrary level.
      *
      * This method allows for compatibility with common interfaces.
      *
      * @param  mixed   $level   The log level
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function log($level, $message, array $context = array())
     {
@@ -523,9 +614,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function debug($message, array $context = array())
     {
@@ -537,9 +628,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function info($message, array $context = array())
     {
@@ -551,9 +642,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function notice($message, array $context = array())
     {
@@ -565,9 +656,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function warn($message, array $context = array())
     {
@@ -579,9 +670,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function warning($message, array $context = array())
     {
@@ -593,9 +684,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function err($message, array $context = array())
     {
@@ -607,9 +698,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function error($message, array $context = array())
     {
@@ -621,9 +712,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function crit($message, array $context = array())
     {
@@ -635,9 +726,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function critical($message, array $context = array())
     {
@@ -649,9 +740,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function alert($message, array $context = array())
     {
@@ -663,9 +754,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function emerg($message, array $context = array())
     {
@@ -677,9 +768,9 @@ class Logger implements LoggerInterface
      *
      * This method allows for compatibility with common interfaces.
      *
-     * @param  string  $message The log message
-     * @param  array   $context The log context
-     * @return Boolean Whether the record has been processed
+     * @param  string $message The log message
+     * @param  array  $context The log context
+     * @return bool   Whether the record has been processed
      */
     public function emergency($message, array $context = array())
     {
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php
index 1899400d..9fc3f50f 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/GitProcessor.php
@@ -19,7 +19,7 @@ use Monolog\Logger;
  * @author Nick Otter
  * @author Jordi Boggiano <j.boggiano@xxxxxxx>
  */
-class GitProcessor
+class GitProcessor implements ProcessorInterface
 {
     private $level;
     private static $cache;
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php
index 2c07caed..6ae192a2 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/IntrospectionProcessor.php
@@ -24,7 +24,7 @@ use Monolog\Logger;
  *
  * @author Jordi Boggiano <j.boggiano@xxxxxxx>
  */
-class IntrospectionProcessor
+class IntrospectionProcessor implements ProcessorInterface
 {
     private $level;
 
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php
index 85f9dc5e..2a379a30 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/MemoryProcessor.php
@@ -16,7 +16,7 @@ namespace Monolog\Processor;
  *
  * @author Rob Jensen
  */
-abstract class MemoryProcessor
+abstract class MemoryProcessor implements ProcessorInterface
 {
     /**
      * @var bool If true, get the real size of memory allocated from system. Else, only the memory used by emalloc() is reported.
@@ -34,8 +34,8 @@ abstract class MemoryProcessor
      */
     public function __construct($realUsage = true, $useFormatting = true)
     {
-        $this->realUsage = (boolean) $realUsage;
-        $this->useFormatting = (boolean) $useFormatting;
+        $this->realUsage = (bool) $realUsage;
+        $this->useFormatting = (bool) $useFormatting;
     }
 
     /**
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php
index 7c07a7e9..2f5b3265 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/MercurialProcessor.php
@@ -18,7 +18,7 @@ use Monolog\Logger;
  *
  * @author Jonathan A. Schweder <jonathanschweder@xxxxxxxxx>
  */
-class MercurialProcessor
+class MercurialProcessor implements ProcessorInterface
 {
     private $level;
     private static $cache;
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php
index 9d3f5590..66b80fbb 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessIdProcessor.php
@@ -16,7 +16,7 @@ namespace Monolog\Processor;
  *
  * @author Andreas Hörnicke
  */
-class ProcessIdProcessor
+class ProcessIdProcessor implements ProcessorInterface
 {
     /**
      * @param  array $record
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php
new file mode 100644
index 00000000..7e64d4df
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Processor/ProcessorInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@xxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog\Processor;
+
+/**
+ * An optional interface to allow labelling Monolog processors.
+ *
+ * @author Nicolas Grekas <p@xxxxxxxxxxx>
+ */
+interface ProcessorInterface
+{
+    /**
+     * @return array The processed records
+     */
+    public function __invoke(array $records);
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php
index c2686ce5..00885054 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/PsrLogMessageProcessor.php
@@ -11,6 +11,8 @@
 
 namespace Monolog\Processor;
 
+use Monolog\Utils;
+
 /**
  * Processes a record's message according to PSR-3 rules
  *
@@ -18,7 +20,7 @@ namespace Monolog\Processor;
  *
  * @author Jordi Boggiano <j.boggiano@xxxxxxx>
  */
-class PsrLogMessageProcessor
+class PsrLogMessageProcessor implements ProcessorInterface
 {
     /**
      * @param  array $record
@@ -35,7 +37,7 @@ class PsrLogMessageProcessor
             if (is_null($val) || is_scalar($val) || (is_object($val) && method_exists($val, "__toString"))) {
                 $replacements['{'.$key.'}'] = $val;
             } elseif (is_object($val)) {
-                $replacements['{'.$key.'}'] = '[object '.get_class($val).']';
+                $replacements['{'.$key.'}'] = '[object '.Utils::getClass($val).']';
             } else {
                 $replacements['{'.$key.'}'] = '['.gettype($val).']';
             }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php
index 7e2df2ac..615a4d99 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/TagProcessor.php
@@ -16,7 +16,7 @@ namespace Monolog\Processor;
  *
  * @author Martijn Riemers
  */
-class TagProcessor
+class TagProcessor implements ProcessorInterface
 {
     private $tags;
 
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php
index 812707cd..d1f708cf 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/UidProcessor.php
@@ -11,12 +11,14 @@
 
 namespace Monolog\Processor;
 
+use Monolog\ResettableInterface;
+
 /**
  * Adds a unique identifier into records
  *
  * @author Simon Mönch <sm@xxxxxxxxxxxxx>
  */
-class UidProcessor
+class UidProcessor implements ProcessorInterface, ResettableInterface
 {
     private $uid;
 
@@ -26,7 +28,8 @@ class UidProcessor
             throw new \InvalidArgumentException('The uid length must be an integer between 1 and 32');
         }
 
-        $this->uid = substr(hash('md5', uniqid('', true)), 0, $length);
+
+        $this->uid = $this->generateUid($length);
     }
 
     public function __invoke(array $record)
@@ -43,4 +46,14 @@ class UidProcessor
     {
         return $this->uid;
     }
+
+    public function reset()
+    {
+        $this->uid = $this->generateUid(strlen($this->uid));
+    }
+
+    private function generateUid($length)
+    {
+        return substr(hash('md5', uniqid('', true)), 0, $length);
+    }
 }
diff --git a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php
index ea1d8978..684188f6 100644
--- a/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php
+++ b/vendor/monolog/monolog/src/Monolog/Processor/WebProcessor.php
@@ -16,7 +16,7 @@ namespace Monolog\Processor;
  *
  * @author Jordi Boggiano <j.boggiano@xxxxxxx>
  */
-class WebProcessor
+class WebProcessor implements ProcessorInterface
 {
     /**
      * @var array|\ArrayAccess
diff --git a/vendor/monolog/monolog/src/Monolog/ResettableInterface.php b/vendor/monolog/monolog/src/Monolog/ResettableInterface.php
new file mode 100644
index 00000000..635bc77d
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/ResettableInterface.php
@@ -0,0 +1,31 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@xxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+/**
+ * Handler or Processor implementing this interface will be reset when Logger::reset() is called.
+ *
+ * Resetting ends a log cycle gets them back to their initial state.
+ *
+ * Resetting a Handler or a Processor means flushing/cleaning all buffers, resetting internal
+ * state, and getting it back to a state in which it can receive log records again.
+ *
+ * This is useful in case you want to avoid logs leaking between two requests or jobs when you
+ * have a long running process like a worker or an application server serving multiple requests
+ * in one process.
+ *
+ * @author Grégoire Pineau <lyrixx@xxxxxxxxxxx>
+ */
+interface ResettableInterface
+{
+    public function reset();
+}
diff --git a/vendor/monolog/monolog/src/Monolog/SignalHandler.php b/vendor/monolog/monolog/src/Monolog/SignalHandler.php
new file mode 100644
index 00000000..d5907805
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/SignalHandler.php
@@ -0,0 +1,115 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@xxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+use Psr\Log\LoggerInterface;
+use Psr\Log\LogLevel;
+use ReflectionExtension;
+
+/**
+ * Monolog POSIX signal handler
+ *
+ * @author Robert Gust-Bardon <robert@xxxxxxxxxxxxxxx>
+ */
+class SignalHandler
+{
+    private $logger;
+
+    private $previousSignalHandler = array();
+    private $signalLevelMap = array();
+    private $signalRestartSyscalls = array();
+
+    public function __construct(LoggerInterface $logger)
+    {
+        $this->logger = $logger;
+    }
+
+    public function registerSignalHandler($signo, $level = LogLevel::CRITICAL, $callPrevious = true, $restartSyscalls = true, $async = true)
+    {
+        if (!extension_loaded('pcntl') || !function_exists('pcntl_signal')) {
+            return $this;
+        }
+
+        if ($callPrevious) {
+            if (function_exists('pcntl_signal_get_handler')) {
+                $handler = pcntl_signal_get_handler($signo);
+                if ($handler === false) {
+                    return $this;
+                }
+                $this->previousSignalHandler[$signo] = $handler;
+            } else {
+                $this->previousSignalHandler[$signo] = true;
+            }
+        } else {
+            unset($this->previousSignalHandler[$signo]);
+        }
+        $this->signalLevelMap[$signo] = $level;
+        $this->signalRestartSyscalls[$signo] = $restartSyscalls;
+
+        if (function_exists('pcntl_async_signals') && $async !== null) {
+            pcntl_async_signals($async);
+        }
+
+        pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls);
+
+        return $this;
+    }
+
+    public function handleSignal($signo, array $siginfo = null)
+    {
+        static $signals = array();
+
+        if (!$signals && extension_loaded('pcntl')) {
+            $pcntl = new ReflectionExtension('pcntl');
+            $constants = $pcntl->getConstants();
+            if (!$constants) {
+                // HHVM 3.24.2 returns an empty array.
+                $constants = get_defined_constants(true);
+                $constants = $constants['Core'];
+            }
+            foreach ($constants as $name => $value) {
+                if (substr($name, 0, 3) === 'SIG' && $name[3] !== '_' && is_int($value)) {
+                    $signals[$value] = $name;
+                }
+            }
+            unset($constants);
+        }
+
+        $level = isset($this->signalLevelMap[$signo]) ? $this->signalLevelMap[$signo] : LogLevel::CRITICAL;
+        $signal = isset($signals[$signo]) ? $signals[$signo] : $signo;
+        $context = isset($siginfo) ? $siginfo : array();
+        $this->logger->log($level, sprintf('Program received signal %s', $signal), $context);
+
+        if (!isset($this->previousSignalHandler[$signo])) {
+            return;
+        }
+
+        if ($this->previousSignalHandler[$signo] === true || $this->previousSignalHandler[$signo] === SIG_DFL) {
+            if (extension_loaded('pcntl') && function_exists('pcntl_signal') && function_exists('pcntl_sigprocmask') && function_exists('pcntl_signal_dispatch')
+                && extension_loaded('posix') && function_exists('posix_getpid') && function_exists('posix_kill')) {
+                    $restartSyscalls = isset($this->restartSyscalls[$signo]) ? $this->restartSyscalls[$signo] : true;
+                    pcntl_signal($signo, SIG_DFL, $restartSyscalls);
+                    pcntl_sigprocmask(SIG_UNBLOCK, array($signo), $oldset);
+                    posix_kill(posix_getpid(), $signo);
+                    pcntl_signal_dispatch();
+                    pcntl_sigprocmask(SIG_SETMASK, $oldset);
+                    pcntl_signal($signo, array($this, 'handleSignal'), $restartSyscalls);
+                }
+        } elseif (is_callable($this->previousSignalHandler[$signo])) {
+            if (PHP_VERSION_ID >= 70100) {
+                $this->previousSignalHandler[$signo]($signo, $siginfo);
+            } else {
+                $this->previousSignalHandler[$signo]($signo);
+            }
+        }
+    }
+}
diff --git a/vendor/monolog/monolog/src/Monolog/Utils.php b/vendor/monolog/monolog/src/Monolog/Utils.php
new file mode 100644
index 00000000..eb9be863
--- /dev/null
+++ b/vendor/monolog/monolog/src/Monolog/Utils.php
@@ -0,0 +1,25 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@xxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+class Utils
+{
+    /**
+     * @internal
+     */
+    public static function getClass($object)
+    {
+        $class = \get_class($object);
+
+        return 'c' === $class[0] && 0 === strpos($class, "class@anonymous\0") ? get_parent_class($class).'@anonymous' : $class;
+    }
+}
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php
index 622b2bae..fd36dbcf 100644
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Formatter/FluentdFormatterTest.php
@@ -40,7 +40,7 @@ class FluentdFormatterTest extends TestCase
 
         $formatter = new FluentdFormatter();
         $this->assertEquals(
-            '["test",0,{"message":"test","extra":[],"level":300,"level_name":"WARNING"}]',
+            '["test",0,{"message":"test","context":[],"extra":[],"level":300,"level_name":"WARNING"}]',
             $formatter->format($record)
         );
     }
@@ -55,7 +55,7 @@ class FluentdFormatterTest extends TestCase
 
         $formatter = new FluentdFormatter(true);
         $this->assertEquals(
-            '["test.error",0,{"message":"test","extra":[]}]',
+            '["test.error",0,{"message":"test","context":[],"extra":[]}]',
             $formatter->format($record)
         );
     }
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php
index c9445f36..24b06cc9 100644
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Formatter/JsonFormatterTest.php
@@ -180,4 +180,40 @@ class JsonFormatterTest extends TestCase
             '}';
         return $formattedException;
     }
+
+    public function testNormalizeHandleLargeArraysWithExactly1000Items()
+    {
+        $formatter = new NormalizerFormatter();
+        $largeArray = range(1, 1000);
+
+        $res = $formatter->format(array(
+            'level_name' => 'CRITICAL',
+            'channel' => 'test',
+            'message' => 'bar',
+            'context' => array($largeArray),
+            'datetime' => new \DateTime,
+            'extra' => array(),
+        ));
+
+        $this->assertCount(1000, $res['context'][0]);
+        $this->assertArrayNotHasKey('...', $res['context'][0]);
+    }
+
+    public function testNormalizeHandleLargeArrays()
+    {
+        $formatter = new NormalizerFormatter();
+        $largeArray = range(1, 2000);
+
+        $res = $formatter->format(array(
+            'level_name' => 'CRITICAL',
+            'channel' => 'test',
+            'message' => 'bar',
+            'context' => array($largeArray),
+            'datetime' => new \DateTime,
+            'extra' => array(),
+        ));
+
+        $this->assertCount(1001, $res['context'][0]);
+        $this->assertEquals('Over 1000 items (2000 total), aborting normalization', $res['context'][0]['...']);
+    }
 }
diff --git a/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php b/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php
index 57bcdf98..bafd1c74 100644
--- a/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Formatter/NormalizerFormatterTest.php
@@ -193,6 +193,15 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals(@json_encode(array($foo, $bar)), $res);
     }
 
+    public function testCanNormalizeReferences()
+    {
+        $formatter = new NormalizerFormatter();
+        $x = array('foo' => 'bar');
+        $y = array('x' => &$x);
+        $x['y'] = &$y;
+        $formatter->format($y);
+    }
+
     public function testIgnoresInvalidTypes()
     {
         // set up the recursion
@@ -217,6 +226,24 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
         $this->assertEquals(@json_encode(array($resource)), $res);
     }
 
+    public function testNormalizeHandleLargeArraysWithExactly1000Items()
+    {
+        $formatter = new NormalizerFormatter();
+        $largeArray = range(1, 1000);
+
+        $res = $formatter->format(array(
+            'level_name' => 'CRITICAL',
+            'channel' => 'test',
+            'message' => 'bar',
+            'context' => array($largeArray),
+            'datetime' => new \DateTime,
+            'extra' => array(),
+        ));
+
+        $this->assertCount(1000, $res['context'][0]);
+        $this->assertArrayNotHasKey('...', $res['context'][0]);
+    }
+
     public function testNormalizeHandleLargeArrays()
     {
         $formatter = new NormalizerFormatter();
@@ -231,7 +258,7 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
             'extra' => array(),
         ));
 
-        $this->assertCount(1000, $res['context'][0]);
+        $this->assertCount(1001, $res['context'][0]);
         $this->assertEquals('Over 1000 items (2000 total), aborting normalization', $res['context'][0]['...']);
     }
 
@@ -380,6 +407,29 @@ class NormalizerFormatterTest extends \PHPUnit_Framework_TestCase
             $result['context']['exception']['trace'][0]
         );
     }
+
+    public function testExceptionTraceDoesNotLeakCallUserFuncArgs()
+    {
+        try {
+            $arg = new TestInfoLeak;
+            call_user_func(array($this, 'throwHelper'), $arg, $dt = new \DateTime());
+        } catch (\Exception $e) {
+        }
+
+        $formatter = new NormalizerFormatter();
+        $record = array('context' => array('exception' => $e));
+        $result = $formatter->format($record);
+
+        $this->assertSame(
+            '{"function":"throwHelper","class":"Monolog\\\\Formatter\\\\NormalizerFormatterTest","type":"->","args":["[object] (Monolog\\\\Formatter\\\\TestInfoLeak)","'.$dt->format('Y-m-d H:i:s').'"]}',
+            $result['context']['exception']['trace'][0]
+        );
+    }
+
+    private function throwHelper($arg)
+    {
+        throw new \RuntimeException('Thrown');
+    }
 }
 
 class TestFooNorm
@@ -421,3 +471,11 @@ class TestToStringError
         throw new \RuntimeException('Could not convert to string');
     }
 }
+
+class TestInfoLeak
+{
+    public function __toString()
+    {
+        return 'Sensitive information';
+    }
+}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php
index ffb1d746..ffe45da2 100644
--- a/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/BrowserConsoleHandlerTest.php
@@ -21,7 +21,7 @@ class BrowserConsoleHandlerTest extends TestCase
 {
     protected function setUp()
     {
-        BrowserConsoleHandler::reset();
+        BrowserConsoleHandler::resetStatic();
     }
 
     protected function generateScript()
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php
index 0449f8b1..421cc491 100644
--- a/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/ChromePHPHandlerTest.php
@@ -21,7 +21,7 @@ class ChromePHPHandlerTest extends TestCase
 {
     protected function setUp()
     {
-        TestChromePHPHandler::reset();
+        TestChromePHPHandler::resetStatic();
         $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; Chrome/1.0';
     }
 
@@ -136,7 +136,7 @@ class TestChromePHPHandler extends ChromePHPHandler
 {
     protected $headers = array();
 
-    public static function reset()
+    public static function resetStatic()
     {
         self::$initialized = false;
         self::$overflowed = false;
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php
index b92bf437..0ec36531 100644
--- a/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/FingersCrossedHandlerTest.php
@@ -58,7 +58,7 @@ class FingersCrossedHandlerTest extends TestCase
      * @covers Monolog\Handler\FingersCrossedHandler::activate
      * @covers Monolog\Handler\FingersCrossedHandler::reset
      */
-    public function testHandleRestartBufferingAfterReset()
+    public function testHandleResetBufferingAfterReset()
     {
         $test = new TestHandler();
         $handler = new FingersCrossedHandler($test);
@@ -76,7 +76,7 @@ class FingersCrossedHandlerTest extends TestCase
      * @covers Monolog\Handler\FingersCrossedHandler::handle
      * @covers Monolog\Handler\FingersCrossedHandler::activate
      */
-    public function testHandleRestartBufferingAfterBeingTriggeredWhenStopBufferingIsDisabled()
+    public function testHandleResetBufferingAfterBeingTriggeredWhenStopBufferingIsDisabled()
     {
         $test = new TestHandler();
         $handler = new FingersCrossedHandler($test, Logger::WARNING, 0, false, false);
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php
index 0eb10a63..7a404e66 100644
--- a/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/FirePHPHandlerTest.php
@@ -21,7 +21,7 @@ class FirePHPHandlerTest extends TestCase
 {
     public function setUp()
     {
-        TestFirePHPHandler::reset();
+        TestFirePHPHandler::resetStatic();
         $_SERVER['HTTP_USER_AGENT'] = 'Monolog Test; FirePHP/1.0';
     }
 
@@ -77,7 +77,7 @@ class TestFirePHPHandler extends FirePHPHandler
 {
     protected $headers = array();
 
-    public static function reset()
+    public static function resetStatic()
     {
         self::$initialized = false;
         self::$sendHeaders = true;
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/InsightOpsHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/InsightOpsHandlerTest.php
new file mode 100644
index 00000000..97c18b59
--- /dev/null
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/InsightOpsHandlerTest.php
@@ -0,0 +1,80 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@xxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+ namespace Monolog\Handler;
+ 
+ use Monolog\TestCase;
+ use Monolog\Logger;
+
+/**
+ * @author Robert Kaufmann III <rok3@xxxxxxx>
+ * @author Gabriel Machado <gabriel.ms1@xxxxxxxxxxx>
+ */
+class InsightOpsHandlerTest extends TestCase
+{
+    /**
+     * @var resource
+     */
+    private $resource;
+
+    /**
+     * @var LogEntriesHandler
+     */
+    private $handler;
+
+    public function testWriteContent()
+    {
+        $this->createHandler();
+        $this->handler->handle($this->getRecord(Logger::CRITICAL, 'Critical write test'));
+
+        fseek($this->resource, 0);
+        $content = fread($this->resource, 1024);
+
+        $this->assertRegexp('/testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] test.CRITICAL: Critical write test/', $content);
+    }
+
+    public function testWriteBatchContent()
+    {
+        $this->createHandler();
+        $this->handler->handleBatch($this->getMultipleRecords());
+
+        fseek($this->resource, 0);
+        $content = fread($this->resource, 1024);
+
+        $this->assertRegexp('/(testToken \[\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\] .* \[\] \[\]\n){3}/', $content);
+    }
+
+    private function createHandler()
+    {
+        $useSSL = extension_loaded('openssl');
+        $args = array('testToken', 'us', $useSSL, Logger::DEBUG, true);
+        $this->resource = fopen('php://memory', 'a');
+        $this->handler = $this->getMock(
+            '\Monolog\Handler\InsightOpsHandler',
+            array('fsockopen', 'streamSetTimeout', 'closeSocket'),
+            $args
+        );
+
+        $reflectionProperty = new \ReflectionProperty('\Monolog\Handler\SocketHandler', 'connectionString');
+        $reflectionProperty->setAccessible(true);
+        $reflectionProperty->setValue($this->handler, 'localhost:1234');
+
+        $this->handler->expects($this->any())
+            ->method('fsockopen')
+            ->will($this->returnValue($this->resource));
+        $this->handler->expects($this->any())
+            ->method('streamSetTimeout')
+            ->will($this->returnValue(true));
+        $this->handler->expects($this->any())
+            ->method('closeSocket')
+            ->will($this->returnValue(true));
+    }
+}
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php
index f1feb228..c6f5fac9 100644
--- a/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/RotatingFileHandlerTest.php
@@ -191,6 +191,40 @@ class RotatingFileHandlerTest extends TestCase
         );
     }
 
+    /**
+     * @dataProvider rotationWhenSimilarFilesExistTests
+     */
+    public function testRotationWhenSimilarFileNamesExist($dateFormat)
+    {
+        touch($old1 = __DIR__.'/Fixtures/foo-foo-'.date($dateFormat).'.rot');
+        touch($old2 = __DIR__.'/Fixtures/foo-bar-'.date($dateFormat).'.rot');
+
+        $log = __DIR__.'/Fixtures/foo-'.date($dateFormat).'.rot';
+
+        $handler = new RotatingFileHandler(__DIR__.'/Fixtures/foo.rot', 2);
+        $handler->setFormatter($this->getIdentityFormatter());
+        $handler->setFilenameFormat('{filename}-{date}', $dateFormat);
+        $handler->handle($this->getRecord());
+        $handler->close();
+
+        $this->assertTrue(file_exists($log));
+    }
+
+    public function rotationWhenSimilarFilesExistTests()
+    {
+
+        return array(
+            'Rotation is triggered when the file of the current day is not present but similar exists'
+                => array(RotatingFileHandler::FILE_PER_DAY),
+
+            'Rotation is triggered when the file of the current month is not present but similar exists'
+                => array(RotatingFileHandler::FILE_PER_MONTH),
+
+            'Rotation is triggered when the file of the current year is not present but similar exists'
+                => array(RotatingFileHandler::FILE_PER_YEAR),
+        );
+    }
+
     public function testReuseCurrentFile()
     {
         $log = __DIR__.'/Fixtures/foo-'.date('Y-m-d').'.rot';
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php
index e1aa96d7..b9de7367 100644
--- a/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/Slack/SlackRecordTest.php
@@ -320,12 +320,12 @@ class SlackRecordTest extends TestCase
                 'short' => false,
             ),
             array(
-                'title' => 'tags',
+                'title' => 'Tags',
                 'value' => sprintf('```%s```', json_encode($extra['tags'])),
                 'short' => false
             ),
             array(
-                'title' => 'test',
+                'title' => 'Test',
                 'value' => $context['test'],
                 'short' => false
             )
@@ -353,6 +353,14 @@ class SlackRecordTest extends TestCase
         $this->assertSame($record['datetime']->getTimestamp(), $attachment['ts']);
     }
 
+    public function testContextHasException()
+    {
+        $record = $this->getRecord(Logger::CRITICAL, 'This is a critical message.', array('exception' => new \Exception()));
+        $slackRecord = new SlackRecord(null, null, true, null, false, true);
+        $data = $slackRecord->getSlackData($record);
+        $this->assertInternalType('string', $data['attachments'][0]['fields'][1]['value']);
+    }
+
     public function testExcludeExtraAndContextFields()
     {
         $record = $this->getRecord(
@@ -368,12 +376,12 @@ class SlackRecordTest extends TestCase
 
         $expected = array(
             array(
-                'title' => 'info',
+                'title' => 'Info',
                 'value' => sprintf('```%s```', json_encode(array('author' => 'Jordi'), $this->jsonPrettyPrintFlag)),
                 'short' => false
             ),
             array(
-                'title' => 'tags',
+                'title' => 'Tags',
                 'value' => sprintf('```%s```', json_encode(array('web'))),
                 'short' => false
             ),
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php
index 1f9c1f28..1da987c9 100644
--- a/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/SocketHandlerTest.php
@@ -77,6 +77,13 @@ class SocketHandlerTest extends TestCase
         $this->assertEquals(10.25, $this->handler->getWritingTimeout());
     }
 
+    public function testSetChunkSize()
+    {
+        $this->createHandler('localhost:1234');
+        $this->handler->setChunkSize(1025);
+        $this->assertEquals(1025, $this->handler->getChunkSize());
+    }
+
     public function testSetConnectionString()
     {
         $this->createHandler('tcp://localhost:9090');
@@ -121,6 +128,19 @@ class SocketHandlerTest extends TestCase
     }
 
     /**
+     * @expectedException UnexpectedValueException
+     */
+    public function testExceptionIsThrownIfCannotSetChunkSize()
+    {
+        $this->setMockHandler(array('streamSetChunkSize'));
+        $this->handler->setChunkSize(8192);
+        $this->handler->expects($this->once())
+            ->method('streamSetChunkSize')
+            ->will($this->returnValue(false));
+        $this->writeRecord('Hello world');
+    }
+
+    /**
      * @expectedException RuntimeException
      */
     public function testWriteFailsOnIfFwriteReturnsFalse()
@@ -304,6 +324,12 @@ class SocketHandlerTest extends TestCase
                 ->will($this->returnValue(true));
         }
 
+        if (!in_array('streamSetChunkSize', $methods)) {
+            $this->handler->expects($this->any())
+                ->method('streamSetChunkSize')
+                ->will($this->returnValue(8192));
+        }
+
         $this->handler->setFormatter($this->getIdentityFormatter());
     }
 }
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php
index bfb8d3df..a7c4fc98 100644
--- a/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/TestHandlerTest.php
@@ -54,6 +54,52 @@ class TestHandlerTest extends TestCase
         $this->assertEquals(array($record), $records);
     }
 
+    public function testHandlerAssertEmptyContext() {
+        $handler = new TestHandler;
+        $record  = $this->getRecord(Logger::WARNING, 'test', array());
+        $this->assertFalse($handler->hasWarning(array(
+            'message' => 'test',
+            'context' => array(),
+        )));
+
+        $handler->handle($record);
+
+        $this->assertTrue($handler->hasWarning(array(
+            'message' => 'test',
+            'context' => array(),
+        )));
+        $this->assertFalse($handler->hasWarning(array(
+            'message' => 'test',
+            'context' => array(
+                'foo' => 'bar'
+            ),
+        )));
+    }
+
+    public function testHandlerAssertNonEmptyContext() {
+        $handler = new TestHandler;
+        $record  = $this->getRecord(Logger::WARNING, 'test', array('foo' => 'bar'));
+        $this->assertFalse($handler->hasWarning(array(
+            'message' => 'test',
+            'context' => array(
+                'foo' => 'bar'
+            ),
+        )));
+
+        $handler->handle($record);
+
+        $this->assertTrue($handler->hasWarning(array(
+            'message' => 'test',
+            'context' => array(
+                'foo' => 'bar'
+            ),
+        )));
+        $this->assertFalse($handler->hasWarning(array(
+            'message' => 'test',
+            'context' => array(),
+        )));
+    }
+
     public function methodProvider()
     {
         return array(
diff --git a/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php
index 8d37a1fc..0594a232 100644
--- a/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/Handler/WhatFailureGroupHandlerTest.php
@@ -88,6 +88,29 @@ class WhatFailureGroupHandlerTest extends TestCase
     }
 
     /**
+     * @covers Monolog\Handler\WhatFailureGroupHandler::handleBatch
+     */
+    public function testHandleBatchUsesProcessors()
+    {
+        $testHandlers = array(new TestHandler(), new TestHandler());
+        $handler = new WhatFailureGroupHandler($testHandlers);
+        $handler->pushProcessor(function ($record) {
+            $record['extra']['foo'] = true;
+
+            return $record;
+        });
+        $handler->handleBatch(array($this->getRecord(Logger::DEBUG), $this->getRecord(Logger::INFO)));
+        foreach ($testHandlers as $test) {
+            $this->assertTrue($test->hasDebugRecords());
+            $this->assertTrue($test->hasInfoRecords());
+            $this->assertTrue(count($test->getRecords()) === 2);
+            $records = $test->getRecords();
+            $this->assertTrue($records[0]['extra']['foo']);
+            $this->assertTrue($records[1]['extra']['foo']);
+        }
+    }
+
+    /**
      * @covers Monolog\Handler\WhatFailureGroupHandler::handle
      */
     public function testHandleException()
diff --git a/vendor/monolog/monolog/tests/Monolog/LoggerTest.php b/vendor/monolog/monolog/tests/Monolog/LoggerTest.php
index 1ecc34a0..442e87de 100644
--- a/vendor/monolog/monolog/tests/Monolog/LoggerTest.php
+++ b/vendor/monolog/monolog/tests/Monolog/LoggerTest.php
@@ -545,4 +545,146 @@ class LoggerTest extends \PHPUnit_Framework_TestCase
             'without microseconds' => array(false, PHP_VERSION_ID >= 70100 ? 'assertNotSame' : 'assertSame'),
         );
     }
+
+    /**
+     * @covers Monolog\Logger::setExceptionHandler
+     */
+    public function testSetExceptionHandler()
+    {
+        $logger = new Logger(__METHOD__);
+        $this->assertNull($logger->getExceptionHandler());
+        $callback = function ($ex) {
+        };
+        $logger->setExceptionHandler($callback);
+        $this->assertEquals($callback, $logger->getExceptionHandler());
+    }
+
+    /**
+     * @covers Monolog\Logger::setExceptionHandler
+     * @expectedException InvalidArgumentException
+     */
+    public function testBadExceptionHandlerType()
+    {
+        $logger = new Logger(__METHOD__);
+        $logger->setExceptionHandler(false);
+    }
+
+    /**
+     * @covers Monolog\Logger::handleException
+     * @expectedException Exception
+     */
+    public function testDefaultHandleException()
+    {
+        $logger = new Logger(__METHOD__);
+        $handler = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler->expects($this->any())
+            ->method('isHandling')
+            ->will($this->returnValue(true))
+        ;
+        $handler->expects($this->any())
+            ->method('handle')
+            ->will($this->throwException(new \Exception('Some handler exception')))
+        ;
+        $logger->pushHandler($handler);
+        $logger->info('test');
+    }
+
+    /**
+     * @covers Monolog\Logger::handleException
+     * @covers Monolog\Logger::addRecord
+     */
+    public function testCustomHandleException()
+    {
+        $logger = new Logger(__METHOD__);
+        $that = $this;
+        $logger->setExceptionHandler(function ($e, $record) use ($that) {
+            $that->assertEquals($e->getMessage(), 'Some handler exception');
+            $that->assertTrue(is_array($record));
+            $that->assertEquals($record['message'], 'test');
+        });
+        $handler = $this->getMock('Monolog\Handler\HandlerInterface');
+        $handler->expects($this->any())
+            ->method('isHandling')
+            ->will($this->returnValue(true))
+        ;
+        $handler->expects($this->any())
+            ->method('handle')
+            ->will($this->throwException(new \Exception('Some handler exception')))
+        ;
+        $logger->pushHandler($handler);
+        $logger->info('test');
+    }
+
+    public function testReset()
+    {
+        $logger = new Logger('app');
+
+        $testHandler = new Handler\TestHandler();
+        $bufferHandler = new Handler\BufferHandler($testHandler);
+        $groupHandler = new Handler\GroupHandler(array($bufferHandler));
+        $fingersCrossedHandler = new Handler\FingersCrossedHandler($groupHandler);
+
+        $logger->pushHandler($fingersCrossedHandler);
+
+        $processorUid1 = new Processor\UidProcessor(10);
+        $uid1 = $processorUid1->getUid();
+        $groupHandler->pushProcessor($processorUid1);
+
+        $processorUid2 = new Processor\UidProcessor(5);
+        $uid2 = $processorUid2->getUid();
+        $logger->pushProcessor($processorUid2);
+
+        $getProperty = function ($object, $property) {
+            $reflectionProperty = new \ReflectionProperty(get_class($object), $property);
+            $reflectionProperty->setAccessible(true);
+
+            return $reflectionProperty->getValue($object);
+        };
+        $that = $this;
+        $assertBufferOfBufferHandlerEmpty = function () use ($getProperty, $bufferHandler, $that) {
+            $that->assertEmpty($getProperty($bufferHandler, 'buffer'));
+        };
+        $assertBuffersEmpty = function() use ($assertBufferOfBufferHandlerEmpty, $getProperty, $fingersCrossedHandler, $that) {
+            $assertBufferOfBufferHandlerEmpty();
+            $that->assertEmpty($getProperty($fingersCrossedHandler, 'buffer'));
+        };
+
+        $logger->debug('debug');
+        $logger->reset();
+        $assertBuffersEmpty();
+        $this->assertFalse($testHandler->hasDebugRecords());
+        $this->assertFalse($testHandler->hasErrorRecords());
+        $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
+        $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
+
+        $logger->debug('debug');
+        $logger->error('error');
+        $logger->reset();
+        $assertBuffersEmpty();
+        $this->assertTrue($testHandler->hasDebugRecords());
+        $this->assertTrue($testHandler->hasErrorRecords());
+        $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
+        $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
+
+        $logger->info('info');
+        $this->assertNotEmpty($getProperty($fingersCrossedHandler, 'buffer'));
+        $assertBufferOfBufferHandlerEmpty();
+        $this->assertFalse($testHandler->hasInfoRecords());
+
+        $logger->reset();
+        $assertBuffersEmpty();
+        $this->assertFalse($testHandler->hasInfoRecords());
+        $this->assertNotSame($uid1, $uid1 = $processorUid1->getUid());
+        $this->assertNotSame($uid2, $uid2 = $processorUid2->getUid());
+
+        $logger->notice('notice');
+        $logger->emergency('emergency');
+        $logger->reset();
+        $assertBuffersEmpty();
+        $this->assertFalse($testHandler->hasInfoRecords());
+        $this->assertTrue($testHandler->hasNoticeRecords());
+        $this->assertTrue($testHandler->hasEmergencyRecords());
+        $this->assertNotSame($uid1, $processorUid1->getUid());
+        $this->assertNotSame($uid2, $processorUid2->getUid());
+    }
 }
diff --git a/vendor/monolog/monolog/tests/Monolog/SignalHandlerTest.php b/vendor/monolog/monolog/tests/Monolog/SignalHandlerTest.php
new file mode 100644
index 00000000..9fa07929
--- /dev/null
+++ b/vendor/monolog/monolog/tests/Monolog/SignalHandlerTest.php
@@ -0,0 +1,287 @@
+<?php
+
+/*
+ * This file is part of the Monolog package.
+ *
+ * (c) Jordi Boggiano <j.boggiano@xxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Monolog;
+
+use Monolog\Handler\StreamHandler;
+use Monolog\Handler\TestHandler;
+use Psr\Log\LogLevel;
+
+/**
+ * @author Robert Gust-Bardon <robert@xxxxxxxxxxxxxxx>
+ * @covers Monolog\SignalHandler
+ */
+class SignalHandlerTest extends TestCase
+{
+
+    private $asyncSignalHandling;
+    private $blockedSignals;
+    private $signalHandlers;
+
+    protected function setUp()
+    {
+        $this->signalHandlers = array();
+        if (extension_loaded('pcntl')) {
+            if (function_exists('pcntl_async_signals')) {
+                $this->asyncSignalHandling = pcntl_async_signals();
+            }
+            if (function_exists('pcntl_sigprocmask')) {
+                pcntl_sigprocmask(SIG_BLOCK, array(), $this->blockedSignals);
+            }
+        }
+    }
+
+    protected function tearDown()
+    {
+        if ($this->asyncSignalHandling !== null) {
+            pcntl_async_signals($this->asyncSignalHandling);
+        }
+        if ($this->blockedSignals !== null) {
+            pcntl_sigprocmask(SIG_SETMASK, $this->blockedSignals);
+        }
+        if ($this->signalHandlers) {
+            pcntl_signal_dispatch();
+            foreach ($this->signalHandlers as $signo => $handler) {
+                pcntl_signal($signo, $handler);
+            }
+        }
+    }
+
+    private function setSignalHandler($signo, $handler = SIG_DFL) {
+        if (function_exists('pcntl_signal_get_handler')) {
+            $this->signalHandlers[$signo] = pcntl_signal_get_handler($signo);
+        } else {
+            $this->signalHandlers[$signo] = SIG_DFL;
+        }
+        $this->assertTrue(pcntl_signal($signo, $handler));
+    }
+
+    public function testHandleSignal()
+    {
+        $logger = new Logger('test', array($handler = new TestHandler));
+        $errHandler = new SignalHandler($logger);
+        $signo = 2;  // SIGINT.
+        $siginfo = array('signo' => $signo, 'errno' => 0, 'code' => 0);
+        $errHandler->handleSignal($signo, $siginfo);
+        $this->assertCount(1, $handler->getRecords());
+        $this->assertTrue($handler->hasCriticalRecords());
+        $records = $handler->getRecords();
+        $this->assertSame($siginfo, $records[0]['context']);
+    }
+
+    /**
+     * @depends testHandleSignal
+     * @requires extension pcntl
+     * @requires extension posix
+     * @requires function pcntl_signal
+     * @requires function pcntl_signal_dispatch
+     * @requires function posix_getpid
+     * @requires function posix_kill
+     */
+    public function testRegisterSignalHandler()
+    {
+        // SIGCONT and SIGURG should be ignored by default.
+        if (!defined('SIGCONT') || !defined('SIGURG')) {
+            $this->markTestSkipped('This test requires the SIGCONT and SIGURG pcntl constants.');
+        }
+
+        $this->setSignalHandler(SIGCONT, SIG_IGN);
+        $this->setSignalHandler(SIGURG, SIG_IGN);
+
+        $logger = new Logger('test', array($handler = new TestHandler));
+        $errHandler = new SignalHandler($logger);
+        $pid = posix_getpid();
+
+        $this->assertTrue(posix_kill($pid, SIGURG));
+        $this->assertTrue(pcntl_signal_dispatch());
+        $this->assertCount(0, $handler->getRecords());
+
+        $errHandler->registerSignalHandler(SIGURG, LogLevel::INFO, false, false, false);
+
+        $this->assertTrue(posix_kill($pid, SIGCONT));
+        $this->assertTrue(pcntl_signal_dispatch());
+        $this->assertCount(0, $handler->getRecords());
+
+        $this->assertTrue(posix_kill($pid, SIGURG));
+        $this->assertTrue(pcntl_signal_dispatch());
+        $this->assertCount(1, $handler->getRecords());
+        $this->assertTrue($handler->hasInfoThatContains('SIGURG'));
+    }
+
+    /**
+     * @dataProvider defaultPreviousProvider
+     * @depends testRegisterSignalHandler
+     * @requires function pcntl_fork
+     * @requires function pcntl_sigprocmask
+     * @requires function pcntl_waitpid
+     */
+    public function testRegisterDefaultPreviousSignalHandler($signo, $callPrevious, $expected)
+    {
+        $this->setSignalHandler($signo, SIG_DFL);
+
+        $path = tempnam(sys_get_temp_dir(), 'monolog-');
+        $this->assertNotFalse($path);
+
+        $pid = pcntl_fork();
+        if ($pid === 0) {  // Child.
+            $streamHandler = new StreamHandler($path);
+            $streamHandler->setFormatter($this->getIdentityFormatter());
+            $logger = new Logger('test', array($streamHandler));
+            $errHandler = new SignalHandler($logger);
+            $errHandler->registerSignalHandler($signo, LogLevel::INFO, $callPrevious, false, false);
+            pcntl_sigprocmask(SIG_SETMASK, array(SIGCONT));
+            posix_kill(posix_getpid(), $signo);
+            pcntl_signal_dispatch();
+            // If $callPrevious is true, SIGINT should terminate by this line.
+            pcntl_sigprocmask(SIG_BLOCK, array(), $oldset);
+            file_put_contents($path, implode(' ', $oldset), FILE_APPEND);
+            posix_kill(posix_getpid(), $signo);
+            pcntl_signal_dispatch();
+            exit();
+        }
+
+        $this->assertNotSame(-1, $pid);
+        $this->assertNotSame(-1, pcntl_waitpid($pid, $status));
+        $this->assertNotSame(-1, $status);
+        $this->assertSame($expected, file_get_contents($path));
+    }
+
+    public function defaultPreviousProvider()
+    {
+        if (!defined('SIGCONT') || !defined('SIGINT') || !defined('SIGURG')) {
+            return array();
+        }
+
+        return array(
+            array(SIGINT, false, 'Program received signal SIGINT'.SIGCONT.'Program received signal SIGINT'),
+            array(SIGINT, true, 'Program received signal SIGINT'),
+            array(SIGURG, false, 'Program received signal SIGURG'.SIGCONT.'Program received signal SIGURG'),
+            array(SIGURG, true, 'Program received signal SIGURG'.SIGCONT.'Program received signal SIGURG'),
+        );
+    }
+
+    /**
+     * @dataProvider callablePreviousProvider
+     * @depends testRegisterSignalHandler
+     * @requires function pcntl_signal_get_handler
+     */
+    public function testRegisterCallablePreviousSignalHandler($callPrevious)
+    {
+        $this->setSignalHandler(SIGURG, SIG_IGN);
+
+        $logger = new Logger('test', array($handler = new TestHandler));
+        $errHandler = new SignalHandler($logger);
+        $previousCalled = 0;
+        pcntl_signal(SIGURG, function ($signo, array $siginfo = null) use (&$previousCalled) {
+            ++$previousCalled;
+        });
+        $errHandler->registerSignalHandler(SIGURG, LogLevel::INFO, $callPrevious, false, false);
+        $this->assertTrue(posix_kill(posix_getpid(), SIGURG));
+        $this->assertTrue(pcntl_signal_dispatch());
+        $this->assertCount(1, $handler->getRecords());
+        $this->assertTrue($handler->hasInfoThatContains('SIGURG'));
+        $this->assertSame($callPrevious ? 1 : 0, $previousCalled);
+    }
+
+    public function callablePreviousProvider()
+    {
+        return array(
+            array(false),
+            array(true),
+        );
+    }
+
+    /**
+     * @dataProvider restartSyscallsProvider
+     * @depends testRegisterDefaultPreviousSignalHandler
+     * @requires function pcntl_fork
+     * @requires function pcntl_waitpid
+     */
+    public function testRegisterSyscallRestartingSignalHandler($restartSyscalls)
+    {
+        $this->setSignalHandler(SIGURG, SIG_IGN);
+
+        $parentPid = posix_getpid();
+        $microtime = microtime(true);
+
+        $pid = pcntl_fork();
+        if ($pid === 0) {  // Child.
+            usleep(100000);
+            posix_kill($parentPid, SIGURG);
+            usleep(100000);
+            exit();
+        }
+
+        $this->assertNotSame(-1, $pid);
+        $logger = new Logger('test', array($handler = new TestHandler));
+        $errHandler = new SignalHandler($logger);
+        $errHandler->registerSignalHandler(SIGURG, LogLevel::INFO, false, $restartSyscalls, false);
+        if ($restartSyscalls) {
+            // pcntl_wait is expected to be restarted after the signal handler.
+            $this->assertNotSame(-1, pcntl_waitpid($pid, $status));
+        } else {
+            // pcntl_wait is expected to be interrupted when the signal handler is invoked.
+            $this->assertSame(-1, pcntl_waitpid($pid, $status));
+        }
+        $this->assertSame($restartSyscalls, microtime(true) - $microtime > 0.15);
+        $this->assertTrue(pcntl_signal_dispatch());
+        $this->assertCount(1, $handler->getRecords());
+        if ($restartSyscalls) {
+            // The child has already exited.
+            $this->assertSame(-1, pcntl_waitpid($pid, $status));
+        } else {
+            // The child has not exited yet.
+            $this->assertNotSame(-1, pcntl_waitpid($pid, $status));
+        }
+    }
+
+    public function restartSyscallsProvider()
+    {
+        return array(
+            array(false),
+            array(true),
+            array(false),
+            array(true),
+        );
+    }
+
+    /**
+     * @dataProvider asyncProvider
+     * @depends testRegisterDefaultPreviousSignalHandler
+     * @requires function pcntl_async_signals
+     */
+    public function testRegisterAsyncSignalHandler($initialAsync, $desiredAsync, $expectedBefore, $expectedAfter)
+    {
+        $this->setSignalHandler(SIGURG, SIG_IGN);
+        pcntl_async_signals($initialAsync);
+
+        $logger = new Logger('test', array($handler = new TestHandler));
+        $errHandler = new SignalHandler($logger);
+        $errHandler->registerSignalHandler(SIGURG, LogLevel::INFO, false, false, $desiredAsync);
+        $this->assertTrue(posix_kill(posix_getpid(), SIGURG));
+        $this->assertCount($expectedBefore, $handler->getRecords());
+        $this->assertTrue(pcntl_signal_dispatch());
+        $this->assertCount($expectedAfter, $handler->getRecords());
+    }
+
+    public function asyncProvider()
+    {
+        return array(
+            array(false, false, 0, 1),
+            array(false, null, 0, 1),
+            array(false, true, 1, 1),
+            array(true, false, 0, 1),
+            array(true, null, 1, 1),
+            array(true, true, 1, 1),
+        );
+    }
+
+}
diff --git a/vendor/myclabs/deep-copy/.gitignore b/vendor/myclabs/deep-copy/.gitignore
index 93541710..eef72f75 100755
--- a/vendor/myclabs/deep-copy/.gitignore
+++ b/vendor/myclabs/deep-copy/.gitignore
@@ -1,6 +1,3 @@
-.DS_Store
-.idea/*
-
-vendor/*
-composer.phar
-composer.lock
+/composer.phar
+/composer.lock
+/vendor/*
diff --git a/vendor/myclabs/deep-copy/.scrutinizer.yml b/vendor/myclabs/deep-copy/.scrutinizer.yml
new file mode 100644
index 00000000..6934299b
--- /dev/null
+++ b/vendor/myclabs/deep-copy/.scrutinizer.yml
@@ -0,0 +1,4 @@
+build:
+    environment:
+        variables:
+            COMPOSER_ROOT_VERSION: '1.8.0'
diff --git a/vendor/myclabs/deep-copy/.travis.yml b/vendor/myclabs/deep-copy/.travis.yml
index 347c6e75..88f9d2e8 100755
--- a/vendor/myclabs/deep-copy/.travis.yml
+++ b/vendor/myclabs/deep-copy/.travis.yml
@@ -1,30 +1,30 @@
 language: php
 
+sudo: false
+
+env:
+  global:
+    - COMPOSER_ROOT_VERSION=1.8.0
+
 php:
-  - '5.5'
-  - '5.6'
-  - '7.0'
   - '7.1'
+  - '7.2'
   - nightly
-  - hhvm
 
 matrix:
   fast_finish: true
   include:
-    - php: '5.4'
+    - php: '7.1'
       env: COMPOSER_FLAGS="--prefer-lowest"
   allow_failures:
     - php: nightly
-    - php: hhvm
 
-before_install:
-  - |
-    if [ "$TRAVIS_PHP_VERSION" = "nightly" ] || "$TRAVIS_PHP_VERSION" = "7.1" ]; then
-      COMPOSER_FLAGS="$COMPOSER_FLAGS --ignore-platform-reqs"
-    fi;
+cache:
+  directories:
+    - $HOME/.composer/cache/files
 
 install:
-  - composer update -n --prefer-dist $COMPOSER_FLAGS
+  - composer update --no-interaction --no-progress --no-suggest --prefer-dist $COMPOSER_FLAGS
   - wget https://github.com/satooshi/php-coveralls/releases/download/v1.0.0/coveralls.phar
 
 before_script:
@@ -35,3 +35,6 @@ script:
 
 after_script:
   - php coveralls.phar -v
+
+notifications:
+    email: false
diff --git a/vendor/myclabs/deep-copy/README.md b/vendor/myclabs/deep-copy/README.md
index 853b7619..7abe5dc8 100644
--- a/vendor/myclabs/deep-copy/README.md
+++ b/vendor/myclabs/deep-copy/README.md
@@ -2,10 +2,16 @@
 
 DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph.
 
-[![Build Status](https://travis-ci.org/myclabs/DeepCopy.png?branch=master)](https://travis-ci.org/myclabs/DeepCopy) [![Coverage Status](https://coveralls.io/repos/myclabs/DeepCopy/badge.png?branch=master)](https://coveralls.io/r/myclabs/DeepCopy?branch=master) [![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/myclabs/DeepCopy/badges/quality-score.png?s=2747100c19b275f93a777e3297c6c12d1b68b934)](https://scrutinizer-ci.com/g/myclabs/DeepCopy/)
+[![Build Status](https://travis-ci.org/myclabs/DeepCopy.png?branch=1.x)](https://travis-ci.org/myclabs/DeepCopy)
+[![Coverage Status](https://coveralls.io/repos/myclabs/DeepCopy/badge.png?branch=1.x)](https://coveralls.io/r/myclabs/DeepCopy?branch=1.x)
+[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/myclabs/DeepCopy/badges/quality-score.png?s=2747100c19b275f93a777e3297c6c12d1b68b934)](https://scrutinizer-ci.com/g/myclabs/DeepCopy/)
 [![Total Downloads](https://poser.pugx.org/myclabs/deep-copy/downloads.svg)](https://packagist.org/packages/myclabs/deep-copy)
 
 
+**You are browsing the 1.x version, this version is in maintenance mode only. Please check the new
+[2.x](https://github.com/myclabs/DeepCopy/tree/2.x) version.**
+
+
 ## Table of Contents
 
 1. [How](#how)
@@ -20,15 +26,18 @@ DeepCopy helps you create deep copies (clones) of your objects. It is designed t
         1. [Specific property](#specific-property)
         1. [Type](#type)
     1. [Filters](#filters)
-        1. [`SetNullFilter`](#setnullfilter)
-        1. [`KeepFilter`](#keepfilter)
-        1. [`ReplaceFilter`](#replacefilter)
-        1. [`ShallowCopyFilter`](#doctrinecollectionfilter)
-        1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter)
-        1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter)
+        1. [`SetNullFilter`](#setnullfilter-filter)
+        1. [`KeepFilter`](#keepfilter-filter)
+        1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter-filter)
+        1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter-filter)
+        1. [`DoctrineProxyFilter`](#doctrineproxyfilter-filter)
+        1. [`ReplaceFilter`](#replacefilter-type-filter)
+        1. [`ShallowCopyFilter`](#shallowcopyfilter-type-filter)
+1. [Edge cases](#edge-cases)
 1. [Contributing](#contributing)
     1. [Tests](#tests)
 
+
 ## How?
 
 Install with Composer:
@@ -42,8 +51,8 @@ Use simply:
 ```php
 use DeepCopy\DeepCopy;
 
-$deepCopy = new DeepCopy();
-$myCopy = $deepCopy->copy($myObject);
+$copier = new DeepCopy();
+$myCopy = $copier->copy($myObject);
 ```
 
 
@@ -57,7 +66,8 @@ $myCopy = clone $myObject;
 
 - How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)?
 
-You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior yourself.
+You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior
+yourself.
 
 - But how do you handle **cycles** in the association graph?
 
@@ -65,37 +75,82 @@ Now you're in for a big mess :(
 
 ![association graph](doc/graph.png)
 
+
 ### Using simply `clone`
 
 ![Using clone](doc/clone.png)
 
+
 ### Overridding `__clone()`
 
 ![Overridding __clone](doc/deep-clone.png)
 
+
 ### With `DeepCopy`
 
 ![With DeepCopy](doc/deep-copy.png)
 
+
 ## How it works
 
-DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it keeps a hash map of all instances and thus preserves the object graph.
+DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it
+keeps a hash map of all instances and thus preserves the object graph.
+
+To use it:
+
+```php
+use function DeepCopy\deep_copy;
+
+$copy = deep_copy($var);
+```
+
+Alternatively, you can create your own `DeepCopy` instance to configure it differently for example:
+
+```php
+use DeepCopy\DeepCopy;
+
+$copier = new DeepCopy(true);
+
+$copy = $copier->copy($var);
+```
+
+You may want to roll your own deep copy function:
+
+```php
+namespace Acme;
+
+use DeepCopy\DeepCopy;
+
+function deep_copy($var)
+{
+    static $copier = null;
+    
+    if (null === $copier) {
+        $copier = new DeepCopy(true);
+    }
+    
+    return $copier->copy($var);
+}
+```
+
 
 ## Going further
 
 You can add filters to customize the copy process.
 
-The method to add a filter is `$deepCopy->addFilter($filter, $matcher)`,
+The method to add a filter is `DeepCopy\DeepCopy::addFilter($filter, $matcher)`,
 with `$filter` implementing `DeepCopy\Filter\Filter`
 and `$matcher` implementing `DeepCopy\Matcher\Matcher`.
 
 We provide some generic filters and matchers.
 
+
 ### Matchers
 
   - `DeepCopy\Matcher` applies on a object attribute.
   - `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements.
 
+
 #### Property name
 
 The `PropertyNameMatcher` will match a property by its name:
@@ -103,10 +158,11 @@ The `PropertyNameMatcher` will match a property by its name:
 ```php
 use DeepCopy\Matcher\PropertyNameMatcher;
 
+// Will apply a filter to any property of any objects named "id"
 $matcher = new PropertyNameMatcher('id');
-// will apply a filter to any property of any objects named "id"
 ```
 
+
 #### Specific property
 
 The `PropertyMatcher` will match a specific property of a specific class:
@@ -114,46 +170,53 @@ The `PropertyMatcher` will match a specific property of a specific class:
 ```php
 use DeepCopy\Matcher\PropertyMatcher;
 
+// Will apply a filter to the property "id" of any objects of the class "MyClass"
 $matcher = new PropertyMatcher('MyClass', 'id');
-// will apply a filter to the property "id" of any objects of the class "MyClass"
 ```
 
+
 #### Type
 
-The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of [gettype()](http://php.net/manual/en/function.gettype.php) function):
+The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of
+[gettype()](http://php.net/manual/en/function.gettype.php) function):
 
 ```php
 use DeepCopy\TypeMatcher\TypeMatcher;
 
+// Will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection
 $matcher = new TypeMatcher('Doctrine\Common\Collections\Collection');
-// will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection
 ```
 
+
 ### Filters
 
-  - `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher`.
-  - `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher`.
+- `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher`
+- `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher`
+
 
-#### `SetNullFilter`
+#### `SetNullFilter` (filter)
 
-Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have any ID:
+Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have
+any ID:
 
 ```php
 use DeepCopy\DeepCopy;
 use DeepCopy\Filter\SetNullFilter;
 use DeepCopy\Matcher\PropertyNameMatcher;
 
-$myObject = MyClass::load(123);
-echo $myObject->id; // 123
+$object = MyClass::load(123);
+echo $object->id; // 123
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new SetNullFilter(), new PropertyNameMatcher('id'));
-$myCopy = $deepCopy->copy($myObject);
+$copier = new DeepCopy();
+$copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id'));
 
-echo $myCopy->id; // null
+$copy = $copier->copy($object);
+
+echo $copy->id; // null
 ```
 
-#### `KeepFilter`
+
+#### `KeepFilter` (filter)
 
 If you want a property to remain untouched (for example, an association to an object):
 
@@ -162,129 +225,152 @@ use DeepCopy\DeepCopy;
 use DeepCopy\Filter\KeepFilter;
 use DeepCopy\Matcher\PropertyMatcher;
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category'));
-$myCopy = $deepCopy->copy($myObject);
+$copier = new DeepCopy();
+$copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category'));
 
-// $myCopy->category has not been touched
+$copy = $copier->copy($object);
+// $copy->category has not been touched
 ```
 
-#### `ReplaceFilter`
 
-  1. If you want to replace the value of a property:
+#### `DoctrineCollectionFilter` (filter)
+
+If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`:
+
+```php
+use DeepCopy\DeepCopy;
+use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter;
+use DeepCopy\Matcher\PropertyTypeMatcher;
 
-  ```php
-  use DeepCopy\DeepCopy;
-  use DeepCopy\Filter\ReplaceFilter;
-  use DeepCopy\Matcher\PropertyMatcher;
+$copier = new DeepCopy();
+$copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection'));
 
-  $deepCopy = new DeepCopy();
-  $callback = function ($currentValue) {
-      return $currentValue . ' (copy)'
-  };
-  $deepCopy->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title'));
-  $myCopy = $deepCopy->copy($myObject);
+$copy = $copier->copy($object);
+```
 
-  // $myCopy->title will contain the data returned by the callback, e.g. 'The title (copy)'
-  ```
 
-  2. If you want to replace whole element:
+#### `DoctrineEmptyCollectionFilter` (filter)
 
-  ```php
-  use DeepCopy\DeepCopy;
-  use DeepCopy\TypeFilter\ReplaceFilter;
-  use DeepCopy\TypeMatcher\TypeMatcher;
+If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the
+`DoctrineEmptyCollectionFilter`
 
-  $deepCopy = new DeepCopy();
-  $callback = function (MyClass $myClass) {
-      return get_class($myClass);
-  };
-  $deepCopy->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass'));
-  $myCopy = $deepCopy->copy(array(new MyClass, 'some string', new MyClass));
+```php
+use DeepCopy\DeepCopy;
+use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter;
+use DeepCopy\Matcher\PropertyMatcher;
 
-  // $myCopy will contain ['MyClass', 'some string', 'MyClass']
-  ```
+$copier = new DeepCopy();
+$copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty'));
 
+$copy = $copier->copy($object);
 
-The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable.
+// $copy->myProperty will return an empty collection
+```
 
-#### `ShallowCopyFilter`
 
-Stop *DeepCopy* from recursively copying element, using standard `clone` instead:
+#### `DoctrineProxyFilter` (filter)
+
+If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a
+Doctrine proxy class (...\\\_\_CG\_\_\Proxy).
+You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class.
+**Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded
+before other filters are applied!**
 
 ```php
 use DeepCopy\DeepCopy;
-use DeepCopy\TypeFilter\ShallowCopyFilter;
-use DeepCopy\TypeMatcher\TypeMatcher;
-use Mockery as m;
+use DeepCopy\Filter\Doctrine\DoctrineProxyFilter;
+use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher;
 
-$this->deepCopy = new DeepCopy();
-$this->deepCopy->addTypeFilter(
-	new ShallowCopyFilter,
-	new TypeMatcher(m\MockInterface::class)
-);
+$copier = new DeepCopy();
+$copier->addFilter(new DoctrineProxyFilter(), new DoctrineProxyMatcher());
 
-$myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class));
-// all mocks will be just cloned, not deep-copied
+$copy = $copier->copy($object);
+
+// $copy should now contain a clone of all entities, including those that were not yet fully loaded.
 ```
 
-#### `DoctrineCollectionFilter`
 
-If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`:
+#### `ReplaceFilter` (type filter)
+
+1. If you want to replace the value of a property:
 
 ```php
 use DeepCopy\DeepCopy;
-use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter;
-use DeepCopy\Matcher\PropertyTypeMatcher;
+use DeepCopy\Filter\ReplaceFilter;
+use DeepCopy\Matcher\PropertyMatcher;
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection'));
-$myCopy = $deepCopy->copy($myObject);
-```
+$copier = new DeepCopy();
+$callback = function ($currentValue) {
+  return $currentValue . ' (copy)'
+};
+$copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title'));
 
-#### `DoctrineEmptyCollectionFilter`
+$copy = $copier->copy($object);
 
-If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the `DoctrineEmptyCollectionFilter`
+// $copy->title will contain the data returned by the callback, e.g. 'The title (copy)'
+```
+
+2. If you want to replace whole element:
 
 ```php
 use DeepCopy\DeepCopy;
-use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter;
-use DeepCopy\Matcher\PropertyMatcher;
+use DeepCopy\TypeFilter\ReplaceFilter;
+use DeepCopy\TypeMatcher\TypeMatcher;
+
+$copier = new DeepCopy();
+$callback = function (MyClass $myClass) {
+  return get_class($myClass);
+};
+$copier->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass'));
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty'));
-$myCopy = $deepCopy->copy($myObject);
+$copy = $copier->copy([new MyClass, 'some string', new MyClass]);
 
-// $myCopy->myProperty will return an empty collection
+// $copy will contain ['MyClass', 'some string', 'MyClass']
 ```
 
-#### `DoctrineProxyFilter`
 
-If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a
-Doctrine proxy class (...\\\_\_CG\_\_\Proxy).
-You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class.
-**Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded before other filters are applied!**
+The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable.
+
+
+#### `ShallowCopyFilter` (type filter)
+
+Stop *DeepCopy* from recursively copying element, using standard `clone` instead:
 
 ```php
 use DeepCopy\DeepCopy;
-use DeepCopy\Filter\Doctrine\DoctrineProxyFilter;
-use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher;
+use DeepCopy\TypeFilter\ShallowCopyFilter;
+use DeepCopy\TypeMatcher\TypeMatcher;
+use Mockery as m;
 
-$deepCopy = new DeepCopy();
-$deepCopy->addFilter(new DoctrineProxyFilter(), new DoctrineProxyMatcher());
-$myCopy = $deepCopy->copy($myObject);
+$this->deepCopy = new DeepCopy();
+$this->deepCopy->addTypeFilter(
+	new ShallowCopyFilter,
+	new TypeMatcher(m\MockInterface::class)
+);
 
-// $myCopy should now contain a clone of all entities, including those that were not yet fully loaded.
+$myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class));
+// All mocks will be just cloned, not deep copied
 ```
 
+
+## Edge cases
+
+The following structures cannot be deep-copied with PHP Reflection. As a result they are shallow cloned and filters are
+not applied. There is two ways for you to handle them:
+
+- Implement your own `__clone()` method
+- Use a filter with a type matcher
+
+
 ## Contributing
 
 DeepCopy is distributed under the MIT license.
 
+
 ### Tests
 
 Running the tests is simple:
 
 ```php
-phpunit
+vendor/bin/phpunit
 ```
diff --git a/vendor/myclabs/deep-copy/composer.json b/vendor/myclabs/deep-copy/composer.json
index d20287ab..4108a23b 100644
--- a/vendor/myclabs/deep-copy/composer.json
+++ b/vendor/myclabs/deep-copy/composer.json
@@ -3,19 +3,36 @@
     "type": "library",
     "description": "Create deep copies (clones) of your objects",
     "keywords": ["clone", "copy", "duplicate", "object", "object graph"],
-    "homepage": "https://github.com/myclabs/DeepCopy";,
     "license": "MIT",
+
     "autoload": {
-        "psr-4": { "DeepCopy\\": "src/DeepCopy/" }
+        "psr-4": {
+            "DeepCopy\\": "src/DeepCopy/"
+        },
+        "files": [
+            "src/DeepCopy/deep_copy.php"
+        ]
     },
     "autoload-dev": {
-        "psr-4": { "DeepCopyTest\\": "tests/DeepCopyTest/" }
+        "psr-4": {
+            "DeepCopy\\": "fixtures/",
+            "DeepCopyTest\\": "tests/DeepCopyTest/"
+        }
     },
+
     "require": {
-        "php": ">=5.4.0"
+        "php": "^7.1"
     },
     "require-dev": {
-        "doctrine/collections": "1.*",
-        "phpunit/phpunit": "~4.1"
+        "doctrine/collections": "^1.0",
+        "doctrine/common": "^2.6",
+        "phpunit/phpunit": "^7.1"
+    },
+    "replace": {
+        "myclabs/deep-copy": "self.version"
+    },
+
+    "config": {
+        "sort-packages": true
     }
 }
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
index aee9e729..2e53cf3d 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/DeepCopy.php
@@ -2,37 +2,48 @@
 
 namespace DeepCopy;
 
+use DateInterval;
+use DateTimeInterface;
+use DateTimeZone;
 use DeepCopy\Exception\CloneException;
 use DeepCopy\Filter\Filter;
 use DeepCopy\Matcher\Matcher;
-use DeepCopy\TypeFilter\Spl\SplDoublyLinkedList;
+use DeepCopy\TypeFilter\Date\DateIntervalFilter;
+use DeepCopy\TypeFilter\Spl\SplDoublyLinkedListFilter;
 use DeepCopy\TypeFilter\TypeFilter;
 use DeepCopy\TypeMatcher\TypeMatcher;
+use ReflectionObject;
 use ReflectionProperty;
 use DeepCopy\Reflection\ReflectionHelper;
+use SplDoublyLinkedList;
 
 /**
- * DeepCopy
+ * @final
  */
 class DeepCopy
 {
     /**
-     * @var array
+     * @var object[] List of objects copied.
      */
     private $hashMap = [];
 
     /**
      * Filters to apply.
-     * @var array
+     *
+     * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs.
      */
     private $filters = [];
 
     /**
      * Type Filters to apply.
-     * @var array
+     *
+     * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs.
      */
     private $typeFilters = [];
 
+    /**
+     * @var bool
+     */
     private $skipUncloneable = false;
 
     /**
@@ -48,23 +59,29 @@ class DeepCopy
     {
         $this->useCloneMethod = $useCloneMethod;
 
-        $this->addTypeFilter(new SplDoublyLinkedList($this), new TypeMatcher('\SplDoublyLinkedList'));
+        $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class));
+        $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class));
     }
 
     /**
-     * Cloning uncloneable properties won't throw exception.
+     * If enabled, will not throw an exception when coming across an uncloneable property.
+     *
      * @param $skipUncloneable
+     *
      * @return $this
      */
     public function skipUncloneable($skipUncloneable = true)
     {
         $this->skipUncloneable = $skipUncloneable;
+
         return $this;
     }
 
     /**
-     * Perform a deep copy of the object.
+     * Deep copies the given object.
+     *
      * @param mixed $object
+     *
      * @return mixed
      */
     public function copy($object)
@@ -82,6 +99,14 @@ class DeepCopy
         ];
     }
 
+    public function prependFilter(Filter $filter, Matcher $matcher)
+    {
+        array_unshift($this->filters, [
+            'matcher' => $matcher,
+            'filter'  => $filter,
+        ]);
+    }
+
     public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher)
     {
         $this->typeFilters[] = [
@@ -90,7 +115,6 @@ class DeepCopy
         ];
     }
 
-
     private function recursiveCopy($var)
     {
         // Matches Type Filter
@@ -102,14 +126,17 @@ class DeepCopy
         if (is_resource($var)) {
             return $var;
         }
+
         // Array
         if (is_array($var)) {
             return $this->copyArray($var);
         }
+
         // Scalar
         if (! is_object($var)) {
             return $var;
         }
+
         // Object
         return $this->copyObject($var);
     }
@@ -129,8 +156,12 @@ class DeepCopy
     }
 
     /**
-     * Copy an object
+     * Copies an object.
+     *
      * @param object $object
+     *
+     * @throws CloneException
+     *
      * @return object
      */
     private function copyObject($object)
@@ -141,29 +172,35 @@ class DeepCopy
             return $this->hashMap[$objectHash];
         }
 
-        $reflectedObject = new \ReflectionObject($object);
-
-        if (false === $isCloneable = $reflectedObject->isCloneable() and $this->skipUncloneable) {
-            $this->hashMap[$objectHash] = $object;
-            return $object;
-        }
+        $reflectedObject = new ReflectionObject($object);
+        $isCloneable = $reflectedObject->isCloneable();
 
         if (false === $isCloneable) {
-            throw new CloneException(sprintf(
-                'Class "%s" is not cloneable.',
-                $reflectedObject->getName()
-            ));
+            if ($this->skipUncloneable) {
+                $this->hashMap[$objectHash] = $object;
+
+                return $object;
+            }
+
+            throw new CloneException(
+                sprintf(
+                    'The class "%s" is not cloneable.',
+                    $reflectedObject->getName()
+                )
+            );
         }
 
         $newObject = clone $object;
         $this->hashMap[$objectHash] = $newObject;
+
         if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) {
-            return $object;
+            return $newObject;
         }
 
-        if ($newObject instanceof \DateTimeInterface) {
+        if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) {
             return $newObject;
         }
+
         foreach (ReflectionHelper::getProperties($reflectedObject) as $property) {
             $this->copyObjectProperty($newObject, $property);
         }
@@ -193,6 +230,7 @@ class DeepCopy
                         return $this->recursiveCopy($object);
                     }
                 );
+
                 // If a filter matches, we stop processing this property
                 return;
             }
@@ -206,10 +244,12 @@ class DeepCopy
     }
 
     /**
-     * Returns first filter that matches variable, NULL if no such filter found.
+     * Returns first filter that matches variable, `null` if no such filter found.
+     *
      * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and
      *                             'matcher' with value of type {@see TypeMatcher}
      * @param mixed $var
+     *
      * @return TypeFilter|null
      */
     private function getFirstMatchedTypeFilter(array $filterRecords, $var)
@@ -228,10 +268,13 @@ class DeepCopy
     }
 
     /**
-     * Returns first element that matches predicate, NULL if no such element found.
-     * @param array    $elements
+     * Returns first element that matches predicate, `null` if no such element found.
+     *
+     * @param array    $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs.
      * @param callable $predicate Predicate arguments are: element.
-     * @return mixed|null
+     *
+     * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher'
+     *                    with value of type {@see TypeMatcher} or `null`.
      */
     private function first(array $elements, callable $predicate)
     {
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php
index dd3b617b..c046706a 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php
@@ -1,6 +1,9 @@
 <?php
+
 namespace DeepCopy\Exception;
 
-class CloneException extends \UnexpectedValueException
+use UnexpectedValueException;
+
+class CloneException extends UnexpectedValueException
 {
 } 
\ No newline at end of file
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php
index 28562ed4..e6d93771 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php
@@ -3,19 +3,21 @@
 namespace DeepCopy\Filter\Doctrine;
 
 use DeepCopy\Filter\Filter;
-use ReflectionProperty;
+use DeepCopy\Reflection\ReflectionHelper;
 
 /**
- * Set a null value for a property
+ * @final
  */
 class DoctrineCollectionFilter implements Filter
 {
     /**
+     * Copies the object property doctrine collection.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
     {
-        $reflectionProperty = new ReflectionProperty($object, $property);
+        $reflectionProperty = ReflectionHelper::getProperty($object, $property);
 
         $reflectionProperty->setAccessible(true);
         $oldCollection = $reflectionProperty->getValue($object);
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php
index f9b3f7ac..7b33fd54 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php
@@ -3,12 +3,16 @@
 namespace DeepCopy\Filter\Doctrine;
 
 use DeepCopy\Filter\Filter;
+use DeepCopy\Reflection\ReflectionHelper;
 use Doctrine\Common\Collections\ArrayCollection;
 
+/**
+ * @final
+ */
 class DoctrineEmptyCollectionFilter implements Filter
 {
     /**
-     * Apply the filter to the object.
+     * Sets the object property to an empty doctrine collection.
      *
      * @param object   $object
      * @param string   $property
@@ -16,7 +20,7 @@ class DoctrineEmptyCollectionFilter implements Filter
      */
     public function apply($object, $property, $objectCopier)
     {
-        $reflectionProperty = new \ReflectionProperty($object, $property);
+        $reflectionProperty = ReflectionHelper::getProperty($object, $property);
         $reflectionProperty->setAccessible(true);
 
         $reflectionProperty->setValue($object, new ArrayCollection());
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php
index a855277a..8bee8f76 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php
@@ -5,12 +5,14 @@ namespace DeepCopy\Filter\Doctrine;
 use DeepCopy\Filter\Filter;
 
 /**
- * Trigger the magic method __load() on a Doctrine Proxy class to load the
- * actual entity from the database.
+ * @final
  */
 class DoctrineProxyFilter implements Filter
 {
     /**
+     * Triggers the magic method __load() on a Doctrine Proxy class to load the
+     * actual entity from the database.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php
index 48076a1b..85ba18ce 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php
@@ -8,7 +8,8 @@ namespace DeepCopy\Filter;
 interface Filter
 {
     /**
-     * Apply the filter to the object.
+     * Applies the filter to the object.
+     *
      * @param object   $object
      * @param string   $property
      * @param callable $objectCopier
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php
index 14c55e75..4b11a081 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php
@@ -2,12 +2,11 @@
 
 namespace DeepCopy\Filter;
 
-/**
- * Keep the value of a property
- */
 class KeepFilter implements Filter
 {
     /**
+     * Keeps the value of the object property.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php
index fce7114b..7aca593b 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php
@@ -2,8 +2,10 @@
 
 namespace DeepCopy\Filter;
 
+use DeepCopy\Reflection\ReflectionHelper;
+
 /**
- * Replace the value of a property
+ * @final
  */
 class ReplaceFilter implements Filter
 {
@@ -21,11 +23,13 @@ class ReplaceFilter implements Filter
     }
 
     /**
+     * Replaces the object property by the result of the callback called with the object property.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
     {
-        $reflectionProperty = new \ReflectionProperty($object, $property);
+        $reflectionProperty = ReflectionHelper::getProperty($object, $property);
         $reflectionProperty->setAccessible(true);
 
         $value = call_user_func($this->callback, $reflectionProperty->getValue($object));
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php
index d48f15b6..bea86b88 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php
@@ -2,19 +2,21 @@
 
 namespace DeepCopy\Filter;
 
-use ReflectionProperty;
+use DeepCopy\Reflection\ReflectionHelper;
 
 /**
- * Set a null value for a property
+ * @final
  */
 class SetNullFilter implements Filter
 {
     /**
+     * Sets the object property to null.
+     *
      * {@inheritdoc}
      */
     public function apply($object, $property, $objectCopier)
     {
-        $reflectionProperty = new ReflectionProperty($object, $property);
+        $reflectionProperty = ReflectionHelper::getProperty($object, $property);
 
         $reflectionProperty->setAccessible(true);
         $reflectionProperty->setValue($object, null);
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php
index 6a7bcf5d..ec8856f5 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php
@@ -6,11 +6,13 @@ use DeepCopy\Matcher\Matcher;
 use Doctrine\Common\Persistence\Proxy;
 
 /**
- * Match a Doctrine Proxy class.
+ * @final
  */
 class DoctrineProxyMatcher implements Matcher
 {
     /**
+     * Matches a Doctrine Proxy class.
+     *
      * {@inheritdoc}
      */
     public function matches($object, $property)
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php
index 91eb7c90..d67f3cac 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php
@@ -2,14 +2,12 @@
 
 namespace DeepCopy\Matcher;
 
-/**
- * Matcher interface
- */
 interface Matcher
 {
     /**
      * @param object $object
      * @param string $property
+     *
      * @return boolean
      */
     public function matches($object, $property);
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php
index 03ef68c0..073b20cb 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php
@@ -3,7 +3,7 @@
 namespace DeepCopy\Matcher;
 
 /**
- * Match a specific property of a specific class
+ * @final
  */
 class PropertyMatcher implements Matcher
 {
@@ -28,10 +28,12 @@ class PropertyMatcher implements Matcher
     }
 
     /**
+     * Matches a specific property of a specific class.
+     *
      * {@inheritdoc}
      */
     public function matches($object, $property)
     {
-        return ($object instanceof $this->class) && ($property == $this->property);
+        return ($object instanceof $this->class) && $property == $this->property;
     }
 }
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php
index 9d9575f0..c8ec0d2b 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php
@@ -3,7 +3,7 @@
 namespace DeepCopy\Matcher;
 
 /**
- * Match a property by its name
+ * @final
  */
 class PropertyNameMatcher implements Matcher
 {
@@ -21,6 +21,8 @@ class PropertyNameMatcher implements Matcher
     }
 
     /**
+     * Matches a property by its name.
+     *
      * {@inheritdoc}
      */
     public function matches($object, $property)
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php
index da116c16..a6b0c0bc 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php
@@ -2,13 +2,16 @@
 
 namespace DeepCopy\Matcher;
 
-use ReflectionProperty;
+use DeepCopy\Reflection\ReflectionHelper;
+use ReflectionException;
 
 /**
- * Match a property by its type
+ * Matches a property by its type.
  *
  * It is recommended to use {@see DeepCopy\TypeFilter\TypeFilter} instead, as it applies on all occurrences
  * of given type in copied context (eg. array elements), not just on object properties.
+ *
+ * @final
  */
 class PropertyTypeMatcher implements Matcher
 {
@@ -30,7 +33,12 @@ class PropertyTypeMatcher implements Matcher
      */
     public function matches($object, $property)
     {
-        $reflectionProperty = new ReflectionProperty($object, $property);
+        try {
+            $reflectionProperty = ReflectionHelper::getProperty($object, $property);
+        } catch (ReflectionException $exception) {
+            return false;
+        }
+
         $reflectionProperty->setAccessible(true);
 
         return $reflectionProperty->getValue($object) instanceof $this->propertyType;
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php b/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php
index a094e729..742410cb 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php
@@ -2,6 +2,12 @@
 
 namespace DeepCopy\Reflection;
 
+use DeepCopy\Exception\PropertyException;
+use ReflectionClass;
+use ReflectionException;
+use ReflectionObject;
+use ReflectionProperty;
+
 class ReflectionHelper
 {
     /**
@@ -12,10 +18,11 @@ class ReflectionHelper
      * @author muratyaman@xxxxxxxxx
      * @see http://php.net/manual/en/reflectionclass.getproperties.php
      *
-     * @param \ReflectionClass $ref
-     * @return \ReflectionProperty[]
+     * @param ReflectionClass $ref
+     *
+     * @return ReflectionProperty[]
      */
-    public static function getProperties(\ReflectionClass $ref)
+    public static function getProperties(ReflectionClass $ref)
     {
         $props = $ref->getProperties();
         $propsArr = array();
@@ -36,4 +43,36 @@ class ReflectionHelper
 
         return $propsArr;
     }
+
+    /**
+     * Retrieves property by name from object and all its ancestors.
+     *
+     * @param object|string $object
+     * @param string $name
+     *
+     * @throws PropertyException
+     * @throws ReflectionException
+     *
+     * @return ReflectionProperty
+     */
+    public static function getProperty($object, $name)
+    {
+        $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object);
+
+        if ($reflection->hasProperty($name)) {
+            return $reflection->getProperty($name);
+        }
+
+        if ($parentClass = $reflection->getParentClass()) {
+            return self::getProperty($parentClass->getName(), $name);
+        }
+
+        throw new PropertyException(
+            sprintf(
+                'The class "%s" doesn\'t have a property with the given name: "%s".',
+                is_object($object) ? get_class($object) : $object,
+                $name
+            )
+        );
+    }
 }
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php
index 0e42b0fe..164f8b8e 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php
@@ -2,6 +2,9 @@
 
 namespace DeepCopy\TypeFilter;
 
+/**
+ * @final
+ */
 class ReplaceFilter implements TypeFilter
 {
     /**
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php
index 408d18bb..a5fbd7a2 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php
@@ -2,6 +2,9 @@
 
 namespace DeepCopy\TypeFilter;
 
+/**
+ * @final
+ */
 class ShallowCopyFilter implements TypeFilter
 {
     /**
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php
index 2bdc5373..c5644cff 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php
@@ -2,36 +2,9 @@
 
 namespace DeepCopy\TypeFilter\Spl;
 
-use DeepCopy\DeepCopy;
-use DeepCopy\TypeFilter\TypeFilter;
-
-class SplDoublyLinkedList implements TypeFilter
+/**
+ * @deprecated Use {@see SplDoublyLinkedListFilter} instead.
+ */
+class SplDoublyLinkedList extends SplDoublyLinkedListFilter
 {
-    /**
-     * @var DeepCopy
-     */
-    private $deepCopy;
-
-    public function __construct(DeepCopy $deepCopy)
-    {
-        $this->deepCopy = $deepCopy;
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function apply($element)
-    {
-        $newElement = clone $element;
-
-        if ($element instanceof \SplDoublyLinkedList) {
-            // Replace each element in the list with a deep copy of itself
-            for ($i = 1; $i <= $newElement->count(); $i++) {
-                $newElement->push($this->deepCopy->copy($newElement->shift()));
-            }
-        }
-
-        return $newElement;
-
-    }
 }
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php
index a37a8ba8..5785a7da 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php
@@ -5,7 +5,8 @@ namespace DeepCopy\TypeFilter;
 interface TypeFilter
 {
     /**
-     * Apply the filter to the object.
+     * Applies the filter to the object.
+     *
      * @param mixed $element
      */
     public function apply($element);
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php b/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php
index e640f31e..a563cb29 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php
@@ -2,9 +2,6 @@
 
 namespace DeepCopy\TypeMatcher;
 
-/**
- * TypeMatcher class
- */
 class TypeMatcher
 {
     /**
@@ -21,7 +18,8 @@ class TypeMatcher
     }
 
     /**
-     * @param $element
+     * @param mixed $element
+     *
      * @return boolean
      */
     public function matches($element)
diff --git a/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php b/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php
index 272652ca..55dcc926 100644
--- a/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php
+++ b/vendor/myclabs/deep-copy/src/DeepCopy/deep_copy.php
@@ -2,15 +2,19 @@
 
 namespace DeepCopy;
 
-/**
- * Deep copies the given value.
- *
- * @param mixed $value
- * @param bool  $useCloneMethod
- *
- * @return mixed
- */
-function deep_copy($value, $useCloneMethod = false)
-{
-    return (new DeepCopy($useCloneMethod))->copy($value);
+use function function_exists;
+
+if (false === function_exists('DeepCopy\deep_copy')) {
+    /**
+     * Deep copies the given value.
+     *
+     * @param mixed $value
+     * @param bool  $useCloneMethod
+     *
+     * @return mixed
+     */
+    function deep_copy($value, $useCloneMethod = false)
+    {
+        return (new DeepCopy($useCloneMethod))->copy($value);
+    }
 }
diff --git a/vendor/nikic/fast-route/.travis.yml b/vendor/nikic/fast-route/.travis.yml
index e16ed63b..10f83819 100644
--- a/vendor/nikic/fast-route/.travis.yml
+++ b/vendor/nikic/fast-route/.travis.yml
@@ -1,3 +1,4 @@
+sudo: false
 language: php
 
 php:
@@ -5,8 +6,15 @@ php:
   - 5.5
   - 5.6
   - 7.0
+  - 7.1
+  - 7.2
   - hhvm
 
-matrix:
-  allow_failures:
-    - php: 7.0
+script:
+  - ./vendor/bin/phpunit
+
+before_install:
+  - travis_retry composer self-update
+
+install:
+  - composer install
diff --git a/vendor/nikic/fast-route/FastRoute.hhi b/vendor/nikic/fast-route/FastRoute.hhi
index c34bb8ef..8d507384 100644
--- a/vendor/nikic/fast-route/FastRoute.hhi
+++ b/vendor/nikic/fast-route/FastRoute.hhi
@@ -34,21 +34,21 @@ namespace FastRoute {
     function simpleDispatcher(
         (function(RouteCollector): void) $routeDefinitionCallback,
         shape(
-          'routeParser' => ?classname<RouteParser>,
-          'dataGenerator' => ?classname<DataGenerator>,
-          'dispatcher' => ?classname<Dispatcher>,
-          'routeCollector' => ?classname<RouteCollector>,
+          ?'routeParser' => classname<RouteParser>,
+          ?'dataGenerator' => classname<DataGenerator>,
+          ?'dispatcher' => classname<Dispatcher>,
+          ?'routeCollector' => classname<RouteCollector>,
         ) $options = shape()): Dispatcher;
 
     function cachedDispatcher(
         (function(RouteCollector): void) $routeDefinitionCallback,
         shape(
-          'routeParser' => ?classname<RouteParser>,
-          'dataGenerator' => ?classname<DataGenerator>,
-          'dispatcher' => ?classname<Dispatcher>,
-          'routeCollector' => ?classname<RouteCollector>,
-          'cacheDisabled' => ?bool,
-          'cacheFile' => ?string,
+          ?'routeParser' => classname<RouteParser>,
+          ?'dataGenerator' => classname<DataGenerator>,
+          ?'dispatcher' => classname<Dispatcher>,
+          ?'routeCollector' => classname<RouteCollector>,
+          ?'cacheDisabled' => bool,
+          ?'cacheFile' => string,
         ) $options = shape()): Dispatcher;
 }
 
diff --git a/vendor/nikic/fast-route/composer.json b/vendor/nikic/fast-route/composer.json
index 62aad22b..fb446a2a 100644
--- a/vendor/nikic/fast-route/composer.json
+++ b/vendor/nikic/fast-route/composer.json
@@ -9,13 +9,16 @@
       "email": "nikic@xxxxxxx"
     }
   ],
-  "require": {
-    "php": ">=5.4.0"
-  },
   "autoload": {
     "psr-4": {
       "FastRoute\\": "src/"
     },
     "files": ["src/functions.php"]
+  },
+  "require": {
+    "php": ">=5.4.0"
+  },
+  "require-dev": {
+    "phpunit/phpunit": "^4.8.35|~5.7"
   }
 }
diff --git a/vendor/nikic/fast-route/psalm.xml b/vendor/nikic/fast-route/psalm.xml
new file mode 100644
index 00000000..0dca5d7e
--- /dev/null
+++ b/vendor/nikic/fast-route/psalm.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<psalm
+    name="Example Psalm config with recommended defaults"
+    stopOnFirstError="false"
+    useDocblockTypes="true"
+    totallyTyped="false"
+    requireVoidReturnType="false"
+>
+    <projectFiles>
+        <directory name="src" />
+    </projectFiles>
+
+    <issueHandlers>
+        <LessSpecificReturnType errorLevel="info" />
+
+        <!-- level 3 issues - slightly lazy code writing, but provably low false-negatives -->
+        <DeprecatedMethod errorLevel="info" />
+
+        <MissingClosureReturnType errorLevel="info" />
+        <MissingReturnType errorLevel="info" />
+        <MissingPropertyType errorLevel="info" />
+        <InvalidDocblock errorLevel="info" />
+        <MisplacedRequiredParam errorLevel="info" />
+
+        <PropertyNotSetInConstructor errorLevel="info" />
+        <MissingConstructor errorLevel="info" />
+    </issueHandlers>
+</psalm>
diff --git a/vendor/nikic/fast-route/src/BadRouteException.php b/vendor/nikic/fast-route/src/BadRouteException.php
index 7e384796..62262ec6 100644
--- a/vendor/nikic/fast-route/src/BadRouteException.php
+++ b/vendor/nikic/fast-route/src/BadRouteException.php
@@ -2,5 +2,6 @@
 
 namespace FastRoute;
 
-class BadRouteException extends \LogicException {
+class BadRouteException extends \LogicException
+{
 }
diff --git a/vendor/nikic/fast-route/src/DataGenerator.php b/vendor/nikic/fast-route/src/DataGenerator.php
index 16053db9..af577cd5 100644
--- a/vendor/nikic/fast-route/src/DataGenerator.php
+++ b/vendor/nikic/fast-route/src/DataGenerator.php
@@ -2,7 +2,8 @@
 
 namespace FastRoute;
 
-interface DataGenerator {
+interface DataGenerator
+{
     /**
      * Adds a route to the data generator. The route data uses the
      * same format that is returned by RouterParser::parser().
diff --git a/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php b/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php
index 5c38b89e..3cfeed66 100644
--- a/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php
+++ b/vendor/nikic/fast-route/src/DataGenerator/CharCountBased.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\DataGenerator;
 
-class CharCountBased extends RegexBasedAbstract {
-    protected function getApproxChunkSize() {
+class CharCountBased extends RegexBasedAbstract
+{
+    protected function getApproxChunkSize()
+    {
         return 30;
     }
 
-    protected function processChunk($regexToRoutesMap) {
+    protected function processChunk($regexToRoutesMap)
+    {
         $routeMap = [];
         $regexes = [];
 
diff --git a/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php b/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php
index d51807f0..54d9a05e 100644
--- a/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php
+++ b/vendor/nikic/fast-route/src/DataGenerator/GroupCountBased.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\DataGenerator;
 
-class GroupCountBased extends RegexBasedAbstract {
-    protected function getApproxChunkSize() {
+class GroupCountBased extends RegexBasedAbstract
+{
+    protected function getApproxChunkSize()
+    {
         return 10;
     }
 
-    protected function processChunk($regexToRoutesMap) {
+    protected function processChunk($regexToRoutesMap)
+    {
         $routeMap = [];
         $regexes = [];
         $numGroups = 0;
@@ -25,4 +28,3 @@ class GroupCountBased extends RegexBasedAbstract {
         return ['regex' => $regex, 'routeMap' => $routeMap];
     }
 }
-
diff --git a/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php b/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php
index 4152f7a7..fc4dc0af 100644
--- a/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php
+++ b/vendor/nikic/fast-route/src/DataGenerator/GroupPosBased.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\DataGenerator;
 
-class GroupPosBased extends RegexBasedAbstract {
-    protected function getApproxChunkSize() {
+class GroupPosBased extends RegexBasedAbstract
+{
+    protected function getApproxChunkSize()
+    {
         return 10;
     }
 
-    protected function processChunk($regexToRoutesMap) {
+    protected function processChunk($regexToRoutesMap)
+    {
         $routeMap = [];
         $regexes = [];
         $offset = 1;
@@ -22,4 +25,3 @@ class GroupPosBased extends RegexBasedAbstract {
         return ['regex' => $regex, 'routeMap' => $routeMap];
     }
 }
-
diff --git a/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php b/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php
index 61359f5e..0aebed9a 100644
--- a/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php
+++ b/vendor/nikic/fast-route/src/DataGenerator/MarkBased.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\DataGenerator;
 
-class MarkBased extends RegexBasedAbstract {
-    protected function getApproxChunkSize() {
+class MarkBased extends RegexBasedAbstract
+{
+    protected function getApproxChunkSize()
+    {
         return 30;
     }
 
-    protected function processChunk($regexToRoutesMap) {
+    protected function processChunk($regexToRoutesMap)
+    {
         $routeMap = [];
         $regexes = [];
         $markName = 'a';
@@ -22,4 +25,3 @@ class MarkBased extends RegexBasedAbstract {
         return ['regex' => $regex, 'routeMap' => $routeMap];
     }
 }
-
diff --git a/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php b/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
index 713d8972..64572905 100644
--- a/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
+++ b/vendor/nikic/fast-route/src/DataGenerator/RegexBasedAbstract.php
@@ -2,18 +2,30 @@
 
 namespace FastRoute\DataGenerator;
 
-use FastRoute\DataGenerator;
 use FastRoute\BadRouteException;
+use FastRoute\DataGenerator;
 use FastRoute\Route;
 
-abstract class RegexBasedAbstract implements DataGenerator {
+abstract class RegexBasedAbstract implements DataGenerator
+{
+    /** @var mixed[][] */
     protected $staticRoutes = [];
+
+    /** @var Route[][] */
     protected $methodToRegexToRoutesMap = [];
 
-    protected abstract function getApproxChunkSize();
-    protected abstract function processChunk($regexToRoutesMap);
+    /**
+     * @return int
+     */
+    abstract protected function getApproxChunkSize();
+
+    /**
+     * @return mixed[]
+     */
+    abstract protected function processChunk($regexToRoutesMap);
 
-    public function addRoute($httpMethod, $routeData, $handler) {
+    public function addRoute($httpMethod, $routeData, $handler)
+    {
         if ($this->isStaticRoute($routeData)) {
             $this->addStaticRoute($httpMethod, $routeData, $handler);
         } else {
@@ -21,7 +33,11 @@ abstract class RegexBasedAbstract implements DataGenerator {
         }
     }
 
-    public function getData() {
+    /**
+     * @return mixed[]
+     */
+    public function getData()
+    {
         if (empty($this->methodToRegexToRoutesMap)) {
             return [$this->staticRoutes, []];
         }
@@ -29,26 +45,41 @@ abstract class RegexBasedAbstract implements DataGenerator {
         return [$this->staticRoutes, $this->generateVariableRouteData()];
     }
 
-    private function generateVariableRouteData() {
+    /**
+     * @return mixed[]
+     */
+    private function generateVariableRouteData()
+    {
         $data = [];
         foreach ($this->methodToRegexToRoutesMap as $method => $regexToRoutesMap) {
             $chunkSize = $this->computeChunkSize(count($regexToRoutesMap));
             $chunks = array_chunk($regexToRoutesMap, $chunkSize, true);
-            $data[$method] =  array_map([$this, 'processChunk'], $chunks);
+            $data[$method] = array_map([$this, 'processChunk'], $chunks);
         }
         return $data;
     }
 
-    private function computeChunkSize($count) {
+    /**
+     * @param int
+     * @return int
+     */
+    private function computeChunkSize($count)
+    {
         $numParts = max(1, round($count / $this->getApproxChunkSize()));
-        return ceil($count / $numParts);
+        return (int) ceil($count / $numParts);
     }
 
-    private function isStaticRoute($routeData) {
+    /**
+     * @param mixed[]
+     * @return bool
+     */
+    private function isStaticRoute($routeData)
+    {
         return count($routeData) === 1 && is_string($routeData[0]);
     }
 
-    private function addStaticRoute($httpMethod, $routeData, $handler) {
+    private function addStaticRoute($httpMethod, $routeData, $handler)
+    {
         $routeStr = $routeData[0];
 
         if (isset($this->staticRoutes[$httpMethod][$routeStr])) {
@@ -72,7 +103,8 @@ abstract class RegexBasedAbstract implements DataGenerator {
         $this->staticRoutes[$httpMethod][$routeStr] = $handler;
     }
 
-    private function addVariableRoute($httpMethod, $routeData, $handler) {
+    private function addVariableRoute($httpMethod, $routeData, $handler)
+    {
         list($regex, $variables) = $this->buildRegexForRoute($routeData);
 
         if (isset($this->methodToRegexToRoutesMap[$httpMethod][$regex])) {
@@ -87,7 +119,12 @@ abstract class RegexBasedAbstract implements DataGenerator {
         );
     }
 
-    private function buildRegexForRoute($routeData) {
+    /**
+     * @param mixed[]
+     * @return mixed[]
+     */
+    private function buildRegexForRoute($routeData)
+    {
         $regex = '';
         $variables = [];
         foreach ($routeData as $part) {
@@ -118,14 +155,19 @@ abstract class RegexBasedAbstract implements DataGenerator {
         return [$regex, $variables];
     }
 
-    private function regexHasCapturingGroups($regex) {
+    /**
+     * @param string
+     * @return bool
+     */
+    private function regexHasCapturingGroups($regex)
+    {
         if (false === strpos($regex, '(')) {
             // Needs to have at least a ( to contain a capturing group
             return false;
         }
 
         // Semi-accurate detection for capturing groups
-        return preg_match(
+        return (bool) preg_match(
             '~
                 (?:
                     \(\?\(
diff --git a/vendor/nikic/fast-route/src/Dispatcher.php b/vendor/nikic/fast-route/src/Dispatcher.php
index ea98009b..4ae72a35 100644
--- a/vendor/nikic/fast-route/src/Dispatcher.php
+++ b/vendor/nikic/fast-route/src/Dispatcher.php
@@ -2,7 +2,8 @@
 
 namespace FastRoute;
 
-interface Dispatcher {
+interface Dispatcher
+{
     const NOT_FOUND = 0;
     const FOUND = 1;
     const METHOD_NOT_ALLOWED = 2;
diff --git a/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php b/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php
index 22ba2406..ef1eec13 100644
--- a/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php
+++ b/vendor/nikic/fast-route/src/Dispatcher/CharCountBased.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\Dispatcher;
 
-class CharCountBased extends RegexBasedAbstract {
-    public function __construct($data) {
+class CharCountBased extends RegexBasedAbstract
+{
+    public function __construct($data)
+    {
         list($this->staticRouteMap, $this->variableRouteData) = $data;
     }
 
-    protected function dispatchVariableRoute($routeData, $uri) {
+    protected function dispatchVariableRoute($routeData, $uri)
+    {
         foreach ($routeData as $data) {
             if (!preg_match($data['regex'], $uri . $data['suffix'], $matches)) {
                 continue;
diff --git a/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php b/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php
index 0abd3223..493e7a94 100644
--- a/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php
+++ b/vendor/nikic/fast-route/src/Dispatcher/GroupCountBased.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\Dispatcher;
 
-class GroupCountBased extends RegexBasedAbstract {
-    public function __construct($data) {
+class GroupCountBased extends RegexBasedAbstract
+{
+    public function __construct($data)
+    {
         list($this->staticRouteMap, $this->variableRouteData) = $data;
     }
 
-    protected function dispatchVariableRoute($routeData, $uri) {
+    protected function dispatchVariableRoute($routeData, $uri)
+    {
         foreach ($routeData as $data) {
             if (!preg_match($data['regex'], $uri, $matches)) {
                 continue;
diff --git a/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php b/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php
index 32227d49..498220ed 100644
--- a/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php
+++ b/vendor/nikic/fast-route/src/Dispatcher/GroupPosBased.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\Dispatcher;
 
-class GroupPosBased extends RegexBasedAbstract {
-    public function __construct($data) {
+class GroupPosBased extends RegexBasedAbstract
+{
+    public function __construct($data)
+    {
         list($this->staticRouteMap, $this->variableRouteData) = $data;
     }
 
-    protected function dispatchVariableRoute($routeData, $uri) {
+    protected function dispatchVariableRoute($routeData, $uri)
+    {
         foreach ($routeData as $data) {
             if (!preg_match($data['regex'], $uri, $matches)) {
                 continue;
diff --git a/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php b/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php
index fefa7118..22eb09ba 100644
--- a/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php
+++ b/vendor/nikic/fast-route/src/Dispatcher/MarkBased.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\Dispatcher;
 
-class MarkBased extends RegexBasedAbstract {
-    public function __construct($data) {
+class MarkBased extends RegexBasedAbstract
+{
+    public function __construct($data)
+    {
         list($this->staticRouteMap, $this->variableRouteData) = $data;
     }
 
-    protected function dispatchVariableRoute($routeData, $uri) {
+    protected function dispatchVariableRoute($routeData, $uri)
+    {
         foreach ($routeData as $data) {
             if (!preg_match($data['regex'], $uri, $matches)) {
                 continue;
diff --git a/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php b/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php
index 8823b9b2..206e879f 100644
--- a/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php
+++ b/vendor/nikic/fast-route/src/Dispatcher/RegexBasedAbstract.php
@@ -4,13 +4,21 @@ namespace FastRoute\Dispatcher;
 
 use FastRoute\Dispatcher;
 
-abstract class RegexBasedAbstract implements Dispatcher {
-    protected $staticRouteMap;
-    protected $variableRouteData;
+abstract class RegexBasedAbstract implements Dispatcher
+{
+    /** @var mixed[][] */
+    protected $staticRouteMap = [];
 
-    protected abstract function dispatchVariableRoute($routeData, $uri);
+    /** @var mixed[] */
+    protected $variableRouteData = [];
 
-    public function dispatch($httpMethod, $uri) {
+    /**
+     * @return mixed[]
+     */
+    abstract protected function dispatchVariableRoute($routeData, $uri);
+
+    public function dispatch($httpMethod, $uri)
+    {
         if (isset($this->staticRouteMap[$httpMethod][$uri])) {
             $handler = $this->staticRouteMap[$httpMethod][$uri];
             return [self::FOUND, $handler, []];
@@ -73,8 +81,8 @@ abstract class RegexBasedAbstract implements Dispatcher {
         // If there are no allowed methods the route simply does not exist
         if ($allowedMethods) {
             return [self::METHOD_NOT_ALLOWED, $allowedMethods];
-        } else {
-            return [self::NOT_FOUND];
         }
+
+        return [self::NOT_FOUND];
     }
 }
diff --git a/vendor/nikic/fast-route/src/Route.php b/vendor/nikic/fast-route/src/Route.php
index d71ded18..e1bf7dd9 100644
--- a/vendor/nikic/fast-route/src/Route.php
+++ b/vendor/nikic/fast-route/src/Route.php
@@ -2,10 +2,18 @@
 
 namespace FastRoute;
 
-class Route {
+class Route
+{
+    /** @var string */
     public $httpMethod;
+
+    /** @var string */
     public $regex;
+
+    /** @var array */
     public $variables;
+
+    /** @var mixed */
     public $handler;
 
     /**
@@ -16,7 +24,8 @@ class Route {
      * @param string $regex
      * @param array  $variables
      */
-    public function __construct($httpMethod, $handler, $regex, $variables) {
+    public function __construct($httpMethod, $handler, $regex, $variables)
+    {
         $this->httpMethod = $httpMethod;
         $this->handler = $handler;
         $this->regex = $regex;
@@ -30,9 +39,9 @@ class Route {
      *
      * @return bool
      */
-    public function matches($str) {
+    public function matches($str)
+    {
         $regex = '~^' . $this->regex . '$~';
         return (bool) preg_match($regex, $str);
     }
 }
-
diff --git a/vendor/nikic/fast-route/src/RouteCollector.php b/vendor/nikic/fast-route/src/RouteCollector.php
index 7d7667b1..c1c1762d 100644
--- a/vendor/nikic/fast-route/src/RouteCollector.php
+++ b/vendor/nikic/fast-route/src/RouteCollector.php
@@ -2,9 +2,15 @@
 
 namespace FastRoute;
 
-class RouteCollector {
+class RouteCollector
+{
+    /** @var RouteParser */
     protected $routeParser;
+
+    /** @var DataGenerator */
     protected $dataGenerator;
+
+    /** @var string */
     protected $currentGroupPrefix;
 
     /**
@@ -13,7 +19,8 @@ class RouteCollector {
      * @param RouteParser   $routeParser
      * @param DataGenerator $dataGenerator
      */
-    public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator) {
+    public function __construct(RouteParser $routeParser, DataGenerator $dataGenerator)
+    {
         $this->routeParser = $routeParser;
         $this->dataGenerator = $dataGenerator;
         $this->currentGroupPrefix = '';
@@ -28,7 +35,8 @@ class RouteCollector {
      * @param string $route
      * @param mixed  $handler
      */
-    public function addRoute($httpMethod, $route, $handler) {
+    public function addRoute($httpMethod, $route, $handler)
+    {
         $route = $this->currentGroupPrefix . $route;
         $routeDatas = $this->routeParser->parse($route);
         foreach ((array) $httpMethod as $method) {
@@ -46,13 +54,14 @@ class RouteCollector {
      * @param string $prefix
      * @param callable $callback
      */
-    public function addGroup($prefix, callable $callback) {
+    public function addGroup($prefix, callable $callback)
+    {
         $previousGroupPrefix = $this->currentGroupPrefix;
         $this->currentGroupPrefix = $previousGroupPrefix . $prefix;
         $callback($this);
         $this->currentGroupPrefix = $previousGroupPrefix;
     }
-    
+
     /**
      * Adds a GET route to the collection
      * 
@@ -61,10 +70,11 @@ class RouteCollector {
      * @param string $route
      * @param mixed  $handler
      */
-    public function get($route, $handler) {
+    public function get($route, $handler)
+    {
         $this->addRoute('GET', $route, $handler);
     }
-    
+
     /**
      * Adds a POST route to the collection
      * 
@@ -73,10 +83,11 @@ class RouteCollector {
      * @param string $route
      * @param mixed  $handler
      */
-    public function post($route, $handler) {
+    public function post($route, $handler)
+    {
         $this->addRoute('POST', $route, $handler);
     }
-    
+
     /**
      * Adds a PUT route to the collection
      * 
@@ -85,10 +96,11 @@ class RouteCollector {
      * @param string $route
      * @param mixed  $handler
      */
-    public function put($route, $handler) {
+    public function put($route, $handler)
+    {
         $this->addRoute('PUT', $route, $handler);
     }
-    
+
     /**
      * Adds a DELETE route to the collection
      * 
@@ -97,10 +109,11 @@ class RouteCollector {
      * @param string $route
      * @param mixed  $handler
      */
-    public function delete($route, $handler) {
+    public function delete($route, $handler)
+    {
         $this->addRoute('DELETE', $route, $handler);
     }
-    
+
     /**
      * Adds a PATCH route to the collection
      * 
@@ -109,7 +122,8 @@ class RouteCollector {
      * @param string $route
      * @param mixed  $handler
      */
-    public function patch($route, $handler) {
+    public function patch($route, $handler)
+    {
         $this->addRoute('PATCH', $route, $handler);
     }
 
@@ -121,7 +135,8 @@ class RouteCollector {
      * @param string $route
      * @param mixed  $handler
      */
-    public function head($route, $handler) {
+    public function head($route, $handler)
+    {
         $this->addRoute('HEAD', $route, $handler);
     }
 
@@ -130,7 +145,8 @@ class RouteCollector {
      *
      * @return array
      */
-    public function getData() {
+    public function getData()
+    {
         return $this->dataGenerator->getData();
     }
 }
diff --git a/vendor/nikic/fast-route/src/RouteParser.php b/vendor/nikic/fast-route/src/RouteParser.php
index c089c315..6a7685cf 100644
--- a/vendor/nikic/fast-route/src/RouteParser.php
+++ b/vendor/nikic/fast-route/src/RouteParser.php
@@ -2,7 +2,8 @@
 
 namespace FastRoute;
 
-interface RouteParser {
+interface RouteParser
+{
     /**
      * Parses a route string into multiple route data arrays.
      *
@@ -29,7 +30,7 @@ interface RouteParser {
      * Here one route string was converted into two route data arrays.
      *
      * @param string $route Route string to parse
-     * 
+     *
      * @return mixed[][] Array of route data arrays
      */
     public function parse($route);
diff --git a/vendor/nikic/fast-route/src/RouteParser/Std.php b/vendor/nikic/fast-route/src/RouteParser/Std.php
index a6c21bdc..4fbdee12 100644
--- a/vendor/nikic/fast-route/src/RouteParser/Std.php
+++ b/vendor/nikic/fast-route/src/RouteParser/Std.php
@@ -10,7 +10,8 @@ use FastRoute\RouteParser;
  *
  * "/user/{name}[/{id:[0-9]+}]"
  */
-class Std implements RouteParser {
+class Std implements RouteParser
+{
     const VARIABLE_REGEX = <<<'REGEX'
 \{
     \s* ([a-zA-Z_][a-zA-Z0-9_-]*) \s*
@@ -21,7 +22,8 @@ class Std implements RouteParser {
 REGEX;
     const DEFAULT_DISPATCH_REGEX = '[^/]+';
 
-    public function parse($route) {
+    public function parse($route)
+    {
         $routeWithoutClosingOptionals = rtrim($route, ']');
         $numOptionals = strlen($route) - strlen($routeWithoutClosingOptionals);
 
@@ -30,7 +32,7 @@ REGEX;
         if ($numOptionals !== count($segments) - 1) {
             // If there are any ] in the middle of the route, throw a more specific error message
             if (preg_match('~' . self::VARIABLE_REGEX . '(*SKIP)(*F) | \]~x', $routeWithoutClosingOptionals)) {
-                throw new BadRouteException("Optional segments can only occur at the end of a route");
+                throw new BadRouteException('Optional segments can only occur at the end of a route');
             }
             throw new BadRouteException("Number of opening '[' and closing ']' does not match");
         }
@@ -39,7 +41,7 @@ REGEX;
         $routeDatas = [];
         foreach ($segments as $n => $segment) {
             if ($segment === '' && $n !== 0) {
-                throw new BadRouteException("Empty optional part");
+                throw new BadRouteException('Empty optional part');
             }
 
             $currentRoute .= $segment;
@@ -50,8 +52,12 @@ REGEX;
 
     /**
      * Parses a route string that does not contain optional segments.
+     *
+     * @param string
+     * @return mixed[]
      */
-    private function parsePlaceholders($route) {
+    private function parsePlaceholders($route)
+    {
         if (!preg_match_all(
             '~' . self::VARIABLE_REGEX . '~x', $route, $matches,
             PREG_OFFSET_CAPTURE | PREG_SET_ORDER
@@ -72,7 +78,7 @@ REGEX;
             $offset = $set[0][1] + strlen($set[0][0]);
         }
 
-        if ($offset != strlen($route)) {
+        if ($offset !== strlen($route)) {
             $routeData[] = substr($route, $offset);
         }
 
diff --git a/vendor/nikic/fast-route/src/bootstrap.php b/vendor/nikic/fast-route/src/bootstrap.php
index add216c7..0bce3a42 100644
--- a/vendor/nikic/fast-route/src/bootstrap.php
+++ b/vendor/nikic/fast-route/src/bootstrap.php
@@ -4,7 +4,7 @@ namespace FastRoute;
 
 require __DIR__ . '/functions.php';
 
-spl_autoload_register(function($class) {
+spl_autoload_register(function ($class) {
     if (strpos($class, 'FastRoute\\') === 0) {
         $name = substr($class, strlen('FastRoute'));
         require __DIR__ . strtr($name, '\\', DIRECTORY_SEPARATOR) . '.php';
diff --git a/vendor/nikic/fast-route/src/functions.php b/vendor/nikic/fast-route/src/functions.php
index 46bc805a..876a5d96 100644
--- a/vendor/nikic/fast-route/src/functions.php
+++ b/vendor/nikic/fast-route/src/functions.php
@@ -9,7 +9,8 @@ if (!function_exists('FastRoute\simpleDispatcher')) {
      *
      * @return Dispatcher
      */
-    function simpleDispatcher(callable $routeDefinitionCallback, array $options = []) {
+    function simpleDispatcher(callable $routeDefinitionCallback, array $options = [])
+    {
         $options += [
             'routeParser' => 'FastRoute\\RouteParser\\Std',
             'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
@@ -32,7 +33,8 @@ if (!function_exists('FastRoute\simpleDispatcher')) {
      *
      * @return Dispatcher
      */
-    function cachedDispatcher(callable $routeDefinitionCallback, array $options = []) {
+    function cachedDispatcher(callable $routeDefinitionCallback, array $options = [])
+    {
         $options += [
             'routeParser' => 'FastRoute\\RouteParser\\Std',
             'dataGenerator' => 'FastRoute\\DataGenerator\\GroupCountBased',
diff --git a/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php
index 8168498e..e15ff8b7 100644
--- a/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php
+++ b/vendor/nikic/fast-route/test/Dispatcher/CharCountBasedTest.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\Dispatcher;
 
-class CharCountBasedTest extends DispatcherTest {
-    protected function getDispatcherClass() {
+class CharCountBasedTest extends DispatcherTest
+{
+    protected function getDispatcherClass()
+    {
         return 'FastRoute\\Dispatcher\\CharCountBased';
     }
 
-    protected function getDataGeneratorClass() {
+    protected function getDataGeneratorClass()
+    {
         return 'FastRoute\\DataGenerator\\CharCountBased';
     }
 }
diff --git a/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php b/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php
index a6d6205b..c2edf8c0 100644
--- a/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php
+++ b/vendor/nikic/fast-route/test/Dispatcher/DispatcherTest.php
@@ -3,9 +3,10 @@
 namespace FastRoute\Dispatcher;
 
 use FastRoute\RouteCollector;
+use PHPUnit\Framework\TestCase;
 
-abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
-
+abstract class DispatcherTest extends TestCase
+{
     /**
      * Delegate dispatcher selection to child test classes
      */
@@ -19,7 +20,8 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
     /**
      * Set appropriate options for the specific Dispatcher class we're testing
      */
-    private function generateDispatcherOptions() {
+    private function generateDispatcherOptions()
+    {
         return [
             'dataGenerator' => $this->getDataGeneratorClass(),
             'dispatcher' => $this->getDispatcherClass()
@@ -29,7 +31,8 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
     /**
      * @dataProvider provideFoundDispatchCases
      */
-    public function testFoundDispatches($method, $uri, $callback, $handler, $argDict) {
+    public function testFoundDispatches($method, $uri, $callback, $handler, $argDict)
+    {
         $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
         $info = $dispatcher->dispatch($method, $uri);
         $this->assertSame($dispatcher::FOUND, $info[0]);
@@ -40,11 +43,12 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
     /**
      * @dataProvider provideNotFoundDispatchCases
      */
-    public function testNotFoundDispatches($method, $uri, $callback) {
+    public function testNotFoundDispatches($method, $uri, $callback)
+    {
         $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
         $routeInfo = $dispatcher->dispatch($method, $uri);
-        $this->assertFalse(isset($routeInfo[1]),
-            "NOT_FOUND result must only contain a single element in the returned info array"
+        $this->assertArrayNotHasKey(1, $routeInfo,
+            'NOT_FOUND result must only contain a single element in the returned info array'
         );
         $this->assertSame($dispatcher::NOT_FOUND, $routeInfo[0]);
     }
@@ -52,11 +56,12 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
     /**
      * @dataProvider provideMethodNotAllowedDispatchCases
      */
-    public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods) {
+    public function testMethodNotAllowedDispatches($method, $uri, $callback, $availableMethods)
+    {
         $dispatcher = \FastRoute\simpleDispatcher($callback, $this->generateDispatcherOptions());
         $routeInfo = $dispatcher->dispatch($method, $uri);
-        $this->assertTrue(isset($routeInfo[1]),
-            "METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1"
+        $this->assertArrayHasKey(1, $routeInfo,
+            'METHOD_NOT_ALLOWED result must return an array of allowed methods at index 1'
         );
 
         list($routedStatus, $methodArray) = $dispatcher->dispatch($method, $uri);
@@ -68,8 +73,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
      * @expectedException \FastRoute\BadRouteException
      * @expectedExceptionMessage Cannot use the same placeholder "test" twice
      */
-    public function testDuplicateVariableNameError() {
-        \FastRoute\simpleDispatcher(function(RouteCollector $r) {
+    public function testDuplicateVariableNameError()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
             $r->addRoute('GET', '/foo/{test}/{test:\d+}', 'handler0');
         }, $this->generateDispatcherOptions());
     }
@@ -78,8 +84,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
      * @expectedException \FastRoute\BadRouteException
      * @expectedExceptionMessage Cannot register two routes matching "/user/([^/]+)" for method "GET"
      */
-    public function testDuplicateVariableRoute() {
-        \FastRoute\simpleDispatcher(function(RouteCollector $r) {
+    public function testDuplicateVariableRoute()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{id}', 'handler0'); // oops, forgot \d+ restriction ;)
             $r->addRoute('GET', '/user/{name}', 'handler1');
         }, $this->generateDispatcherOptions());
@@ -89,8 +96,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
      * @expectedException \FastRoute\BadRouteException
      * @expectedExceptionMessage Cannot register two routes matching "/user" for method "GET"
      */
-    public function testDuplicateStaticRoute() {
-        \FastRoute\simpleDispatcher(function(RouteCollector $r) {
+    public function testDuplicateStaticRoute()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
             $r->addRoute('GET', '/user', 'handler0');
             $r->addRoute('GET', '/user', 'handler1');
         }, $this->generateDispatcherOptions());
@@ -100,8 +108,9 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
      * @expectedException \FastRoute\BadRouteException
      * @expectedExceptionMessage Static route "/user/nikic" is shadowed by previously defined variable route "/user/([^/]+)" for method "GET"
      */
-    public function testShadowedStaticRoute() {
-        \FastRoute\simpleDispatcher(function(RouteCollector $r) {
+    public function testShadowedStaticRoute()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{name}', 'handler0');
             $r->addRoute('GET', '/user/nikic', 'handler1');
         }, $this->generateDispatcherOptions());
@@ -111,18 +120,20 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
      * @expectedException \FastRoute\BadRouteException
      * @expectedExceptionMessage Regex "(en|de)" for parameter "lang" contains a capturing group
      */
-    public function testCapturing() {
-        \FastRoute\simpleDispatcher(function(RouteCollector $r) {
+    public function testCapturing()
+    {
+        \FastRoute\simpleDispatcher(function (RouteCollector $r) {
             $r->addRoute('GET', '/{lang:(en|de)}', 'handler0');
         }, $this->generateDispatcherOptions());
     }
 
-    public function provideFoundDispatchCases() {
+    public function provideFoundDispatchCases()
+    {
         $cases = [];
 
         // 0 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/resource/123/456', 'handler0');
         };
 
@@ -135,7 +146,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 1 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/handler0', 'handler0');
             $r->addRoute('GET', '/handler1', 'handler1');
             $r->addRoute('GET', '/handler2', 'handler2');
@@ -150,7 +161,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 2 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
             $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
             $r->addRoute('GET', '/user/{name}', 'handler2');
@@ -198,11 +209,10 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 6 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler0');
             $r->addRoute('GET', '/user/12345/extension', 'handler1');
             $r->addRoute('GET', '/user/{id:[0-9]+}.{extension}', 'handler2');
-
         };
 
         $method = 'GET';
@@ -214,7 +224,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 7 ----- Test GET method fallback on HEAD route miss ------------------------------------>
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{name}', 'handler0');
             $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler1');
             $r->addRoute('GET', '/static0', 'handler2');
@@ -264,7 +274,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 11 ---- More specified routes are not shadowed by less specific of another method ------>
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{name}', 'handler0');
             $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1');
         };
@@ -278,7 +288,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 12 ---- Handler of more specific routes is used, if it occurs first -------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{name}', 'handler0');
             $r->addRoute('POST', '/user/{name:[a-z]+}', 'handler1');
             $r->addRoute('POST', '/user/{name}', 'handler2');
@@ -293,7 +303,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 13 ---- Route with constant suffix ----------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{name}', 'handler0');
             $r->addRoute('GET', '/user/{name}/edit', 'handler1');
         };
@@ -307,7 +317,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 14 ---- Handle multiple methods with the same handler ---------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost');
             $r->addRoute(['DELETE'], '/user', 'handlerDelete');
             $r->addRoute([], '/user', 'handlerNone');
@@ -318,53 +328,53 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
         $cases[] = ['POST', '/user', $callback, 'handlerGetPost', $argDict];
         $cases[] = ['DELETE', '/user', $callback, 'handlerDelete', $argDict];
 
-        // 15 ----
+        // 17 ----
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('POST', '/user.json', 'handler0');
             $r->addRoute('GET', '/{entity}.json', 'handler1');
         };
 
         $cases[] = ['GET', '/user.json', $callback, 'handler1', ['entity' => 'user']];
 
-        // 16 ----
+        // 18 ----
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '', 'handler0');
         };
 
         $cases[] = ['GET', '', $callback, 'handler0', []];
 
-        // 17 ----
+        // 19 ----
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('HEAD', '/a/{foo}', 'handler0');
             $r->addRoute('GET', '/b/{foo}', 'handler1');
         };
 
         $cases[] = ['HEAD', '/b/bar', $callback, 'handler1', ['foo' => 'bar']];
 
-        // 18 ----
+        // 20 ----
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('HEAD', '/a', 'handler0');
             $r->addRoute('GET', '/b', 'handler1');
         };
 
         $cases[] = ['HEAD', '/b', $callback, 'handler1', []];
 
-        // 19 ----
+        // 21 ----
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/foo', 'handler0');
             $r->addRoute('HEAD', '/{bar}', 'handler1');
         };
 
         $cases[] = ['HEAD', '/foo', $callback, 'handler1', ['bar' => 'foo']];
 
-        // 20 ----
+        // 22 ----
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('*', '/user', 'handler0');
             $r->addRoute('*', '/{user}', 'handler1');
             $r->addRoute('GET', '/user', 'handler2');
@@ -372,39 +382,49 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         $cases[] = ['GET', '/user', $callback, 'handler2', []];
 
-        // 21 ----
+        // 23 ----
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('*', '/user', 'handler0');
             $r->addRoute('GET', '/user', 'handler1');
         };
 
         $cases[] = ['POST', '/user', $callback, 'handler0', []];
 
-        // 22 ----
+        // 24 ----
 
         $cases[] = ['HEAD', '/user', $callback, 'handler1', []];
 
-        // 23 ----
+        // 25 ----
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/{bar}', 'handler0');
             $r->addRoute('*', '/foo', 'handler1');
         };
 
         $cases[] = ['GET', '/foo', $callback, 'handler0', ['bar' => 'foo']];
 
+        // 26 ----
+
+        $callback = function(RouteCollector $r) {
+            $r->addRoute('GET', '/user', 'handler0');
+            $r->addRoute('*', '/{foo:.*}', 'handler1');
+        };
+
+        $cases[] = ['POST', '/bar', $callback, 'handler1', ['foo' => 'bar']];
+
         // x -------------------------------------------------------------------------------------->
 
         return $cases;
     }
 
-    public function provideNotFoundDispatchCases() {
+    public function provideNotFoundDispatchCases()
+    {
         $cases = [];
 
         // 0 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/resource/123/456', 'handler0');
         };
 
@@ -431,7 +451,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 3 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/handler0', 'handler0');
             $r->addRoute('GET', '/handler1', 'handler1');
             $r->addRoute('GET', '/handler2', 'handler2');
@@ -444,7 +464,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 4 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
             $r->addRoute('GET', '/user/{id:[0-9]+}', 'handler1');
             $r->addRoute('GET', '/user/{name}', 'handler2');
@@ -468,19 +488,20 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
         // reuse callback from #5
         $method = 'HEAD';
 
-        $cases[] = array($method, $uri, $callback);
+        $cases[] = [$method, $uri, $callback];
 
         // x -------------------------------------------------------------------------------------->
 
         return $cases;
     }
 
-    public function provideMethodNotAllowedDispatchCases() {
+    public function provideMethodNotAllowedDispatchCases()
+    {
         $cases = [];
 
         // 0 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/resource/123/456', 'handler0');
         };
 
@@ -492,7 +513,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 1 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/resource/123/456', 'handler0');
             $r->addRoute('POST', '/resource/123/456', 'handler1');
             $r->addRoute('PUT', '/resource/123/456', 'handler2');
@@ -507,7 +528,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 2 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('GET', '/user/{name}/{id:[0-9]+}', 'handler0');
             $r->addRoute('POST', '/user/{name}/{id:[0-9]+}', 'handler1');
             $r->addRoute('PUT', '/user/{name}/{id:[0-9]+}', 'handler2');
@@ -522,7 +543,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 3 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('POST', '/user/{name}', 'handler1');
             $r->addRoute('PUT', '/user/{name:[a-z]+}', 'handler2');
             $r->addRoute('PATCH', '/user/{name:[a-z]+}', 'handler3');
@@ -536,7 +557,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 4 -------------------------------------------------------------------------------------->
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute(['GET', 'POST'], '/user', 'handlerGetPost');
             $r->addRoute(['DELETE'], '/user', 'handlerDelete');
             $r->addRoute([], '/user', 'handlerNone');
@@ -546,7 +567,7 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         // 5
 
-        $callback = function(RouteCollector $r) {
+        $callback = function (RouteCollector $r) {
             $r->addRoute('POST', '/user.json', 'handler0');
             $r->addRoute('GET', '/{entity}.json', 'handler1');
         };
@@ -557,5 +578,4 @@ abstract class DispatcherTest extends \PHPUnit_Framework_TestCase {
 
         return $cases;
     }
-
 }
diff --git a/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php
index 74820fca..f821ef56 100644
--- a/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php
+++ b/vendor/nikic/fast-route/test/Dispatcher/GroupCountBasedTest.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\Dispatcher;
 
-class GroupCountBasedTest extends DispatcherTest {
-    protected function getDispatcherClass() {
+class GroupCountBasedTest extends DispatcherTest
+{
+    protected function getDispatcherClass()
+    {
         return 'FastRoute\\Dispatcher\\GroupCountBased';
     }
 
-    protected function getDataGeneratorClass() {
+    protected function getDataGeneratorClass()
+    {
         return 'FastRoute\\DataGenerator\\GroupCountBased';
     }
 }
diff --git a/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php
index c3d4f8db..b5c9567d 100644
--- a/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php
+++ b/vendor/nikic/fast-route/test/Dispatcher/GroupPosBasedTest.php
@@ -2,12 +2,15 @@
 
 namespace FastRoute\Dispatcher;
 
-class GroupPosBasedTest extends DispatcherTest {
-    protected function getDispatcherClass() {
+class GroupPosBasedTest extends DispatcherTest
+{
+    protected function getDispatcherClass()
+    {
         return 'FastRoute\\Dispatcher\\GroupPosBased';
     }
 
-    protected function getDataGeneratorClass() {
+    protected function getDataGeneratorClass()
+    {
         return 'FastRoute\\DataGenerator\\GroupPosBased';
     }
 }
diff --git a/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php b/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php
index 04b0af9b..b3b27dd2 100644
--- a/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php
+++ b/vendor/nikic/fast-route/test/Dispatcher/MarkBasedTest.php
@@ -2,19 +2,23 @@
 
 namespace FastRoute\Dispatcher;
 
-class MarkBasedTest extends DispatcherTest {
-    public function setUp() {
+class MarkBasedTest extends DispatcherTest
+{
+    public function setUp()
+    {
         preg_match('/(*MARK:A)a/', 'a', $matches);
         if (!isset($matches['MARK'])) {
             $this->markTestSkipped('PHP 5.6 required for MARK support');
         }
     }
 
-    protected function getDispatcherClass() {
+    protected function getDispatcherClass()
+    {
         return 'FastRoute\\Dispatcher\\MarkBased';
     }
 
-    protected function getDataGeneratorClass() {
+    protected function getDataGeneratorClass()
+    {
         return 'FastRoute\\DataGenerator\\MarkBased';
     }
 }
diff --git a/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php b/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php
index 7bc6ebb3..b6fc53f7 100644
--- a/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php
+++ b/vendor/nikic/fast-route/test/HackTypechecker/HackTypecheckerTest.php
@@ -2,11 +2,16 @@
 
 namespace FastRoute;
 
-class HackTypecheckerTest extends \PhpUnit_Framework_TestCase {
+use PHPUnit\Framework\TestCase;
+
+class HackTypecheckerTest extends TestCase
+{
     const SERVER_ALREADY_RUNNING_CODE = 77;
-    public function testTypechecks($recurse = true) {
+
+    public function testTypechecks($recurse = true)
+    {
         if (!defined('HHVM_VERSION')) {
-            $this->markTestSkipped("HHVM only");
+            $this->markTestSkipped('HHVM only');
         }
         if (!version_compare(HHVM_VERSION, '3.9.0', '>=')) {
           $this->markTestSkipped('classname<T> requires HHVM 3.9+');
@@ -15,17 +20,17 @@ class HackTypecheckerTest extends \PhpUnit_Framework_TestCase {
         // The typechecker recurses the whole tree, so it makes sure
         // that everything in fixtures/ is valid when this runs.
 
-        $output = array();
+        $output = [];
         $exit_code = null;
         exec(
-            'hh_server --check '.escapeshellarg(__DIR__.'/../../').' 2>&1',
+            'hh_server --check ' . escapeshellarg(__DIR__ . '/../../') . ' 2>&1',
             $output,
             $exit_code
         );
         if ($exit_code === self::SERVER_ALREADY_RUNNING_CODE) {
             $this->assertTrue(
               $recurse,
-              "Typechecker still running after running hh_client stop"
+              'Typechecker still running after running hh_client stop'
             );
             // Server already running - 3.10 => 3.11 regression:
             // https://github.com/facebook/hhvm/issues/6646
diff --git a/vendor/nikic/fast-route/test/RouteCollectorTest.php b/vendor/nikic/fast-route/test/RouteCollectorTest.php
index 11bcf1cb..cc54407d 100644
--- a/vendor/nikic/fast-route/test/RouteCollectorTest.php
+++ b/vendor/nikic/fast-route/test/RouteCollectorTest.php
@@ -2,8 +2,12 @@
 
 namespace FastRoute;
 
-class RouteCollectorTest extends \PHPUnit_Framework_TestCase {
-    public function testShortcuts() {
+use PHPUnit\Framework\TestCase;
+
+class RouteCollectorTest extends TestCase
+{
+    public function testShortcuts()
+    {
         $r = new DummyRouteCollector();
 
         $r->delete('/delete', 'delete');
@@ -25,7 +29,8 @@ class RouteCollectorTest extends \PHPUnit_Framework_TestCase {
         $this->assertSame($expected, $r->routes);
     }
 
-    public function testGroups() {
+    public function testGroups()
+    {
         $r = new DummyRouteCollector();
 
         $r->delete('/delete', 'delete');
@@ -87,11 +92,17 @@ class RouteCollectorTest extends \PHPUnit_Framework_TestCase {
     }
 }
 
-class DummyRouteCollector extends RouteCollector {
+class DummyRouteCollector extends RouteCollector
+{
     public $routes = [];
-    public function __construct() {}
-    public function addRoute($method, $route, $handler) {
+
+    public function __construct()
+    {
+    }
+
+    public function addRoute($method, $route, $handler)
+    {
         $route = $this->currentGroupPrefix . $route;
         $this->routes[] = [$method, $route, $handler];
     }
-}
\ No newline at end of file
+}
diff --git a/vendor/nikic/fast-route/test/RouteParser/StdTest.php b/vendor/nikic/fast-route/test/RouteParser/StdTest.php
index 41f194ba..e13e4de6 100644
--- a/vendor/nikic/fast-route/test/RouteParser/StdTest.php
+++ b/vendor/nikic/fast-route/test/RouteParser/StdTest.php
@@ -2,22 +2,28 @@
 
 namespace FastRoute\RouteParser;
 
-class StdTest extends \PhpUnit_Framework_TestCase {
+use PHPUnit\Framework\TestCase;
+
+class StdTest extends TestCase
+{
     /** @dataProvider provideTestParse */
-    public function testParse($routeString, $expectedRouteDatas) {
+    public function testParse($routeString, $expectedRouteDatas)
+    {
         $parser = new Std();
         $routeDatas = $parser->parse($routeString);
         $this->assertSame($expectedRouteDatas, $routeDatas);
     }
 
     /** @dataProvider provideTestParseError */
-    public function testParseError($routeString, $expectedExceptionMessage) {
+    public function testParseError($routeString, $expectedExceptionMessage)
+    {
         $parser = new Std();
         $this->setExpectedException('FastRoute\\BadRouteException', $expectedExceptionMessage);
         $parser->parse($routeString);
     }
 
-    public function provideTestParse() {
+    public function provideTestParse()
+    {
         return [
             [
                 '/test',
@@ -112,7 +118,8 @@ class StdTest extends \PhpUnit_Framework_TestCase {
         ];
     }
 
-    public function provideTestParseError() {
+    public function provideTestParseError()
+    {
         return [
             [
                 '/test[opt',
@@ -128,19 +135,19 @@ class StdTest extends \PhpUnit_Framework_TestCase {
             ],
             [
                 '/test[]',
-                "Empty optional part"
+                'Empty optional part'
             ],
             [
                 '/test[[opt]]',
-                "Empty optional part"
+                'Empty optional part'
             ],
             [
                 '[[test]]',
-                "Empty optional part"
+                'Empty optional part'
             ],
             [
                 '/test[/opt]/required',
-                "Optional segments can only occur at the end of a route"
+                'Optional segments can only occur at the end of a route'
             ],
         ];
     }
diff --git a/vendor/nikic/fast-route/test/bootstrap.php b/vendor/nikic/fast-route/test/bootstrap.php
index 27e6d4c8..3023f41e 100644
--- a/vendor/nikic/fast-route/test/bootstrap.php
+++ b/vendor/nikic/fast-route/test/bootstrap.php
@@ -2,7 +2,7 @@
 
 require_once __DIR__ . '/../src/functions.php';
 
-spl_autoload_register(function($class) {
+spl_autoload_register(function ($class) {
     if (strpos($class, 'FastRoute\\') === 0) {
         $dir = strcasecmp(substr($class, -4), 'Test') ? 'src/' : 'test/';
         $name = substr($class, strlen('FastRoute'));
diff --git a/vendor/paragonie/random_compat/composer.json b/vendor/paragonie/random_compat/composer.json
index 1c5978c6..1fa8de9f 100644
--- a/vendor/paragonie/random_compat/composer.json
+++ b/vendor/paragonie/random_compat/composer.json
@@ -4,6 +4,7 @@
   "keywords": [
     "csprng",
     "random",
+    "polyfill",
     "pseudorandom"
   ],
   "license":      "MIT",
@@ -21,17 +22,13 @@
     "source":     "https://github.com/paragonie/random_compat";
   },
   "require": {
-    "php": ">=5.2.0"
+    "php": "^7"
   },
   "require-dev": {
+    "vimeo/psalm": "^1",
     "phpunit/phpunit": "4.*|5.*"
   },
   "suggest": {
     "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
-  },
-  "autoload": {
-    "files": [
-      "lib/random.php"
-    ]
   }
 }
diff --git a/vendor/paragonie/random_compat/lib/byte_safe_strings.php b/vendor/paragonie/random_compat/lib/byte_safe_strings.php
deleted file mode 100644
index 3de86b22..00000000
--- a/vendor/paragonie/random_compat/lib/byte_safe_strings.php
+++ /dev/null
@@ -1,181 +0,0 @@
-<?php
-/**
- * Random_* Compatibility Library
- * for using the new PHP 7 random_* API in PHP 5 projects
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- *
- * 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.
- */
-
-if (!is_callable('RandomCompat_strlen')) {
-    if (
-        defined('MB_OVERLOAD_STRING') &&
-        ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING
-    ) {
-        /**
-         * strlen() implementation that isn't brittle to mbstring.func_overload
-         *
-         * This version uses mb_strlen() in '8bit' mode to treat strings as raw
-         * binary rather than UTF-8, ISO-8859-1, etc
-         *
-         * @param string $binary_string
-         *
-         * @throws TypeError
-         *
-         * @return int
-         */
-        function RandomCompat_strlen($binary_string)
-        {
-            if (!is_string($binary_string)) {
-                throw new TypeError(
-                    'RandomCompat_strlen() expects a string'
-                );
-            }
-
-            return (int) mb_strlen($binary_string, '8bit');
-        }
-
-    } else {
-        /**
-         * strlen() implementation that isn't brittle to mbstring.func_overload
-         *
-         * This version just used the default strlen()
-         *
-         * @param string $binary_string
-         *
-         * @throws TypeError
-         *
-         * @return int
-         */
-        function RandomCompat_strlen($binary_string)
-        {
-            if (!is_string($binary_string)) {
-                throw new TypeError(
-                    'RandomCompat_strlen() expects a string'
-                );
-            }
-            return (int) strlen($binary_string);
-        }
-    }
-}
-
-if (!is_callable('RandomCompat_substr')) {
-
-    if (
-        defined('MB_OVERLOAD_STRING')
-        &&
-        ini_get('mbstring.func_overload') & MB_OVERLOAD_STRING
-    ) {
-        /**
-         * substr() implementation that isn't brittle to mbstring.func_overload
-         *
-         * This version uses mb_substr() in '8bit' mode to treat strings as raw
-         * binary rather than UTF-8, ISO-8859-1, etc
-         *
-         * @param string $binary_string
-         * @param int $start
-         * @param int $length (optional)
-         *
-         * @throws TypeError
-         *
-         * @return string
-         */
-        function RandomCompat_substr($binary_string, $start, $length = null)
-        {
-            if (!is_string($binary_string)) {
-                throw new TypeError(
-                    'RandomCompat_substr(): First argument should be a string'
-                );
-            }
-
-            if (!is_int($start)) {
-                throw new TypeError(
-                    'RandomCompat_substr(): Second argument should be an integer'
-                );
-            }
-
-            if ($length === null) {
-                /**
-                 * mb_substr($str, 0, NULL, '8bit') returns an empty string on
-                 * PHP 5.3, so we have to find the length ourselves.
-                 */
-                $length = RandomCompat_strlen($binary_string) - $start;
-            } elseif (!is_int($length)) {
-                throw new TypeError(
-                    'RandomCompat_substr(): Third argument should be an integer, or omitted'
-                );
-            }
-
-            // Consistency with PHP's behavior
-            if ($start === RandomCompat_strlen($binary_string) && $length === 0) {
-                return '';
-            }
-            if ($start > RandomCompat_strlen($binary_string)) {
-                return '';
-            }
-
-            return (string) mb_substr($binary_string, $start, $length, '8bit');
-        }
-
-    } else {
-
-        /**
-         * substr() implementation that isn't brittle to mbstring.func_overload
-         *
-         * This version just uses the default substr()
-         *
-         * @param string $binary_string
-         * @param int $start
-         * @param int $length (optional)
-         *
-         * @throws TypeError
-         *
-         * @return string
-         */
-        function RandomCompat_substr($binary_string, $start, $length = null)
-        {
-            if (!is_string($binary_string)) {
-                throw new TypeError(
-                    'RandomCompat_substr(): First argument should be a string'
-                );
-            }
-
-            if (!is_int($start)) {
-                throw new TypeError(
-                    'RandomCompat_substr(): Second argument should be an integer'
-                );
-            }
-
-            if ($length !== null) {
-                if (!is_int($length)) {
-                    throw new TypeError(
-                        'RandomCompat_substr(): Third argument should be an integer, or omitted'
-                    );
-                }
-
-                return (string) substr($binary_string, $start, $length);
-            }
-
-            return (string) substr($binary_string, $start);
-        }
-    }
-}
diff --git a/vendor/paragonie/random_compat/lib/cast_to_int.php b/vendor/paragonie/random_compat/lib/cast_to_int.php
deleted file mode 100644
index be7388df..00000000
--- a/vendor/paragonie/random_compat/lib/cast_to_int.php
+++ /dev/null
@@ -1,74 +0,0 @@
-<?php
-/**
- * Random_* Compatibility Library
- * for using the new PHP 7 random_* API in PHP 5 projects
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- *
- * 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.
- */
-
-if (!is_callable('RandomCompat_intval')) {
-    
-    /**
-     * Cast to an integer if we can, safely.
-     * 
-     * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
-     * (non-inclusive), it will sanely cast it to an int. If you it's equal to
-     * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats 
-     * lose precision, so the <= and => operators might accidentally let a float
-     * through.
-     * 
-     * @param int|float $number    The number we want to convert to an int
-     * @param boolean   $fail_open Set to true to not throw an exception
-     * 
-     * @return float|int
-     *
-     * @throws TypeError
-     */
-    function RandomCompat_intval($number, $fail_open = false)
-    {
-        if (is_int($number) || is_float($number)) {
-            $number += 0;
-        } elseif (is_numeric($number)) {
-            $number += 0;
-        }
-
-        if (
-            is_float($number)
-            &&
-            $number > ~PHP_INT_MAX
-            &&
-            $number < PHP_INT_MAX
-        ) {
-            $number = (int) $number;
-        }
-
-        if (is_int($number)) {
-            return (int) $number;
-        } elseif (!$fail_open) {
-            throw new TypeError(
-                'Expected an integer.'
-            );
-        }
-        return $number;
-    }
-}
diff --git a/vendor/paragonie/random_compat/lib/error_polyfill.php b/vendor/paragonie/random_compat/lib/error_polyfill.php
deleted file mode 100644
index 6a91990c..00000000
--- a/vendor/paragonie/random_compat/lib/error_polyfill.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-/**
- * Random_* Compatibility Library 
- * for using the new PHP 7 random_* API in PHP 5 projects
- * 
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- * 
- * 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.
- */
-
-if (!class_exists('Error', false)) {
-    // We can't really avoid making this extend Exception in PHP 5.
-    class Error extends Exception
-    {
-        
-    }
-}
-
-if (!class_exists('TypeError', false)) {
-    if (is_subclass_of('Error', 'Exception')) {
-        class TypeError extends Error
-        {
-            
-        }
-    } else {
-        class TypeError extends Exception
-        {
-            
-        }
-    }
-}
diff --git a/vendor/paragonie/random_compat/lib/random.php b/vendor/paragonie/random_compat/lib/random.php
index df74c8a4..c7731a56 100644
--- a/vendor/paragonie/random_compat/lib/random.php
+++ b/vendor/paragonie/random_compat/lib/random.php
@@ -3,12 +3,12 @@
  * Random_* Compatibility Library
  * for using the new PHP 7 random_* API in PHP 5 projects
  *
- * @version 2.0.10
- * @released 2017-03-13
+ * @version 2.99.99
+ * @released 2018-06-06
  *
  * The MIT License (MIT)
  *
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
+ * Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -29,195 +29,4 @@
  * SOFTWARE.
  */
 
-if (!defined('PHP_VERSION_ID')) {
-    // This constant was introduced in PHP 5.2.7
-    $RandomCompatversion = array_map('intval', explode('.', PHP_VERSION));
-    define(
-        'PHP_VERSION_ID',
-        $RandomCompatversion[0] * 10000
-        + $RandomCompatversion[1] * 100
-        + $RandomCompatversion[2]
-    );
-    $RandomCompatversion = null;
-}
-
-/**
- * PHP 7.0.0 and newer have these functions natively.
- */
-if (PHP_VERSION_ID >= 70000) {
-    return;
-}
-
-if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
-    define('RANDOM_COMPAT_READ_BUFFER', 8);
-}
-
-$RandomCompatDIR = dirname(__FILE__);
-
-require_once $RandomCompatDIR . '/byte_safe_strings.php';
-require_once $RandomCompatDIR . '/cast_to_int.php';
-require_once $RandomCompatDIR . '/error_polyfill.php';
-
-if (!is_callable('random_bytes')) {
-    /**
-     * PHP 5.2.0 - 5.6.x way to implement random_bytes()
-     *
-     * We use conditional statements here to define the function in accordance
-     * to the operating environment. It's a micro-optimization.
-     *
-     * In order of preference:
-     *   1. Use libsodium if available.
-     *   2. fread() /dev/urandom if available (never on Windows)
-     *   3. mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM)
-     *   4. COM('CAPICOM.Utilities.1')->GetRandom()
-     *
-     * See RATIONALE.md for our reasoning behind this particular order
-     */
-    if (extension_loaded('libsodium')) {
-        // See random_bytes_libsodium.php
-        if (PHP_VERSION_ID >= 50300 && is_callable('\\Sodium\\randombytes_buf')) {
-            require_once $RandomCompatDIR . '/random_bytes_libsodium.php';
-        } elseif (method_exists('Sodium', 'randombytes_buf')) {
-            require_once $RandomCompatDIR . '/random_bytes_libsodium_legacy.php';
-        }
-    }
-
-    /**
-     * Reading directly from /dev/urandom:
-     */
-    if (DIRECTORY_SEPARATOR === '/') {
-        // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast
-        // way to exclude Windows.
-        $RandomCompatUrandom = true;
-        $RandomCompat_basedir = ini_get('open_basedir');
-
-        if (!empty($RandomCompat_basedir)) {
-            $RandomCompat_open_basedir = explode(
-                PATH_SEPARATOR,
-                strtolower($RandomCompat_basedir)
-            );
-            $RandomCompatUrandom = (array() !== array_intersect(
-                array('/dev', '/dev/', '/dev/urandom'),
-                $RandomCompat_open_basedir
-            ));
-            $RandomCompat_open_basedir = null;
-        }
-
-        if (
-            !is_callable('random_bytes')
-            &&
-            $RandomCompatUrandom
-            &&
-            @is_readable('/dev/urandom')
-        ) {
-            // Error suppression on is_readable() in case of an open_basedir
-            // or safe_mode failure. All we care about is whether or not we
-            // can read it at this point. If the PHP environment is going to
-            // panic over trying to see if the file can be read in the first
-            // place, that is not helpful to us here.
-
-            // See random_bytes_dev_urandom.php
-            require_once $RandomCompatDIR . '/random_bytes_dev_urandom.php';
-        }
-        // Unset variables after use
-        $RandomCompat_basedir = null;
-    } else {
-        $RandomCompatUrandom = false;
-    }
-
-    /**
-     * mcrypt_create_iv()
-     *
-     * We only want to use mcypt_create_iv() if:
-     *
-     * - random_bytes() hasn't already been defined
-     * - the mcrypt extensions is loaded
-     * - One of these two conditions is true:
-     *   - We're on Windows (DIRECTORY_SEPARATOR !== '/')
-     *   - We're not on Windows and /dev/urandom is readabale
-     *     (i.e. we're not in a chroot jail)
-     * - Special case:
-     *   - If we're not on Windows, but the PHP version is between
-     *     5.6.10 and 5.6.12, we don't want to use mcrypt. It will
-     *     hang indefinitely. This is bad.
-     *   - If we're on Windows, we want to use PHP >= 5.3.7 or else
-     *     we get insufficient entropy errors.
-     */
-    if (
-        !is_callable('random_bytes')
-        &&
-        // Windows on PHP < 5.3.7 is broken, but non-Windows is not known to be.
-        (DIRECTORY_SEPARATOR === '/' || PHP_VERSION_ID >= 50307)
-        &&
-        // Prevent this code from hanging indefinitely on non-Windows;
-        // see https://bugs.php.net/bug.php?id=69833
-        (
-            DIRECTORY_SEPARATOR !== '/' ||
-            (PHP_VERSION_ID <= 50609 || PHP_VERSION_ID >= 50613)
-        )
-        &&
-        extension_loaded('mcrypt')
-    ) {
-        // See random_bytes_mcrypt.php
-        require_once $RandomCompatDIR . '/random_bytes_mcrypt.php';
-    }
-    $RandomCompatUrandom = null;
-
-    /**
-     * This is a Windows-specific fallback, for when the mcrypt extension
-     * isn't loaded.
-     */
-    if (
-        !is_callable('random_bytes')
-        &&
-        extension_loaded('com_dotnet')
-        &&
-        class_exists('COM')
-    ) {
-        $RandomCompat_disabled_classes = preg_split(
-            '#\s*,\s*#',
-            strtolower(ini_get('disable_classes'))
-        );
-
-        if (!in_array('com', $RandomCompat_disabled_classes)) {
-            try {
-                $RandomCompatCOMtest = new COM('CAPICOM.Utilities.1');
-                if (method_exists($RandomCompatCOMtest, 'GetRandom')) {
-                    // See random_bytes_com_dotnet.php
-                    require_once $RandomCompatDIR . '/random_bytes_com_dotnet.php';
-                }
-            } catch (com_exception $e) {
-                // Don't try to use it.
-            }
-        }
-        $RandomCompat_disabled_classes = null;
-        $RandomCompatCOMtest = null;
-    }
-
-    /**
-     * throw new Exception
-     */
-    if (!is_callable('random_bytes')) {
-        /**
-         * We don't have any more options, so let's throw an exception right now
-         * and hope the developer won't let it fail silently.
-         *
-         * @param mixed $length
-         * @return void
-         * @throws Exception
-         */
-        function random_bytes($length)
-        {
-            unset($length); // Suppress "variable not used" warnings.
-            throw new Exception(
-                'There is no suitable CSPRNG installed on your system'
-            );
-        }
-    }
-}
-
-if (!is_callable('random_int')) {
-    require_once $RandomCompatDIR . '/random_int.php';
-}
-
-$RandomCompatDIR = null;
+// NOP
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php b/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php
deleted file mode 100644
index fc1926e5..00000000
--- a/vendor/paragonie/random_compat/lib/random_bytes_com_dotnet.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * Random_* Compatibility Library 
- * for using the new PHP 7 random_* API in PHP 5 projects
- * 
- * The MIT License (MIT)
- * 
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- * 
- * 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.
- */
-
-if (!is_callable('random_bytes')) {
-    /**
-     * Windows with PHP < 5.3.0 will not have the function
-     * openssl_random_pseudo_bytes() available, so let's use
-     * CAPICOM to work around this deficiency.
-     *
-     * @param int $bytes
-     *
-     * @throws Exception
-     *
-     * @return string
-     */
-    function random_bytes($bytes)
-    {
-        try {
-            $bytes = RandomCompat_intval($bytes);
-        } catch (TypeError $ex) {
-            throw new TypeError(
-                'random_bytes(): $bytes must be an integer'
-            );
-        }
-
-        if ($bytes < 1) {
-            throw new Error(
-                'Length must be greater than 0'
-            );
-        }
-
-        $buf = '';
-        if (!class_exists('COM')) {
-            throw new Error(
-                'COM does not exist'
-            );
-        }
-        $util = new COM('CAPICOM.Utilities.1');
-        $execCount = 0;
-
-        /**
-         * Let's not let it loop forever. If we run N times and fail to
-         * get N bytes of random data, then CAPICOM has failed us.
-         */
-        do {
-            $buf .= base64_decode($util->GetRandom($bytes, 0));
-            if (RandomCompat_strlen($buf) >= $bytes) {
-                /**
-                 * Return our random entropy buffer here:
-                 */
-                return RandomCompat_substr($buf, 0, $bytes);
-            }
-            ++$execCount;
-        } while ($execCount < $bytes);
-
-        /**
-         * If we reach here, PHP has failed us.
-         */
-        throw new Exception(
-            'Could not gather sufficient random data'
-        );
-    }
-}
\ No newline at end of file
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php b/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php
deleted file mode 100644
index df5b9152..00000000
--- a/vendor/paragonie/random_compat/lib/random_bytes_dev_urandom.php
+++ /dev/null
@@ -1,167 +0,0 @@
-<?php
-/**
- * Random_* Compatibility Library 
- * for using the new PHP 7 random_* API in PHP 5 projects
- * 
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- * 
- * 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.
- */
-
-if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
-    define('RANDOM_COMPAT_READ_BUFFER', 8);
-}
-
-if (!is_callable('random_bytes')) {
-    /**
-     * Unless open_basedir is enabled, use /dev/urandom for
-     * random numbers in accordance with best practices
-     *
-     * Why we use /dev/urandom and not /dev/random
-     * @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers
-     *
-     * @param int $bytes
-     *
-     * @throws Exception
-     *
-     * @return string
-     */
-    function random_bytes($bytes)
-    {
-        static $fp = null;
-        /**
-         * This block should only be run once
-         */
-        if (empty($fp)) {
-            /**
-             * We use /dev/urandom if it is a char device.
-             * We never fall back to /dev/random
-             */
-            $fp = fopen('/dev/urandom', 'rb');
-            if (!empty($fp)) {
-                $st = fstat($fp);
-                if (($st['mode'] & 0170000) !== 020000) {
-                    fclose($fp);
-                    $fp = false;
-                }
-            }
-
-            if (!empty($fp)) {
-                /**
-                 * stream_set_read_buffer() does not exist in HHVM
-                 *
-                 * If we don't set the stream's read buffer to 0, PHP will
-                 * internally buffer 8192 bytes, which can waste entropy
-                 *
-                 * stream_set_read_buffer returns 0 on success
-                 */
-                if (is_callable('stream_set_read_buffer')) {
-                    stream_set_read_buffer($fp, RANDOM_COMPAT_READ_BUFFER);
-                }
-                if (is_callable('stream_set_chunk_size')) {
-                    stream_set_chunk_size($fp, RANDOM_COMPAT_READ_BUFFER);
-                }
-            }
-        }
-
-        try {
-            $bytes = RandomCompat_intval($bytes);
-        } catch (TypeError $ex) {
-            throw new TypeError(
-                'random_bytes(): $bytes must be an integer'
-            );
-        }
-
-        if ($bytes < 1) {
-            throw new Error(
-                'Length must be greater than 0'
-            );
-        }
-
-        /**
-         * This if() block only runs if we managed to open a file handle
-         *
-         * It does not belong in an else {} block, because the above
-         * if (empty($fp)) line is logic that should only be run once per
-         * page load.
-         */
-        if (!empty($fp)) {
-            /**
-             * @var int
-             */
-            $remaining = $bytes;
-
-            /**
-             * @var string|bool
-             */
-            $buf = '';
-
-            /**
-             * We use fread() in a loop to protect against partial reads
-             */
-            do {
-                /**
-                 * @var string|bool
-                 */
-                $read = fread($fp, $remaining);
-                if (!is_string($read)) {
-                    if ($read === false) {
-                        /**
-                         * We cannot safely read from the file. Exit the
-                         * do-while loop and trigger the exception condition
-                         *
-                         * @var string|bool
-                         */
-                        $buf = false;
-                        break;
-                    }
-                }
-                /**
-                 * Decrease the number of bytes returned from remaining
-                 */
-                $remaining -= RandomCompat_strlen($read);
-                /**
-                 * @var string|bool
-                 */
-                $buf = $buf . $read;
-            } while ($remaining > 0);
-
-            /**
-             * Is our result valid?
-             */
-            if (is_string($buf)) {
-                if (RandomCompat_strlen($buf) === $bytes) {
-                    /**
-                     * Return our random entropy buffer here:
-                     */
-                    return $buf;
-                }
-            }
-        }
-
-        /**
-         * If we reach here, PHP has failed us.
-         */
-        throw new Exception(
-            'Error reading from source device'
-        );
-    }
-}
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php b/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php
deleted file mode 100644
index 4af1a242..00000000
--- a/vendor/paragonie/random_compat/lib/random_bytes_libsodium.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-/**
- * Random_* Compatibility Library 
- * for using the new PHP 7 random_* API in PHP 5 projects
- * 
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- * 
- * 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.
- */
-
-if (!is_callable('random_bytes')) {
-    /**
-     * If the libsodium PHP extension is loaded, we'll use it above any other
-     * solution.
-     *
-     * libsodium-php project:
-     * @ref https://github.com/jedisct1/libsodium-php
-     *
-     * @param int $bytes
-     *
-     * @throws Exception
-     *
-     * @return string
-     */
-    function random_bytes($bytes)
-    {
-        try {
-            $bytes = RandomCompat_intval($bytes);
-        } catch (TypeError $ex) {
-            throw new TypeError(
-                'random_bytes(): $bytes must be an integer'
-            );
-        }
-
-        if ($bytes < 1) {
-            throw new Error(
-                'Length must be greater than 0'
-            );
-        }
-
-        /**
-         * \Sodium\randombytes_buf() doesn't allow more than 2147483647 bytes to be
-         * generated in one invocation.
-         */
-        if ($bytes > 2147483647) {
-            $buf = '';
-            for ($i = 0; $i < $bytes; $i += 1073741824) {
-                $n = ($bytes - $i) > 1073741824
-                    ? 1073741824
-                    : $bytes - $i;
-                $buf .= \Sodium\randombytes_buf($n);
-            }
-        } else {
-            $buf = \Sodium\randombytes_buf($bytes);
-        }
-
-        if ($buf !== false) {
-            if (RandomCompat_strlen($buf) === $bytes) {
-                return $buf;
-            }
-        }
-
-        /**
-         * If we reach here, PHP has failed us.
-         */
-        throw new Exception(
-            'Could not gather sufficient random data'
-        );
-    }
-}
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php b/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
deleted file mode 100644
index 02160b91..00000000
--- a/vendor/paragonie/random_compat/lib/random_bytes_libsodium_legacy.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-/**
- * Random_* Compatibility Library 
- * for using the new PHP 7 random_* API in PHP 5 projects
- * 
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- * 
- * 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.
- */
-
-if (!is_callable('random_bytes')) {
-    /**
-     * If the libsodium PHP extension is loaded, we'll use it above any other
-     * solution.
-     *
-     * libsodium-php project:
-     * @ref https://github.com/jedisct1/libsodium-php
-     *
-     * @param int $bytes
-     *
-     * @throws Exception
-     *
-     * @return string
-     */
-    function random_bytes($bytes)
-    {
-        try {
-            $bytes = RandomCompat_intval($bytes);
-        } catch (TypeError $ex) {
-            throw new TypeError(
-                'random_bytes(): $bytes must be an integer'
-            );
-        }
-
-        if ($bytes < 1) {
-            throw new Error(
-                'Length must be greater than 0'
-            );
-        }
-
-        /**
-         * @var string
-         */
-        $buf = '';
-
-        /**
-         * \Sodium\randombytes_buf() doesn't allow more than 2147483647 bytes to be
-         * generated in one invocation.
-         */
-        if ($bytes > 2147483647) {
-            for ($i = 0; $i < $bytes; $i += 1073741824) {
-                $n = ($bytes - $i) > 1073741824
-                    ? 1073741824
-                    : $bytes - $i;
-                $buf .= Sodium::randombytes_buf($n);
-            }
-        } else {
-            $buf .= Sodium::randombytes_buf($bytes);
-        }
-
-        if (is_string($buf)) {
-            if (RandomCompat_strlen($buf) === $bytes) {
-                return $buf;
-            }
-        }
-
-        /**
-         * If we reach here, PHP has failed us.
-         */
-        throw new Exception(
-            'Could not gather sufficient random data'
-        );
-    }
-}
diff --git a/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php b/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php
deleted file mode 100644
index aac9c013..00000000
--- a/vendor/paragonie/random_compat/lib/random_bytes_mcrypt.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-/**
- * Random_* Compatibility Library 
- * for using the new PHP 7 random_* API in PHP 5 projects
- * 
- * The MIT License (MIT)
- *
- * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
- * 
- * 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.
- */
-
-if (!is_callable('random_bytes')) {
-    /**
-     * Powered by ext/mcrypt (and thankfully NOT libmcrypt)
-     *
-     * @ref https://bugs.php.net/bug.php?id=55169
-     * @ref https://github.com/php/php-src/blob/c568ffe5171d942161fc8dda066bce844bdef676/ext/mcrypt/mcrypt.c#L1321-L1386
-     *
-     * @param int $bytes
-     *
-     * @throws Exception
-     *
-     * @return string
-     */
-    function random_bytes($bytes)
-    {
-        try {
-            $bytes = RandomCompat_intval($bytes);
-        } catch (TypeError $ex) {
-            throw new TypeError(
-                'random_bytes(): $bytes must be an integer'
-            );
-        }
-
-        if ($bytes < 1) {
-            throw new Error(
-                'Length must be greater than 0'
-            );
-        }
-
-        $buf = @mcrypt_create_iv($bytes, MCRYPT_DEV_URANDOM);
-        if (
-            $buf !== false
-            &&
-            RandomCompat_strlen($buf) === $bytes
-        ) {
-            /**
-             * Return our random entropy buffer here:
-             */
-            return $buf;
-        }
-
-        /**
-         * If we reach here, PHP has failed us.
-         */
-        throw new Exception(
-            'Could not gather sufficient random data'
-        );
-    }
-}
diff --git a/vendor/paragonie/random_compat/lib/random_int.php b/vendor/paragonie/random_compat/lib/random_int.php
deleted file mode 100644
index b2ea02d1..00000000
--- a/vendor/paragonie/random_compat/lib/random_int.php
+++ /dev/null
@@ -1,190 +0,0 @@
-<?php
-
-if (!is_callable('random_int')) {
-    /**
-     * Random_* Compatibility Library
-     * for using the new PHP 7 random_* API in PHP 5 projects
-     *
-     * The MIT License (MIT)
-     *
-     * Copyright (c) 2015 - 2017 Paragon Initiative Enterprises
-     *
-     * 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.
-     */
-
-    /**
-     * Fetch a random integer between $min and $max inclusive
-     *
-     * @param int $min
-     * @param int $max
-     *
-     * @throws Exception
-     *
-     * @return int
-     */
-    function random_int($min, $max)
-    {
-        /**
-         * Type and input logic checks
-         *
-         * If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
-         * (non-inclusive), it will sanely cast it to an int. If you it's equal to
-         * ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats
-         * lose precision, so the <= and => operators might accidentally let a float
-         * through.
-         */
-
-        try {
-            $min = RandomCompat_intval($min);
-        } catch (TypeError $ex) {
-            throw new TypeError(
-                'random_int(): $min must be an integer'
-            );
-        }
-
-        try {
-            $max = RandomCompat_intval($max);
-        } catch (TypeError $ex) {
-            throw new TypeError(
-                'random_int(): $max must be an integer'
-            );
-        }
-
-        /**
-         * Now that we've verified our weak typing system has given us an integer,
-         * let's validate the logic then we can move forward with generating random
-         * integers along a given range.
-         */
-        if ($min > $max) {
-            throw new Error(
-                'Minimum value must be less than or equal to the maximum value'
-            );
-        }
-
-        if ($max === $min) {
-            return $min;
-        }
-
-        /**
-         * Initialize variables to 0
-         *
-         * We want to store:
-         * $bytes => the number of random bytes we need
-         * $mask => an integer bitmask (for use with the &) operator
-         *          so we can minimize the number of discards
-         */
-        $attempts = $bits = $bytes = $mask = $valueShift = 0;
-
-        /**
-         * At this point, $range is a positive number greater than 0. It might
-         * overflow, however, if $max - $min > PHP_INT_MAX. PHP will cast it to
-         * a float and we will lose some precision.
-         */
-        $range = $max - $min;
-
-        /**
-         * Test for integer overflow:
-         */
-        if (!is_int($range)) {
-
-            /**
-             * Still safely calculate wider ranges.
-             * Provided by @CodesInChaos, @oittaa
-             *
-             * @ref https://gist.github.com/CodesInChaos/03f9ea0b58e8b2b8d435
-             *
-             * We use ~0 as a mask in this case because it generates all 1s
-             *
-             * @ref https://eval.in/400356 (32-bit)
-             * @ref http://3v4l.org/XX9r5  (64-bit)
-             */
-            $bytes = PHP_INT_SIZE;
-            $mask = ~0;
-
-        } else {
-
-            /**
-             * $bits is effectively ceil(log($range, 2)) without dealing with
-             * type juggling
-             */
-            while ($range > 0) {
-                if ($bits % 8 === 0) {
-                    ++$bytes;
-                }
-                ++$bits;
-                $range >>= 1;
-                $mask = $mask << 1 | 1;
-            }
-            $valueShift = $min;
-        }
-
-        $val = 0;
-        /**
-         * Now that we have our parameters set up, let's begin generating
-         * random integers until one falls between $min and $max
-         */
-        do {
-            /**
-             * The rejection probability is at most 0.5, so this corresponds
-             * to a failure probability of 2^-128 for a working RNG
-             */
-            if ($attempts > 128) {
-                throw new Exception(
-                    'random_int: RNG is broken - too many rejections'
-                );
-            }
-
-            /**
-             * Let's grab the necessary number of random bytes
-             */
-            $randomByteString = random_bytes($bytes);
-
-            /**
-             * Let's turn $randomByteString into an integer
-             *
-             * This uses bitwise operators (<< and |) to build an integer
-             * out of the values extracted from ord()
-             *
-             * Example: [9F] | [6D] | [32] | [0C] =>
-             *   159 + 27904 + 3276800 + 201326592 =>
-             *   204631455
-             */
-            $val &= 0;
-            for ($i = 0; $i < $bytes; ++$i) {
-                $val |= ord($randomByteString[$i]) << ($i * 8);
-            }
-
-            /**
-             * Apply mask
-             */
-            $val &= $mask;
-            $val += $valueShift;
-
-            ++$attempts;
-            /**
-             * If $val overflows to a floating point number,
-             * ... or is larger than $max,
-             * ... or smaller than $min,
-             * then try again.
-             */
-        } while (!is_int($val) || $val > $max || $val < $min);
-
-        return (int)$val;
-    }
-}
diff --git a/vendor/paragonie/random_compat/psalm.xml b/vendor/paragonie/random_compat/psalm.xml
index f5013156..596d99dd 100644
--- a/vendor/paragonie/random_compat/psalm.xml
+++ b/vendor/paragonie/random_compat/psalm.xml
@@ -8,8 +8,12 @@
         <directory name="lib" />
     </projectFiles>
     <issueHandlers>
+        <RedundantConditionGivenDocblockType errorLevel="info" />
+        <UnresolvableInclude errorLevel="info" />
+        <DuplicateClass errorLevel="info" />
         <InvalidOperand errorLevel="info" />
         <UndefinedConstant errorLevel="info" />
         <MissingReturnType errorLevel="info" />
+        <InvalidReturnType errorLevel="info" />
     </issueHandlers>
 </psalm>
diff --git a/vendor/paypal/merchant-sdk-php/CHANGELOG.md b/vendor/paypal/merchant-sdk-php/CHANGELOG.md
index 2f1be677..ce1a1989 100644
--- a/vendor/paypal/merchant-sdk-php/CHANGELOG.md
+++ b/vendor/paypal/merchant-sdk-php/CHANGELOG.md
@@ -1,5 +1,9 @@
 ### CHANGELOG
 
+####Version 3.12.0 - Oct 10, 2017
+   - Fixes name attribute in EBLBaseComponents. Fixes #136.
+   - Minor bug fixes.
+
 ####Version 3.11.0 - Mar 7, 2017
    - Updated stubs for 204 release.
 
diff --git a/vendor/paypal/merchant-sdk-php/README.md b/vendor/paypal/merchant-sdk-php/README.md
index 565d730e..3fad2304 100644
--- a/vendor/paypal/merchant-sdk-php/README.md
+++ b/vendor/paypal/merchant-sdk-php/README.md
@@ -31,14 +31,7 @@
     - CURLOPT_SSLVERSION is set to 1 . See [here](http://curl.haxx.se/libcurl/c/CURLOPT_SSLVERSION.html) for more information
     - CURLOPT_SSL_CIPHER_LIST was set to TLSv1, See [here](http://curl.haxx.se/libcurl/c/CURLOPT_SSL_CIPHER_LIST.html) for more information
 
-All these changes are included in the recent release, along with many other bug fixes. We highly encourage you to update your versions, by either using `composer` or running this command shown below:
-
-```
-curl -k -L https://raw.githubusercontent.com/paypal/merchant-sdk-php/stable-php5.3/samples/install.php | php    
-        OR        
-wget  https://raw.githubusercontent.com/paypal/merchant-sdk-php/stable-php5.3/samples/install.php
-php install.php
-```
+All these changes are included in the recent release, along with many other bug fixes.
 
 ## Prerequisites
 
@@ -51,15 +44,11 @@ PayPal's PHP Merchant SDK requires
 
 To run the bundled sample, first copy the samples folder to your web server root. You will then need to install the SDK as a dependency using composer (PHP V5.3+ only).
 
-
-run `composer update` from the samples folder.
-
 ## Using the SDK
 
-
 To use the SDK,
 
-   * Create a composer.json file with the following contents.
+   * Create a `composer.json` file with the following contents.
 
 ```json
 {
@@ -69,7 +58,7 @@ To use the SDK,
     }
 }
 ```
-   * Install the SDK as a dependency using composer. 
+   * Install the SDK as a dependency using `composer`. To download `composer`, follow [installation instructions](https://getcomposer.org/download/) provided in Composer documentation.
    * Require `PPBootStrap.php` in your application.
    * Choose how you would like to configure the SDK - You can either
 	  * Create a hashmap containing configuration parameters and pass it to the service object OR
diff --git a/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetAccessPermissionsRequestDetailsType.php b/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetAccessPermissionsRequestDetailsType.php
index 0505cf9f..19156d76 100644
--- a/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetAccessPermissionsRequestDetailsType.php
+++ b/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetAccessPermissionsRequestDetailsType.php
@@ -114,7 +114,7 @@ class SetAccessPermissionsRequestDetailsType
      * Character length and limitations: 127
      * @access    public
      * @namespace ebl
-     * @name cpp -header-image
+     * @name cpp-header-image
      * @var string
      */
     public $cppheaderimage;
@@ -127,7 +127,7 @@ class SetAccessPermissionsRequestDetailsType
      * hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -header-border-color
+     * @name cpp-header-border-color
      * @var string
      */
     public $cppheaderbordercolor;
@@ -138,7 +138,7 @@ class SetAccessPermissionsRequestDetailsType
      * hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -header-back-color
+     * @name cpp-header-back-color
      * @var string
      */
     public $cppheaderbackcolor;
@@ -149,7 +149,7 @@ class SetAccessPermissionsRequestDetailsType
      * hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -payflow-color
+     * @name cpp-payflow-color
      * @var string
      */
     public $cpppayflowcolor;
diff --git a/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetAuthFlowParamRequestDetailsType.php b/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetAuthFlowParamRequestDetailsType.php
index 2612e07f..311149ef 100644
--- a/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetAuthFlowParamRequestDetailsType.php
+++ b/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetAuthFlowParamRequestDetailsType.php
@@ -136,7 +136,7 @@ class SetAuthFlowParamRequestDetailsType
      * Character length and limitations: 127
      * @access    public
      * @namespace ebl
-     * @name cpp -header-image
+     * @name cpp-header-image
      * @var string
      */
     public $cppheaderimage;
@@ -149,7 +149,7 @@ class SetAuthFlowParamRequestDetailsType
      * hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -header-border-color
+     * @name cpp-header-border-color
      * @var string
      */
     public $cppheaderbordercolor;
@@ -160,7 +160,7 @@ class SetAuthFlowParamRequestDetailsType
      * hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -header-back-color
+     * @name cpp-header-back-color
      * @var string
      */
     public $cppheaderbackcolor;
@@ -171,7 +171,7 @@ class SetAuthFlowParamRequestDetailsType
      * hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -payflow-color
+     * @name cpp-payflow-color
      * @var string
      */
     public $cpppayflowcolor;
diff --git a/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetCustomerBillingAgreementRequestDetailsType.php b/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetCustomerBillingAgreementRequestDetailsType.php
index b9c9ddad..f1302007 100644
--- a/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetCustomerBillingAgreementRequestDetailsType.php
+++ b/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetCustomerBillingAgreementRequestDetailsType.php
@@ -54,7 +54,7 @@ class SetCustomerBillingAgreementRequestDetailsType
      *
      * @access    public
      * @namespace ebl
-     * @name cpp -header-image
+     * @name cpp-header-image
      * @var string
      */
     public $cppheaderimage;
@@ -63,7 +63,7 @@ class SetCustomerBillingAgreementRequestDetailsType
      *
      * @access    public
      * @namespace ebl
-     * @name cpp -header-border-color
+     * @name cpp-header-border-color
      * @var string
      */
     public $cppheaderbordercolor;
@@ -72,7 +72,7 @@ class SetCustomerBillingAgreementRequestDetailsType
      *
      * @access    public
      * @namespace ebl
-     * @name cpp -header-back-color
+     * @name cpp-header-back-color
      * @var string
      */
     public $cppheaderbackcolor;
@@ -81,7 +81,7 @@ class SetCustomerBillingAgreementRequestDetailsType
      *
      * @access    public
      * @namespace ebl
-     * @name cpp -payflow-color
+     * @name cpp-payflow-color
      * @var string
      */
     public $cpppayflowcolor;
diff --git a/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetExpressCheckoutRequestDetailsType.php b/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetExpressCheckoutRequestDetailsType.php
index 856299e5..e9d39b98 100644
--- a/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetExpressCheckoutRequestDetailsType.php
+++ b/vendor/paypal/merchant-sdk-php/lib/PayPal/EBLBaseComponents/SetExpressCheckoutRequestDetailsType.php
@@ -256,7 +256,7 @@ class SetExpressCheckoutRequestDetailsType
      * Character length and limitations: 127
      * @access    public
      * @namespace ebl
-     * @name cpp -header-image
+     * @name cpp-header-image
      * @var string
      */
     public $cppheaderimage;
@@ -269,7 +269,7 @@ class SetExpressCheckoutRequestDetailsType
      * hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -header-border-color
+     * @name cpp-header-border-color
      * @var string
      */
     public $cppheaderbordercolor;
@@ -280,7 +280,7 @@ class SetExpressCheckoutRequestDetailsType
      * character HTML hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -header-back-color
+     * @name cpp-header-back-color
      * @var string
      */
     public $cppheaderbackcolor;
@@ -291,7 +291,7 @@ class SetExpressCheckoutRequestDetailsType
      * hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -payflow-color
+     * @name cpp-payflow-color
      * @var string
      */
     public $cpppayflowcolor;
@@ -302,7 +302,7 @@ class SetExpressCheckoutRequestDetailsType
      * hexadecimal color code in ASCII
      * @access    public
      * @namespace ebl
-     * @name cpp -cart-border-color
+     * @name cpp-cart-border-color
      * @var string
      */
     public $cppcartbordercolor;
@@ -315,7 +315,7 @@ class SetExpressCheckoutRequestDetailsType
      * and limitations: 127
      * @access    public
      * @namespace ebl
-     * @name cpp -logo-image
+     * @name cpp-logo-image
      * @var string
      */
     public $cpplogoimage;
diff --git a/vendor/paypal/merchant-sdk-php/lib/PayPal/Service/PayPalAPIInterfaceServiceService.php b/vendor/paypal/merchant-sdk-php/lib/PayPal/Service/PayPalAPIInterfaceServiceService.php
index e9345075..1d466ae1 100644
--- a/vendor/paypal/merchant-sdk-php/lib/PayPal/Service/PayPalAPIInterfaceServiceService.php
+++ b/vendor/paypal/merchant-sdk-php/lib/PayPal/Service/PayPalAPIInterfaceServiceService.php
@@ -123,7 +123,7 @@ class PayPalAPIInterfaceServiceService
     protected static $SDK_NAME = "merchant-php-sdk";
 
     // SDK Version
-    protected static $SDK_VERSION = "3.11.0";
+    protected static $SDK_VERSION = "3.12.0";
 
     /**
      * @param $config - Dynamic config map. This takes the higher precedence if config file is also present.
diff --git a/vendor/paypal/merchant-sdk-php/samples/.gitignore b/vendor/paypal/merchant-sdk-php/samples/.gitignore
deleted file mode 100644
index eedac07b..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/.gitignore
+++ /dev/null
@@ -1,14 +0,0 @@
-
-build
-.DS_Store
-*.log
-
-# IDE
-.project
-.settings
-.buildpath
-*.bak
-
-# Composer
-vendor
-composer.lock
diff --git a/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/GetAuthDetails.html.php b/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/GetAuthDetails.html.php
deleted file mode 100644
index 78668f67..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/GetAuthDetails.html.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
-<html xmlns="http://www.w3.org/1999/xhtml";>
-<head>
-<title>PayPal Merchant SDK - GetAuthDetails</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<?php $token = isset($_GET['token'])?  $_GET['token'] : 'HA-WJH3DBT463KH4';
-?>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png"/>
-		<div id="header">
-			<h3>GetAuthDetails</h3>
-			<div id="apidetails"></div>
-		</div>
-		<form id="form1" action="GetAuthDetails.php">
-			<div id="request_form">
-				<div class="param_name">Token</div>
-				<div class="param_value">
-					<input type="text" name="token" id="token"
-						value=<?php echo $token ;?> />
-				</div>
-				<div class="submit">
-					<input id="Submit1" type="submit" name="submit" value="Submit" />
-				</div>
-			</div>
-		</form>
-		<a href="../index.php">Home</a>
-	</div>
-	<div id="relatedcalls"></div>
-</body>
-</html>
-
diff --git a/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/GetAuthDetails.php b/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/GetAuthDetails.php
deleted file mode 100644
index f2fd5d9a..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/GetAuthDetails.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-use PayPal\PayPalAPI\GetAuthDetailsReq;
-use PayPal\PayPalAPI\GetAuthDetailsRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- *  If a token from the SetAuthFlowParam call is specified on input, the GetAuthDetails call can return a customer's Payer ID, PayPal email address, first name, and last name. 
- */
-$reqType = new GetAuthDetailsRequestType($_REQUEST['token']);
-$req = new GetAuthDetailsReq();
-$req->GetAuthDetailsRequest = $reqType;
-
-$logger->info("created GetAuthDetailsRequest Object");
-/*
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$getAuthDetailsResponse = $paypalService->GetAuthDetails($req);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-
-if(isset($getAuthDetailsResponse)) {
-	echo "<pre>";
-	print_r($getAuthDetailsResponse);
-	echo "</pre>";
-	if($getAuthDetailsResponse->Ack == 'Success') {
-		$payPalURL = 'https://www.sandbox.paypal.com/webscr&cmd=_account-authenticate-logout&token='.$token;
-		echo "<a href=$payPalURL><b>* Redirect to paypal to logout</b></a><br>";
-	}
-}
-/*
- * Note that the GetAuthDetails call is used after you have specified a set of customer data in the SetAuthFlowParam call (in the example above, the customer name and email address), and the customer has logged into PayPal and then was redirected back to your site
- */
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/SetAuthFlowParam.html.php b/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/SetAuthFlowParam.html.php
deleted file mode 100644
index 58afb056..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/SetAuthFlowParam.html.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
-<html xmlns="http://www.w3.org/1999/xhtml";>
-<head>
-<title>PayPal Merchant SDK - SetAuthFlowParam</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<?php 
-$serverName = $_SERVER['SERVER_NAME'];
-$serverPort = $_SERVER['SERVER_PORT'];
-$url=dirname('http://'.$serverName.':'.$serverPort.$_SERVER['REQUEST_URI']);
-$returnUrl = $url."/GetAuthDetails.html.php";
-$cancelUrl = $url. "/SetAuthFlowParam.html.php" ;
-?>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png"/>
-		<div id="header">
-			<h3>SetAuthFlowParam</h3>
-			<div id="apidetails"></div>
-		</div>
-		<form id="form1" action="SetAuthFlowParam.php">
-			<div id="request_form">
-				<div class="param_name">Return URL</div>
-				<div class="param_value">
-					<input type="text" name="returnURL" id="returnURL" size="90"
-						value=<?php echo $returnUrl?> />
-				</div>
-				<div class="param_name">Cancel URL</div>
-				<div class="param_value">
-					<input type="text" name="cancelURL" id="cancelURL" size="90"
-						value=<?php echo $cancelUrl?> />
-				</div>
-
-				<div class="param_name">Logout URL</div>
-				<div class="param_value">
-					<input type="text" name="logoutURL" id="LogoutURL" size="90"
-						value=<?php echo $cancelUrl ?> />
-				</div>
-
-				<div class="submit">
-					<input id="Submit1" type="submit" name="submit" value="Submit" />
-				</div>
-			</div>
-			<a href="../index.php">Home</a>
-		</form>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/SetAuthFlowParam.php b/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/SetAuthFlowParam.php
deleted file mode 100644
index f3f12ef8..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AccountAuthentication/SetAuthFlowParam.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-use PayPal\EBLBaseComponents\SetAuthFlowParamRequestDetailsType;
-use PayPal\PayPalAPI\SetAuthFlowParamReq;
-use PayPal\PayPalAPI\SetAuthFlowParamRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * Sets up the account authentication flow and returns a token
- * To validate a PayPal account in the sandbox:
-
-    1. Set up the account authentication flow.
-    2. Redirect the customer to PayPal for authorization.
-    3. Retrieve the customer data for identifying the customer on your site.
-
- */
-$reqDetails = new SetAuthFlowParamRequestDetailsType();
-$reqDetails->CancelURL = $_REQUEST['cancelURL'];
-$reqDetails->ReturnURL = $_REQUEST['returnURL'];
-$reqDetails->LogoutURL = $_REQUEST['logoutURL'];
-
-$reqType = new SetAuthFlowParamRequestType();
-
-$reqType->SetAuthFlowParamRequestDetails = $reqDetails;
-$req = new SetAuthFlowParamReq();
-$req->SetAuthFlowParamRequest = $reqType;
-
-/*
- * 	 ## Creating service wrapper object
-		 Creating service wrapper object to make API call and loading
-		Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$setAuthFlowParamResponse = $paypalService->SetAuthFlowParam($req);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-
-if(isset($setAuthFlowParamResponse)) {
-	echo "<pre>";
-	print_r($setAuthFlowParamResponse);
-	echo "</pre>";
-	if($setAuthFlowParamResponse->Ack == 'Success') {
-		$token = $setAuthFlowParamResponse->Token;
-		$payPalURL = 'https://www.sandbox.paypal.com/webscr&cmd=_account-authenticate-login&token='.$token;
-		echo"<a href=$payPalURL><b>* Redirect to paypal to login</b></a><br>";
-	}
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/AddressVerify.html.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/AddressVerify.html.php
deleted file mode 100644
index c9932956..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/AddressVerify.html.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - AddressVerify</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>AddressVerify</h3>
-			<div id="apidetails">AddressVerify API operation confirms whether a
-				postal address and postal code match those of the specified PayPal
-				account holder.</div>
-		</div>
-		<form method="POST" action="AddressVerify.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">Mail *</div>
-					<div class="param_value">
-						<input type="text" name="mail" value="" size="50" maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Street *</div>
-					<div class="param_value">
-						<input type="text" name="street" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Zip *</div>
-					<div class="param_value">
-						<input type="text" name="zip" value="" size="50" maxlength="260" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="AddressVerifyBtn" value="AddressVerify" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/AddressVerify.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/AddressVerify.php
deleted file mode 100644
index 7d75578b..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/AddressVerify.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-use PayPal\PayPalAPI\AddressVerifyReq;
-use PayPal\PayPalAPI\AddressVerifyRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * The AddressVerify API operation confirms whether a postal address and postal code match those of the specified PayPal account holder.
- */
-
-/*
- * Email address of a PayPal member to verify
- * First line of the billing or shipping postal address to verify. To pass verification, the value of Street must match the first 3 single-byte characters of a postal address on file for the PayPal member. 
- * Postal code to verify. To pass verification, the value of Zip must match the first 5 single-byte characters of the postal code of the verified postal address for the verified PayPal member.
- */
-
-$addressVerifyRequest = new AddressVerifyRequestType($_REQUEST['mail'], $_REQUEST['street'], $_REQUEST['zip']);
-$addrVerifyReq = new AddressVerifyReq();
-$addrVerifyReq->AddressVerifyRequest = $addressVerifyRequest;
-
-/*
- * 		// ## Creating service wrapper object
-		// Creating service wrapper object to make API call and loading
-		Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$addrVerifyResponse = $paypalService->AddressVerify($addrVerifyReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($addrVerifyResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$addrVerifyResponse->Ack</div> </td></tr>";
-	echo "<tr><td>StreetMatch :</td><td><div id='StreetMatch'>$addrVerifyResponse->StreetMatch</div> </td></tr>";
-	echo "<tr><td>ZipMatch :</td><td><div id='ZipMatch'>$addrVerifyResponse->ZipMatch</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($addrVerifyResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetBalance.html.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetBalance.html.php
deleted file mode 100644
index 380b1619..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetBalance.html.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - GetBalance</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>GetBalance</h3>
-			<div id="apidetails">GetBalance API Operation obtains the available
-				balance for a PayPal account.</div>
-		</div>
-		<form method="POST" action="GetBalance.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">Return All Currencies (Indicates whether to
-						return all currencies)</div>
-					<div class="param_value">
-						<select name="returnAllCurrencies">
-							<option value=""></option>
-							<option value="0">Return only the balance for the primary
-								currency holding</option>
-							<option value="1">Return the balance for each currency holding</option>
-						</select>
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="GetBalanceBtn" value="GetBalance" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetBalance.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetBalance.php
deleted file mode 100644
index 2820ef15..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetBalance.php
+++ /dev/null
@@ -1,46 +0,0 @@
-<?php
-use PayPal\PayPalAPI\GetBalanceReq;
-use PayPal\PayPalAPI\GetBalanceRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- *  The GetBalance API Operation obtains the available balance for a PayPal account.
-*  This sample code uses Merchant PHP SDK to make API call
-*/
-$getBalanceRequest = new GetBalanceRequestType();
-
-/*
- *  Indicates whether to return all currencies. It is one of the
-following values:
-
-* 0 ? Return only the balance for the primary currency holding.
-* 1 ? Return the balance for each currency holding.
-*/
-$getBalanceRequest->ReturnAllCurrencies = $_REQUEST['returnAllCurrencies'];
-
-$getBalanceReq = new GetBalanceReq();
-$getBalanceReq->GetBalanceRequest = $getBalanceRequest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$getBalanceResponse = $paypalService->GetBalance($getBalanceReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($getBalanceResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$getBalanceResponse->Ack</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($getBalanceResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetPalDetails.html.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetPalDetails.html.php
deleted file mode 100644
index e00384e2..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetPalDetails.html.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - GetPalDetails</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-
-	<div id="header">
-		<h3>GetPalDetails</h3>
-		<div id="apidetails">GetPalDetails API operation gets the information
-			about the partner of the requested Merchant.</div>
-	</div>
-	<form method="POST" action="GetPalDetails.php">
-		<div id="request_form">
-			<div class="submit">
-				<input type="submit" name="GetPalDetailsBtn" value="GetPalDetails" /><br />
-			</div>
-			<a href="../index.php">Home</a>
-		</div>
-	</form>
-
-
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetPalDetails.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetPalDetails.php
deleted file mode 100644
index f9a9041f..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetPalDetails.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-use PayPal\PayPalAPI\GetPalDetailsReq;
-use PayPal\PayPalAPI\GetPalDetailsRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-/*
- * Obtain your Pal ID, which is the PayPal-assigned merchant account number, and other informaton about your account. You need the account number when working with dynamic versions of PayPalbuttons and logos
- */
-$getPalDetailsRequest = new GetPalDetailsRequestType();
-$getPalDetailsReq = new GetPalDetailsReq();
-$getPalDetailsReq->GetPalDetailsRequest = $getPalDetailsRequest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$getPalDetailsResponse = $paypalService->GetPalDetails($getPalDetailsReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($getPalDetailsResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$getPalDetailsResponse->Ack</div> </td></tr>";
-	echo "<tr><td>Pal :</td><td><div id='Pal'>$getPalDetailsResponse->Pal</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($getPalDetailsResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetTransactionDetails.html.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetTransactionDetails.html.php
deleted file mode 100644
index 2efbf0dc..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetTransactionDetails.html.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - GetTransactionDetails</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>GetTransactionDetails</h3>
-			<div id="apidetails">GetTransactionDetails API operation obtains
-				information about a specific transaction.</div>
-		</div>
-		<form method="POST" action="GetTransactionDetails.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						Transaction ID * (Get Transaction ID via <a
-							href="../DirectPayment/DoDirectPayment.html.php">Direct Payment</a>
-						or <a href="../ExpressCheckout/SetExpressCheckout.html.php">ExpressCheckout</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="transID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="GetTransactionDetailsBtn"
-						value="GetTransactionDetails" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetTransactionDetails.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetTransactionDetails.php
deleted file mode 100644
index ee581104..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/GetTransactionDetails.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-use PayPal\PayPalAPI\GetTransactionDetailsReq;
-use PayPal\PayPalAPI\GetTransactionDetailsRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * The GetTransactionDetails API operation obtains information about a specific transaction.
-*/
-$transactionDetails = new GetTransactionDetailsRequestType();
-/*
- * Unique identifier of a transaction.
-*/
-$transactionDetails->TransactionID = $_POST['transID'];
-
-$request = new GetTransactionDetailsReq();
-$request->GetTransactionDetailsRequest = $transactionDetails;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$transDetailsResponse = $paypalService->GetTransactionDetails($request);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($transDetailsResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$transDetailsResponse->Ack</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($transDetailsResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
-
-?>
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/TransactionSearch.html.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/TransactionSearch.html.php
deleted file mode 100644
index fb458558..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/TransactionSearch.html.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php 
-$currDate = getdate();
-$endDate = $currDate['year'].'-'.$currDate['mon'].'-'.$currDate['mday'];
-$endDate = strtotime($endDate);
-$endDate = date("Y-m-d\TH:i:sO", mktime(0,0,0,date('m',$endDate),date('d',$endDate),date('Y',$endDate)));
-$startDate = strtDate($endDate, 1);
-
-function strtDate($orgDate,$dy){
-	$cd = strtotime($orgDate);
-	$retDAY = date("Y-m-d\TH:i:sO", mktime(0,0,0,date('m',$cd),date('d',$cd)-$dy,date('Y',$cd)));
-	return $retDAY;
-}
-
-?>
-<html>
-<head>
-<title>PayPal Merchant SDK - TransactionSearch</title>
-<link href="../Common/sdk.css" rel="stylesheet"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>TransactionSearch</h3>
-			<div id="apidetails">TransactionSearch API searches transaction
-				history for transactions that meet the specified criteria.</div>
-		</div>
-		<form method="POST" action="TransactionSearch.php">
-
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">Start date *</div>
-					<div class="param_value">
-						<input type="text" name="startDate" size="30"
-							value="<?php echo $startDate ?>" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">End date</div>
-					<div class="param_value">
-						<input type="text" name="endDate" size="30"
-							value=<?php echo $endDate?> />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">
-						Transaction ID (Get Transaction ID via <a
-							href="../DirectPayment/DoDirectPayment.html.php">Direct Payment</a>
-						or <a href="../ExpressCheckout/SetExpressCheckout.html.php">ExpressCheckout</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="transactionID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="TransactionSearchBtn"
-						value="TransactionSearch" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-
-			</div>
-		</form>
-
-
-	</div>
-</body>
-</html>
-
-
diff --git a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/TransactionSearch.php b/vendor/paypal/merchant-sdk-php/samples/AdminCalls/TransactionSearch.php
deleted file mode 100644
index dfcffbe0..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/AdminCalls/TransactionSearch.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-use PayPal\PayPalAPI\TransactionSearchReq;
-use PayPal\PayPalAPI\TransactionSearchRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- *  # TransactionSearch API
-The TransactionSearch API searches transaction history for transactions
-that meet the specified criteria.
-`Note:
-The maximum number of transactions that can be returned from a
-TransactionSearch API call is 100.`
-This sample code uses Merchant PHP SDK to make API call
-*/
-
-/*
- *  `TransactionSearchRequestType` which takes mandatory argument:
-
-* `Start Date` - The earliest transaction date at which to start the
-search.
-*/
-$transactionSearchRequest = new TransactionSearchRequestType();
-$transactionSearchRequest->StartDate = $_REQUEST['startDate'];
-$transactionSearchRequest->EndDate = $_REQUEST['endDate'];
-$transactionSearchRequest->TransactionID = $_REQUEST['transactionID'];
-
-$tranSearchReq = new TransactionSearchReq();
-$tranSearchReq->TransactionSearchRequest = $transactionSearchRequest;
-
-/*
- * 		 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$transactionSearchResponse = $paypalService->TransactionSearch($tranSearchReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($transactionSearchResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$transactionSearchResponse->Ack</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($transactionSearchResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillUser.html.php b/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillUser.html.php
deleted file mode 100644
index 7dc14116..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillUser.html.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - Bill User</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>Bill User</h3>
-			<div id="apidetails">Initiate a "merchant pull" (or "prepparoved
-				payment") transaction - transfer money from the user's account to
-				the merchant's account in accordance with a previously established
-				billing agreement.</div>
-		</div>
-		<form method="POST" action="BillUser.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						Billing Agreement ID*(Get Billing Agreement ID via <a
-							href="../ExpressCheckout/SetExpressCheckout.html.php">ExpressCheckout</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="billingAgreementID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Payment Type</div>
-					<div class="param_value">
-						<select name=paymentCodeType>
-							<option value=Any>Any</option>
-							<option value=InstantOnly>InstantOnly</option>
-							<option value=EcheckOnly>EcheckOnly</option>
-						</select>
-					</div>
-				</div>
-				<div class="section_header">Item Details</div>
-				<table class="params">
-					<tr>
-						<th class="param_name">Item Name</th>
-						<th class="param_name">Item Number</th>
-					</tr>
-					<tr>
-						<td class="param_value"><input type="text" name="itemName"
-							value="Goods" /></td>
-						<td class="param_value"><input type="text" name="itemNum"
-							value="1" /></td>
-					</tr>
-				</table>
-				<table class="params">
-					<tr>
-						<th class="param_name">Amount to be charged</th>
-						<th class="param_name">Shipping cost</th>
-						<th class="param_name">Handling cost</th>
-						<th class="param_name">Tax Amount</th>						
-						<th class="param_name">Currency Code</th>
-					</tr>
-					<tr>
-						<td class="param_value"><input type="text" name="amt" value="0.50" />
-						</td>
-						<td class="param_value"><input type="text" name="shipping"
-							value="0.50" />
-						</td>
-						<td class="param_value"><input type="text" name="handling"
-							value="0.00" />
-						</td>
-						<td class="param_value"><input type="text" name="tax"
-							value="0.0" />
-						</td>						
-						<td class="param_value"><input type="text" name="currencyID"
-							value="USD" /></td>
-					</tr>
-				</table>
-				<div class="params">
-					<div class="param_name">Subject in email</div>
-					<div class="param_value">
-						<input type="text" name="mailSubject" value="BillUser" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Memo</div>
-					<div class="param_value">
-						<input type="text" name="memo" value="BillUser" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="BillUserBtn" value="BillUser" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillUser.php b/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillUser.php
deleted file mode 100644
index 81dc388d..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillUser.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\MerchantPullPaymentType;
-use PayPal\PayPalAPI\BillUserReq;
-use PayPal\PayPalAPI\BillUserRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * Initiate a "merchant pull" (or "prepparoved payment") transaction - transfer money from the user's account to the merchant's account in accordance with a previously established billing agreement
- */
-$currencyId = $_REQUEST['currencyID'];
-
-/*
- * payment details
- */
-$MPPaymentDetails = new MerchantPullPaymentType();
-$MPPaymentDetails->Amount = new BasicAmountType($currencyId, $_REQUEST['amt']);
-$MPPaymentDetails->Shipping = new BasicAmountType($currencyId, $_REQUEST['shipping']);
-$MPPaymentDetails->Handling = new BasicAmountType($currencyId, $_REQUEST['handling']);
-$MPPaymentDetails->Tax = new BasicAmountType($currencyId, $_REQUEST['tax']);
-$MPPaymentDetails->PaymentType = $_REQUEST['paymentCodeType'];
-$MPPaymentDetails->EmailSubject = $_REQUEST['mailSubject'];
-$MPPaymentDetails->ItemName = $_REQUEST['itemName'];
-$MPPaymentDetails->ItemNumber = $_REQUEST['itemNum'];
-$MPPaymentDetails->Memo = $_REQUEST['memo'];
-$MPPaymentDetails->MpID = $_REQUEST['billingAgreementID'];
-
-$billUserReqest = new BillUserRequestType();
-$billUserReqest->MerchantPullPaymentDetails = $MPPaymentDetails;
-
-
-$billUserReq = new BillUserReq();
-$billUserReq->BillUserRequest = $billUserReqest;
-
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$billUserResponse = $paypalService->BillUser($billUserReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($billUserResponse)) {
-	echo "<pre>";
-	print_r($billUserResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillingAgreementUpdate.html.php b/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillingAgreementUpdate.html.php
deleted file mode 100644
index 18d0d373..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillingAgreementUpdate.html.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<title>PayPal Merchant SDK - BillAgreementUpdate</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>BillAgreementUpdate</h3>
-			<div id="header">
-				<p>
-					<b>BAUpdate API operation updates or deletes a billing agreement.</b>
-				</p>
-			</div>
-		</div>
-		<form id="form1" method="post" action="BillingAgreementUpdate.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						ReferenceID (Billing agreement ID or a reference transaction ID
-						that is associated with a billing agreement, get it via <a
-							href="../ExpressCheckout/SetExpressCheckout.html.php">ExpressCheckout</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="referenceID" value="" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">BillingAgreement Status</div>
-					<div class="param_value">
-						<select name="billingAgreementStatus">
-							<option value="Active">Active</option>
-							<option value="Canceled">Canceled</option>
-						</select>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">BillingAgreement Description</div>
-					<div class="param_value">
-						<textarea name="billingAgreementDescription" rows="10" cols="50"></textarea>
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="BillAgreementUpdateBtn"
-						value="BillAgreementUpdate" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-	</div>
-</body>
-</html>
-
diff --git a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillingAgreementUpdate.php b/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillingAgreementUpdate.php
deleted file mode 100644
index f0bbc854..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/BillingAgreementUpdate.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-use PayPal\PayPalAPI\BAUpdateRequestType;
-use PayPal\PayPalAPI\BillAgreementUpdateReq;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-/*
- * update billing agreement
- */
-$BAUpdateRequest = new BAUpdateRequestType($_REQUEST['referenceID']);
-$BAUpdateRequest->BillingAgreementStatus = $_REQUEST['billingAgreementStatus'];
-$BAUpdateRequest->BillingAgreementDescription = $_REQUEST['billingAgreementDescription'];
-
-$billingAgreementUpdateReq = new BillAgreementUpdateReq();
-$billingAgreementUpdateReq->BAUpdateRequest = $BAUpdateRequest;
-/*
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$BAUpdatResponse = $paypalService->BillAgreementUpdate($billingAgreementUpdateReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($BAUpdatResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$BAUpdatResponse->Ack</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($BAUpdatResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/DoReferenceTransaction.html.php b/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/DoReferenceTransaction.html.php
deleted file mode 100644
index aed2c9c1..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/DoReferenceTransaction.html.php
+++ /dev/null
@@ -1,397 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<title>PayPal Merchant SDK - DoReferenceTransaction</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-<script type="text/javascript">
-function display() {
-document.getElementById("id2").style.display = "";
-}
-</script>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>DoReferenceTransaction</h3>
-			<div id="header">
-				<p>The DoReferenceTransaction API operation processes a payment from
-					a buyers account, which is identified by a previous transaction.</p>
-			</div>
-		</div>
-		<form id="form1" method="post" action="DoReferenceTransaction.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">Payment Action</div>
-					<div class="param_value">
-						<select name=paymentAction>
-							<option value=Sale selected>Sale</option>
-							<option value=Authorization>Authorization</option>
-						</select>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Payment Type</div>
-					<div class="param_value">
-						<select name=paymentType>
-							<option value=Any>Any</option>
-							<option value=InstantOnly>InstantOnly</option>
-							<option value=EcheckOnly>EcheckOnly</option>
-						</select>
-					</div>
-				</div>
-
-				<div class="section_header">
-					<b>Payment Details</b>
-				</div>
-				<div id="paymentDetails">
-					<div class="params">
-						<div class="param_name">Amount</div>
-						<div class="param_value">
-							<input type="text" name="amount" id="amount" value="1.00" />
-						</div>
-					</div>
-					<div class="params">
-						<div class="param_name">CurrencyID</div>
-						<div class="param_value">
-							<input type="text" name="currencyID" id="currencyID" value="USD" />
-						</div>
-					</div>
-					<div class="params">
-						<div class="param_name">Shipping Address</div>
-					</div>
-
-					<div class="params">
-						<div class="param_name">First Name</div>
-						<div class="param_value">
-							<input type="text" name="firstName" id="firstName" value="John" />
-						</div>
-					</div>
-
-					<div class="params">
-						<div class="param_name">Last Name</div>
-						<div class="param_value">
-							<input type="text" name="lastName" id="lastName" value="Doe" />
-						</div>
-					</div>
-
-					<div class="params">
-						<div class="param_name">Address Line 1</div>
-						<div class="param_value">
-							<input type="text" name="address1" id="address1"
-								value="1 Main St" />
-						</div>
-					</div>
-
-
-					<div class="params">
-						<div class="param_name">City</div>
-						<div class="param_value">
-							<input type="text" name="city" id="city" value="San Jose" />
-						</div>
-					</div>
-
-					<div class="params">
-						<div class="param_name">Country</div>
-						<div class="param_value">
-							<input type="text" name="country" id="country" value="USA" />
-						</div>
-					</div>
-
-					<div class="params">
-						<div class="param_name">State</div>
-						<div class="param_value">
-							<select id="state" name="state">
-								<option value=></option>
-								<option value=AK>AK</option>
-								<option value=AL>AL</option>
-								<option value=AR>AR</option>
-								<option value=AZ>AZ</option>
-								<option value=CA selected>CA</option>
-								<option value=CO>CO</option>
-								<option value=CT>CT</option>
-								<option value=DC>DC</option>
-								<option value=DE>DE</option>
-								<option value=FL>FL</option>
-								<option value=GA>GA</option>
-								<option value=HI>HI</option>
-								<option value=IA>IA</option>
-								<option value=ID>ID</option>
-								<option value=IL>IL</option>
-								<option value=IN>IN</option>
-								<option value=KS>KS</option>
-								<option value=KY>KY</option>
-								<option value=LA>LA</option>
-								<option value=MA>MA</option>
-								<option value=MD>MD</option>
-								<option value=ME>ME</option>
-								<option value=MI>MI</option>
-								<option value=MN>MN</option>
-								<option value=MO>MO</option>
-								<option value=MS>MS</option>
-								<option value=MT>MT</option>
-								<option value=NC>NC</option>
-								<option value=ND>ND</option>
-								<option value=NE>NE</option>
-								<option value=NH>NH</option>
-								<option value=NJ>NJ</option>
-								<option value=NM>NM</option>
-								<option value=NV>NV</option>
-								<option value=NY>NY</option>
-								<option value=OH>OH</option>
-								<option value=OK>OK</option>
-								<option value=OR>OR</option>
-								<option value=PA>PA</option>
-								<option value=RI>RI</option>
-								<option value=SC>SC</option>
-								<option value=SD>SD</option>
-								<option value=TN>TN</option>
-								<option value=TX>TX</option>
-								<option value=UT>UT</option>
-								<option value=VA>VA</option>
-								<option value=VT>VT</option>
-								<option value=WA>WA</option>
-								<option value=WI>WI</option>
-								<option value=WV>WV</option>
-								<option value=WY>WY</option>
-								<option value=AA>AA</option>
-								<option value=AE>AE</option>
-								<option value=AP>AP</option>
-								<option value=AS>AS</option>
-								<option value=FM>FM</option>
-								<option value=GU>GU</option>
-								<option value=MH>MH</option>
-								<option value=MP>MP</option>
-								<option value=PR>PR</option>
-								<option value=PW>PW</option>
-								<option value=VI>VI</option>
-							</select>
-						</div>
-					</div>
-
-					<div class="params">
-						<div class="param_name">Postal Code</div>
-						<div class="param_value">
-							<input type="text" name="zip" id="zip" value="95131" />
-						</div>
-					</div>
-					<div class="params">
-						<div class="param_name">
-							Reference TransactionID (Billing agreement ID or a reference
-								transaction ID that is associated with a billing agreement, get
-								it via <a href="../ExpressCheckout/SetExpressCheckout.html.php">ExpressCheckout</a>)							
-						</div>
-						<div class="param_value">
-							<input type="text" name="referenceID" id="referenceID" />
-						</div>
-					</div>
-						<div class="params">
-							<div class="param_name">Notify Url</div>
-							<div class="param_value">
-								<input type="text" name="notifyURL" id="notifyURL" value="" size = "80" />
-							</div>
-						</div>
-
-					<table class="params">
-						<tr>
-							<th class="param_name">Override CreditCard Details</th>
-							<td class="param_value"><input type="checkbox"
-								name="ReferenceCreditCardDetails" value="ON" onclick="display()" />
-							</td>
-						</tr>
-					</table>
-
-
-					<div id="id2" class="param_value" style="display: none">
-						<div class="section_header">
-							<b>CreditCard Details</b>
-						</div>
-						<div class="params">
-							<div class="param_name">First Name</div>
-							<div class="param_value">
-								<input type="text" name="OfirstName" id="firstName" value="John" />
-							</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">Last Name</div>
-							<div class="param_value">
-								<input type="text" name="OlastName" id="lastName" value="Doe" />
-							</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">CreditCard Number</div>
-							<div class="param_value">
-								<input type="text" name="creditCardNumber" id="creditCardNumber"
-									value="4904969011809253" />
-							</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">CreditCardType</div>
-							<div class="param_value">
-								<select name=creditCardType>
-									<option value=Visa selected>Visa</option>
-									<option value=MasterCard>MasterCard</option>
-									<option value=Discover>Discover</option>
-									<option value=Amex>American Express</option>
-								</select>
-							</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">CVV2</div>
-							<div class="param_value">
-								<input type="text" name="CVV2" id="CVV2" value="962" />
-							</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">Expiry Month</div>
-							<div class="param_value">
-								<input type="text" name="expMonth" id="expMonth" value="11" />
-							</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">Expiry Year</div>
-							<div class="param_value">
-								<input type="text" name="expYear" id="expYear" value="2015" />
-							</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">Billing Address</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">First Name</div>
-							<div class="param_value">
-								<input type="text" name="BfirstName" id="firstName" value="John" />
-							</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">Last Name</div>
-							<div class="param_value">
-								<input type="text" name="BlastName" id="lastName" value="Doe" />
-							</div>
-						</div>
-						<div class="params">
-							<div class="param_name">Address Line 1</div>
-							<div class="param_value">
-								<input type="text" name="Baddress1" id="address1"
-									value="1 Main St" />
-							</div>
-						</div>
-
-						<div class="params">
-							<div class="param_name">Address Line 2</div>
-							<div class="param_value">
-								<input type="text" name="Baddress2" id="address2" />
-							</div>
-						</div>
-						<div class="params">
-							<div class="param_name">City</div>
-							<div class="param_value">
-								<input type="text" name="Bcity" id="city" value="San Jose" />
-							</div>
-						</div>
-						<div class="params">
-							<div class="param_name">Country</div>
-							<div class="param_value">
-								<input type="text" name="Bcountry" id="country" value="USA" />
-							</div>
-						</div>
-						<div class="params">
-							<div class="param_name">State</div>
-							<div class="param_value">
-								<select id=state name=Bstate>
-									<option value=></option>
-									<option value=AK>AK</option>
-									<option value=AL>AL</option>
-									<option value=AR>AR</option>
-									<option value=AZ>AZ</option>
-									<option value=CA selected>CA</option>
-									<option value=CO>CO</option>
-									<option value=CT>CT</option>
-									<option value=DC>DC</option>
-									<option value=DE>DE</option>
-									<option value=FL>FL</option>
-									<option value=GA>GA</option>
-									<option value=HI>HI</option>
-									<option value=IA>IA</option>
-									<option value=ID>ID</option>
-									<option value=IL>IL</option>
-									<option value=IN>IN</option>
-									<option value=KS>KS</option>
-									<option value=KY>KY</option>
-									<option value=LA>LA</option>
-									<option value=MA>MA</option>
-									<option value=MD>MD</option>
-									<option value=ME>ME</option>
-									<option value=MI>MI</option>
-									<option value=MN>MN</option>
-									<option value=MO>MO</option>
-									<option value=MS>MS</option>
-									<option value=MT>MT</option>
-									<option value=NC>NC</option>
-									<option value=ND>ND</option>
-									<option value=NE>NE</option>
-									<option value=NH>NH</option>
-									<option value=NJ>NJ</option>
-									<option value=NM>NM</option>
-									<option value=NV>NV</option>
-									<option value=NY>NY</option>
-									<option value=OH>OH</option>
-									<option value=OK>OK</option>
-									<option value=OR>OR</option>
-									<option value=PA>PA</option>
-									<option value=RI>RI</option>
-									<option value=SC>SC</option>
-									<option value=SD>SD</option>
-									<option value=TN>TN</option>
-									<option value=TX>TX</option>
-									<option value=UT>UT</option>
-									<option value=VA>VA</option>
-									<option value=VT>VT</option>
-									<option value=WA>WA</option>
-									<option value=WI>WI</option>
-									<option value=WV>WV</option>
-									<option value=WY>WY</option>
-									<option value=AA>AA</option>
-									<option value=AE>AE</option>
-									<option value=AP>AP</option>
-									<option value=AS>AS</option>
-									<option value=FM>FM</option>
-									<option value=GU>GU</option>
-									<option value=MH>MH</option>
-									<option value=MP>MP</option>
-									<option value=PR>PR</option>
-									<option value=PW>PW</option>
-									<option value=VI>VI</option>
-								</select>
-							</div>
-						</div>
-						<div class="params">
-							<div class="param_name">Postal Code</div>
-							<div class="param_value">
-								<input type="text" name="Bzip" id="Bzip" value="95131" />
-							</div>
-						</div>
-					
-					</div>
-					<div class="submit">
-						<input type="submit" name="DoReferenceTransactionBtn"
-							value="DoReferenceTransaction" /><br />
-					</div>
-					<a href="../index.php">Home</a>
-				</div>
-			</div>
-		</form>
-
-	</div>
-
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/DoReferenceTransaction.php b/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/DoReferenceTransaction.php
deleted file mode 100644
index 689517e5..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/DoReferenceTransaction.php
+++ /dev/null
@@ -1,143 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\AddressType;
-use PayPal\EBLBaseComponents\CreditCardNumberTypeType;
-use PayPal\EBLBaseComponents\DoReferenceTransactionRequestDetailsType;
-use PayPal\EBLBaseComponents\PaymentDetailsType;
-use PayPal\EBLBaseComponents\PersonNameType;
-use PayPal\EBLBaseComponents\ReferenceCreditCardDetailsType;
-use PayPal\PayPalAPI\DoReferenceTransactionReq;
-use PayPal\PayPalAPI\DoReferenceTransactionRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- *  # DoReferenceTransaction API
-The DoReferenceTransaction API operation processes a payment from a
-buyer's account, which is identified by a previous transaction.
-This sample code uses Merchant PHP SDK to make API call
-*/
-
-/*
- *  The total cost of the transaction to the buyer. If shipping cost and
-tax charges are known, include them in this value. If not, this value
-should be the current subtotal of the order.
-
-If the transaction includes one or more one-time purchases, this field must be equal to
-the sum of the purchases. Set this field to 0 if the transaction does
-not include a one-time purchase such as when you set up a billing
-agreement for a recurring payment that is not immediately charged.
-When the field is set to 0, purchase-specific fields are ignored
-
-* `Currency ID` - You must set the currencyID attribute to one of the
-3-character currency codes for any of the supported PayPal
-currencies.
-* `Amount`
-*/
-$amount = new BasicAmountType($_REQUEST['currencyID'], $_REQUEST['amount']);
-
-// Address the order is shipped to.
-$shippingAddress = new AddressType();
-$shippingAddress->Name = $_REQUEST['firstName'].' '.$_REQUEST['lastName'];
-$shippingAddress->Street1 = $_REQUEST['address1'];
-$shippingAddress->CityName = $_REQUEST['city'];
-$shippingAddress->StateOrProvince = $_REQUEST['state'];
-$shippingAddress->Country = $_REQUEST['country'];
-$shippingAddress->PostalCode = $_REQUEST['zip'];
-
-if(isset($_REQUEST['ReferenceCreditCardDetails']) && $_REQUEST['ReferenceCreditCardDetails'] == "ON" )
-{
-	// biling address
-	$billingAddress = new AddressType();
-	$billingAddress->Name = $_REQUEST['OfirstName'].' '.$_REQUEST['OlastName'];
-	$billingAddress->Street1 = $_REQUEST['Baddress1'];
-	$billingAddress->CityName = $_REQUEST['Bcity'];
-	$billingAddress->StateOrProvince = $_REQUEST['Bstate'];
-	$billingAddress->Country = $_REQUEST['Bcountry'];
-	$billingAddress->PostalCode = $_REQUEST['Bzip'];
-
-	// credit card details
-	$cardOwner = new PersonNameType();
-	$cardOwner->FirstName = $_REQUEST['OfirstName'];
-	$cardOwner->LastName =  $_REQUEST['OlastName'];
-
-	$creditCardNumberType= new CreditCardNumberTypeType();
-	$creditCardNumberType->CreditCardNumber = $_REQUEST['creditCardNumber'];
-	$creditCardNumberType->CreditCardType = $_REQUEST['creditCardType'];
-
-	$creditCard = new ReferenceCreditCardDetailsType();
-	$creditCard->CardOwnerName = $cardOwner;
-	$creditCard->BillingAddress = $billingAddress;
-	$creditCard->CreditCardNumberType = $creditCardNumberType;
-	$creditCard->CVV2 = $_REQUEST['CVV2'];
-	$creditCard->ExpMonth = $_REQUEST['expMonth'];
-	$creditCard->ExpYear = $_REQUEST['expYear'];
-}
-
-// Information about the payment.
-$paymentDetails = new PaymentDetailsType();
-$paymentDetails->OrderTotal = $amount;
-$paymentDetails->ShipToAddress = $shippingAddress;
-
-/*
- * 		//Your URL for receiving Instant Payment Notification (IPN) about this transaction. If you do not specify this value in the request, the notification URL from your Merchant Profile is used, if one exists.
-
-*/
-if(isset($_REQUEST['notifyURL']))
-{
-	$paymentDetails->NotifyURL = $_REQUEST['notifyURL'];
-}
-
-/*
- * 	 `DoReferenceTransactionRequestDetails` takes mandatory params:
-
-* `Reference Id` - A transaction ID from a previous purchase, such as a
-credit card charge using the DoDirectPayment API, or a billing
-agreement ID.
-* `Payment Action Code` - How you want to obtain payment. It is one of
-the following values:
-* Authorization
-* Sale
-* Order
-* None
-* `Payment Details`
-*/
-$RTRequestDetails = new DoReferenceTransactionRequestDetailsType();
-if(isset($_REQUEST['ReferenceCreditCardDetails']) && $_REQUEST['ReferenceCreditCardDetails'] == "ON" )
-{
-	$RTRequestDetails->CreditCard = $creditCard;
-}
-
-$RTRequestDetails->PaymentDetails = $paymentDetails;
-$RTRequestDetails->ReferenceID = $_REQUEST['referenceID'];
-$RTRequestDetails->PaymentAction =$_REQUEST['paymentAction'];
-$RTRequestDetails->PaymentType = $_REQUEST['paymentType'];
-
-$RTRequest = new DoReferenceTransactionRequestType();
-$RTRequest->DoReferenceTransactionRequestDetails  = $RTRequestDetails;
-
-$RTReq = new DoReferenceTransactionReq();
-$RTReq->DoReferenceTransactionRequest = $RTRequest;
-
-/*
-## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$RTResponse = $paypalService->DoReferenceTransaction($RTReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($RTResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$RTResponse->Ack</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($RTResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/GetBillingAgreementCustomerDetails.html.php b/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/GetBillingAgreementCustomerDetails.html.php
deleted file mode 100644
index 7afd4304..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/GetBillingAgreementCustomerDetails.html.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<html>
-<title>PayPal Merchant SDK - GetBillingAgreementCustomerDetails</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>GetBillingAgreementCustomerDetails</h3>
-			<div id="GetBillingAgreementCustomerDetails">
-				<p>
-					<b>GetBillingAgreementCustomerDetails API operation obtains
-						information about a billing agreement's PayPal account holder.</b>
-				</p>
-			</div>
-		</div>
-		<form id="form1" method="post"
-			action="GetBillingAgreementCustomerDetails.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						Token (Get Token via <a
-							href="../ExpressCheckout/SetExpressCheckout.html.php">ExpressCheckout</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="token" value="" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="GetBillingAgreementCustomerDetailsBtn"
-						value="GetBillingAgreementCustomerDetails" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-	</div>
-</body>
-</html>
-
diff --git a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/GetBillingAgreementCustomerDetails.php b/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/GetBillingAgreementCustomerDetails.php
deleted file mode 100644
index c87867f0..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/BillingAgreements/GetBillingAgreementCustomerDetails.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-use PayPal\PayPalAPI\GetBillingAgreementCustomerDetailsReq;
-use PayPal\PayPalAPI\GetBillingAgreementCustomerDetailsRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-/*
- * The GetBillingAgreementCustomerDetails API operation obtains information about a billing agreement?s PayPal account holder. 
- */
-
-/*
- *  The time-stamped token returned in the SetCustomerBillingAgreement response
- */
-$BACustomerDetailRequest = new GetBillingAgreementCustomerDetailsRequestType($_REQUEST['token']);
-$BACustomerDetailReq = new GetBillingAgreementCustomerDetailsReq();
-$BACustomerDetailReq->GetBillingAgreementCustomerDetailsRequest = $BACustomerDetailRequest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$BACustomerDetailResponse = $paypalService->GetBillingAgreementCustomerDetails($BACustomerDetailReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($BACustomerDetailResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$BACustomerDetailResponse->Ack</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($BACustomerDetailResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/Common/sdk.css b/vendor/paypal/merchant-sdk-php/samples/Common/sdk.css
deleted file mode 100644
index 2f57e421..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Common/sdk.css
+++ /dev/null
@@ -1,92 +0,0 @@
-body {
-	
-}
-
-table th {
-	font-weight: normal;	
-}
-
-#permissionsdata {
-	margin-top: 20px;
-}
-
-#permissionsdata td {
-	padding: 10px 20px;
-}
-
-#permissionsdata td.left {
-	border-right: solid 1px gray;
-}
-
-.overview {
-	padding: 10px 20px;
-	font-style: italic;
-	width: 75%;
-}
-
-input.smallfield, select.smallfield {
-	width: 105px;
-	font-size: 12px;
-}
-
-input.xsmallfield, select.xsmallfield {
-	width: 75px;
-	font-size: 12px;
-}
-
-.open {
-	display: block;
-}
-
-.closed {
-	display: none;
-}
-
-#apidetails {
-	padding: 10px 20px 30px 20px;
-	font-style: italic;
-	width: 75%;
-}
-
-.note {
-	margin: 10px 10px;
-	font-style: italic;
-	width: 700px;
-}
-
-.section_header {
-	margin: 20px 0px;
-	font-weight: bold;
-}
-
-.submit {
-	margin-top: 20px;
-	margin-bottom: 20px;
-}
-
-ul.wizard {
-	font-size: 16px;
-	color: gray;
-	list-style-type: none;
-}
-
-ul.wizard li {
-	width: 20%;
-}
-
-ul.wizard li.current {
-	color: black;
-	font-weight: bold;
-}
-
-ul.wizard li.complete {
-	color: black;
-	background-image: url(images/tick.png);
-	background-repeat: no-repeat;
-	background-position: center right;
-	padding-right: 50px;
-}
-
-#apiResponse {
-	width: 700px;
-}
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/Common/sdk.js b/vendor/paypal/merchant-sdk-php/samples/Common/sdk.js
deleted file mode 100644
index fbae7bea..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Common/sdk.js
+++ /dev/null
@@ -1,9 +0,0 @@
-function toggleDisplay(id) {
-    var elem = document.getElementById(id);
-    var style = elem.style.display;
-    if(style == 'block') {
-        elem.style.display = 'none';
-    } else {
-        elem.style.display = 'block';
-    }
-}
diff --git a/vendor/paypal/merchant-sdk-php/samples/Configuration.php b/vendor/paypal/merchant-sdk-php/samples/Configuration.php
deleted file mode 100644
index 421961d5..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Configuration.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php 
-class Configuration
-{
-	// For a full list of configuration parameters refer in wiki page (https://github.com/paypal/sdk-core-php/wiki/Configuring-the-SDK)
-	public static function getConfig()
-	{
-		$config = array(
-				// values: 'sandbox' for testing
-				//		   'live' for production
-                //         'tls' for testing if your server supports TLSv1.2
-				"mode" => "sandbox",
-                // TLSv1.2 Check: Comment the above line, and switch the mode to tls as shown below
-                // "mode" => "tls"
-
-                'log.LogEnabled' => true,
-                'log.FileName' => '../PayPal.log',
-                'log.LogLevel' => 'FINE'
-	
-				// These values are defaulted in SDK. If you want to override default values, uncomment it and add your value.
-				// "http.ConnectionTimeOut" => "5000",
-				// "http.Retry" => "2",
-		);
-		return $config;
-	}
-	
-	// Creates a configuration array containing credentials and other required configuration parameters.
-	public static function getAcctAndConfig()
-	{
-		$config = array(
-				// Signature Credential
-				"acct1.UserName" => "jb-us-seller_api1.paypal.com",
-				"acct1.Password" => "WX4WTU3S8MY44S7F",
-				"acct1.Signature" => "AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy",
-				// Subject is optional and is required only in case of third party authorization
-				// "acct1.Subject" => "",
-				
-				// Sample Certificate Credential
-				// "acct1.UserName" => "certuser_biz_api1.paypal.com",
-				// "acct1.Password" => "D6JNKKULHN3G5B8A",
-				// Certificate path relative to config folder or absolute path in file system
-				// "acct1.CertPath" => "cert_key.pem",
-				// Subject is optional and is required only in case of third party authorization
-				// "acct1.Subject" => "",
-		
-				);
-		
-		return array_merge($config, self::getConfig());
-	}
-}
diff --git a/vendor/paypal/merchant-sdk-php/samples/DirectPayment/DoDirectPayment.html.php b/vendor/paypal/merchant-sdk-php/samples/DirectPayment/DoDirectPayment.html.php
deleted file mode 100644
index 90e1fea1..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/DirectPayment/DoDirectPayment.html.php
+++ /dev/null
@@ -1,290 +0,0 @@
-<?php
-
-/************************************************************
- This is the main web page for the DoDirectPayment sample.
-This page allows the user to enter name, address, amount,
-and credit card information. It also accept input variable
-paymentType which becomes the value of the PAYMENTACTION
-parameter.
-
-************************************************************/
-// clearing the session before starting new API Call
-session_unset();
-?>
-<html>
-<head>
-<title>PayPal Merchant SDK - DoDirectPayment API</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-<script language="JavaScript">
-	function generateCC(){
-		var cc_number = new Array(16);
-		var cc_len = 16;
-		var start = 0;
-		var rand_number = Math.random();
-
-		switch(document.DoDirectPaymentForm.creditCardType.value)
-        {
-			case "Visa":
-				cc_number[start++] = 4;
-				break;
-			case "Discover":
-				cc_number[start++] = 6;
-				cc_number[start++] = 0;
-				cc_number[start++] = 1;
-				cc_number[start++] = 1;
-				break;
-			case "MasterCard":
-				cc_number[start++] = 5;
-				cc_number[start++] = Math.floor(Math.random() * 5) + 1;
-				break;
-			case "Amex":
-				cc_number[start++] = 3;
-				cc_number[start++] = Math.round(Math.random()) ? 7 : 4 ;
-				cc_len = 15;
-				break;
-        }
-
-        for (var i = start; i < (cc_len - 1); i++) {
-			cc_number[i] = Math.floor(Math.random() * 10);
-        }
-
-		var sum = 0;
-		for (var j = 0; j < (cc_len - 1); j++) {
-			var digit = cc_number[j];
-			if ((j & 1) == (cc_len & 1)) digit *= 2;
-			if (digit > 9) digit -= 9;
-			sum += digit;
-		}
-
-		var check_digit = new Array(0, 9, 8, 7, 6, 5, 4, 3, 2, 1);
-		cc_number[cc_len - 1] = check_digit[sum % 10];
-
-		document.DoDirectPaymentForm.creditCardNumber.value = "";
-		for (var k = 0; k < cc_len; k++) {
-			document.DoDirectPaymentForm.creditCardNumber.value += cc_number[k];
-		}
-	}
-</script>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>DoDirectPayment</h3>
-			<div id="apidetails">Process a credit card payment.</div>
-		</div>
-		<div id="request_form">		
-			<form method="POST" action="DoDirectPayment.php"
-				name="DoDirectPaymentForm">
-				<div class="params">
-					<div class="param_name">Payment type</div>
-					<div class="param_value">
-						<select name="paymentType">
-							<option value="Sale" selected="selected">Sale</option>
-							<option value="Authorization">Authorization</option>
-						</select>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">First name</div>
-					<div class="param_value">
-						<input type="text" name="firstName" value="John"/>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Last name</div>
-					<div class="param_value">
-						<input type="text" name="lastName" value="Doe"/>
-					</div>
-				</div>			
-				<div class="params">
-					<div class="param_name">Card type</div>
-					<div class="param_value">
-						<select name="creditCardType"
-							onChange="javascript:generateCC(); return false;">
-								<option value="Visa" selected="selected">Visa</option>
-								<option value="MasterCard">MasterCard</option>
-								<option value="Discover">Discover</option>
-								<option value="Amex">American Express</option>
-						</select>				
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Card number</div>
-					<div class="param_value">
-						<input type="text" size="19" maxlength="19" name="creditCardNumber">
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Expiry date</div>
-					<div class="param_value">
-						<select name="expDateMonth">
-							<option value="01">01</option>
-							<option value="02">02</option>
-							<option value="03">03</option>
-							<option value="04">04</option>
-							<option value="05">05</option>
-							<option value="06">06</option>
-							<option value="07">07</option>
-							<option value="08">08</option>
-							<option value="09">09</option>
-							<option value="10">10</option>
-							<option value="11">11</option>
-							<option value="12">12</option>
-						</select>
-						<select name="expDateYear">					
-							<option value="2013">2013</option>
-							<option value="2014">2014</option>
-							<option value="2015">2015</option>
-							<option value="2016">2016</option>
-							<option value="2017" selected>2017</option>
-							<option value="2018">2018</option>
-							<option value="2019">2019</option>
-							<option value="2020">2020</option>						
-						</select>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">CVV</div>
-					<div class="param_value">
-						<input type="text" size="3" maxlength="4" name="cvv2Number" value="962">
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Amount</div>
-					<div class="param_value">
-						 <input type="text" size="5" maxlength="7" name="amount" value="1.00"> USD
-					</div>
-				</div>				
-				<div class="section_header">Billing address</div>
-				<div class="params">
-					<div class="param_name">Address 1</div>
-					<div class="param_value">
-						<input type="text" size="25" maxlength="100" name="address1" value="1 Main St">
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Address 2 (optional)</div>
-					<div class="param_value">
-						<input type="text" size="25" maxlength="100" name="address2" value="">
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">City</div>
-					<div class="param_value">
-						<input type="text" size="25" maxlength="40" name="city" value="San Jose">
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">State</div>
-					<div class="param_value">
-						<select id=state name="state">
-							<option value=""></option>
-							<option value="AK">AK</option>
-							<option value="AL">AL</option>
-							<option value="AR">AR</option>
-							<option value="AZ">AZ</option>
-							<option value="CA" selected>CA</option>
-							<option value="CO">CO</option>
-							<option value="CT">CT</option>
-							<option value="DC">DC</option>
-							<option value="DE">DE</option>
-							<option value="FL">FL</option>
-							<option value="GA">GA</option>
-							<option value="HI">HI</option>
-							<option value="IA">IA</option>
-							<option value="ID">ID</option>
-							<option value="IL">IL</option>
-							<option value="IN">IN</option>
-							<option value="KS">KS</option>
-							<option value="KY">KY</option>
-							<option value="LA">LA</option>
-							<option value="MA">MA</option>
-							<option value="MD">MD</option>
-							<option value="ME">ME</option>
-							<option value="MI">MI</option>
-							<option value="MN">MN</option>
-							<option value="MO">MO</option>
-							<option value="MS">MS</option>
-							<option value="MT">MT</option>
-							<option value="NC">NC</option>
-							<option value="ND">ND</option>
-							<option value="NE">NE</option>
-							<option value="NH">NH</option>
-							<option value="NJ">NJ</option>
-							<option value="NM">NM</option>
-							<option value="NV">NV</option>
-							<option value="NY">NY</option>
-							<option value="OH">OH</option>
-							<option value="OK">OK</option>
-							<option value="OR">OR</option>
-							<option value="PA">PA</option>
-							<option value="RI">RI</option>
-							<option value="SC">SC</option>
-							<option value="SD">SD</option>
-							<option value="TN">TN</option>
-							<option value="TX">TX</option>
-							<option value="UT">UT</option>
-							<option value="VA">VA</option>
-							<option value="VT">VT</option>
-							<option value="WA">WA</option>
-							<option value="WI">WI</option>
-							<option value="WV">WV</option>
-							<option value="WY">WY</option>
-							<option value="AA">AA</option>
-							<option value="AE">AE</option>
-							<option value="AP">AP</option>
-							<option value="AS">AS</option>
-							<option value="FM">FM</option>
-							<option value="GU">GU</option>
-							<option value="MH">MH</option>
-							<option value="MP">MP</option>
-							<option value="PR">PR</option>
-							<option value="PW">PW</option>
-							<option value="VI">VI</option>
-						</select>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Zip code</div>
-					<div class="param_value">
-						<input type="text" size="10" maxlength="10" name="zip" value="95131"> (5 or 9 digits)
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Country</div>
-					<div class="param_value">
-						<input type="text" size="10" maxlength="10" name="country" value="US">
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Phone</div>
-					<div class="param_value">
-						<input type="text" size="10" maxlength="10" name="phone" value="">
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">IPN listener URL</div>
-					<div class="param_value">
-						<input type="text" size="80" maxlength="200" name="notifyURL" value="">
-					</div>
-				</div>
-				
-				<div class="params">
-					<div class="param_name"></div>
-					<div class="param_value">
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="DoDirectPaymentBtn"
-						value="DoDirectPayment" />
-				</div>							
-			</form>
-			<a href="../index.php">Home</a>
-		</div>
-	</div>
-	<script language="javascript">
-		generateCC();
-	</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/DirectPayment/DoDirectPayment.php b/vendor/paypal/merchant-sdk-php/samples/DirectPayment/DoDirectPayment.php
deleted file mode 100644
index 40fa142e..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/DirectPayment/DoDirectPayment.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\AddressType;
-use PayPal\EBLBaseComponents\CreditCardDetailsType;
-use PayPal\EBLBaseComponents\DoDirectPaymentRequestDetailsType;
-use PayPal\EBLBaseComponents\PayerInfoType;
-use PayPal\EBLBaseComponents\PaymentDetailsType;
-use PayPal\EBLBaseComponents\PersonNameType;
-use PayPal\PayPalAPI\DoDirectPaymentReq;
-use PayPal\PayPalAPI\DoDirectPaymentRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-/***********************************************************
- DoDirectPayment.php
-
-Submits a credit card transaction to PayPal using a
-DoDirectPayment request.
-
-The code collects transaction parameters from the form
-displayed by DoDirectPayment.php then constructs and sends
-the DoDirectPayment request string to the PayPal server.
-The paymentType variable becomes the PAYMENTACTION parameter
-of the request string.
-
-After the PayPal server returns the response, the code
-displays the API request and response in the browser.
-If the response from PayPal was a success, it displays the
-response parameters. If the response was an error, it
-displays the errors.
-
-Called by DoDirectPayment.html.php.
-
-***********************************************************/
-session_start();
-
-require_once('../PPBootStrap.php');
-/**
- * Get required parameters from the web form for the request
-*/
-
-
-$firstName = $_POST['firstName'];
-$lastName = $_POST['lastName'];
-
-/*
- * shipping adress
-*/
-$address = new AddressType();
-$address->Name = "$firstName $lastName";
-$address->Street1 = $_POST['address1'];
-$address->Street2 = $_POST['address2'];
-$address->CityName = $_POST['city'];
-$address->StateOrProvince = $_POST['state'];
-$address->PostalCode = $_POST['zip'];
-$address->Country = $_POST['country'];
-$address->Phone = $_POST['phone'];
-
-$paymentDetails = new PaymentDetailsType();
-$paymentDetails->ShipToAddress = $address;
-
-/*
- *  Total cost of the transaction to the buyer. If shipping cost and tax
-charges are known, include them in this value. If not, this value
-should be the current sub-total of the order.
-
-If the transaction includes one or more one-time purchases, this field must be equal to
-the sum of the purchases. Set this field to 0 if the transaction does
-not include a one-time purchase such as when you set up a billing
-agreement for a recurring payment that is not immediately charged.
-When the field is set to 0, purchase-specific fields are ignored.
-
-* `Currency Code` - You must set the currencyID attribute to one of the
-3-character currency codes for any of the supported PayPal
-currencies.
-* `Amount`
-*/
-$paymentDetails->OrderTotal = new BasicAmountType('USD', $_POST['amount']);
-/*
- * 		Your URL for receiving Instant Payment Notification (IPN) about this transaction. If you do not specify this value in the request, the notification URL from your Merchant Profile is used, if one exists.
-
-*/
-if(isset($_REQUEST['notifyURL']))
-{
-	$paymentDetails->NotifyURL = $_REQUEST['notifyURL'];
-}
-
-$personName = new PersonNameType();
-$personName->FirstName = $firstName;
-$personName->LastName = $lastName;
-
-//information about the payer
-$payer = new PayerInfoType();
-$payer->PayerName = $personName;
-$payer->Address = $address;
-$payer->PayerCountry = $_POST['country'];
-
-$cardDetails = new CreditCardDetailsType();
-$cardDetails->CreditCardNumber = $_POST['creditCardNumber'];
-
-/*
- *
-Type of credit card. For UK, only Maestro, MasterCard, Discover, and
-Visa are allowable. For Canada, only MasterCard and Visa are
-allowable and Interac debit cards are not supported. It is one of the
-following values:
-
-* Visa
-* MasterCard
-* Discover
-* Amex
-* Solo
-* Switch
-* Maestro: See note.
-`Note:
-If the credit card type is Maestro, you must set currencyId to GBP.
-In addition, you must specify either StartMonth and StartYear or
-IssueNumber.`
-*/
-$cardDetails->CreditCardType = $_POST['creditCardType'];
-$cardDetails->ExpMonth = $_POST['expDateMonth'];
-$cardDetails->ExpYear = $_POST['expDateYear'];
-$cardDetails->CVV2 = $_POST['cvv2Number'];
-$cardDetails->CardOwner = $payer;
-
-$ddReqDetails = new DoDirectPaymentRequestDetailsType();
-$ddReqDetails->CreditCard = $cardDetails;
-$ddReqDetails->PaymentDetails = $paymentDetails;
-$ddReqDetails->PaymentAction = $_REQUEST['paymentType'];
-
-$doDirectPaymentReq = new DoDirectPaymentReq();
-$doDirectPaymentReq->DoDirectPaymentRequest = new DoDirectPaymentRequestType($ddReqDetails);
-
-/*
- * 		 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$doDirectPaymentResponse = $paypalService->DoDirectPayment($doDirectPaymentReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($doDirectPaymentResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$doDirectPaymentResponse->Ack</div> </td></tr>";
-	echo "<tr><td>TransactionID :</td><td><div id='TransactionID'>$doDirectPaymentResponse->TransactionID</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($doDirectPaymentResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
-?>
diff --git a/vendor/paypal/merchant-sdk-php/samples/Error.php b/vendor/paypal/merchant-sdk-php/samples/Error.php
deleted file mode 100644
index 96c29918..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Error.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-$ex_message = "";
-$ex_detailed_message = "";
-$ex_type = "Unknown";
-
-if(isset($ex)) {
-
-	$ex_message = $ex->getMessage();
-	$ex_type = get_class($ex);
-
-	if($ex instanceof PPConnectionException) {
-		$ex_detailed_message = "Error connecting to " . $ex->getUrl();
-	} else if($ex instanceof PPMissingCredentialException || $ex instanceof PPInvalidCredentialException) {
-		$ex_detailed_message = $ex->errorMessage();
-	} else if($ex instanceof PPConfigurationException) {
-		$ex_detailed_message = "Invalid configuration. Please check your configuration file";
-	}
-}
-?>
-
-<html>
-<title>PayPal SDK Sample - Exception</title>
-<body>
-	<div id="error_info" style="text-align: center;">
-		<div id="error_title">
-			<b>SDK Exception</b><br /> <br />
-		</div>
-		<table style="margin: auto;">
-			<tr>
-				<td><b>Type</b></td>
-				<td><?php echo $ex_type;?>
-				</td>
-			</tr>
-
-			<tr>
-				<td><b>Message</b></td>
-				<td><?php echo $ex_message;?>
-				</td>
-			</tr>
-			<tr>
-				<td><b>Detail</b></td>
-				<td><?php echo $ex_detailed_message;?>
-				</td>
-			</tr>
-
-		</table>
-		<br> <a href="index.php">Home</a>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DGdoExpressCheckout.php b/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DGdoExpressCheckout.php
deleted file mode 100644
index e58b9b1a..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DGdoExpressCheckout.php
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\DoExpressCheckoutPaymentRequestDetailsType;
-use PayPal\EBLBaseComponents\PaymentDetailsItemType;
-use PayPal\EBLBaseComponents\PaymentDetailsType;
-use PayPal\PayPalAPI\DoExpressCheckoutPaymentReq;
-use PayPal\PayPalAPI\DoExpressCheckoutPaymentRequestType;
-use PayPal\PayPalAPI\GetExpressCheckoutDetailsReq;
-use PayPal\PayPalAPI\GetExpressCheckoutDetailsRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * Digital goods payments combine JavaScript with the Express Checkout API to streamline the checkout process for buyers of digital goods.
- * Digital goods are items such as e-books, music files, and digital images distributed in electronic format. The buyer can conveniently purchase digital goods during checkout with a minimum of clicks without leaving your website or interrupting their online activities
- *
-*/
-$token =urlencode( $_REQUEST['token']);
-
-/*
- *  Unique PayPal buyer account identification number as returned in the GetExpressCheckoutDetails response
-*/
-$payerId=urlencode( $_REQUEST['PayerID']);
-
-//--------------------------------------------------------------
-// this section is optional if values are retrieved from your database
-$token = $_REQUEST['token'];
-
-
-$getExpressCheckoutDetailsRequest = new GetExpressCheckoutDetailsRequestType($token);
-$getExpressCheckoutReq = new GetExpressCheckoutDetailsReq();
-$getExpressCheckoutReq->GetExpressCheckoutDetailsRequest = $getExpressCheckoutDetailsRequest;
-
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-    /** @var \PayPal\PayPalAPI\GetExpressCheckoutDetailsResponseType $getECResponse */
-    $getECResponse = $paypalService->GetExpressCheckoutDetails($getExpressCheckoutReq);
-} catch (Exception $ex) {
-    echo $ex->getMessage();
-}
-
-//--------------------------------------------------------------------
-
-/*
- * The total cost of the transaction to the buyer. If shipping cost (not applicable to digital goods) and tax charges are known, include them in this value. If not, this value should be the current sub-total of the order. If the transaction includes one or more one-time purchases, this field must be equal to the sum of the purchases. Set this field to 0 if the transaction does not include a one-time purchase such as when you set up a billing agreement for a recurring payment that is not immediately charged. When the field is set to 0, purchase-specific fields are ignored.
-*/
-$orderTotal = new BasicAmountType();
-$orderTotal->currencyID = $getECResponse->GetExpressCheckoutDetailsResponseDetails->PaymentDetails[0]->OrderTotal->currencyID;
-$orderTotal->value = $getECResponse->GetExpressCheckoutDetailsResponseDetails->PaymentDetails[0]->OrderTotal->value;
-
-//Details about each individual item included in the order.
-$itemDetails = new PaymentDetailsItemType();
-$itemDetails->Name = 'sample item';
-$itemDetails->Amount = $orderTotal;
-$itemDetails->Quantity = '1';
-
-/*
- * Item quantity. This field is required when you pass a value for ItemCategory. For digital goods (ItemCategory=Digital), this field is required
-*/
-$itemDetails->ItemCategory =  'Digital';
-
-$PaymentDetails= new PaymentDetailsType();
-$PaymentDetails->PaymentDetailsItem[0] = $itemDetails;
-
-//$PaymentDetails->ShipToAddress = $address;
-$PaymentDetails->OrderTotal = $orderTotal;
-
-/*
- * How you want to obtain payment. When implementing parallel payments, this field is required and must be set to Order. When implementing digital goods, this field is required and must be set to Sale.
-*/
-$PaymentDetails->PaymentAction = 'Sale';
-
-/*
- * Sum of cost of all items in this order. For digital goods, this field is required. PayPal recommends that you pass the same value in the call to DoExpressCheckoutPayment that you passed in the call to SetExpressCheckout
-*/
-$PaymentDetails->ItemTotal = $orderTotal;
-
-$DoECRequestDetails = new DoExpressCheckoutPaymentRequestDetailsType();
-$DoECRequestDetails->PayerID = $payerId;
-$DoECRequestDetails->Token = $token;
-$DoECRequestDetails->PaymentDetails[0] = $PaymentDetails;
-
-$DoECRequest = new DoExpressCheckoutPaymentRequestType();
-$DoECRequest->DoExpressCheckoutPaymentRequestDetails = $DoECRequestDetails;
-
-
-$DoECReq = new DoExpressCheckoutPaymentReq();
-$DoECReq->DoExpressCheckoutPaymentRequest = $DoECRequest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-$DoECResponse = $paypalService->DoExpressCheckoutPayment($DoECReq);
-//var_dump($DoECResponse);
-if($DoECResponse->Ack == 'Success')
-{
-	?>
-<html>
-<head>
-<script>
-alert("Payment Successful")
-top.dg.closeFlow();
-</script>
-<?php 
-/*
- * TODO: add your logic that handles successful payment
-*/
-}
-else
-{
-	?>
-<script>
-alert("Payment failed")
-top.dg.closeFlow();
-</script>
-<?php 
-}
-?>
-
-
-<script type="text/javascript"
-	src="https://www.paypalobjects.com/js/external/dg.js";></script>
-</head>
-<body>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DGsetEC.html.php b/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DGsetEC.html.php
deleted file mode 100644
index 273ebfb2..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DGsetEC.html.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<html>
-<head>
-<title>PayPal Merchant SDK - SetExpressCheckout for Digital Goods</title>
-
-</head>
-<body alink=#0000FF vlink=#0000FF>
-	<script>
-
-top.dg.closeFlow();
-</script>
-	<br>
-	<div style="align: auto;">
-		<font size=2 color=black face=Verdana><b>SetExpressCheckout - digital
-				goods</b> </font> <br> <br>
-		<form method="POST" action="DGsetExpressCheckout.php">
-
-			<table style="align: auto;">
-				<tr>
-					<td align=right></td>
-					<td align=left>Digital Download</td>
-				</tr>
-
-				<tr>
-					<td align=right>Currency:</td>
-					<td align=left><input type=text size=30 maxlength=32
-						name=currencyId value=USD></td>
-				</tr>
-				<tr>
-					<td align=right>Amount:</td>
-					<td align=left><input type=text size=30 maxlength=32 name=amount
-						value=1.00></td>
-				</tr>
-				<tr>
-					<td />
-					<td align=left><b></b></td>
-				</tr>
-
-				<tr>
-					<td />
-					<td><input type="image"
-						src='https://www.paypal.com/en_US/i/btn/btn_dg_pay_w_paypal.gif'
-						id="submitBtn" name="submitBtn" value="Pay with PayPal" /></td>
-				</tr>
-
-
-			</table>
-			<script type="text/javascript"
-				src="https://www.paypalobjects.com/js/external/dg.js";></script>
-			<script>
-    var dg = new PAYPAL.apps.DGFlow({
-        
-        trigger: "submitBtn"
-    });
-</script>
-		</form>
-	</div>
-	<a id="CallsLink" href="../index.php">Home</a>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DGsetExpressCheckout.php b/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DGsetExpressCheckout.php
deleted file mode 100644
index 4cbd7622..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DGsetExpressCheckout.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\PaymentDetailsItemType;
-use PayPal\EBLBaseComponents\PaymentDetailsType;
-use PayPal\EBLBaseComponents\SetExpressCheckoutRequestDetailsType;
-use PayPal\PayPalAPI\SetExpressCheckoutReq;
-use PayPal\PayPalAPI\SetExpressCheckoutRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-session_start();
-/*
- * Digital goods payments combine JavaScript with the Express Checkout API to streamline the checkout process for buyers of digital goods.
-* Digital goods are items such as e-books, music files, and digital images distributed in electronic format. The buyer can conveniently purchase digital goods during checkout with a minimum of clicks without leaving your website or interrupting their online activities
-*
-*/
-$serverName = $_SERVER['SERVER_NAME'];
-$serverPort = $_SERVER['SERVER_PORT'];
-$url = dirname('http://'.$serverName.':'.$serverPort.$_SERVER['REQUEST_URI']);
-
-/*
- * URL to which the buyer's browser is returned after choosing to pay with PayPal. For digital goods, you must add JavaScript to this page to close the in-context experience.
- */
-$returnUrl = $url."/DGdoExpressCheckout.php";
-/*
- * URL to which the buyer is returned if the buyer does not approve the use of PayPal to pay you. For digital goods, you must add JavaScript to this page to close the in-context experience
- */
-$cancelUrl = $url. "/DGsetEC.html.php" ;
-
-/*
- * Total cost of the transaction to the buyer. If shipping cost and tax charges are known, include them in this value. If not, this value should be the current sub-total of the order. If the transaction includes one or more one-time purchases, this field must be equal to the sum of the purchases. Set this field to 0 if the transaction does not include a one-time purchase such as when you set up a billing agreement for a recurring payment that is not immediately charged. When the field is set to 0, purchase-specific fields are ignored
- */
-$orderTotal = new BasicAmountType();
-$orderTotal->currencyID = $_REQUEST['currencyId'];
-$orderTotal->value = $_REQUEST['amount'];
-
-$taxTotal = new BasicAmountType();
-$taxTotal->currencyID = 'USD';
-$taxTotal->value = '0.0';
-
-$itemDetails = new PaymentDetailsItemType();
-$itemDetails->Name = 'sample item';
-
-
-$itemDetails->Amount = $orderTotal;
-/*
- * Item quantity. This field is required when you pass a value for ItemCategory. For digital goods (ItemCategory=Digital), this field is required. 
- */
-$itemDetails->Quantity = '1';
-/*
- * Indicates whether an item is digital or physical. For digital goods, this field is required and must be set to Digital
- */
-$itemDetails->ItemCategory =  'Digital';
-
-$PaymentDetails= new PaymentDetailsType();
-$PaymentDetails->PaymentDetailsItem[0] = $itemDetails;
-
-//$PaymentDetails->ShipToAddress = $address;
-$PaymentDetails->OrderTotal = $orderTotal;
-/*
- * How you want to obtain payment. When implementing parallel payments, this field is required and must be set to Order. When implementing digital goods, this field is required and must be set to Sale
- */
-$PaymentDetails->PaymentAction = 'Sale';
-/*
- * Sum of cost of all items in this order. For digital goods, this field is required. 
- */
-$PaymentDetails->ItemTotal = $orderTotal;
-$PaymentDetails->TaxTotal = $taxTotal;
-
-$setECReqDetails = new SetExpressCheckoutRequestDetailsType();
-$setECReqDetails->PaymentDetails[0] = $PaymentDetails;
-$setECReqDetails->CancelURL = $cancelUrl;
-$setECReqDetails->ReturnURL = $returnUrl;
-/*
- * Indicates whether or not you require the buyer's shipping address on file with PayPal be a confirmed address. For digital goods, this field is required, and you must set it to 0. It is one of the following values:
-
-    0 � You do not require the buyer's shipping address be a confirmed address.
-
-    1 � You require the buyer's shipping address be a confirmed address.
-
- */
-$setECReqDetails->ReqConfirmShipping = 0;
-/*
- * Determines where or not PayPal displays shipping address fields on the PayPal pages. For digital goods, this field is required, and you must set it to 1. It is one of the following values:
-
-    0 � PayPal displays the shipping address on the PayPal pages.
-
-    1 � PayPal does not display shipping address fields whatsoever.
-
-    2 � If you do not pass the shipping address, PayPal obtains it from the buyer's account profile.
-
- */
-$setECReqDetails->NoShipping = 1;
-
-$setECReqType = new SetExpressCheckoutRequestType();
-$setECReqType->SetExpressCheckoutRequestDetails = $setECReqDetails;
-
-$setECReq = new SetExpressCheckoutReq();
-$setECReq->SetExpressCheckoutRequest = $setECReqType;
-
-// storing in session to use in DoExpressCheckout
-$_SESSION['amount'] = $_REQUEST['amount'];
-$_SESSION['currencyID'] = $_REQUEST['currencyId'];
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-$setECResponse = $paypalService->SetExpressCheckout($setECReq);
-// echo '<pre>';
-//print_r($setECResponse);
-// echo '</pre>';
-if($setECResponse->Ack == 'Success')
-{
-
-	$token = $setECResponse->Token;
-	/*
-		$payPalURL = 'https://www.sandbox.paypal.com/incontext?token=' . $token;
-	header("Location: ".$payPalURL);*/
-	echo "<br><br><br><br><br><br><br><br><a href=https://www.sandbox.paypal.com/incontext?token=$token />Click here to continue to https://www.sandbox.paypal.com/incontext?token=$token</a>";
-}
-else {
-	var_dump($setECResponse);
-	echo "error in SetEC API call";
-}
-?>
diff --git a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DoExpressCheckout.html.php b/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DoExpressCheckout.html.php
deleted file mode 100644
index 0fe8bfc4..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DoExpressCheckout.html.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - DoExpressCheckout</title>
-<link rel="stylesheet" type="text/css" href="../Common/sdk.css" />
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>DoExpressCheckout</h3>
-			<div id="apidetails">Used to make checkout payment</div>
-		</div>
-		<form method="POST" action="DoExpressCheckout.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						Token(Get Token via <a href="SetExpressCheckout.html.php">SetExpressCheckout</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="token" value="EC-8UT96070TG172711X"
-							size="50" maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Payer ID</div>
-					<div class="param_value">
-						<input type="text" name="payerID" value="TWLK53YN7GDM6" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">PaymentType</div>
-					<div class="param_value">
-						<select name="paymentAction">
-							<option value="Sale">Sale</option>
-							<option value="Authorization">Authorization</option>
-							<option value="Order">Order</option>
-						</select>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Amount</div>
-					<div class="param_value">
-						<input type="text" name="amt" value="2.00" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">CurrencyCode</div>
-					<div class="param_value">
-						<input type="text" name="currencyCode" value="USD" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				
-				<div class="params">
-					<div class="param_name">IPN listener URL</div>
-					<div class="param_value">
-						<input type="text" name="notifyURL" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-
-				<div class="submit">
-					<input type="submit" name="DoExpressCheckoutBtn"
-						value="DoExpressCheckout" /> <br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-	</div>
-	<div id="relatedcalls"></div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DoExpressCheckout.php b/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DoExpressCheckout.php
deleted file mode 100644
index bf9382d1..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/DoExpressCheckout.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\DoExpressCheckoutPaymentRequestDetailsType;
-use PayPal\EBLBaseComponents\PaymentDetailsType;
-use PayPal\PayPalAPI\DoExpressCheckoutPaymentReq;
-use PayPal\PayPalAPI\DoExpressCheckoutPaymentRequestType;
-use PayPal\PayPalAPI\GetExpressCheckoutDetailsReq;
-use PayPal\PayPalAPI\GetExpressCheckoutDetailsRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-session_start();
-
-/*
- * The DoExpressCheckoutPayment API operation completes an Express Checkout transaction. If you set up a billing agreement in your SetExpressCheckout API call, the billing agreement is created when you call the DoExpressCheckoutPayment API operatio
- */
-
-/*
- * The total cost of the transaction to the buyer. If shipping cost (not applicable to digital goods) and tax charges are known, include them in this value. If not, this value should be the current sub-total of the order. If the transaction includes one or more one-time purchases, this field must be equal to the sum of the purchases. Set this field to 0 if the transaction does not include a one-time purchase such as when you set up a billing agreement for a recurring payment that is not immediately charged. When the field is set to 0, purchase-specific fields are ignored.
- * For digital goods, the following must be true:
- * total cost > 0
- * total cost <= total cost passed in the call to SetExpressCheckout
-*/
-$token =urlencode( $_REQUEST['token']);
-
-/*
- *  Unique PayPal buyer account identification number as returned in the GetExpressCheckoutDetails response
-*/
-$payerId=urlencode(  $_REQUEST['payerID']);
-$paymentAction = urlencode(  $_REQUEST['paymentAction']);
-
-// ------------------------------------------------------------------
-// this section is optional if parameters required for DoExpressCheckout is retrieved from your database
-$getExpressCheckoutDetailsRequest = new GetExpressCheckoutDetailsRequestType($token);
-$getExpressCheckoutReq = new GetExpressCheckoutDetailsReq();
-$getExpressCheckoutReq->GetExpressCheckoutDetailsRequest = $getExpressCheckoutDetailsRequest;
-/*
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$getECResponse = $paypalService->GetExpressCheckoutDetails($getExpressCheckoutReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-//----------------------------------------------------------------------------
-
-/*
- * The total cost of the transaction to the buyer. If shipping cost (not applicable to digital goods) and tax charges are known, include them in this value. If not, this value should be the current sub-total of the order. If the transaction includes one or more one-time purchases, this field must be equal to the sum of the purchases. Set this field to 0 if the transaction does not include a one-time purchase such as when you set up a billing agreement for a recurring payment that is not immediately charged. When the field is set to 0, purchase-specific fields are ignored.
-*/
-$orderTotal = new BasicAmountType();
-$orderTotal->currencyID = $_REQUEST['currencyCode'];
-$orderTotal->value = $_REQUEST['amt'];
-
-$paymentDetails= new PaymentDetailsType();
-$paymentDetails->OrderTotal = $orderTotal;
-
-/*
- * Your URL for receiving Instant Payment Notification (IPN) about this transaction. If you do not specify this value in the request, the notification URL from your Merchant Profile is used, if one exists.
- */
-if(isset($_REQUEST['notifyURL']))
-{
-	$paymentDetails->NotifyURL = $_REQUEST['notifyURL'];
-}
-
-$DoECRequestDetails = new DoExpressCheckoutPaymentRequestDetailsType();
-$DoECRequestDetails->PayerID = $payerId;
-$DoECRequestDetails->Token = $token;
-$DoECRequestDetails->PaymentAction = $paymentAction;
-$DoECRequestDetails->PaymentDetails[0] = $paymentDetails;
-
-$DoECRequest = new DoExpressCheckoutPaymentRequestType();
-$DoECRequest->DoExpressCheckoutPaymentRequestDetails = $DoECRequestDetails;
-
-
-$DoECReq = new DoExpressCheckoutPaymentReq();
-$DoECReq->DoExpressCheckoutPaymentRequest = $DoECRequest;
-
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$DoECResponse = $paypalService->DoExpressCheckoutPayment($DoECReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($DoECResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$DoECResponse->Ack</div> </td></tr>";
-	if(isset($DoECResponse->DoExpressCheckoutPaymentResponseDetails->PaymentInfo)) {
-		echo "<tr><td>TransactionID :</td><td><div id='TransactionID'>". $DoECResponse->DoExpressCheckoutPaymentResponseDetails->PaymentInfo[0]->TransactionID."</div> </td></tr>";
-	}
-	echo "</table>";
-	echo "<pre>";
-	print_r($DoECResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/GetExpressCheckout.html.php b/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/GetExpressCheckout.html.php
deleted file mode 100644
index a382f1fb..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/GetExpressCheckout.html.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - GetExpressCheckout</title>
-<link rel="stylesheet" type="text/css" href="../Common/sdk.css" />
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>GetExpressCheckout</h3>
-			<div id="apidetails">Used to get checkout details by checkout token</div>
-		</div>
-		<form method="POST" action="GetExpressCheckout.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						Token(Get Token via <a href="SetExpressCheckout.html.php">SetExpressCheckout</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="token" value="" size="50" maxlength="260" />
-					</div>
-				</div>
-
-				<div class="submit">
-					<input type="submit" name="GetExpressCheckoutBtn"
-						value="GetExpressCheckout" /> <br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/GetExpressCheckout.php b/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/GetExpressCheckout.php
deleted file mode 100644
index 9a4ab3f0..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/GetExpressCheckout.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-use PayPal\PayPalAPI\GetExpressCheckoutDetailsReq;
-use PayPal\PayPalAPI\GetExpressCheckoutDetailsRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-session_start();
-
-/*
- *  # GetExpressCheckout API
-The GetExpressCheckoutDetails API operation obtains information about
-an Express Checkout transaction.
-This sample code uses Merchant PHP SDK to make API call
-*/
-/*
- * 		 A timestamped token, the value of which was returned by
-`SetExpressCheckout` response.
-*/
-$token = $_REQUEST['token'];
-
-$getExpressCheckoutDetailsRequest = new GetExpressCheckoutDetailsRequestType($token);
-
-$getExpressCheckoutReq = new GetExpressCheckoutDetailsReq();
-$getExpressCheckoutReq->GetExpressCheckoutDetailsRequest = $getExpressCheckoutDetailsRequest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$getECResponse = $paypalService->GetExpressCheckoutDetails($getExpressCheckoutReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($getECResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>".$getECResponse->Ack."</div> </td></tr>";
-	echo "<tr><td>Token :</td><td><div id='Token'>".$getECResponse->GetExpressCheckoutDetailsResponseDetails->Token."</div></td></tr>";
-	echo "<tr><td>PayerID :</td><td><div id='PayerID'>".$getECResponse->GetExpressCheckoutDetailsResponseDetails->PayerInfo->PayerID."</div></td></tr>";
-	echo "<tr><td>PayerStatus :</td><td><div id='PayerStatus'>".$getECResponse->GetExpressCheckoutDetailsResponseDetails->PayerInfo->PayerStatus."</div></td></tr>";
-	echo "</table>";
-	echo '<pre>';
-	print_r($getECResponse);
-	echo '</pre>';
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/SetExpressCheckout.html.php b/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/SetExpressCheckout.html.php
deleted file mode 100644
index 6e70d4fc..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/SetExpressCheckout.html.php
+++ /dev/null
@@ -1,359 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - SetExpressCheckout</title>
-<link rel="stylesheet" type="text/css" href="../Common/sdk.css" />
-<script type=text/javascript>
-function display(value) {
-	switch (value) {
-	case 'Ground':
-		document.getElementById('shippingAmount').value = '3.00';
-		break;
-	case 'UPS Air':
-		document.getElementById('shippingAmount').value = '17.00';
-		break;
-	}
-}
-</script>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>SetExpressCheckout</h3>
-		</div>
-		<br>
-		<div id="request_form">
-			<form method="POST" action="SetExpressCheckout.php">
-				<div class="params">
-					<div class="param_name">Buyer email (Email address of the buyer as entered during checkout.
-					 PayPal uses this value to pre-fill the PayPal membership sign-up portion of the PayPal login page)</div>
-					<div class="param_value">
-						<input type="text" name="buyerEmail"
-							value="platfo_1255077030_biz@xxxxxxxxx" size="50" maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Payment Type</div>
-					<div class="param_value">
-						<select name="paymentType">
-							<option value="Sale">Sale</option>
-							<option value="Authorization">Authorization</option>
-							<option value="Order">Order</option>
-						</select>
-					</div>
-				</div>
-				<div class="section_header">Payment Details</div>
-				<div class="params"></div>
-
-				<div class="params">
-					<div class="param_name">CurrencyCode</div>
-					<div class="param_value">
-						<input type="text" name="currencyCode" value="USD" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Total Shipping costs</div>
-					<div class="param_value">
-						<input type="text" name="shippingTotal" id="shippingTotal"
-							value="0.50" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Total insurance cost</div>
-					<div class="param_value">
-						<input type="text" name="insuranceTotal" id="insuranceTotal"
-							value="" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Total handling cost</div>
-					<div class="param_value">
-						<input type="text" name="handlingTotal" id="handlingTotal"
-							value="" />
-					</div>
-				</div>								
-				<div class="params">
-					<div class="param_name">Item Details</div>
-					<table class="line_item">
-					
-						<tr>
-							<th class="param_name">Name</th>
-							<th class="param_name">Cost</th>
-							<th class="param_name">Quantity</th>
-							<th class="param_name">Sales tax</th>
-							<th class="param_name">Item Category</th>
-							<th class="param_name">Description (optional)</th>
-						</tr>
-	
-						<tr>
-							<td><div class="param_value">
-									<input type="text" name="itemName[]" id="itemName0"
-										value="Item 1" />
-								</div>
-							</td>	
-							<td><div class="param_value">
-									<input type="text" name="itemAmount[]" id="itemAmount0"
-										value="5.50" />
-								</div>
-							</td>	
-							<td><div class="param_value">
-									<input type="text" name="itemQuantity[]" id="itemQuantity0"
-										value="2" />
-								</div>
-							</td>							
-							<td><div class="param_value">
-									<input type="text" name="itemSalesTax[]" id="itemSalesTax0"
-										value="1.5" />
-								</div>
-							</td>	
-							<td><div class="param_value">
-									<select name="itemCategory[]" id="itemCategory0">
-										<option Value="Physical">Physical</option>
-										<option Value="Digital">Digital</option>
-									</select>
-								</div>
-							</td>	
-							<td><div class="param_value">
-									<input type="text" name="itemDescription[]" id="itemDescription0"
-										value="" />
-								</div>
-							</td>
-						</tr>
-						
-						<tr>
-							<td><div class="param_value">
-									<input type="text" name="itemName[]" id="itemName1"
-										value="Item 2" />
-								</div>
-							</td>	
-							<td><div class="param_value">
-									<input type="text" name="itemAmount[]" id="itemAmount1"
-										value="1.00" />
-								</div>
-							</td>	
-							<td><div class="param_value">
-									<input type="text" name="itemQuantity[]" id="itemQuantity1"
-										value="1" />
-								</div>
-							</td>							
-							<td><div class="param_value">
-									<input type="text" name="itemSalesTax[]" id="itemSalesTax1"
-										value="0.0" />
-								</div>
-							</td>	
-							<td><div class="param_value">
-									<select name="itemCategory[]" id="itemCategory1">
-										<option Value="Physical">Physical</option>
-										<option Value="Digital">Digital</option>
-									</select>
-								</div>
-							</td>	
-							<td><div class="param_value">
-									<input type="text" name="itemDescription[]" id="itemDescription1"
-										value="" />
-								</div>
-							</td>
-						</tr>						
-					</table>
-				</div>
-				<div class="params">
-					<div class="param_name">Order description</div>
-					<div class="param_value">
-						<textarea cols="40" rows="5" name="orderDescription"></textarea>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">IPN listener URL</div>
-					<div class="param_value">
-					<input type="text" size="80" maxlength="200" name="notifyURL" value="">
-					</div>
-				</div>
-				
-				<div class="section_header">Shipping information:</div>
-				<div class="params">
-					<div class="param_name">Requires shipping</div>
-					<div class="param_value">
-						<select name="noShipping">
-							<option value="0">Display shipping address in PayPal pages</option>
-							<option value="1">Do not display shipping address in PayPal
-								pages</option>
-							<option value="2">If shipping address not passed, use value in
-								buyer's profile</option>
-						</select>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Require buyer's PayPal Shipping address to be a confirmed address</div>
-		            <div class="param_value">
-		                <select name="reqConfirmShipping">
-		                    <option value="0">No</option>
-		                    <option value="1">Yes</option>
-		                </select>
-		            </div>
-	            </div>
-	            <div class="params">				
-					<div class="param_name">Allow Address override</div>
-		            <div class="param_value">
-		                <select name="addressOverride">
-		                    <option value="">-Select a value-</option>
-		                    <option value="0">No - PayPal should not display shipping address</option>
-		                    <option value="1">Yes - PayPal should display shipping address</option>
-		                </select>
-		            </div>				
-	            </div>				
-				<table class="params">
-					<tr>
-						<th class="param_name">Shipping Method</th>
-						<th class="param_name">Shipping Amount</th>
-					</tr>
-					<tr>
-						<td class="param_value"><select name="shippingMethod"
-							onclick="display(this.value)">
-								<option value="Ground">Ground</option>
-								<option value="UPS Air">UPS Air</option>
-						</select></td>
-						<td class="param_value"><input type="text" name="shippingAmount"
-							id="shippingAmount" value="3.00" size="25" maxlength="260" /></td>
-					</tr>
-				</table>
-				<div class="params">
-					<div class="param_name">Name</div>
-					<div class="param_value">
-						<input type="text" name="name" value="John" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Address Line1</div>
-					<div class="param_value">
-						<input type="text" name="street" value="1,Main St" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-
-				<div class="params">
-					<div class="param_name">City</div>
-					<div class="param_value">
-						<input type="text" name="city" value="Austin" size="50"
-							maxlength="260" />
-					</div>
-
-				</div>
-				<div class="params">
-					<div class="param_name">State</div>
-					<div class="param_value">
-						<input type="text" name="state" value="TX" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">PostalCode</div>
-					<div class="param_value">
-						<input type="text" name="postalCode" value="78701" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-
-				<div class="params">
-					<div class="param_name">CountryCode</div>
-					<div class="param_value">
-						<input type="text" name="countryCode" value="US" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				
-				<div class="params">
-					<div class="param_name">Phone</div>
-					<div class="param_value">
-						<input type="text" name="phone" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				
-				<div class="section_header">Billing Agreement (Required for
-					Recurring payments/Reference transactions only)</div>
-				<div class="param_name">Billing Agreement Description *</div>
-				<div class="param_value">
-					<textarea cols="80" rows="10" name="billingAgreementText"></textarea>
-				</div>
-				<div class="param_name">Billing type *</div>
-				<div class="param_value">
-					<select name="billingType">
-						<option value="None">None</option>
-						<option value="MerchantInitiatedBilling">Merchant Initiated
-							Billing</option>
-						<option value="RecurringPayments">Recurring Payments</option>
-						<option value="MerchantInitiatedBillingSingleAgreement">Merchant
-							Initiated Billing Single Agreement</option>
-						<option value="ChannelInitiatedBilling">Channel Initiated Billing</option>
-					</select>
-				</div>
-
-				<!-- PayPal page styling attributes -->
-				<div class="section_header">PayPal page styling attributes
-					(optional)</div>
-				<div class="param_name">Business name to display in the PayPal
-					account on the PayPal hosted checkout pages</div>
-				<div class="param_value">
-					<input type="text" name="brandName" id="brandName" value="" />
-				</div>
-				<div class="param_name">Custom page style for payment pages
-					(as configured in Merchant's account profile)</div>
-				<div class="param_value">
-					<input type="text" name="pageStyle" id="pageStyle" value="" />
-				</div>
-				<div class="param_name">URL for header image</div>
-				<div class="param_value">
-					<input type="text" name="cppheaderimage" id="cppheaderimage"
-						value="" />
-				</div>
-				<div class="param_name">Border color around header</div>
-				<div class="param_value">
-					<input type="text" name="cppheaderbordercolor"
-						id="cppheaderbordercolor" value="" />
-				</div>
-				<div class="param_name">Background color for header</div>
-				<div class="param_value">
-					<input type="text" name="cppheaderbackcolor"
-						id="cppheaderbackcolor" value="" />
-				</div>
-				<div class="param_name">Background color for payment page</div>
-				<div class="param_value">
-					<input type="text" name="cpppayflowcolor" id="cpppayflowcolor"
-						value="" />
-				</div>
-				<div class="param_name">Gradient color for the Mini Cart on 1X flow</div>
-				<div class="param_value">
-					<input type="text" name="cppcartbordercolor" id="cppcartbordercolor"
-						value="" />
-				</div>
-				<div class="param_name">A URL for the image you want to appear above the mini-cart</div>
-				<div class="param_value">
-					<input type="text" name="cpplogoimage" id="cpplogoimage"
-						value="" />
-				</div>
-												
-				<!-- Advanced features -->
-				<div class="section_header">Advanced features (optional)</div>
-				<div class="param_name">Allow buyer to enter note to merchant
-					on PayPal pages</div>
-				<div class="param_value">
-					<select name="allowNote">
-						<option value="0">False</option>
-						<option value="1">True</option>
-					</select>
-				</div>				
-
-				<div class="submit">
-					<input type="submit" name="SetExpressCheckoutBtn"
-						value="SetExpressCheckout" /> <br />
-				</div>
-				<a href="../index.php">Home</a>
-			</form>
-		</div>			
-	</div>	
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/SetExpressCheckout.php b/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/SetExpressCheckout.php
deleted file mode 100644
index 45bf2794..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/ExpressCheckout/SetExpressCheckout.php
+++ /dev/null
@@ -1,198 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\AddressType;
-use PayPal\EBLBaseComponents\BillingAgreementDetailsType;
-use PayPal\EBLBaseComponents\PaymentDetailsItemType;
-use PayPal\EBLBaseComponents\PaymentDetailsType;
-use PayPal\EBLBaseComponents\SetExpressCheckoutRequestDetailsType;
-use PayPal\PayPalAPI\SetExpressCheckoutReq;
-use PayPal\PayPalAPI\SetExpressCheckoutRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * The SetExpressCheckout API operation initiates an Express Checkout transaction
- * This sample code uses Merchant PHP SDK to make API call
- */
-$url = dirname('http://' . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['REQUEST_URI']);
-$returnUrl = "$url/GetExpressCheckout.php";
-$cancelUrl = "$url/SetExpressCheckout.php" ;
-
-$currencyCode = $_REQUEST['currencyCode'];
-// total shipping amount
-$shippingTotal = new BasicAmountType($currencyCode, $_REQUEST['shippingTotal']);
-//total handling amount if any
-$handlingTotal = new BasicAmountType($currencyCode, $_REQUEST['handlingTotal']);
-//total insurance amount if any
-$insuranceTotal = new BasicAmountType($currencyCode, $_REQUEST['insuranceTotal']);
-
-// shipping address
-$address = new AddressType();
-$address->CityName = $_REQUEST['city'];
-$address->Name = $_REQUEST['name'];
-$address->Street1 = $_REQUEST['street'];
-$address->StateOrProvince = $_REQUEST['state'];
-$address->PostalCode = $_REQUEST['postalCode'];
-$address->Country = $_REQUEST['countryCode'];
-$address->Phone = $_REQUEST['phone'];
-
-// details about payment
-$paymentDetails = new PaymentDetailsType();
-$itemTotalValue = 0;
-$taxTotalValue = 0;
-/*
- * iterate trhough each item and add to atem detaisl
- */
-for($i=0; $i<count($_REQUEST['itemAmount']); $i++) {
-	$itemAmount = new BasicAmountType($currencyCode, $_REQUEST['itemAmount'][$i]);	
-	$itemTotalValue += $_REQUEST['itemAmount'][$i] * $_REQUEST['itemQuantity'][$i]; 
-	$taxTotalValue += $_REQUEST['itemSalesTax'][$i] * $_REQUEST['itemQuantity'][$i];
-	$itemDetails = new PaymentDetailsItemType();
-	$itemDetails->Name = $_REQUEST['itemName'][$i];
-	$itemDetails->Amount = $itemAmount;
-	$itemDetails->Quantity = $_REQUEST['itemQuantity'][$i];
-	/*
-	 * Indicates whether an item is digital or physical. For digital goods, this field is required and must be set to Digital. It is one of the following values:
-
-    Digital
-
-    Physical
-
-	 */
-	$itemDetails->ItemCategory = $_REQUEST['itemCategory'][$i];
-	$itemDetails->Tax = new BasicAmountType($currencyCode, $_REQUEST['itemSalesTax'][$i]);	
-	
-	$paymentDetails->PaymentDetailsItem[$i] = $itemDetails;	
-}
-
-/*
- * The total cost of the transaction to the buyer. If shipping cost and tax charges are known, include them in this value. If not, this value should be the current subtotal of the order. If the transaction includes one or more one-time purchases, this field must be equal to the sum of the purchases. If the transaction does not include a one-time purchase such as when you set up a billing agreement for a recurring payment, set this field to 0.
- */
-$orderTotalValue = $shippingTotal->value + $handlingTotal->value +
-$insuranceTotal->value +
-$itemTotalValue + $taxTotalValue;
-
-//Payment details
-$paymentDetails->ShipToAddress = $address;
-$paymentDetails->ItemTotal = new BasicAmountType($currencyCode, $itemTotalValue);
-$paymentDetails->TaxTotal = new BasicAmountType($currencyCode, $taxTotalValue);
-$paymentDetails->OrderTotal = new BasicAmountType($currencyCode, $orderTotalValue);
-
-/*
- * How you want to obtain payment. When implementing parallel payments, this field is required and must be set to Order. When implementing digital goods, this field is required and must be set to Sale. If the transaction does not include a one-time purchase, this field is ignored. It is one of the following values:
-
-    Sale ? This is a final sale for which you are requesting payment (default).
-
-    Authorization ? This payment is a basic authorization subject to settlement with PayPal Authorization and Capture.
-
-    Order ? This payment is an order authorization subject to settlement with PayPal Authorization and Capture.
-
- */
-$paymentDetails->PaymentAction = $_REQUEST['paymentType'];
-
-$paymentDetails->HandlingTotal = $handlingTotal;
-$paymentDetails->InsuranceTotal = $insuranceTotal;
-$paymentDetails->ShippingTotal = $shippingTotal;
-
-/*
- *  Your URL for receiving Instant Payment Notification (IPN) about this transaction. If you do not specify this value in the request, the notification URL from your Merchant Profile is used, if one exists.
- */
-if(isset($_REQUEST['notifyURL']))
-{
-	$paymentDetails->NotifyURL = $_REQUEST['notifyURL'];
-}
-
-$setECReqDetails = new SetExpressCheckoutRequestDetailsType();
-$setECReqDetails->PaymentDetails[0] = $paymentDetails;
-/*
- * (Required) URL to which the buyer is returned if the buyer does not approve the use of PayPal to pay you. For digital goods, you must add JavaScript to this page to close the in-context experience.
- */
-$setECReqDetails->CancelURL = $cancelUrl;
-/*
- * (Required) URL to which the buyer's browser is returned after choosing to pay with PayPal. For digital goods, you must add JavaScript to this page to close the in-context experience.
- */
-$setECReqDetails->ReturnURL = $returnUrl;
-
-/*
- * Determines where or not PayPal displays shipping address fields on the PayPal pages. For digital goods, this field is required, and you must set it to 1. It is one of the following values:
-
-    0 ? PayPal displays the shipping address on the PayPal pages.
-
-    1 ? PayPal does not display shipping address fields whatsoever.
-
-    2 ? If you do not pass the shipping address, PayPal obtains it from the buyer's account profile.
-
- */
-$setECReqDetails->NoShipping = $_REQUEST['noShipping'];
-/*
- *  (Optional) Determines whether or not the PayPal pages should display the shipping address set by you in this SetExpressCheckout request, not the shipping address on file with PayPal for this buyer. Displaying the PayPal street address on file does not allow the buyer to edit that address. It is one of the following values:
-
-    0 ? The PayPal pages should not display the shipping address.
-
-    1 ? The PayPal pages should display the shipping address.
-
- */
-$setECReqDetails->AddressOverride = $_REQUEST['addressOverride'];
-
-/*
- * Indicates whether or not you require the buyer's shipping address on file with PayPal be a confirmed address. For digital goods, this field is required, and you must set it to 0. It is one of the following values:
-
-    0 ? You do not require the buyer's shipping address be a confirmed address.
-
-    1 ? You require the buyer's shipping address be a confirmed address.
-
- */
-$setECReqDetails->ReqConfirmShipping = $_REQUEST['reqConfirmShipping'];
-
-// Billing agreement details
-$billingAgreementDetails = new BillingAgreementDetailsType($_REQUEST['billingType']);
-$billingAgreementDetails->BillingAgreementDescription = $_REQUEST['billingAgreementText'];
-$setECReqDetails->BillingAgreementDetails = array($billingAgreementDetails);
-
-// Display options
-$setECReqDetails->cppheaderimage = $_REQUEST['cppheaderimage'];
-$setECReqDetails->cppheaderbordercolor = $_REQUEST['cppheaderbordercolor'];
-$setECReqDetails->cppheaderbackcolor = $_REQUEST['cppheaderbackcolor'];
-$setECReqDetails->cpppayflowcolor = $_REQUEST['cpppayflowcolor'];
-$setECReqDetails->cppcartbordercolor = $_REQUEST['cppcartbordercolor'];
-$setECReqDetails->cpplogoimage = $_REQUEST['cpplogoimage'];
-$setECReqDetails->PageStyle = $_REQUEST['pageStyle'];
-$setECReqDetails->BrandName = $_REQUEST['brandName'];
-
-// Advanced options
-$setECReqDetails->AllowNote = $_REQUEST['allowNote'];
-
-$setECReqType = new SetExpressCheckoutRequestType();
-$setECReqType->SetExpressCheckoutRequestDetails = $setECReqDetails;
-$setECReq = new SetExpressCheckoutReq();
-$setECReq->SetExpressCheckoutRequest = $setECReqType;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$setECResponse = $paypalService->SetExpressCheckout($setECReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($setECResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$setECResponse->Ack</div> </td></tr>";
-	echo "<tr><td>Token :</td><td><div id='Token'>$setECResponse->Token</div> </td></tr>";
-	echo "</table>";
-	echo '<pre>';
-	print_r($setECResponse);
-	echo '</pre>';
-	if($setECResponse->Ack =='Success') {
-		$token = $setECResponse->Token;
-		// Redirect to paypal.com here
-		$payPalURL = 'https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=' . $token;
-		echo" <a href=$payPalURL><b>* Redirect to PayPal to login </b></a><br>";
-	}
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/IPN/IPN-README.md b/vendor/paypal/merchant-sdk-php/samples/IPN/IPN-README.md
deleted file mode 100644
index 98ee9904..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/IPN/IPN-README.md
+++ /dev/null
@@ -1,201 +0,0 @@
-IPN Overview :
-------------
-
-* PayPal Instant Payment Notification is call back system that initiated once a tranction is completed  
-  (eg: When ExpressCheckout completed successfully).
-* You will receive the transaction related IPN variables on your call back url that you have specified in your request.
-* You have to send this IPN variable back to PayPal system for verification, Upon verification PayPal will send  
-  a response string "VERIFIED" or "INVALID".
-* PayPal will continuously resend this IPN, if a wrong IPN is sent.
-    
-IPN How to use
---------------
-* Include 'ipn/PPIPNMessage.php' in your IPN callback URL  
-* Initialize IPNMessage constructor with a map containing configuration parameters, as shown below.
-
-		// Array containing configuration parameters. (not required if config file is used)
-		$config = array(
-		    // values: 'sandbox' for testing
-			//		   'live' for production
-			"mode" => "sandbox"
-			
-			// These values are defaulted in SDK. If you want to override default values, uncomment it and add your value.
-			// "http.ConnectionTimeOut" => "5000",
-			// "http.Retry" => "2",
-		);
-		$ipnMessage = new PPIPNMessage(null, $config);   
-* 'validate()' method validates the IPN message and returns true if 'VERIFIED' or returns false if 'INVALID'  
-Ex:
-		$result = $ipnMessage->validate();
-		  
-  Initiating IPN:
-* Make a PayPal API call (eg: SetExpressCheckout request), setting the NotifyURL field of API request   
-  to the url of deployed IPNLIstener sample(eg:https://example.com/merchant-sdk-sample/IPN/IPNListener.php)  
-  the notifyURL field is in 'PaymentDetailsType' class under API request class  
- (Ex: 'SetExpressCheckoutRequestDetailsType->PaymentDetailsType')  
-* You will receive IPN call back from PayPal , which will be logged in to log file in case of IPN sample.
-* See the included sample for more details.
-* To access the IPN received use 'getRawData()' which give an array of received IPN variables  
-Ex:
-		
-		$ipnMessage->getRawData(); 
-	       
-IPN variables :
---------------
-
-[TransactionType]
------------------   
-	txn_type    
-
-[Transaction_Notification]
----------------------------
-	business,
-	charset,
-	custom,
-	ipn_track_id,
-	notify_version,
-	parent_txn_id,
-	receipt_id,
-	receiver_email,
-	receiver_id,
-	resend,
-	residence_country,
-	test_ipn,
-	txn_id,
-	txn_type,
-	verify_sign,
-	transaction_subject 
-
-
-[BuyerInfo]
-------------
-	address_country,
-	address_city,
-	address_country_code,
-	address_name,
-	address_state,
-	address_status,
-	address_street,
-	address_zip,
-	contact_phone,
-	first_name,
-	last_name,
-	payer_business_name,
-	payer_email,
-	payer_id,
-
-
-[Auction]
------------
-	auction_buyer_id,
-	auction_closing_date,
-	auction_multi_item,
-	for_auction,
-
-[MassPay]
-----------
-	masspay_txn_id_X,
-	mc_currency_X,
-	mc_fee_X,
-	mc_gross_X,
-	mc_handlingX,
-	payment_date,
-	payment_status,
-	reason_code,
-	receiver_email_X,
-	status_X,
-	unique_id_X,
-
-[RecurringPayment]
-------------------
-	amount,
-	amount_per_cycle,
-	initial_payment_amount,
-	next_payment_date,
-	outstanding_balance,
-	payment_cycle,
-	period_type,
-	product_name,
-	product_type,
-	profile_status,
-	recurring_payment_id,
-	rp_invoice_id,
-	time_created,
-
-[Subscription]
---------------
-	amountX,
-	mc_amountX,
-	password,
-	periodX,
-	reattempt,
-	recur_times,
-	recurring,
-	retry_at,
-	subscr_date,
-	subscr_effective,
-	subscr_id,
-	username,
-
-
-[DisputeResolution]
--------------------
-	case_creation_date,
-	case_id,
-	case_type,
-	reason_code,
- 
-[Paymentinfo]
--------------
-	exchange_rate,
-	fraud_managment_pending_filters_X,
-	invoice,
-	item_nameX,
-	item_numberX,
-	mc_currency,
-	mc_fee,
-	mc_gross,
-	mc_gross_X,
-	mc_handling,
-	mc_shipping,
-	mc_shippingX,
-	memo,
-	num_cart_items,
-	option_nameX,
-	option_selectionX,
-	payer_status,
-	payment_date,
-	payment_fee,
-	payment_fee_X,
-	payment_gross,
-	payment_gross_X,
-	payment_status,
-	pending_reason,
-	protection_eligibility,
-	quantity,
-	reason_code,
-	remaining_settle,
-	settle_amount,
-	settle_currency,
-	shipping,
-	shipping_method,
-	tax,
-	transaction_entity,
-	payment_type,
-	handling_amount,
-
-[BillingAgreement]
-------------------
-	mp_currency,
-	mp_custom,
-	mp_cycle_start,
-	mp_desc,
-	mp_id,
-	mp_pay_type,
-	mp_status
-	 
-*   For a full list of IPN variables you need to check log file, that IPN Listener is logging into.    
-
-IPN Reference :
---------------
-*   You can refer IPN getting started guide at [https://www.x.com/developers/paypal/documentation-tools/ipn/gs_IPN]
diff --git a/vendor/paypal/merchant-sdk-php/samples/IPN/IPNListener.php b/vendor/paypal/merchant-sdk-php/samples/IPN/IPNListener.php
deleted file mode 100644
index dacecad7..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/IPN/IPNListener.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-use PayPal\IPN\PPIPNMessage;
-/**
- * This is a sample implementation of an IPN listener
- * that uses the SDK's PPIPNMessage class to process IPNs
- * 
- * This sample simply validates the incoming IPN message
- * and logs IPN variables. In a real application, you will
- * validate the IPN and initiate some action based on the 
- * incoming IPN variables.
- */
-require_once('../PPBootStrap.php');
-// first param takes ipn data to be validated. if null, raw POST data is read from input stream
-$ipnMessage = new PPIPNMessage(null, Configuration::getConfig()); 
-foreach($ipnMessage->getRawData() as $key => $value) {
-	error_log("IPN: $key => $value");
-}
-
-if($ipnMessage->validate()) {
-	error_log("Success: Got valid IPN data");		
-} else {
-	error_log("Error: Got invalid IPN data");	
-}
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/MassPay/MassPay.html.php b/vendor/paypal/merchant-sdk-php/samples/MassPay/MassPay.html.php
deleted file mode 100644
index 53e51055..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/MassPay/MassPay.html.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-	<title>PayPal Merchant SDK - MassPay</title>
-	<link rel="stylesheet" href="../Common/sdk.css"/>
-	<script type="text/javascript" src="../Common/sdk.js"></script>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>MassPay</h3>
-			<div id="apidetails">MassPay API operation makes a payment to one or
-				more PayPal account holders.</div>
-		</div>
-		<form method="POST" action="MassPay.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">Receiver Info Code Type</div>
-					<div class="param_value">
-						<select name=receiverInfoCode>
-							<option value=EmailAddress>Email</option>
-							<option value=UserID>UserID</option>
-							<option value=PhoneNumber>Phone</option>
-						</select>
-					</div>
-				</div>
-				<table class="params">
-					<tr>
-						<th class="param_name">Mail</th>
-						<th class="param_name">UserID</th>
-						<th class="param_name">Phone Number</th>
-						<th class="param_name">Amount</th>
-						<th class="param_name">Currency Code</th>
-					</tr>
-					<tr>
-						<td class="param_value"><input type="text" name="mail[]"
-							value="enduser_biz@xxxxxxxxx" size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="id[]" value=""
-							size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="phone[]" value=""
-							size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="amount[]"
-							value="3.00" size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="currencyCode[]"
-							value="USD" size="25" maxlength="260" /></td>
-					</tr>
-					<tr>
-						<td class="param_value"><input type="text" name="mail[]"
-							value="sdk-three@xxxxxxxxxx" size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="id[]" value=""
-							size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="phone[]" value=""
-							size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="amount[]"
-							value="3.00" size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="currencyCode[]"
-							value="USD" size="25" maxlength="260" /></td>
-					</tr>
-					<tr>
-						<td class="param_value"><input type="text" name="mail[]"
-							value="jb-us-seller@xxxxxxxxxx" size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="id[]" value=""
-							size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="phone[]" value=""
-							size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="amount[]"
-							value="3.00" size="25" maxlength="260" /></td>
-						<td class="param_value"><input type="text" name="currencyCode[]"
-							value="USD" size="25" maxlength="260" /></td>
-					</tr>
-				</table>
-				<?php
-					include('../Permissions/Permission.html.php');
-				?>
-					
-				<input type="submit" name="MassPayBtn" value="MassPay" /><br />
-			</div>
-			<a href="../index.php">Home</a>
-		</form>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/MassPay/MassPay.php b/vendor/paypal/merchant-sdk-php/samples/MassPay/MassPay.php
deleted file mode 100644
index e7316b14..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/MassPay/MassPay.php
+++ /dev/null
@@ -1,88 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\PayPalAPI\MassPayReq;
-use PayPal\PayPalAPI\MassPayRequestItemType;
-use PayPal\PayPalAPI\MassPayRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-use PayPal\Auth\PPSignatureCredential;
-use PayPal\Auth\PPTokenAuthorization;
-
-require_once('../PPBootStrap.php');
-
-/*
- *  # MassPay API
-The MassPay API operation makes a payment to one or more PayPal account
-holders.
-This sample code uses Merchant PHP SDK to make API call
-*/
-$massPayRequest = new MassPayRequestType();
-$massPayRequest->MassPayItem = array();
-for($i=0; $i<count($_REQUEST['mail']); $i++) {
-	$masspayItem = new MassPayRequestItemType();
-	/*
-	 *  `Amount` for the payment which contains
-
-	* `Currency Code`
-	* `Amount`
-	*/
-	$masspayItem->Amount = new BasicAmountType($_REQUEST['currencyCode'][$i], $_REQUEST['amount'][$i]);
-	if($_REQUEST['receiverInfoCode'] == 'EmailAddress') {
-		/*
-		 *  (Optional) How you identify the recipients of payments in this call to MassPay. It is one of the following values:
-		EmailAddress
-		UserID
-		PhoneNumber
-		*/
-		$masspayItem->ReceiverEmail = $_REQUEST['mail'][$i];
-	} elseif ($_REQUEST['receiverInfoCode'] == 'UserID') {
-		$masspayItem->ReceiverID = $_REQUEST['id'][$i];
-	} elseif ($_REQUEST['receiverInfoCode'] == 'PhoneNumber') {
-		$masspayItem->ReceiverPhone = $_REQUEST['phone'][$i];
-	}
-	$massPayRequest->MassPayItem[] = $masspayItem;
-}
-
-/*
- *  ## MassPayReq
-Details of each payment.
-`Note:
-A single MassPayRequest can include up to 250 MassPayItems.`
-*/
-$massPayReq = new MassPayReq();
-$massPayReq->MassPayRequest = $massPayRequest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-
-// required in third party permissioning
-if(($_POST['accessToken']!= null) && ($_POST['tokenSecret'] != null)) {
-	$cred = new PPSignatureCredential("jb-us-seller_api1.paypal.com", "WX4WTU3S8MY44S7F", "AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy");
-	$cred->setThirdPartyAuthorization(new PPTokenAuthorization($_POST['accessToken'], $_POST['tokenSecret']));
-}
-
-try {
-	/* wrap API method calls on the service object with a try catch */
-	if(($_POST['accessToken']!= null) && ($_POST['tokenSecret'] != null)) {
-			$massPayResponse = $paypalService->MassPay($massPayReq, $cred);
-		}
-		else{
-		 	$massPayResponse = $paypalService->MassPay($massPayReq);
-		}
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($massPayResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$massPayResponse->Ack</div> </td></tr>";
-	echo "</table>";
-
-	echo "<pre>";
-	print_r($massPayResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/PPBootStrap.php b/vendor/paypal/merchant-sdk-php/samples/PPBootStrap.php
deleted file mode 100644
index a4fef2a2..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PPBootStrap.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-/**
- * Include this file in your application. This file sets up the required classloader based on
-* whether you used composer or the custom installer.
-*/
-
-//
-require_once 'Configuration.php';
-/*
- * @constant PP_CONFIG_PATH required if credentoal and configuration is to be used from a file
-* Let the SDK know where the sdk_config.ini file resides.
-*/
-//define('PP_CONFIG_PATH', dirname(__FILE__));
-
-/*
- * use autoloader
-*/
-if(file_exists( dirname(__FILE__). '/vendor/autoload.php')) {
-require 'vendor/autoload.php';
-} else {
-require 'PPAutoloader.php';
-    PPAutoloader::register();
-}
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoAuthorization.html.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoAuthorization.html.php
deleted file mode 100644
index 4525ae3a..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoAuthorization.html.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - DoAuthorization</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>DoAuthorization</h3>
-			<div id="apidetails">Used to authorize a payment</div>
-		</div>
-		<form method="POST" action="DoAuthorization.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name"> Transaction ID
-						 (Make a Transaction to get Transaction ID <a
-							href="../DCC/DirectPayment">Direct Payment</a> or <a
-							href="../EC/SetExpressCheckout">ExpressCheckout</a> with
-						PaymentType "Order")
-					</div>
-					<div class="param_value">
-						<input type="text" name="transID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Amount</div>
-					<div class="param_value">
-						<input type="text" name="amt" value="1.00" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Currency Code</div>
-					<div class="param_value">
-						<input type="text" name="currencyCode" value="USD" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="DoAuthorizationBtn"
-						value="DoAuthorization" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-		<div id="relatedcalls">
-			See also
-			<ul>
-				<li><a href="DoCapture.html.php">DoCapture</a>
-				</li>
-				<li><a href="DoVoid.html.php">DoVoid</a>
-				</li>
-				<li><a href="Refund.html.php">Refund</a>
-				</li>
-				<li><a href="DoReauthorization.html.php">DoReauthorization</a>
-				</li>
-
-				<li><a href="ReverseTransaction.html.php">ReverseTransaction</a>
-				</li>
-				<li><a href="DoNonReferencedCredit.html.php">DoNonReferencedCredit</a>
-				</li>
-				<li><a href="ManagePendingTransactionStatus.html.php">ManagePendingTransactionStatus</a>
-				</li>
-			</ul>
-		</div>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoAuthorization.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoAuthorization.php
deleted file mode 100644
index 64fee458..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoAuthorization.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\PayPalAPI\DoAuthorizationReq;
-use PayPal\PayPalAPI\DoAuthorizationRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-/*
- *  # DoAuthorization API
-Authorize a payment.
-This sample code uses Merchant PHP SDK to make API call
-*/
-
-/*
- *  `Amount` which takes mandatory params:
-
-* `currencyCode`
-* `amount`
-*/
-$amount = new BasicAmountType($_REQUEST['currencyCode'], $_REQUEST['amt']);
-
-/*
- *  `DoAuthorizationRequest` which takes mandatory params:
-
-* `Transaction ID` - Value of the order's transaction identification
-number returned by PayPal.
-* `Amount` - Amount to authorize.
-*/
-$doAuthRequest = new DoAuthorizationRequestType($_REQUEST['transID'], $amount);
-$doAuthReq = new DoAuthorizationReq();
-$doAuthReq->DoAuthorizationRequest =$doAuthRequest;
-
-/*
- *  ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$doAuthResponse = $paypalService->DoAuthorization($doAuthReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($doAuthResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>".$doAuthResponse->Ack."</div> </td></tr>";
-	echo "<tr><td>TransactionID :</td><td><div id='TransactionID'>".$doAuthResponse->TransactionID."</div></td></tr>";
-	echo "</table>";
-
-	echo "<pre>";
-	print_r($doAuthResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
-?>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoCapture.html.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoCapture.html.php
deleted file mode 100644
index cc70a55b..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoCapture.html.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - DoCapture</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>DoCapture</h3>
-			<div id="apidetails">Used to captures an authorized payment.</div>
-		</div>
-		<form method="POST" action="DoCapture.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">AuthorizationID</div>
-					<div class="param_value">
-						<input type="text" name="authID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Amount</div>
-					<div class="param_value">
-						<input type="text" name="amt" value="1.00" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Currency Code</div>
-					<div class="param_value">
-						<input type="text" name="currencyCode" value="USD" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">CompleteCodeType</div>
-					<div class="param_value">
-						<select name="completeCodeType">
-							<option value="Complete">Complete</option>
-							<option value="NotComplete">NotComplete</option>
-						</select>
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="DoCaptureBtn" value="DoCapture" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-		<div id="relatedcalls">
-			See also
-			<ul>
-				<li><a href="DoCapture.html.php">DoCapture</a>
-				</li>
-				<li><a href="DoVoid.html.php">DoVoid</a>
-				</li>
-				<li><a href="Refund.html.php">Refund</a>
-				</li>
-				<li><a href="DoReauthorization.html.php">DoReauthorization</a>
-				</li>
-
-				<li><a href="ReverseTransaction.html.php">ReverseTransaction</a>
-				</li>
-				<li><a href="DoNonReferencedCredit.html.php">DoNonReferencedCredit</a>
-				</li>
-				<li><a href="ManagePendingTransactionStatus.html.php">ManagePendingTransactionStatus</a>
-				</li>
-			</ul>
-		</div>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoCapture.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoCapture.php
deleted file mode 100644
index 515c6b04..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoCapture.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\PayPalAPI\DoCaptureReq;
-use PayPal\PayPalAPI\DoCaptureRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-/*
- *  # DoCapture API
-Captures an authorized payment.
-This sample code uses Merchant PHP SDK to make API call
-*/
-
-/*
- *
-`Amount` to capture which takes mandatory params:
-
-* `currencyCode`
-* `amount`
-*/
-$amount = new BasicAmountType($_REQUEST['currencyCode'], $_REQUEST['amt']);
-
-/*
- *  `DoCaptureRequest` which takes mandatory params:
-
-* `Authorization ID` - Authorization identification number of the
-payment you want to capture. This is the transaction ID returned from
-DoExpressCheckoutPayment, DoDirectPayment, or CheckOut. For
-point-of-sale transactions, this is the transaction ID returned by
-the CheckOut call when the payment action is Authorization.
-* `amount` - Amount to capture
-* `CompleteCode` - Indicates whether or not this is your last capture.
-It is one of the following values:
-* Complete ? This is the last capture you intend to make.
-* NotComplete ? You intend to make additional captures.
-`Note:
-If Complete, any remaining amount of the original authorized
-transaction is automatically voided and all remaining open
-authorizations are voided.`
-*/
-$doCaptureReqest = new DoCaptureRequestType($_REQUEST['authID'], $amount, $_REQUEST['completeCodeType']);
-$doCaptureReq = new DoCaptureReq();
-$doCaptureReq->DoCaptureRequest = $doCaptureReqest;
-
-/*
- *  ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$doCaptureResponse = $paypalService->DoCapture($doCaptureReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($doCaptureResponse)) {
-	echo "<pre>";
-	print_r($doCaptureResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoNonReferencedCredit.html.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoNonReferencedCredit.html.php
deleted file mode 100644
index dee058dc..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoNonReferencedCredit.html.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - DoNonReferencedCredit</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>DoNonReferencedCredit</h3>
-			<div id="apidetails">
-				<p>Non-referenced credits allow the merchant to issue credits to CC
-					of buyers even if there is no prior record of a transaction with
-					the buyers. This feature was introduced primarily to help merchants
-					who recently migrated from other acquirers and need to refund
-					transactions processed through other acquirers</p>
-			</div>
-		</div>
-		<form method="POST" action="DoNonReferencedCredit.php">
-			<div id="request_form">
-				<div id="section_header">Credit Card Details</div>
-				<table class="params">
-					<tr>
-						<th class="param_name">Credit Card number</th>
-						<th class="param_name">Expiry date</th>
-						<th class="param_name">Credit Card type</th>
-						<th class="param_name">CVV</th>
-					</tr>
-					<tr>
-						<td><div class="param_value">
-								<input type="text" name="creditCard" id="creditCardNumber"
-									value="" />
-							</div>
-						</td>
-						<td><div class="param_value">
-								<select name="expMonth">
-									<option value="1">Jan</option>
-									<option value="2">Feb</option>
-									<option value="3">Mar</option>
-									<option value="4">Apr</option>
-									<option value="5">May</option>
-									<option value="6">Jun</option>
-									<option value="7">Jul</option>
-									<option value="8">Aug</option>
-									<option value="9">Sep</option>
-									<option value="10">Oct</option>
-									<option value="11">Nov</option>
-									<option value="12">Dec</option>
-								</select> <select name="expYear">
-									<option value="2013">2013</option>
-									<option value="2014">2014</option>
-									<option value="2015">2015</option>
-									<option value="2016">2016</option>
-									<option value="2017">2017</option>
-								</select>
-							</div>
-						</td>
-						<td><div class="param_value">
-								<select name="creditCardType">
-									<option value="Visa">Visa</option>
-									<option value="MasterCard">MasterCard</option>
-									<option value="Discover">Discover</option>
-									<option value="Amex">Amex</option>
-								</select>
-							</div>
-						</td>
-						<td><div class="param_value">
-								<input type="text" name="cvv" id="cvv" />
-							</div>
-						</td>
-					</tr>
-				</table>
-				<div class="params">
-					<div class="param_name">Comment</div>
-					<div class="param_value">
-						<input type=text size=30 maxlength=32 name="comment"
-							value="NonReferencedCredit">
-					</div>
-				</div>
-				<table class="params">
-					<tr>
-						<th class="param_name">Item Cost*</th>
-						<th class="param_name">Shipping cost</th>
-						<th class="param_name">Tax Amount</th>
-						<th class="param_name">Currency Code*</th>
-					</tr>
-					<tr>
-						<td class="param_value"><input type="text" name="itemAmount"
-							value="0.50" /></td>
-						<td class="param_value"><input type="text" name="shippingAmount"
-							value="0.50" /></td>
-						<td class="param_value"><input type="text" name="taxAmount"
-							value="0.0" /></td>
-						<td class="param_value"><input type="text" name="currencyID"
-							value="USD" /></td>
-					</tr>
-				</table>
-				<div class="submit">
-					<input type="submit" name="DoNonReferencedCreditBtn"
-						value="DoNonReferencedCredit" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-		<div id="relatedcalls">
-			See also
-			<ul>
-				<li><a href="DoCapture.html.php">DoCapture</a>
-				</li>
-
-				<li><a href="Refund.html.php">Refund</a>
-				</li>
-
-				<li><a href="DoAuthorization.html.php">DoAuthorization</a></li>
-
-				<li><a href="ReverseTransaction.html.php">ReverseTransaction</a>
-				</li>
-
-				<li><a href="ManagePendingTransactionStatus.html.php">ManagePendingTransactionStatus</a>
-				</li>
-			</ul>
-		</div>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoNonReferencedCredit.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoNonReferencedCredit.php
deleted file mode 100644
index a9df5dc9..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoNonReferencedCredit.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\CreditCardDetailsType;
-use PayPal\EBLBaseComponents\DoNonReferencedCreditRequestDetailsType;
-use PayPal\PayPalAPI\DoNonReferencedCreditReq;
-use PayPal\PayPalAPI\DoNonReferencedCreditRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * The DoNonReferencedCredit API issues a credit to a card not referenced by the original transaction
-*/
-
-$currencyId = $_REQUEST['currencyID'];
-
-/*
- * (Optional) Total amount of all items in this transaction.
-*/
-$itemAmount = new BasicAmountType();
-$itemAmount->value = $_REQUEST['itemAmount'];
-$itemAmount->currencyID = $currencyId;
-
-/*
- * shipping address
-*/
-$shippingAmount = new BasicAmountType();
-$shippingAmount->value = $_REQUEST['shippingAmount'];
-$shippingAmount->currencyID = $currencyId;
-
-/*
- * (Optional) Sum of tax for all items in this order.
-*/
-$taxAmount = new BasicAmountType();
-$taxAmount->value = $_REQUEST['taxAmount'];
-$taxAmount->currencyID = $currencyId;
-
-/*
- * Total of order, including shipping, handling, and tax.
-*/
-$totalamount = new BasicAmountType();
-$totalamount->value = ($taxAmount->value + $shippingAmount->value + $itemAmount->value);
-$totalamount->currencyID = $currencyId;
-
-/*
- * creditcard details
-*/
-$creditCard = new CreditCardDetailsType();
-$creditCard->CreditCardNumber = $_REQUEST['creditCard'];
-$creditCard->ExpMonth = $_REQUEST['expMonth'];
-$creditCard->ExpYear =$_REQUEST['expYear'];
-$creditCard->CreditCardType = $_REQUEST['creditCardType'];
-$creditCard->CVV2 = $_REQUEST['cvv'];
-
-
-$doNonRefCreditRequestDetails= new DoNonReferencedCreditRequestDetailsType();
-$doNonRefCreditRequestDetails->CreditCard = $creditCard;
-$doNonRefCreditRequestDetails->Comment =$_REQUEST['comment'];
-$doNonRefCreditRequestDetails->NetAmount =$itemAmount;
-$doNonRefCreditRequestDetails->ShippingAmount = $shippingAmount;
-$doNonRefCreditRequestDetails->TaxAmount = $taxAmount;
-$doNonRefCreditRequestDetails->Amount = $totalamount;
-
-$doNonRefCreditRequest = new DoNonReferencedCreditRequestType();
-$doNonRefCreditRequest->DoNonReferencedCreditRequestDetails =$doNonRefCreditRequestDetails;
-
-
-$doNonRefCreditReq = new DoNonReferencedCreditReq();
-$doNonRefCreditReq->DoNonReferencedCreditRequest = $doNonRefCreditRequest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$doNonRefCreditResponse = $paypalService->DoNonReferencedCredit($doNonRefCreditReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($doNonRefCreditResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$doNonRefCreditResponse->Ack</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($doNonRefCreditResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoReauthorization.html.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoReauthorization.html.php
deleted file mode 100644
index 2a8cdcc4..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoReauthorization.html.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - DoReauthorization</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>DoReauthorization</h3>
-			<div id="apidetails">Used to reauthorize transaction for a different
-				amount</div>
-		</div>
-		<form method="POST" action="DoReauthorization.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">Authorization ID</div>
-					<div class="param_value">
-						<input type="text" name="authID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Amount</div>
-					<div class="param_value">
-						<input type="text" name="amt" value="1.00" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Currency Code</div>
-					<div class="param_value">
-						<input type="text" name="currencyCode" value="USD" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="DoReauthorizationBtn"
-						value="DoReauthorization" /> <br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-		<div id="relatedcalls">
-			See also
-			<ul>
-				<li><a href="DoCapture.html.php">DoCapture</a>
-				</li>
-				<li><a href="DoVoid.html.php">DoVoid</a>
-				</li>
-				<li><a href="Refund.html.php">Refund</a>
-				</li>
-				<li><a href="DoReauthorization.html.php">DoReauthorization</a>
-				</li>
-				<li><a href="DoAuthorization.html.php">DoAuthorization</a></li>
-
-				<li><a href="ReverseTransaction.html.php">ReverseTransaction</a>
-				</li>
-				<li><a href="DoNonReferencedCredit.html.php">DoNonReferencedCredit</a>
-				</li>
-				<li><a href="ManagePendingTransactionStatus.html.php">ManagePendingTransactionStatus</a>
-				</li>
-			</ul>
-		</div>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoReauthorization.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoReauthorization.php
deleted file mode 100644
index 326fdb5a..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoReauthorization.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\PayPalAPI\DoReauthorizationReq;
-use PayPal\PayPalAPI\DoReauthorizationRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-/*
- * Authorize a payment. 
- */
-
-/*
- * (Required) Amount to reauthorize.
- */
-$amount = new BasicAmountType($_REQUEST['currencyCode'], $_REQUEST['amt']);
-
-/*
- * (Required) Value of a previously authorized transaction identification number returned by PayPal.
- */
-$doReAuthRequest = new DoReauthorizationRequestType($_REQUEST['authID'], $amount);
-$doReAuthReq = new DoReauthorizationReq();
-$doReAuthReq->DoReauthorizationRequest =$doReAuthRequest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$doReAuthResponse = $paypalService->DoReauthorization($doReAuthReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($doReAuthResponse)) {
-	echo "<pre>";
-	print_r($doReAuthResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoVoid.html.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoVoid.html.php
deleted file mode 100644
index fcd29186..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoVoid.html.php
+++ /dev/null
@@ -1,53 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - DoVoid</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>DoVoid</h3>
-			<div id="apidetails">Used to void an order or an authorization.</div>
-		</div>
-		<form method="POST" action="DoVoid.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">Authorization ID *</div>
-					<div class="param_value">
-						<input type="text" name="authID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="DoVoidBtn" value="DoVoid" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-		<div id="relatedcalls">
-			See also
-			<ul>
-				<li><a href="DoCapture.html.php">DoCapture</a>
-				</li>
-				<li><a href="DoVoid.html.php">DoVoid</a>
-				</li>
-				<li><a href="Refund.html.php">Refund</a>
-				</li>
-				<li><a href="DoReauthorization.html.php">DoReauthorization</a>
-				</li>
-				<li><a href="DoAuthorization.html.php">DoAuthorization</a></li>
-
-				<li><a href="ReverseTransaction.html.php">ReverseTransaction</a>
-				</li>
-				<li><a href="DoNonReferencedCredit.html.php">DoNonReferencedCredit</a>
-				</li>
-				<li><a href="ManagePendingTransactionStatus.html.php">ManagePendingTransactionStatus</a>
-				</li>
-			</ul>
-		</div>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoVoid.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoVoid.php
deleted file mode 100644
index c198ff39..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/DoVoid.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-use PayPal\PayPalAPI\DoVoidReq;
-use PayPal\PayPalAPI\DoVoidRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- *  # DoVoid API
- Void an order or an authorization.
- This sample code uses Merchant PHP SDK to make API call
- */
-
-
-$doVoidRequest = new DoVoidRequestType();
-/*
- *  DoVoidRequest which takes mandatory params:
-
- * `Authorization ID` - Original authorization ID specifying the
- authorization to void or, to void an order, the order ID.
- `Important:
- If you are voiding a transaction that has been reauthorized, use the
- ID from the original authorization, and not the reauthorization.`
-*/
-$doVoidRequest->AuthorizationID = $_REQUEST['authID'];
-
-
-$doVoidReq = new DoVoidReq();
-$doVoidReq->DoVoidRequest =$doVoidRequest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$doVoidResponse = $paypalService->DoVoid($doVoidReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($doVoidResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>".$doVoidResponse->Ack."</div> </td></tr>";
-	echo "<tr><td>AuthorizationID :</td><td><div id='AuthorizationID'>".$doVoidResponse->AuthorizationID."</div></td></tr>";
-	echo "</table>";
-
-	echo "<pre>";
-	print_r($doVoidResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
-?>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ManagePendingTransactionStatus.html.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ManagePendingTransactionStatus.html.php
deleted file mode 100644
index 8787e0d0..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ManagePendingTransactionStatus.html.php
+++ /dev/null
@@ -1,66 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - ManagePendingTransactionStatus</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>ManagePendingTransactionStatus</h3>
-			<div id="apidetails">
-				<p>ManagePendingTransactionStatus API operation accepts or denys a
-					pending transaction held by Fraud Management Filters.</p>
-			</div>
-		</div>
-		<form method="POST" action="ManagePendingTransactionStatus.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">Transaction ID *</div>
-					<div class="param_value">
-						<input type="text" name="transactionID" value="" />
-					</div>
-				</div>
-
-				<div class="params">
-					<div class="param_name">Action *</div>
-					<div class="param_value">
-						<select name="action">
-							<option value="Accept">Accept</option>
-							<option value="Deny">Deny</option>
-						</select>
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="ManagePendingTransactionStatusBtn"
-						value="ManagePendingTransactionStatus" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-
-			</div>
-		</form>
-		<div id="relatedcalls">
-			See also
-			<ul>
-				<li><a href="DoCapture.html.php">DoCapture</a>
-				</li>
-				<li><a href="DoVoid.html.php">DoVoid</a>
-				</li>
-				<li><a href="Refund.html.php">Refund</a>
-				</li>
-				<li><a href="DoReauthorization.html.php">DoReauthorization</a>
-				</li>
-				<li><a href="DoAuthorization.html.php">DoAuthorization</a></li>
-
-				<li><a href="ReverseTransaction.html.php">ReverseTransaction</a>
-				</li>
-				<li><a href="DoNonReferencedCredit.html.php">DoNonReferencedCredit</a>
-				</li>
-
-			</ul>
-		</div>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ManagePendingTransactionStatus.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ManagePendingTransactionStatus.php
deleted file mode 100644
index 8d6d89e7..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ManagePendingTransactionStatus.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-use PayPal\PayPalAPI\ManagePendingTransactionStatusReq;
-use PayPal\PayPalAPI\ManagePendingTransactionStatusRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * The ManagePendingTransactionStatus API operation accepts or denys a pending transaction held by Fraud Management Filters. 
- */
-
-/*
- * (Required) The transaction ID of the payment transaction. 
- * 
- * (Required) The operation you want to perform on the transaction. It is one of the following values:
-
-    Accept ? Accepts the payment
-
-    Deny ? Rejects the payment
-
- */
-$MPTranStatusReqest= new ManagePendingTransactionStatusRequestType($_REQUEST['transactionID'], $_REQUEST['action']);
-$MPTranStatusReq = new ManagePendingTransactionStatusReq();
-$MPTranStatusReq->ManagePendingTransactionStatusRequest = $MPTranStatusReqest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$MPTranStatusResponse = $paypalService->ManagePendingTransactionStatus($MPTranStatusReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($MPTranStatusResponse)) {
-	echo "<pre>";
-	print_r($MPTranStatusResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
-?>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/Refund.html.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/Refund.html.php
deleted file mode 100644
index 39dcb50e..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/Refund.html.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - Refund</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>Refund</h3>
-			<div id="apidetails">RefundTransaction API operation issues a refund
-				to the PayPal account holder associated with a transaction.</div>
-		</div>
-		<form method="POST" action="Refund.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						TransactionID * (Get Transaction ID via<a
-							href="../DirectPayment/DoDirectPayment.html.php">Direct Payment</a>
-						or <a href="../ExpressCheckout/SetExpressCheckout.html.php">ExpressCheckout</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="transID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Refund Type</div>
-					<div class="param_value">
-						<select name="refundType">
-							<option value=""></option>
-							<option value="Other">Other</option>
-							<option value="Full" selected="selected">Full (Default)</option>
-							<option value="Partial">Partial</option>
-							<option value="ExternalDispute">ExternalDispute</option>
-						</select>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Refund Source</div>
-					<div class="param_value">
-						<select name="refundSource">
-							<option value=""></option>
-							<option value="any">Use any available funding source</option>
-							<option value="default">Use the preferred funding source, as
-								configured in the profile</option>
-							<option value="instant">Use the balance as the funding source</option>
-							<option value="echeck">Use the eCheck funding source</option>
-						</select>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Amount to be refunded (If RefundType is
-						full, do not set the amount)</div>
-					<div class="param_value">
-						<input type="text" name="amt" value=""/>
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Currency Code</div>
-					<div class="param_value">
-						<input type="text" name="currencyID" value=""/>
-					</div>
-				</div>
-				<div class="param_name">Memo</div>
-	            <div class="param_value">
-	                <input type="text" name="memo" id="memo" size="50" value="" />
-	            </div>
-	            <div class="param_name">Maximum time until which refund must be retried</div>
-	            <div class="param_value">	                
-	                <input type="text" name="retryUntil" value="" />
-	            </div>
-
-				<div class="submit">
-					<input type="submit" name="RefundBtn" value="Refund" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/Refund.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/Refund.php
deleted file mode 100644
index 1312db11..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/Refund.php
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\PayPalAPI\RefundTransactionReq;
-use PayPal\PayPalAPI\RefundTransactionRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * The RefundTransaction API operation issues a refund to the PayPal account holder associated with a transaction. 
- This sample code uses Merchant PHP SDK to make API call
- */
-$refundReqest = new RefundTransactionRequestType();
-
-/*
- * 	 Type of refund you are making. It is one of the following values:
-		
-		 * `Full` - Full refund (default).
-		 * `Partial` - Partial refund.
-		 * `ExternalDispute` - External dispute. (Value available since
-		 version
-		 82.0)
-		 * `Other` - Other type of refund. (Value available since version
-		 82.0)
- */
-if($_REQUEST['amt'] != "" && strtoupper($_POST['refundType']) != "FULL") {
-	/*
-	 * 		 `Refund amount`, which contains
-		
-		 * `Currency Code`
-		 * `Amount`
-		 The amount is required if RefundType is Partial.
-		 `Note:
-		 If RefundType is Full, do not set the amount.`
-	 */
-	$refundReqest->Amount = new BasicAmountType($_REQUEST['currencyID'], $_REQUEST['amt']);
-}
-$refundReqest->RefundType = $_REQUEST['refundType'];
-
-/*
- *  Either the `transaction ID` or the `payer ID` must be specified.
-		 PayerID is unique encrypted merchant identification number
-		 For setting `payerId`,
-		 `refundTransactionRequest.setPayerID("A9BVYX8XCR9ZQ");`
-
-		 Unique identifier of the transaction to be refunded.
- */
-$refundReqest->TransactionID = $_REQUEST['transID'];
-
-/*
- *  (Optional)Type of PayPal funding source (balance or eCheck) that can be used for auto refund. It is one of the following values:
-
-    any ? The merchant does not have a preference. Use any available funding source.
-
-    default ? Use the merchant's preferred funding source, as configured in the merchant's profile.
-
-    instant ? Use the merchant's balance as the funding source.
-
-    eCheck ? The merchant prefers using the eCheck funding source. If the merchant's PayPal balance can cover the refund amount, use the PayPal balance.
-
- */
-$refundReqest->RefundSource = $_REQUEST['refundSource'];
-$refundReqest->Memo = $_REQUEST['memo'];
-/*
- * 
-   (Optional) Maximum time until you must retry the refund. 
- */
-$refundReqest->RetryUntil = $_REQUEST['retryUntil'];
-
-$refundReq = new RefundTransactionReq();
-$refundReq->RefundTransactionRequest = $refundReqest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$refundResponse = $paypalService->RefundTransaction($refundReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($refundResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$refundResponse->Ack</div> </td></tr>";
-	//echo "<tr><td>RefundStatus :</td><td><div id='RefundStatus'>$refundResponse->RefundInfo->RefundStatus</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($refundResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ReverseTransaction.html.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ReverseTransaction.html.php
deleted file mode 100644
index 85d7e4c2..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ReverseTransaction.html.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - ReverseTransaction</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>ReverseTransaction</h3>
-			<div id="apidetails">ReverseTransaction API operation reverses a
-				transaction.</div>
-		</div>
-		<form method="POST" action="ReverseTransaction.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						Transaction ID *(Get Transaction ID via <a
-							href="../DirectPayment/DoDirectPayment.html.php">Direct Payment</a>
-						or <a href="../ExpressCheckout/SetExpressCheckout.html.php">ExpressCheckout</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="transID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="ReverseTransactionBtn"
-						value="ReverseTransaction" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-		<div id="relatedcalls">
-			See also
-			<ul>
-				<li><a href="DoCapture.html.php">DoCapture</a>
-				</li>
-				<li><a href="DoVoid.html.php">DoVoid</a>
-				</li>
-				<li><a href="Refund.html.php">Refund</a>
-				</li>
-				<li><a href="DoReauthorization.html.php">DoReauthorization</a>
-				</li>
-				<li><a href="DoAuthorization.html.php">DoAuthorization</a></li>
-
-				<li><a href="DoNonReferencedCredit.html.php">DoNonReferencedCredit</a>
-				</li>
-				<li><a href="ManagePendingTransactionStatus.html.php">ManagePendingTransactionStatus</a>
-				</li>
-			</ul>
-		</div>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ReverseTransaction.php b/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ReverseTransaction.php
deleted file mode 100644
index 16de19d3..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/PaymentSettlements/ReverseTransaction.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-use PayPal\EBLBaseComponents\ReverseTransactionRequestDetailsType;
-use PayPal\PayPalAPI\ReverseTransactionReq;
-use PayPal\PayPalAPI\ReverseTransactionRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-/**
- * Get required parameters from the web form for the request
- */
-
-$reverseTransactionReqestDetails = new ReverseTransactionRequestDetailsType();
-$reverseTransactionReqestDetails->TransactionID = $_REQUEST['transID'];
-
-$reverseTransactionReqest = new ReverseTransactionRequestType();
-$reverseTransactionReqest->ReverseTransactionRequestDetails = $reverseTransactionReqestDetails;
-
-
-$reverseTransactionReq = new ReverseTransactionReq();
-$reverseTransactionReq->ReverseTransactionRequest = $reverseTransactionReqest;
-/*
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$reverseTransactionResponse = $paypalService->ReverseTransaction($reverseTransactionReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-if(isset($reverseTransactionResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$reverseTransactionResponse->Ack</div> </td></tr>";
-	//echo "<tr><td>Ack :</td><td><div id='Ack'>$reverseTransactionResponse->ReverseTransactionResponseDetails->ReverseTransactionID</div> </td></tr>";
-	echo "</table>";
-	echo "<pre>";
-	print_r($reverseTransactionResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/APIError.php b/vendor/paypal/merchant-sdk-php/samples/Permissions/APIError.php
deleted file mode 100644
index cd844996..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/APIError.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/*************************************************
- APIError.php
-Displays error parameters.
-*************************************************/
-session_start();
-$response=$_SESSION['reshash'];
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
-<html>
-<body>
-	<div id="request_form">
-		<h3>
-			<b>The PayPal API has returned an error!</b>
-		</h3>
-		<table width="280">
-
-			<?php  //it will print if any URL errors
-if(isset($_SESSION['curl_error_no'])) {
-	$errorCode= $_SESSION['curl_error_no'] ;
-	$errorMessage=$_SESSION['curl_error_msg'] ;
-
-	?>
-
-
-			<tr>
-				<td class="thinfield">Error Number:</td>
-				<td><?php $errorCode ?></td>
-			</tr>
-			<tr>
-				<td>Error Message:</td>
-				<td><?php $errorMessage ?></td>
-			</tr>
-
-
-		</table>
-		<?php } else {
-
-			/* If there is no URL Errors, Construct the HTML page with
-			 Response Error parameters.
-			*/
-			?>
-		<font size=2 color=black face=Verdana><b></b> </font> <b> PayPal API
-			Error</b><br></br>
-
-		<table width=400>
-			<?php
-
-			require 'ShowAllResponse.php';
-			?>
-		</table>
-		<?php
-		}// end else
-		session_unset();
-		?>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/Error.php b/vendor/paypal/merchant-sdk-php/samples/Permissions/Error.php
deleted file mode 100644
index 2a6323d9..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/Error.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-function getDetailedExceptionMessage($ex) {
-	if($ex instanceof PPConnectionException) {
-		return "Error connecting to " . $ex->getUrl();
-	} else if($ex instanceof PPConfigurationException) {
-		return "Error at $ex->getLine() in $ex->getFile()";
-	} else if($ex instanceof PPInvalidCredentialException || $x instanceof PPMissingCredentialException) {
-		return $ex->errorMessage();
-	}
-	return "";
-}
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
-<html>
-<body>
-	<br />
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<h3>SDK Exception</h3>
-		<?php if (isset($ex) && $ex instanceof Exception) {?>
-		<table>
-			<tr>
-				<td>Type</td>
-				<td><?php echo get_class($ex)?></td>
-			</tr>
-			<tr>
-				<td>Message</td>
-				<td><?php echo $ex->getMessage();?></td>
-			</tr>
-			<tr>
-				<td>Detailed message</td>
-				<td><?php echo getDetailedExceptionMessage($ex);?></td>
-			</tr>
-			<?php }?>
-		</table>
-		<br /> <a href="index.php">Home</a>
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/GetAccessToken.php b/vendor/paypal/merchant-sdk-php/samples/Permissions/GetAccessToken.php
deleted file mode 100644
index d5faa27f..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/GetAccessToken.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/********************************************
- GetAccessToken.php
- Calls  GetAccessTokenReceipt.php,and APIError.php.
- ********************************************/
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
-
-<html>
-<head>
-<title>PayPal Permissions - Get Access Token</title>
-</head>
-<body>
-<center>
-
-	<form action="GetAccessTokenReceipt.php" method="post">
-	
-	
-	<h3>Permissions - Get Access Token</h3>
-	<table>
-	<tr><td>
-	Verifier<input type="text" name="Verifier" size="50"
-		value="<?php if(isset($_REQUEST['verification_code'])) echo $_REQUEST['verification_code']?>" /><br></br>
-		</td></tr>
-	<tr><td>Request Token<input type="text" name="Requesttoken" size="50"
-		value="<?php if(isset($_REQUEST['request_token'])) echo $_REQUEST['request_token']?>" /><br></br></td></tr>
-	<tr><td><input type="submit" value="GetAccessToken" /></td></tr>
-	</table>
-	</form>
-<a href="index.php" >Home</a>
-</center>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/GetAccessTokenReceipt.php b/vendor/paypal/merchant-sdk-php/samples/Permissions/GetAccessTokenReceipt.php
deleted file mode 100644
index ec7ac4b1..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/GetAccessTokenReceipt.php
+++ /dev/null
@@ -1,72 +0,0 @@
-<?php
-use PayPal\Service\PermissionsService;
-use PayPal\Types\Common\RequestEnvelope;
-use PayPal\Types\Perm\GetAccessTokenRequest;
-/********************************************
- GetAccessTokenReceipt.php
- Called by GetAccessToken.php
- Use the GetAccessToken API operation to obtain an access token for a set of permissions. 
- ********************************************/
-require_once('../PPBootStrap.php');
-
-/*
- * (Required) Information common to each API operation, such as the language in which an error message is returned.
- */
-$requestEnvelope = new RequestEnvelope();
-$requestEnvelope->errorLanguage = "en_US";
-
-$request = new GetAccessTokenRequest();
-$request->requestEnvelope = $requestEnvelope;
-/*
- * (Required) The request token from the response to RequestPermissions. 
- */
-$request->token = $_REQUEST['Requesttoken'];
-/*
- * (Required) The verification code returned in the redirect from PayPal to the return URL. 
- */
-$request->verifier = $_REQUEST['Verifier'];
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$service = new PermissionsService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$response = $service->GetAccessToken($request);
-} catch (Exception $ex) {
-	require 'Error.php';
-	exit;
-}
-
-/* Display the API response back to the browser. */
-$ack = strtoupper($response->responseEnvelope->ack);
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
-
-<html>
-<head>
-	<title>GetAccessToken - Response</title>
-</head>
-
-<body>
-
-<div id="request_form">
-<center>
-<h3>GetAccessToken</h3>
-<br />
-</center>
-
-<?php
-echo "<table>";
-echo "<tr><td>Ack :</td><td><div id='Ack'>". $response->responseEnvelope->ack ."</div> </td></tr>";
-echo "<tr><td>Token :</td><td><div id='Token'>". $response->token ."</div> </td></tr>";
-echo "<tr><td>TokenSecret :</td><td><div id='TokenSecret'>". $response->tokenSecret ."</div> </td></tr>";
-echo "</table>";
-
-require_once 'ShowAllResponse.php';
-?>
-</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/Permission.html.php b/vendor/paypal/merchant-sdk-php/samples/Permissions/Permission.html.php
deleted file mode 100644
index 189f7c94..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/Permission.html.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<br/>
-<input type="checkbox" id="permissions" <?php if (isset($_GET['permToken'])) echo ' checked ';?> onclick="javascript: toggleDisplay('permissionsdata');"/>
-<label for="permissions"> Use Permission Credentials </label><br/>
-<div id="permissionsdata" style="display: <?php if (isset($_GET['permToken'])) echo 'block'; else echo 'none'; ?>">
-	<div class="overview">The PayPal Permissions API allows you to request and obtain permissions to execute one or more APIs on behalf of your customers (third party). The granted permission is represented by a access token and token secret pair that you must store securely.</div>
-	<div class="param_name">Access Token</div>
-	<div class="param_value">
-		<input type="text" name="accessToken"
-			value="<?php if(isset($_GET['permToken'])) echo $_GET['permToken'];?>"
-			size="50" />
-	</div>
-	<div class="param_name">Token Secret</div>
-	<div class="param_value">
-		<input type="text" name="tokenSecret" id="auth"
-			value="<?php if(isset($_GET['permTokenSecret'])) echo $_GET['permTokenSecret'];?>"
-			size="50" />
-	</div>
-	Click <a href="../Permissions/RequestPermissions.php" target="_blank">here</a> to get AccessToken and TokenSecret<br />
-</div>
-<br/>
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/README.md b/vendor/paypal/merchant-sdk-php/samples/Permissions/README.md
deleted file mode 100644
index a5d04a60..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/README.md
+++ /dev/null
@@ -1,14 +0,0 @@
-PayPal PHP Permission API sample scripts using the sdk
-======================
-
-Prerequisites
--------------
-
- * Permission API PHP SDK (see the README.md in the parent directory for instructions on how to install it - you essentially need to copy the lib and config directories into your applications path). 
-
-Sample php scripts
--------------
-
-The three PHP scripts (createInvoice.php, sendInvoice.php and createAndSendInvoice.php) demonstrate how the 3 API calls can be executed using the SDK. Please make sure the sdk_config.ini in the config folder is updated with the correct set of API credentials. 
-  
- 
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/RequestPermissions.php b/vendor/paypal/merchant-sdk-php/samples/Permissions/RequestPermissions.php
deleted file mode 100644
index cfd39c87..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/RequestPermissions.php
+++ /dev/null
@@ -1,78 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
-
-<html xmlns="http://www.w3.org/1999/xhtml";>
-<head>
-<title>PayPal Permissions - Request Permissions</title>
-
-</head>
-<body>
-<div id="request_form">
-
-<form name="Form1" id="Form1" method="post"
-	action="RequestPermissionsReceipt.php">
-<center>
-<h3>Permissions - Request Permissions</h3>
-<table>
-	<tr>
-		<td class="thinfield" width="120">Scope</td>
-		<td align="left"><input type=checkbox name=chkScope[]
-			value='EXPRESS_CHECKOUT' /> EXPRESS_CHECKOUT <br />
-		<input type=checkbox name=chkScope[] value='DIRECT_PAYMENT' />
-		DIRECT_PAYMENT <br />
-		<input type=checkbox name=chkScope[] value='AUTH_CAPTURE' />
-		AUTH_CAPTURE <br />
-		<input type=checkbox name=chkScope[] value='AIR_TRAVEL' /> AIR_TRAVEL
-		<br />
-		<input type=checkbox name=chkScope[] value='TRANSACTION_SEARCH' />
-		TRANSACTION_SEARCH <br />
-		<input type=checkbox name=chkScope[] value='RECURRING_PAYMENTS' />
-		RECURRING_PAYMENTS <br />
-		<input type=checkbox name=chkScope[] value='ACCOUNT_BALANCE' />
-		ACCOUNT_BALANCE <br />
-		<input type=checkbox name=chkScope[]
-			value='ENCRYPTED_WEBSITE_PAYMENTS' /> ENCRYPTED_WEBSITE_PAYMENTS <br />
-		<input type=checkbox name=chkScope[] value='REFUND' /> REFUND <br />
-		<input type=checkbox name=chkScope[] value='BILLING_AGREEMENT' />
-		BILLING_AGREEMENT <br />
-		<input type=checkbox name=chkScope[] value='REFERENCE_TRANSACTION' />
-		REFERENCE_TRANSACTION <br />
-		<input type=checkbox name=chkScope[] value='MASS_PAY' /> MASS_PAY <br />
-		<input type=checkbox name=chkScope[] value='TRANSACTION_DETAILS' />
-		TRANSACTION_DETAILS <br />
-		<input type=checkbox name=chkScope[] value='NON_REFERENCED_CREDIT' />
-		NON_REFERENCED_CREDIT <br />
-		<input type=checkbox name=chkScope[] value='SETTLEMENT_CONSOLIDATION' />
-		SETTLEMENT_CONSOLIDATION <br />
-		<input type=checkbox name=chkScope[] value='SETTLEMENT_REPORTING' />
-		SETTLEMENT_REPORTING <br />
-		<input type=checkbox name=chkScope[] value='BUTTON_MANAGER' />
-		BUTTON_MANAGER <br />
-		<input type=checkbox name=chkScope[]
-			value='MANAGE_PENDING_TRANSACTION_STATUS' />
-		MANAGE_PENDING_TRANSACTION_STATUS <br />
-		<input type=checkbox name=chkScope[] value='RECURRING_PAYMENT_REPORT' />
-		RECURRING_PAYMENT_REPORT <br />
-		<input type=checkbox name=chkScope[]
-			value='EXTENDED_PRO_PROCESSING_REPORT' />
-		EXTENDED_PRO_PROCESSING_REPORT <br />
-		<input type=checkbox name=chkScope[]
-			value='EXCEPTION_PROCESSING_REPORT' /> EXCEPTION_PROCESSING_REPORT <br />
-		<input type=checkbox name=chkScope[]
-			value='ACCOUNT_MANAGEMENT_PERMISSION' />
-		ACCOUNT_MANAGEMENT_PERMISSION <br />
-		<input type=checkbox name=chkScope[] value='INVOICING' /> INVOICING <br />
-		</td>
-	</tr>
-	<tr align="center">
-		<td colspan="2"><br />
-		<input type="submit" name="Submit" value="submit" /></td>
-	</tr>
-
-</table>
-</center>
-</form>
-<a href="index.php" >Home</a>
-</div>
-
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/RequestPermissionsReceipt.php b/vendor/paypal/merchant-sdk-php/samples/Permissions/RequestPermissionsReceipt.php
deleted file mode 100644
index e06a83ec..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/RequestPermissionsReceipt.php
+++ /dev/null
@@ -1,127 +0,0 @@
-<?php
-use PayPal\Service\PermissionsService;
-use PayPal\Types\Common\RequestEnvelope;
-use PayPal\Types\Perm\RequestPermissionsRequest;
-/********************************************
- RequestPermissionsReceipt.php
- Called by RequestPermissions.php
- Use the RequestPermissions API operation to request permissions to execute API operations on a PayPal account holder?s behalf. 
- ********************************************/
-require_once('../PPBootStrap.php');
-$serverName = $_SERVER['SERVER_NAME'];
-$serverPort = $_SERVER['SERVER_PORT'];
-$url = dirname('http://'.$serverName.':'.$serverPort.$_SERVER['REQUEST_URI']);
-
-$returnURL = $url."/GetAccessToken.php";
-$cancelURL = $url. "/RequestPermissions.php";
-
-/*
- *  (Required) At least 1 of the following permission categories:
-
-    EXPRESS_CHECKOUT - Express Checkout
-
-    DIRECT_PAYMENT - Direct payment by debit or credit card
-
-    SETTLEMENT_CONSOLIDATION - Settlement consolidation
-
-    SETTLEMENT_REPORTING - Settlement reporting
-
-    AUTH_CAPTURE - Payment authorization and capture
-
-    MOBILE_CHECKOUT - Mobile checkout
-
-    BILLING_AGREEMENT - Billing agreements
-
-    REFERENCE_TRANSACTION - Reference transactions
-
-    AIR_TRAVEL - Express Checkout for UTAP
-
-    MASS_PAY - Mass pay
-
-    TRANSACTION_DETAILS - Transaction details
-
-    TRANSACTION_SEARCH - Transaction search
-
-    RECURRING_PAYMENTS - Recurring payments
-
-    ACCOUNT_BALANCE - Account balance
-
-    ENCRYPTED_WEBSITE_PAYMENTS - Encrypted website payments
-
-    REFUND - Refunds
-
-    NON_REFERENCED_CREDIT - Non-referenced credit
-
-    BUTTON_MANAGER - Button Manager
-
-    MANAGE_PENDING_TRANSACTION_STATUS includes ManagePendingTransactionStatus
-
-    RECURRING_PAYMENT_REPORT - Reporting for recurring payments
-
-    EXTENDED_PRO_PROCESSING_REPORT - Extended Pro processing
-
-    EXCEPTION_PROCESSING_REPORT - Exception processing
-
-    ACCOUNT_MANAGEMENT_PERMISSION - Account Management Permission (MAM)
-
-    ACCESS_BASIC_PERSONAL_DATA - User attributes
-
-    ACCESS_ADVANCED_PERSONAL_DATA - User attributes
-
-    INVOICING - Invoicing
-
- */
-$scope = array();
-if(isset($_POST['chkScope'])) {
-	$i = 0;
-	foreach ($_POST['chkScope'] as $value) {
-		$scope[$i++] = $value;
-	}
-}
-
-/*
- * (Required) Information common to each API operation, such as the language in which an error message is returned.
- */
-$requestEnvelope = new RequestEnvelope("en_US");
-$request = new RequestPermissionsRequest($scope, $returnURL);
-$request->requestEnvelope = $requestEnvelope;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$service = new PermissionsService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$response = $service->RequestPermissions($request);
-} catch(Exception $ex) {
-	require 'Error.php';
-	exit;
-}		
-/* Display the API response back to the browser.
- If the response from PayPal was a success, display the response parameters'
- If the response was an error, display the errors received using APIError.php.
- */
-?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
-<html>
-<body>
-<div id="request_form">
-<h3>RequestPermissions - Response</h3>
-<?php
-$token = $response->token;
-if(strtoupper($response->responseEnvelope->ack) == 'SUCCESS') {
-	$payPalURL = 'https://www.sandbox.paypal.com/webscr&cmd='.'_grant-permission&request_token='.$token;
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>". $response->responseEnvelope->ack ."</div> </td></tr>";
-	echo "<tr><td>Token :</td><td><div id='Token'>". $response->token ."</div> </td></tr>";
-	echo "<tr><td><a href=$payPalURL><b>* Redirect URL to Complete RequestPermissions API operation </b></a></td></tr>";
-	echo "</table>";
-}
-require_once 'ShowAllResponse.php';
-?>
-
-</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/ShowAllResponse.php b/vendor/paypal/merchant-sdk-php/samples/Permissions/ShowAllResponse.php
deleted file mode 100644
index 34f6259c..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/ShowAllResponse.php
+++ /dev/null
@@ -1,30 +0,0 @@
-
-<?php
-if(isset($service) && $service instanceof PermissionsService) {
-	?>
-<table id="apiResponse">
-	<tr>
-		<td>Request:</td>
-	</tr>
-	<tr>
-		<td><textarea rows="10" cols="100"><?php echo $service->getLastRequest();?></textarea>
-		</td>
-	</tr>
-	<tr>
-		<td>Response:</td>
-	</tr>
-	<tr>
-		<td><textarea rows="10" cols="100"><?php echo $service->getLastResponse();?></textarea>
-		</td>
-	</tr>
-</table>
-<br />
-<?php 
-}
-if(isset($response)) {
-	echo "<pre>";
-	print_r($response);
-	echo "</pre>";
-}
-?>
-<a href="index.php">Home</a>
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/Permissions/index.php b/vendor/paypal/merchant-sdk-php/samples/Permissions/index.php
deleted file mode 100644
index 17422258..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Permissions/index.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-
-<html>
-<head>
-<title>PayPal Permissions SDK - Samples Main Page</title>
-</head>
-<body>
-	<center>
-		<h4>Permissions SDK Samples Home Page</h4>
-		<table>
-			<tr>
-				<th>Permissions API methods</th>
-			</tr>
-			<tr>
-				<td><a id="RequestPermissions" href="RequestPermissions.php"
-					name="RequestPermissions">RequestPermissions</a></td>
-			</tr>
-			<tr>
-				<td><a id="GetAccessToken" href="GetAccessToken.php"
-					name="GetAccessToken">GetAccessToken</a></td>
-			</tr>
-		</table>
-	</center>
-</body>
-</html>
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/BillOutstandingAmount.html.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/BillOutstandingAmount.html.php
deleted file mode 100644
index 35b1700a..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/BillOutstandingAmount.html.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - BillOutstandingAmount</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>BillOutstandingAmount</h3>
-			<div id="apidetails">
-				<p>BillOutstandingAmount API operation bills the buyer for the
-					outstanding balance associated with a recurring payments profile.</p>
-			</div>
-		</div>
-		<form method="POST" action="BillOutstandingAmount.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						Profile ID*(Get Profile ID via <a
-							href='CreateRecurringPaymentsProfile.html.php'>CreateRecurringPaymentsProfile</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="profileID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Bill Outstanding Amount</div>
-					<div class="param_value">
-						<input type="text" name="amt" value="1.00" size="20" />
-						<input type="text" name="currencyCode" value="USD" size="20" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="BillOutstandingAmountBtn"
-						value="BillOutstandingAmount" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/BillOutstandingAmount.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/BillOutstandingAmount.php
deleted file mode 100644
index 39cb3361..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/BillOutstandingAmount.php
+++ /dev/null
@@ -1,52 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\BillOutstandingAmountRequestDetailsType;
-use PayPal\PayPalAPI\BillOutstandingAmountReq;
-use PayPal\PayPalAPI\BillOutstandingAmountRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * The BillOutstandingAmount API operation bills the buyer for the outstanding balance associated with a recurring payments profile. 
- */
-
-$billOutstandingAmtReqestDetail = new BillOutstandingAmountRequestDetailsType();
-
-/*
- * (Optional) The amount to bill. The amount must be less than or equal to the current outstanding balance of the profile. If no value is specified, PayPal attempts to bill the entire outstanding balance amount.
- */
-$billOutstandingAmtReqestDetail->Amount = new BasicAmountType($_REQUEST['currencyCode'], $_REQUEST['amt']);
-
-/*
- *  (Required) Recurring payments profile ID returned in the CreateRecurringPaymentsProfile response.
-Note:The profile must have a status of either Active or Suspended. 
- */
-$billOutstandingAmtReqestDetail->ProfileID = $_REQUEST['profileID'];
-
-$billOutstandingAmtReqest = new BillOutstandingAmountRequestType();
-$billOutstandingAmtReqest->BillOutstandingAmountRequestDetails = $billOutstandingAmtReqestDetail;
-
-
-$billOutstandingAmtReq =  new BillOutstandingAmountReq();
-$billOutstandingAmtReq->BillOutstandingAmountRequest = $billOutstandingAmtReqest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$billOutstandingAmtResponse = $paypalService->BillOutstandingAmount($billOutstandingAmtReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-
-if(isset($billOutstandingAmtResponse)) {
-	echo "<pre>";
-	print_r($billOutstandingAmtResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/CreateRecurringPaymentsProfile.html.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/CreateRecurringPaymentsProfile.html.php
deleted file mode 100644
index a263c9b8..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/CreateRecurringPaymentsProfile.html.php
+++ /dev/null
@@ -1,336 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - CreateRecurringPaymentsProfile</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-<script language="JavaScript">
-	function generateCC(){
-		var cc_number = new Array(16);
-		var cc_len = 16;
-		var start = 0;
-		var rand_number = Math.random();
-
-		switch(document.CreateRPProfileForm.creditCardType.value)
-        {
-			case "Visa":
-				cc_number[start++] = 4;
-				break;
-			case "Discover":
-				cc_number[start++] = 6;
-				cc_number[start++] = 0;
-				cc_number[start++] = 1;
-				cc_number[start++] = 1;
-				break;
-			case "MasterCard":
-				cc_number[start++] = 5;
-				cc_number[start++] = Math.floor(Math.random() * 5) + 1;
-				break;
-			case "Amex":
-				cc_number[start++] = 3;
-				cc_number[start++] = Math.round(Math.random()) ? 7 : 4 ;
-				cc_len = 15;
-				break;
-        }
-
-        for (var i = start; i < (cc_len - 1); i++) {
-			cc_number[i] = Math.floor(Math.random() * 10);
-        }
-
-		var sum = 0;
-		for (var j = 0; j < (cc_len - 1); j++) {
-			var digit = cc_number[j];
-			if ((j & 1) == (cc_len & 1)) digit *= 2;
-			if (digit > 9) digit -= 9;
-			sum += digit;
-		}
-
-		var check_digit = new Array(0, 9, 8, 7, 6, 5, 4, 3, 2, 1);
-		cc_number[cc_len - 1] = check_digit[sum % 10];
-
-		document.CreateRPProfileForm.creditCardNumber.value = "";
-		for (var k = 0; k < cc_len; k++) {
-			document.CreateRPProfileForm.creditCardNumber.value += cc_number[k];
-		}
-	}
-</script>
-
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>CreateRecurringPaymentsProfile</h3>
-			<div id="apidetails">
-				<p>CreateRecurringPaymentsProfile API operation creates a recurring
-					payments profile. You must invoke the
-					CreateRecurringPaymentsProfile API operation for each profile you
-					want to create. The API operation creates a profile and an
-					associated billing agreement.</p>
-			</div>
-		</div>
-		<form method="POST" name="CreateRPProfileForm"
-			action="CreateRecurringPaymentsProfile.php">
-			<div id="request_form">
-				<div class="note">You must set either Token or Credit Card number</div>
-				<div class="params">
-					<div class="param_name">Express Checkout Token *</div>
-					<div class="param_value">
-						<input type="text" name="token" id="token" value="" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Credit Card *</div>
-				</div>
-				<table class="params">
-					<tr>
-						<th class="param_name">Credit Card number</th>
-						<th class="param_name">Expiry date</th>
-						<th class="param_name">Name on card</th>
-						<th class="param_name">Credit Card type</th>
-						<th class="param_name">CVV</th>
-					</tr>
-					<tr>
-						<td>
-							<div class="param_value">
-								<input type="text" name="creditCardNumber" id="creditCardNumber"
-									value="" />
-							</div>
-						</td>
-						<td>
-							<div class="param_value">
-								<select name="expMonth">
-									<option value="1">Jan</option>
-									<option value="2">Feb</option>
-									<option value="3">Mar</option>
-									<option value="4">Apr</option>
-									<option value="5">May</option>
-									<option value="6">Jun</option>
-									<option value="7">Jul</option>
-									<option value="8">Aug</option>
-									<option value="9">Sep</option>
-									<option value="10">Oct</option>
-									<option value="11">Nov</option>
-									<option value="12">Dec</option>
-								</select> <select name="expYear">
-									<?php
-									foreach (range(date("Y") + 1, date("Y") + 5) as $year) {
-										echo "<option>$year</option>";
-									}
-									?>
-								</select>
-							</div>
-						</td>
-						<td>
-							<div class="param_value">
-								<input type="text" name="cardOnName" id="cardOnName" value="" />
-							</div>
-						</td>
-						<td>
-							<div class="param_value">
-								<select name="creditCardType"
-									onChange="javascript:generateCC(); return false;">
-									<option value="Visa">Visa</option>
-									<option value="MasterCard">MasterCard</option>
-									<option value="Discover">Discover</option>
-									<option value="Amex">Amex</option>
-								</select>
-							</div>
-						</td>
-						<td>
-							<div class="param_value">
-								<input type="text" name="cvv" id="cvv" value="962" />
-							</div>
-						</td>
-					</tr>
-				</table>
-
-				<div class="section_header">Recurring payments profile details</div>
-				<div class="param_name">Subscriber Name</div>
-				<div class="param_value">
-					<input type="text" name="subscriberName" id="subscriberName"
-						value="" value="" />
-				</div>
-				<div class="param_name">Billing start date</div>
-				<div class="param_value">
-					<input type="text" name="billingStartDate" id="billingStartDate"
-						value="<?php echo date(DATE_ATOM)?>" />
-				</div>
-				<div class="param_name">Subscriber address - if missing, the address
-					in buyer's account will be used</div>
-				<table class="line_item">
-					<tr>
-						<th>Name</th>
-						<th>Street 1</th>
-						<th>Street 2</th>
-						<th>City</th>
-						<th>State</th>
-						<th>Postal Code</th>
-						<th>Country</th>
-						<th>Phone</th>
-					</tr>
-					<tr>
-						<td><span class="param_value"> <input type="text"
-								id="shippingName" name="shippingName" value="" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingStreet1" name="shippingStreet1" value="" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingStreet2" name="shippingStreet2" value="" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingCity" name="shippingCity" value="" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingState" name="shippingState" value="" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingPostalCode" name="shippingPostalCode" value="" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingCountry" name="shippingCountry" value="" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingPhone" name="shippingPhone" value="" />
-						</span></td>
-					</tr>
-				</table>
-				<div class="section_header">Schedule details</div>
-				<div class="params">
-					<div class="param_name">Description (must match billing agreement
-						if using Express Checkout token)</div>
-					<div class="param_value">
-						<textarea rows="5" cols="60" name="profileDescription">Welcome to the world of shopping where you get everything</textarea>
-					</div>
-				</div>
-				<div class="section_header">Activation Details</div>
-				<table class="params">
-					<tr>
-						<th>Initial Amount</th>
-						<th>Failed Payment Action</th>
-					</tr>
-					<tr>
-						<td><span class="param_value"> <input id="initialAmount"
-								name="initialAmount" />
-						</span></td>
-						<td><span class="param_value"> <select
-								name="failedInitialAmountAction">
-									<option value="ContinueOnFailure">Continue On Failure</option>
-									<option value="CancelOnFailure">Cancel On Failure</option>
-							</select>
-						</span></td>
-					</tr>
-				</table>
-
-				<div class="section_header">Trial Period</div>
-				<table class="params">
-					<tr>
-						<th>Billing frequency</th>
-						<th>Billing period</th>
-						<th>Total billing cycles</th>
-						<th>Amount (per billing cycle)</th>
-						<th>Shipping amount</th>
-						<th>Tax</th>
-					</tr>
-					<tr>
-						<td><span class="param_value"> <input type="text"
-								id="trialBillingFrequency" name="trialBillingFrequency"
-								value="10" />
-						</span></td>
-						<td><span class="param_value"> <select name="trialBillingPeriod">
-									<option value="Day">Day</option>
-									<option value="Week">Week</option>
-									<option value="SemiMonth">SemiMonth</option>
-									<option value="Month">Month</option>
-									<option value="Year">Year</option>
-							</select>
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="trialBillingCycles" name="trialBillingCycles" value="2" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text" id="trialAmount"
-								name="trialAmount" value="2.0" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="trialShippingAmount" name="trialShippingAmount" value="0.0" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="trialTaxAmount" name="trialTaxAmount" value="0.0" />
-						</span>
-						</td>
-				
-				</table>
-
-				<div class="section_header">Payment Period</div>
-				<table class="params_name">
-					<tr>
-						<th>Billing frequency</th>
-						<th>Billing period</th>
-						<th>Total billing cycles</th>
-						<th>Amount (per billing cycle)</th>
-						<th>Shipping amount</th>
-						<th>Tax</th>
-					</tr>
-					<tr>
-						<td><span class="param_value"> <input type="text"
-								id="billingFrequency" name="billingFrequency" value="10" />
-						</span></td>
-						<td><span class="param_value"> <select name="billingPeriod">
-									<option value="Day">Day</option>
-									<option value="Week">Week</option>
-									<option value="SemiMonth">SemiMonth</option>
-									<option value="Month">Month</option>
-									<option value="Year">Year</option>
-							</select>
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="totalBillingCycles" name="totalBillingCycles" value="8" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="paymentAmount" name="paymentAmount" value="5.0" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="paymentShippingAmount" name="paymentShippingAmount"
-								value="0.0" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="paymentTaxAmount" name="paymentTaxAmount" value="0.0" />
-						</span></td>
-					</tr>
-				</table>
-				<div class="params">
-					<div class="param_name">Maximum failed payments before profile
-						suspension</div>
-					<div class="param_value">
-						<input type="text" name="maxFailedPayments" id="maxFailedPayments"
-							value="3" />
-					</div>
-				</div>
-				<div class="param_name">Auto billing of outstanding amount</div>
-				<div class="param_value">
-					<select name="autoBillOutstandingAmount">
-						<option value="">- Select a value -</option>
-						<option value="NoAutoBill">No Auto billing</option>
-						<option value="AddToNextBilling">Add to next billing</option>
-					</select>
-				</div>
-
-				<div class="submit">
-					<input type="submit" name="CreateRecurringPaymentsProfileBtn"
-						value="CreateRecurringPaymentsProfile" /><br />
-				</div>
-				<a href="../index.php">Home</a> <br /> <br />
-			</div>
-		</form>
-	</div>
-	<script language="javascript">
-	generateCC();
-</script>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/CreateRecurringPaymentsProfile.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/CreateRecurringPaymentsProfile.php
deleted file mode 100644
index dfaf8329..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/CreateRecurringPaymentsProfile.php
+++ /dev/null
@@ -1,234 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\ActivationDetailsType;
-use PayPal\EBLBaseComponents\AddressType;
-use PayPal\EBLBaseComponents\BillingPeriodDetailsType;
-use PayPal\EBLBaseComponents\CreateRecurringPaymentsProfileRequestDetailsType;
-use PayPal\EBLBaseComponents\CreditCardDetailsType;
-use PayPal\EBLBaseComponents\RecurringPaymentsProfileDetailsType;
-use PayPal\EBLBaseComponents\ScheduleDetailsType;
-use PayPal\PayPalAPI\CreateRecurringPaymentsProfileReq;
-use PayPal\PayPalAPI\CreateRecurringPaymentsProfileRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-/**
- *
- # CreateRecurringPaymentsProfile API
- The CreateRecurringPaymentsProfile API operation creates a recurring
- payments profile.
- You must invoke the CreateRecurringPaymentsProfile API operation for each
- profile you want to create. The API operation creates a profile and an
- associated billing agreement.
- `Note:
- There is a one-to-one correspondence between billing agreements and
- recurring payments profiles. To associate a recurring payments profile
- with its billing agreement, you must ensure that the description in the
- recurring payments profile matches the description of a billing
- agreement. For version 54.0 and later, use SetExpressCheckout to initiate
- creation of a billing agreement.`
- This sample code uses Merchant PHP SDK to make API call
-*/
-
-$currencyCode = "USD";
-
-$shippingAddress = new AddressType();
-$shippingAddress->Name = $_REQUEST['shippingName'];
-$shippingAddress->Street1 = $_REQUEST['shippingStreet1'];
-$shippingAddress->Street2 = $_REQUEST['shippingStreet2'];
-$shippingAddress->CityName = $_REQUEST['shippingCity'];
-$shippingAddress->StateOrProvince = $_REQUEST['shippingState'];
-$shippingAddress->PostalCode = $_REQUEST['shippingPostalCode'];
-$shippingAddress->Country = $_REQUEST['shippingCountry'];
-$shippingAddress->Phone = $_REQUEST['shippingPhone'];
-
-/*
- *  You can include up to 10 recurring payments profiles per request. The
-order of the profile details must match the order of the billing
-agreement details specified in the SetExpressCheckout request which
-takes mandatory argument:
-
-* `billing start date` - The date when billing for this profile begins.
-`Note:
-The profile may take up to 24 hours for activation.`
-*/
-$RPProfileDetails = new RecurringPaymentsProfileDetailsType();
-$RPProfileDetails->SubscriberName = $_REQUEST['subscriberName'];
-$RPProfileDetails->BillingStartDate = $_REQUEST['billingStartDate'];
-$RPProfileDetails->SubscriberShippingAddress  = $shippingAddress;
-
-$activationDetails = new ActivationDetailsType();
-
-/*
- * (Optional) Initial non-recurring payment amount due immediately upon profile creation. Use an initial amount for enrolment or set-up fees.
- */
-$activationDetails->InitialAmount = new BasicAmountType($currencyCode, $_REQUEST['initialAmount']);
-/*
- *  (Optional) Action you can specify when a payment fails. It is one of the following values:
-
-    ContinueOnFailure ? By default, PayPal suspends the pending profile in the event that the initial payment amount fails. You can override this default behavior by setting this field to ContinueOnFailure. Then, if the initial payment amount fails, PayPal adds the failed payment amount to the outstanding balance for this recurring payment profile.
-
-    When you specify ContinueOnFailure, a success code is returned to you in the CreateRecurringPaymentsProfile response and the recurring payments profile is activated for scheduled billing immediately. You should check your IPN messages or PayPal account for updates of the payment status.
-
-    CancelOnFailure ? If this field is not set or you set it to CancelOnFailure, PayPal creates the recurring payment profile, but places it into a pending status until the initial payment completes. If the initial payment clears, PayPal notifies you by IPN that the pending profile has been activated. If the payment fails, PayPal notifies you by IPN that the pending profile has been canceled.
-
- */
-$activationDetails->FailedInitialAmountAction = $_REQUEST['failedInitialAmountAction'];
-
-/*
- *  Regular payment period for this schedule which takes mandatory
-params:
-
-* `Billing Period` - Unit for billing during this subscription period. It is one of the
-following values:
-* Day
-* Week
-* SemiMonth
-* Month
-* Year
-For SemiMonth, billing is done on the 1st and 15th of each month.
-`Note:
-The combination of BillingPeriod and BillingFrequency cannot exceed
-one year.`
-* `Billing Frequency` - Number of billing periods that make up one billing cycle.
-The combination of billing frequency and billing period must be less
-than or equal to one year. For example, if the billing cycle is
-Month, the maximum value for billing frequency is 12. Similarly, if
-the billing cycle is Week, the maximum value for billing frequency is
-52.
-`Note:
-If the billing period is SemiMonth, the billing frequency must be 1.`
-* `Billing Amount`
-*/
-$paymentBillingPeriod =  new BillingPeriodDetailsType();
-$paymentBillingPeriod->BillingFrequency = $_REQUEST['billingFrequency'];
-$paymentBillingPeriod->BillingPeriod = $_REQUEST['billingPeriod'];
-$paymentBillingPeriod->TotalBillingCycles = $_REQUEST['totalBillingCycles'];
-$paymentBillingPeriod->Amount = new BasicAmountType($currencyCode, $_REQUEST['paymentAmount']);
-$paymentBillingPeriod->ShippingAmount = new BasicAmountType($currencyCode, $_REQUEST['paymentShippingAmount']);
-$paymentBillingPeriod->TaxAmount = new BasicAmountType($currencyCode, $_REQUEST['paymentTaxAmount']);
-
-/*
- * 	 Describes the recurring payments schedule, including the regular
-payment period, whether there is a trial period, and the number of
-payments that can fail before a profile is suspended which takes
-mandatory params:
-
-* `Description` - Description of the recurring payment.
-`Note:
-You must ensure that this field matches the corresponding billing
-agreement description included in the SetExpressCheckout request.`
-* `Payment Period`
-*/
-$scheduleDetails = new ScheduleDetailsType();
-$scheduleDetails->Description = $_REQUEST['profileDescription'];
-$scheduleDetails->ActivationDetails = $activationDetails;
-
-if( $_REQUEST['trialBillingFrequency'] != "" && $_REQUEST['trialAmount'] != "") {
-	$trialBillingPeriod =  new BillingPeriodDetailsType();
-	$trialBillingPeriod->BillingFrequency = $_REQUEST['trialBillingFrequency'];
-	$trialBillingPeriod->BillingPeriod = $_REQUEST['trialBillingPeriod'];
-	$trialBillingPeriod->TotalBillingCycles = $_REQUEST['trialBillingCycles'];
-	$trialBillingPeriod->Amount = new BasicAmountType($currencyCode, $_REQUEST['trialAmount']);
-	$trialBillingPeriod->ShippingAmount = new BasicAmountType($currencyCode, $_REQUEST['trialShippingAmount']);
-	$trialBillingPeriod->TaxAmount = new BasicAmountType($currencyCode, $_REQUEST['trialTaxAmount']);
-	$scheduleDetails->TrialPeriod  = $trialBillingPeriod;
-}
-
-$scheduleDetails->PaymentPeriod = $paymentBillingPeriod;
-if($_REQUEST['maxFailedPayments'] != "") {
-	$scheduleDetails->MaxFailedPayments =  $_REQUEST['maxFailedPayments'];
-}
-if($_REQUEST['autoBillOutstandingAmount'] != "") {
-	$scheduleDetails->AutoBillOutstandingAmount = $_REQUEST['autoBillOutstandingAmount'];
-}
-
-/*
- * 	 `CreateRecurringPaymentsProfileRequestDetailsType` which takes
-mandatory params:
-
-* `Recurring Payments Profile Details`
-* `Schedule Details`
-*/
-$createRPProfileRequestDetail = new CreateRecurringPaymentsProfileRequestDetailsType();
-if(trim($_REQUEST['token']) != "") {
-	$createRPProfileRequestDetail->Token  = $_REQUEST['token'];
-} else {
-
-	/*
-	 * 	 Either EC token or a credit card number is required.If you include
-	both token and credit card number, the token is used and credit card number is
-	ignored
-	In case of setting EC token,
-	`createRecurringPaymentsProfileRequestDetails.setToken("EC-5KH01765D1724703R");`
-	A timestamped token, the value of which was returned in the response
-	to the first call to SetExpressCheckout. Call
-	CreateRecurringPaymentsProfile once for each billing
-	agreement included in SetExpressCheckout request and use the same
-	token for each call. Each CreateRecurringPaymentsProfile request
-	creates a single recurring payments profile.
-	`Note:
-	Tokens expire after approximately 3 hours.`
-
-	Credit card information for recurring payments using direct payments.
-	*/
-	$creditCard = new CreditCardDetailsType();
-	$creditCard->CreditCardNumber = $_REQUEST['creditCardNumber'];
-
-	/*
-	 *  Type of credit card. For UK, only Maestro, MasterCard, Discover, and
-	Visa are allowable. For Canada, only MasterCard and Visa are
-	allowable and Interac debit cards are not supported. It is one of the
-	following values:
-
-	* Visa
-	* MasterCard
-	* Discover
-	* Amex
-	* Solo
-	* Switch
-	* Maestro: See note.
-	`Note:
-	If the credit card type is Maestro, you must set currencyId to GBP.
-	In addition, you must specify either StartMonth and StartYear or
-	IssueNumber.`
-	*/
-	$creditCard->CreditCardType = $_REQUEST['creditCardType'];
-	$creditCard->CVV2 = $_REQUEST['cvv'];
-	$creditCard->ExpMonth = $_REQUEST['expMonth'];
-	$creditCard->ExpYear = $_REQUEST['expYear'];
-	$createRPProfileRequestDetail->CreditCard = $creditCard;
-}
-$createRPProfileRequestDetail->ScheduleDetails = $scheduleDetails;
-$createRPProfileRequestDetail->RecurringPaymentsProfileDetails = $RPProfileDetails;
-$createRPProfileRequest = new CreateRecurringPaymentsProfileRequestType();
-$createRPProfileRequest->CreateRecurringPaymentsProfileRequestDetails = $createRPProfileRequestDetail;
-
-
-$createRPProfileReq =  new CreateRecurringPaymentsProfileReq();
-$createRPProfileReq->CreateRecurringPaymentsProfileRequest = $createRPProfileRequest;
-
-/*
- *  ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$createRPProfileResponse = $paypalService->CreateRecurringPaymentsProfile($createRPProfileReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-
-if(isset($createRPProfileResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$createRPProfileResponse->Ack</div> </td></tr>";
-	echo "<tr><td>ProfileID :</td><td><div id='ProfileID'>".$createRPProfileResponse->CreateRecurringPaymentsProfileResponseDetails->ProfileID ."</div> </td></tr>";
-	echo "</table>";
-
-	echo "<pre>";
-	print_r($createRPProfileResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/GetRecurringPaymentsProfileDetails.html.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/GetRecurringPaymentsProfileDetails.html.php
deleted file mode 100644
index 68369ba7..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/GetRecurringPaymentsProfileDetails.html.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - GetRecurringPaymentsProfileDetails</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>GetRecurringPaymentsProfileDetails</h3>
-			<div id="apidetails">
-				<p>GetRecurringPaymentsProfileDetails API obtains information about
-					a recurring payments profile.</p>
-			</div>
-		</div>
-		<form method="POST" action="GetRecurringPaymentsProfileDetails.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						Profile ID*(Get Profile ID via <a
-							href='CreateRecurringPaymentsProfile.html.php'>CreateRecurringPaymentsProfile</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="profileID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="GetRecurringPaymentsProfileDetailsBtn"
-						value="GetRecurringPaymentsProfileDetails" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/GetRecurringPaymentsProfileDetails.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/GetRecurringPaymentsProfileDetails.php
deleted file mode 100644
index fc87c189..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/GetRecurringPaymentsProfileDetails.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-use PayPal\PayPalAPI\GetRecurringPaymentsProfileDetailsReq;
-use PayPal\PayPalAPI\GetRecurringPaymentsProfileDetailsRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * Obtain information about a recurring payments profile. 
- */
-$getRPPDetailsReqest = new GetRecurringPaymentsProfileDetailsRequestType();
-/*
- * (Required) Recurring payments profile ID returned in the CreateRecurringPaymentsProfile response. 19-character profile IDs are supported for compatibility with previous versions of the PayPal API.
- */
-$getRPPDetailsReqest->ProfileID = $_REQUEST['profileID'];
-
-
-$getRPPDetailsReq = new GetRecurringPaymentsProfileDetailsReq();
-$getRPPDetailsReq->GetRecurringPaymentsProfileDetailsRequest = $getRPPDetailsReqest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$getRPPDetailsResponse = $paypalService->GetRecurringPaymentsProfileDetails($getRPPDetailsReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-
-if(isset($getRPPDetailsResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$getRPPDetailsResponse->Ack</div> </td></tr>";
-	echo "<tr><td>ProfileID :</td><td><div id='ProfileID'>". $getRPPDetailsResponse->GetRecurringPaymentsProfileDetailsResponseDetails->ProfileID ."</div> </td></tr>";
-	echo "</table>";
-
-	echo "<pre>";
-	print_r($getRPPDetailsResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/ManageRecurringPaymentsProfileStatus.html.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/ManageRecurringPaymentsProfileStatus.html.php
deleted file mode 100644
index a8125a16..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/ManageRecurringPaymentsProfileStatus.html.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - ManageRecurringPaymentsProfileStatus</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>ManageRecurringPaymentsProfileStatus</h3>
-			<div id="apidetails">
-				<p>ManageRecurringPaymentsProfileStatus API operation cancels,
-					suspends, or reactivates a recurring payments profile.</p>
-			</div>
-		</div>
-		<form method="POST" action="ManageRecurringPaymentsProfileStatus.php">
-			<div id="request_form">
-				<div class="params">
-					<div class="param_name">
-						Profile ID*(Get Profile ID via <a
-							href='CreateRecurringPaymentsProfile.html.php'>CreateRecurringPaymentsProfile</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="profileID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Action*</div>
-					<div class="param_value">
-						<select name="action"><option value="Cancel">Cancel</option>
-							<option value="Suspend">Suspend</option>
-							<option value="Reactivate">Reactivate</option>
-						</select>
-					</div>
-				</div>
-				<div class="submit">
-					<input type="submit" name="ManageRecurringPaymentsProfileStatusBtn"
-						value="ManageRecurringPaymentsProfileStatus" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-
-	</div>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/ManageRecurringPaymentsProfileStatus.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/ManageRecurringPaymentsProfileStatus.php
deleted file mode 100644
index d98afc82..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/ManageRecurringPaymentsProfileStatus.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-use PayPal\EBLBaseComponents\ManageRecurringPaymentsProfileStatusRequestDetailsType;
-use PayPal\PayPalAPI\ManageRecurringPaymentsProfileStatusReq;
-use PayPal\PayPalAPI\ManageRecurringPaymentsProfileStatusRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-
-/*
- * The ManageRecurringPaymentsProfileStatus API operation cancels, suspends, or reactivates a recurring payments profile. 
- */
-$manageRPPStatusReqestDetails = new ManageRecurringPaymentsProfileStatusRequestDetailsType();
-/*
- *  (Required) The action to be performed to the recurring payments profile. Must be one of the following:
-
-    Cancel ? Only profiles in Active or Suspended state can be canceled.
-
-    Suspend ? Only profiles in Active state can be suspended.
-
-    Reactivate ? Only profiles in a suspended state can be reactivated.
-
- */
-$manageRPPStatusReqestDetails->Action =  $_REQUEST['action'];
-/*
- * (Required) Recurring payments profile ID returned in the CreateRecurringPaymentsProfile response.
- */
-$manageRPPStatusReqestDetails->ProfileID =  $_REQUEST['profileID'];
-
-$manageRPPStatusReqest = new ManageRecurringPaymentsProfileStatusRequestType();
-$manageRPPStatusReqest->ManageRecurringPaymentsProfileStatusRequestDetails = $manageRPPStatusReqestDetails;
-
-
-$manageRPPStatusReq = new ManageRecurringPaymentsProfileStatusReq();
-$manageRPPStatusReq->ManageRecurringPaymentsProfileStatusRequest = $manageRPPStatusReqest;
-
-/*
- * 	 ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$manageRPPStatusResponse = $paypalService->ManageRecurringPaymentsProfileStatus($manageRPPStatusReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-
-if(isset($manageRPPStatusResponse)) {
-
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$manageRPPStatusResponse->Ack</div> </td></tr>";
-	echo "<tr><td>ProfileID :</td><td><div id='ProfileID'>".$manageRPPStatusResponse->ManageRecurringPaymentsProfileStatusResponseDetails->ProfileID ."</div> </td></tr>";
-	echo "</table>";
-
-	echo "<pre>";
-	print_r($manageRPPStatusResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/UpdateRecurringPaymentsProfile.html.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/UpdateRecurringPaymentsProfile.html.php
deleted file mode 100644
index f4d05d94..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/UpdateRecurringPaymentsProfile.html.php
+++ /dev/null
@@ -1,277 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - UpdateRecurringPaymentsProfile</title>
-<link rel="stylesheet" href="../Common/sdk.css"/>
-</head>
-<body>
-	<div id="wrapper">
-		<img src="https://devtools-paypal.com/image/bdg_payments_by_pp_2line.png";>
-		<div id="header">
-			<h3>UpdateRecurringPaymentsProfile</h3>
-			<div id="apidetails">
-				<p>UpdateRecurringPaymentsProfile API operation updates a recurring
-					payments profile.</p>
-			</div>
-		</div>
-		<form method="POST" name="UpdateRPProfileForm"
-			action="UpdateRecurringPaymentsProfile.php">
-			<div id="request_form" >
-				<div class="params">
-					<div class="param_name">
-						Profile ID *(Get Profile ID via <a
-							href='CreateRecurringPaymentsProfile'>CreateRecurringPaymentsProfile</a>)
-					</div>
-					<div class="param_value">
-						<input type="text" name="profileID" value="" size="50"
-							maxlength="260" />
-					</div>
-				</div>
-				<div class="params">
-					<div class="param_name">Credit Card</div>
-				</div>
-				<table class="params">
-					<tr>
-						<th class="param_name">Credit Card number</th>
-						<th class="param_name">Expiry date</th>
-						<th class="param_name">Name on card</th>
-						<th class="param_name">Credit Card type</th>
-						<th class="param_name">CVV</th>
-					</tr>
-					<tr>
-						<td><div class="param_value">
-								<input type="text" name="creditCardNumber" id="creditCardNumber"
-									value="" />
-							</div></td>
-						<td><div class="param_value">
-								<select name="expMonth">
-									<option value="1">Jan</option>
-									<option value="2">Feb</option>
-									<option value="3">Mar</option>
-									<option value="4">Apr</option>
-									<option value="5">May</option>
-									<option value="6">Jun</option>
-									<option value="7">Jul</option>
-									<option value="8">Aug</option>
-									<option value="9">Sep</option>
-									<option value="10">Oct</option>
-									<option value="11">Nov</option>
-									<option value="12">Dec</option>
-								</select> <select name="expYear">
-									<option value="2011">2011</option>
-									<option value="2012">2012</option>
-									<option value="2013">2013</option>
-									<option value="2014">2014</option>
-								</select>
-							</div></td>
-						<td><div class="param_value">
-								<input type="text" name="cardOnName" id="cardOnName" value="" />
-							</div></td>
-						<td><div class="param_value">
-								<select name="creditCardType">
-									<option value="Visa">Visa</option>
-									<option value="MasterCard">MasterCard</option>
-									<option value="Discover">Discover</option>
-									<option value="Amex">Amex</option>
-								</select>
-							</div></td>
-						<td><div class="param_value">
-								<input type="text" name="cvv" id="cvv" />
-							</div></td>
-					</tr>
-				</table>
-				<div class="param_name">Subscriber Name</div>
-				<div class="param_value">
-					<input type="text" name="subscriberName" id="subscriberName"
-						value="" value="" />
-				</div>
-				<div class="param_name">Billing start date</div>
-				<div class="param_value">
-					<input type="text" name="billingStartDate" id="billingStartDate"
-						value= <?php echo date(DATE_ATOM)?>/>
-				</div>
-				<div class="param_name">Subscriber shipping address (if different
-					from buyer's PayPal account address)</div>
-				<table class="line_item">
-					<tr>
-						<th>Name</th>
-						<th>Street 1</th>
-						<th>Street 2</th>
-						<th>City</th>
-						<th>State</th>
-						<th>Postal Code</th>
-						<th>Country</th>
-						<th>Phone</th>
-					</tr>
-					<tr>
-						<td><span class="param_value"> <input type="text"
-								id="shippingName" name="shippingName" value="" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingStreet1" name="shippingStreet1" value="" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingStreet2" name="shippingStreet2" value="" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingCity" name="shippingCity" value="" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingState" name="shippingState" value="" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingPostalCode" name="shippingPostalCode" value="" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingCountry" name="shippingCountry" value="" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingPhone" name="shippingPhone" value="" />
-						</span>
-						</td>
-					</tr>
-				</table>
-
-				<div class="params">
-					<div class="param_name">Description (must match billing agreement
-						if using Express Checkout token)</div>
-					<div class="param_value">
-						<textarea rows="5" cols="60" name="profileDescription"></textarea>
-					</div>
-				</div>
-
-				<table class="params">
-					<tr>
-						<th>Amount</th>
-						<th>Shipping Amount</th>
-						<th>Tax Amount</th>
-						<th>Additonal Billing Cycles</th>
-					</tr>
-					<tr>
-						<td><span class="param_value"> <input id="amount" name="amount" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input id="shippingAmount"
-								name="shippingAmount" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input id="taxAmount"
-								name="taxAmount" />
-						</span>
-						</td>
-						<td><span class="param_value"> <input id="additionalBillingCycles"
-								name="additionalBillingCycles" />
-						</span>
-						</td>
-					</tr>
-				</table>
-
-				<div class="section_header">Trial Period</div>
-				<table class="params">
-					<tr>
-						<th>Billing frequency</th>
-						<th>Billing period</th>
-						<th>Total billing cycles</th>
-						<th>Per billing cycle amount</th>
-						<th>Shipping amount</th>
-						<th>Tax</th>
-					</tr>
-					<tr>
-						<td><span class="param_value"> <input type="text"
-								id="trialBillingFrequency" name="trialBillingFrequency"
-								value="10" />
-						</span></td>
-						<td><span class="param_value"> <select name="trialBillingPeriod">
-									<option value="Day">Day</option>
-									<option value="Week">Week</option>
-									<option value="SemiMonth">SemiMonth</option>
-									<option value="Month">Month</option>
-									<option value="Year">Year</option>
-							</select>
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="trialBillingCycles" name="trialBillingCycles" value="2" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="trialBillingAmount" name="trialBillingAmount" value="2.0" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="trialShippingAmount" name="trialShippingAmount" value="0.0" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="trialTaxAmount" name="trialTaxAmount" value="0.0" />
-						</span></td>
-					</tr>
-				</table>
-
-				<div class="section_header">Payment Period</div>
-				<table class="params_name">
-					<tr>
-						<th>Billing frequency</th>
-						<th>Billing period</th>
-						<th>Total billing cycles</th>
-						<th>Per billing cycle amount</th>
-						<th>Shipping amount</th>
-						<th>Tax</th>
-					</tr>
-					<tr>
-						<td><span class="param_value"> <input type="text"
-								id="billingFrequency" name="billingFrequency" value="10" />
-						</span></td>
-						<td><span class="param_value"> <select name="billingPeriod">
-									<option value="Day">Day</option>
-									<option value="Week">Week</option>
-									<option value="SemiMonth">SemiMonth</option>
-									<option value="Month">Month</option>
-									<option value="Year">Year</option>
-							</select>
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="totalBillingCycles" name="totalBillingCycles" value="8" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="billingAmount" name="billingAmount" value="5.0" />
-						</span></td>
-						<td><span class="param_value"> <input type="text"
-								id="shippingAmount" name="shippingAmount" value="1.0" />
-						</span></td>
-						<td><span class="param_value"> <input type="text" id="taxAmount"
-								name="taxAmount" value="0.0" />
-						</span></td>
-					</tr>
-				</table>
-				<div class="params">
-					<div class="param_name">Maximum failed payments before profile
-						suspension</div>
-					<div class="param_value">
-						<input type="text" name="maxFailedPayments" id="maxFailedPayments"
-							value="3" />
-					</div>
-				</div>
-				<div class="param_name">Auto billing of outstanding amount</div>
-				<div class="param_value">
-					<select name="autoBillOutstandingAmount">
-						<option value="NoAutoBill">No Auto billing</option>
-						<option value="AddToNextBilling">Add to next billing</option>
-					</select>
-				</div>
-				<div class="submit">
-					<input type="submit" name="UpdateRecurringPaymentsProfileBtn"
-						value="UpdateRecurringPaymentsProfile" /><br />
-				</div>
-				<a href="../index.php">Home</a>
-			</div>
-		</form>
-	</div>
-</body>
-</html>
-
-
diff --git a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/UpdateRecurringPaymentsProfile.php b/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/UpdateRecurringPaymentsProfile.php
deleted file mode 100644
index e56f3cc3..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/RecurringPayments/UpdateRecurringPaymentsProfile.php
+++ /dev/null
@@ -1,160 +0,0 @@
-<?php
-use PayPal\CoreComponentTypes\BasicAmountType;
-use PayPal\EBLBaseComponents\AddressType;
-use PayPal\EBLBaseComponents\BillingPeriodDetailsType;
-use PayPal\EBLBaseComponents\UpdateRecurringPaymentsProfileRequestDetailsType;
-use PayPal\EBLBaseComponents\CreditCardDetailsType;
-use PayPal\PayPalAPI\UpdateRecurringPaymentsProfileReq;
-use PayPal\PayPalAPI\UpdateRecurringPaymentsProfileRequestType;
-use PayPal\Service\PayPalAPIInterfaceServiceService;
-require_once('../PPBootStrap.php');
-/**
- *
- # UpdateRecurringPaymentsProfile API
- The UpdateRecurringPaymentsProfile API operation updates a recurring
- payments profile.
-
- This sample code uses Merchant PHP SDK to make API call
-*/
-
-$currencyCode = "USD";
-
-$shippingAddress = new AddressType();
-$shippingAddress->Name = $_REQUEST['shippingName'];
-$shippingAddress->Street1 = $_REQUEST['shippingStreet1'];
-$shippingAddress->Street2 = $_REQUEST['shippingStreet2'];
-$shippingAddress->CityName = $_REQUEST['shippingCity'];
-$shippingAddress->StateOrProvince = $_REQUEST['shippingState'];
-$shippingAddress->PostalCode = $_REQUEST['shippingPostalCode'];
-$shippingAddress->Country = $_REQUEST['shippingCountry'];
-$shippingAddress->Phone = $_REQUEST['shippingPhone'];
-
-$updateRPProfileRequestDetail = new UpdateRecurringPaymentsProfileRequestDetailsType();
-
-$updateRPProfileRequestDetail->SubscriberName = $_REQUEST['subscriberName'];
-$updateRPProfileRequestDetail->BillingStartDate = $_REQUEST['billingStartDate'];
-$updateRPProfileRequestDetail->SubscriberShippingAddress  = $shippingAddress;
-
-/*
- *  Regular payment period for this schedule which takes mandatory
-params:
-
-* `Billing Period` - Unit for billing during this subscription period. It is one of the
-following values:
-* Day
-* Week
-* SemiMonth
-* Month
-* Year
-For SemiMonth, billing is done on the 1st and 15th of each month.
-`Note:
-The combination of BillingPeriod and BillingFrequency cannot exceed
-one year.`
-* `Billing Frequency` - Number of billing periods that make up one billing cycle.
-The combination of billing frequency and billing period must be less
-than or equal to one year. For example, if the billing cycle is
-Month, the maximum value for billing frequency is 12. Similarly, if
-the billing cycle is Week, the maximum value for billing frequency is
-52.
-`Note:
-If the billing period is SemiMonth, the billing frequency must be 1.`
-* `Billing Amount`
-*/
-$paymentBillingPeriod =  new BillingPeriodDetailsType();
-$paymentBillingPeriod->BillingFrequency = $_REQUEST['billingFrequency'];
-$paymentBillingPeriod->BillingPeriod = $_REQUEST['billingPeriod'];
-$paymentBillingPeriod->TotalBillingCycles = $_REQUEST['totalBillingCycles'];
-$paymentBillingPeriod->Amount = new BasicAmountType($currencyCode, $_REQUEST['billingAmount']);
-$paymentBillingPeriod->ShippingAmount = new BasicAmountType($currencyCode, $_REQUEST['shippingAmount']);
-$paymentBillingPeriod->TaxAmount = new BasicAmountType($currencyCode, $_REQUEST['taxAmount']);
-
-/*
-* `Description` - Description of the recurring payment.
-*/
-$updateRPProfileRequestDetail->Description = $_REQUEST['profileDescription'];
-
-
-if( $_REQUEST['trialBillingFrequency'] != "" && $_REQUEST['trialBillingAmount'] != "") {
-	$trialBillingPeriod =  new BillingPeriodDetailsType();
-	$trialBillingPeriod->BillingFrequency = $_REQUEST['trialBillingFrequency'];
-	$trialBillingPeriod->BillingPeriod = $_REQUEST['trialBillingPeriod'];
-	$trialBillingPeriod->TotalBillingCycles = $_REQUEST['trialBillingCycles'];
-	$trialBillingPeriod->Amount = new BasicAmountType($currencyCode, $_REQUEST['trialBillingAmount']);
-	$trialBillingPeriod->ShippingAmount = new BasicAmountType($currencyCode, $_REQUEST['trialShippingAmount']);
-	$trialBillingPeriod->TaxAmount = new BasicAmountType($currencyCode, $_REQUEST['trialTaxAmount']);
-	$updateRPProfileRequestDetail->TrialPeriod  = $trialBillingPeriod;
-}
-
-$updateRPProfileRequestDetail->PaymentPeriod = $paymentBillingPeriod;
-if($_REQUEST['maxFailedPayments'] != "") {
-	$updateRPProfileRequestDetail->MaxFailedPayments =  $_REQUEST['maxFailedPayments'];
-}
-if($_REQUEST['autoBillOutstandingAmount'] != "") {
-	$updateRPProfileRequestDetail->AutoBillOutstandingAmount = $_REQUEST['autoBillOutstandingAmount'];
-}
-
-if($_REQUEST['creditCardNumber'] != null){
-	// Credit card information cannot be updated for profiles created through Express Checkout, since the payment is tied to the PayPal account and not a credit card.
-	$creditCard = new CreditCardDetailsType();
-	$creditCard->CreditCardNumber = $_REQUEST['creditCardNumber'];
-
-	/*
-	 *  Type of credit card. For UK, only Maestro, MasterCard, Discover, and
-	Visa are allowable. For Canada, only MasterCard and Visa are
-	allowable and Interac debit cards are not supported. It is one of the
-	following values:
-
-	* Visa
-	* MasterCard
-	* Discover
-	* Amex
-	* Solo
-	* Switch
-	* Maestro: See note.
-	`Note:
-	If the credit card type is Maestro, you must set currencyId to GBP.
-	In addition, you must specify either StartMonth and StartYear or
-	IssueNumber.`
-	*/
-	$creditCard->CreditCardType = $_REQUEST['creditCardType'];
-	$creditCard->CVV2 = $_REQUEST['cvv'];
-	$creditCard->ExpMonth = $_REQUEST['expMonth'];
-	$creditCard->ExpYear = $_REQUEST['expYear'];
-	$updateRPProfileRequestDetail->CreditCard = $creditCard;
-}
-
-//(Required) Recurring payments profile ID returned in the CreateRecurringPaymentsProfile response.
-$updateRPProfileRequestDetail->ProfileID = $_REQUEST['profileID'];
-
-$updateRPProfileRequest = new UpdateRecurringPaymentsProfileRequestType();
-$updateRPProfileRequest->UpdateRecurringPaymentsProfileRequestDetails = $updateRPProfileRequestDetail;
-
-
-$updateRPProfileReq =  new UpdateRecurringPaymentsProfileReq();
-$updateRPProfileReq->UpdateRecurringPaymentsProfileRequest = $updateRPProfileRequest;
-
-/*
- *  ## Creating service wrapper object
-Creating service wrapper object to make API call and loading
-Configuration::getAcctAndConfig() returns array that contains credential and config parameters
-*/
-$paypalService = new PayPalAPIInterfaceServiceService(Configuration::getAcctAndConfig());;
-try {
-	/* wrap API method calls on the service object with a try catch */
-	$updateRPProfileResponse = $paypalService->UpdateRecurringPaymentsProfile($updateRPProfileReq);
-} catch (Exception $ex) {
-	include_once("../Error.php");
-	exit;
-}
-
-if(isset($updateRPProfileResponse)) {
-	echo "<table>";
-	echo "<tr><td>Ack :</td><td><div id='Ack'>$updateRPProfileResponse->Ack</div> </td></tr>";
-	echo "<tr><td>ProfileID :</td><td><div id='ProfileID'>".$updateRPProfileResponse->UpdateRecurringPaymentsProfileResponseDetails->ProfileID ."</div> </td></tr>";
-	echo "</table>";
-
-	echo "<pre>";
-	print_r($updateRPProfileResponse);
-	echo "</pre>";
-}
-require_once '../Response.php';
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/Response.php b/vendor/paypal/merchant-sdk-php/samples/Response.php
deleted file mode 100644
index 2e75d707..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/Response.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK - API response</title>
-</head>
-<body>
-	<table>
-		<tr>
-			<td>Request:</td>
-		</tr>
-		<tr>
-			<td><textarea rows="10" cols="100"><?php echo htmlspecialchars($paypalService->getLastRequest())?></textarea></td>
-		</tr>
-		<tr>
-			<td>Response:</td>
-		</tr>
-		<tr>
-			<td><textarea rows="10" cols="100"><?php echo htmlspecialchars($paypalService->getLastResponse());?></textarea></td>
-		</tr>
-	</table>
-	<br>
-	<a href="../index.php">Home</a>
-</body>
-</html>
\ No newline at end of file
diff --git a/vendor/paypal/merchant-sdk-php/samples/cert_key.pem b/vendor/paypal/merchant-sdk-php/samples/cert_key.pem
deleted file mode 100644
index fa306b1e..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/cert_key.pem
+++ /dev/null
@@ -1,31 +0,0 @@
------BEGIN RSA PRIVATE KEY-----
-MIICXgIBAAKBgQCaGw566OIaeIsrp2tyzfwUtwapk2aPgL9N8oOoPmTmA/bqhqF8
-2X43EB2zZF1HY35kPp3L5rZSjqraEZz5j7W4DkXMS286wLnaoh02sVWbbXlLcZ/v
-sAQzNgi1s2raOWonkcbAIAyhjVoGQjpuCn7y9YNgQfpZkgrh/R5ig8obQwIDAQAB
-AoGBAI/YrZ2BAHzhBFdNQXi6WZEkfu2PD27oKKojs006YIhsLvEflmGpyqyvOGoZ
-RxC6CGKeKEEKLCnHzicbxcEVqfKfOxrXkym3ldqBaYubL1OU62biDRtZZdIpG3TE
-gBDRtU8gPQv1ykqY9KqdeORy8vu0lW9Zx9/4ccW126HLt/kxAkEAzF9NKltIc+gu
-S79lzerE8qngiUSc/ccb1ssLj4v4Lf90HNeJ4oSQEikuN32GjPVrUpQYpC4fjcET
-KmqE7k1V3wJBAMEJB3VRToeTQKhWet8JQPkcfES3B+l7NCauUcysSI5XZ9kVflLu
-c5vzznMooRpcNtjJwDmkcnW0lhIQH/DKvx0CQQCWHJXoO54vDGYc2xuisQMyHha/
-nHcXbA0FqqP2Lt/+oTifCq3LhITx4e+BcKDInmbTA9ZJmVsx2pQCPrUe+AzPAkA/
-OU7ZDPVUkFU4DYMW8/f033CQLQaJYVH2bVfbWn41KMmZn2GNlg4FgTgYHbGOaa+J
-F6M+/e6DQM96QQ/FFRK9AkEApx1r0di+W2ibrTANnk6QjQbva9JyOztI+Avg86X5
-swB44tEsRImOTNsE6nfE/215AxjgI1vdn6uU4P8GIKfxnw==
------END RSA PRIVATE KEY-----
------BEGIN CERTIFICATE-----
-MIICiDCCAfGgAwIBAgIDD/WUMA0GCSqGSIb3DQEBBQUAMIGfMQswCQYDVQQGEwJV
-UzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIU2FuIEpvc2UxFTATBgNV
-BAoTDFBheVBhbCwgSW5jLjEWMBQGA1UECxQNc2FuZGJveF9jZXJ0czEbMBkGA1UE
-AxQSc2FuZGJveF9jYW1lcmNoYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwu
-Y29tMB4XDTExMDUwMjA1MDQ0NFoXDTIxMDQyOTA1MDQ0NFowYzElMCMGA1UEAxQc
-Y2VydHVzZXJfYml6X2FwaTEucGF5cGFsLmNvbTEPMA0GA1UEChMGQm9uem9wMQ8w
-DQYDVQQHEwZBdXN0aW4xCzAJBgNVBAgTAlRYMQswCQYDVQQGEwJVUzCBnzANBgkq
-hkiG9w0BAQEFAAOBjQAwgYkCgYEAmhsOeujiGniLK6drcs38FLcGqZNmj4C/TfKD
-qD5k5gP26oahfNl+NxAds2RdR2N+ZD6dy+a2Uo6q2hGc+Y+1uA5FzEtvOsC52qId
-NrFVm215S3Gf77AEMzYItbNq2jlqJ5HGwCAMoY1aBkI6bgp+8vWDYEH6WZIK4f0e
-YoPKG0MCAwEAAaMNMAswCQYDVR0TBAIwADANBgkqhkiG9w0BAQUFAAOBgQBj6xWw
-AumLzSodCWyocPcyKSooNa7wgJKzaVrf0Kxz2QBesKpsfe9UN3Dj04016FIUbkRI
-4qLJIkKHyeQRU9hvJ78tU7OeykDEVqlHAEE/Z4c5EIs6l9x60VqOpAjnaqX/9Jty
-jXhqpINjolTh6D5jq8y4FX5krKqIYBCNDHM+cQ==
------END CERTIFICATE-----
diff --git a/vendor/paypal/merchant-sdk-php/samples/composer.json b/vendor/paypal/merchant-sdk-php/samples/composer.json
deleted file mode 100644
index 9bf55ed9..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/composer.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-    "name": "paypal/merchant-sdk-php-sample",
-    "description": "Sample app for PayPal's Merchant SDK",
-    "keywords": ["paypal", "php", "sdk"],
-    "homepage": "https://developer.paypal.com";,
-    "license": "Apache2",
-    "authors": [
-        {
-            "name": "PayPal",
-            "homepage": "https://github.com/paypal/merchant-sdk-php/contributors";
-        }
-    ],
-    "require": {
-        "php": ">=5.3.0",
-        "ext-curl": "*",
-        "paypal/merchant-sdk-php":"3.*",
-        "paypal/permissions-sdk-php":"3.*"
-    }
-}
diff --git a/vendor/paypal/merchant-sdk-php/samples/index.php b/vendor/paypal/merchant-sdk-php/samples/index.php
deleted file mode 100644
index b40a22a9..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/index.php
+++ /dev/null
@@ -1,130 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd";>
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<title>PayPal Merchant SDK for PHP - Samples</title>
-<style>
-table {
-	border-collapse: collapse;
-	margin: auto;
-}
-
-td {
-	padding: 5px 15px;
-}
-</style>
-</head>
-<body>
-	<center>
-		<font size=2 color=black face=Verdana><b><u>PayPal Merchant SDK for
-					PHP - Samples</u> </b> </font>
-	</center>
-	<br />
-	<br /><br />
-	<table>
-		<tr valign="top">
-			<td><b>Express Checkout</b>
-				<ul>
-					<li><a href="ExpressCheckout/SetExpressCheckout.html.php">SetExpressCheckout</a>
-					</li>
-					<li><a href="ExpressCheckout/GetExpressCheckout.html.php">GetExpressCheckout</a>
-					</li>
-					<li><a href="ExpressCheckout/DoExpressCheckout.html.php">DoExpressCheckout</a>
-					</li>
-					<li><a href="ExpressCheckout/DGsetEC.html.php">ExpressCheckout -
-							Digital Goods</a></li>
-				</ul>
-			</td>
-			<td><b>DCC</b>
-				<ul>
-					<li><a href="DirectPayment/DoDirectPayment.html.php">DoDirectPayment</a>
-					</li>
-				</ul>
-			</td>
-			<td><b>MassPay</b>
-				<ul>
-					<li><a href="MassPay/MassPay.html.php">MassPay</a></li>
-				</ul>
-			</td>
-		</tr>
-		<tr valign="top">
-			<td><b>Settlments and Refunds</b>
-				<ul>
-					<li><a href="PaymentSettlements/Refund.html.php">Refund</a></li>
-					<li><a href="PaymentSettlements/DoAuthorization.html.php">DoAuthorization</a>
-					</li>
-					<li><a href="PaymentSettlements/DoVoid.html.php">DoVoid</a></li>
-					<li><a href="PaymentSettlements/DoReauthorization.html.php">DoReauthorization</a>
-					</li>
-					<li><a href="PaymentSettlements/DoCapture.html.php">DoCapture</a></li>
-					<li><a href="PaymentSettlements/ReverseTransaction.html.php">ReverseTransaction</a>
-					</li>
-					<li><a href="PaymentSettlements/DoNonReferencedCredit.html.php">DoNonReferencedCredit</a>
-					</li>
-					<li><a
-						href="PaymentSettlements/ManagePendingTransactionStatus.html.php">ManagePendingTransactionStatus</a>
-					</li>
-				</ul>
-			</td>
-			<td><b>Recurring Payments</b>
-				<ul>
-					<li><a
-						href="RecurringPayments/CreateRecurringPaymentsProfile.html.php">CreateRecurringPaymentsProfile</a>
-					</li>
-					<li><a
-						href="RecurringPayments/UpdateRecurringPaymentsProfile.html.php">UpdateRecurringPaymentsProfile</a>
-					</li>
-					<li><a
-						href="RecurringPayments/GetRecurringPaymentsProfileDetails.html.php">GetRecurringPaymentsProfileDetails</a>
-					</li>
-					<li><a
-						href="RecurringPayments/ManageRecurringPaymentsProfileStatus.html.php">ManageRecurringPaymentsProfileStatus</a>
-					</li>
-					<li><a href="RecurringPayments/BillOutstandingAmount.html.php">BillOutstandingAmount</a>
-					</li>
-				</ul>
-			</td>
-			<td><b>Reference Transactions and Billing Agreement</b>
-				<ul>
-					<li><a
-						href="BillingAgreements/GetBillingAgreementCustomerDetails.html.php">GetBillingAgreementCustomerDetails</a>
-					</li>
-					<li><a href="BillingAgreements/BillingAgreementUpdate.html.php">BillAgreementUpdate</a>
-					</li>
-					<li><a href="BillingAgreements/DoReferenceTransaction.html.php">DoReferenceTransaction</a>
-					</li>
-					<li><a href="BillingAgreements/BillUser.html.php">BillUser</a></li>
-				</ul>
-			</td>
-		</tr>
-		<tr valign="top">
-			<td><b>Account Authentication</b>
-				<ul>
-					<li><a href="AccountAuthentication/SetAuthFlowParam.html.php">SetAuthFlowParam</a>
-					</li>
-					<li><a href="AccountAuthentication/GetAuthDetails.html.php">GetAuthDetails</a>
-					</li>
-				</ul>
-			</td>
-			<td><b>Reporting and Admin</b>
-				<ul>
-					<li><a href="AdminCalls/TransactionSearch.html.php">TransactionSearch</a>
-					</li>
-					<li><a href="AdminCalls/GetTransactionDetails.html.php">GetTransactionDetails</a>
-					</li>
-					<li><a href="AdminCalls/GetBalance.html.php">GetBalance</a></li>
-					<li><a href="AdminCalls/GetPalDetails.html.php">GetPalDetails</a></li>
-					<li><a href="AdminCalls/AddressVerify.html.php">AddressVerify</a></li>
-				</ul>
-			</td>
-			<td><b>Onboarding</b>
-				<ul>
-					<li><a href="Onboarding/EnterBoarding.html.php">EnterBoarding</a></li>
-					<li><a href="Onboarding/GetBoardingDetails.html.php">GetBoardingDetails</a>
-					</li>
-				</ul>
-			</td>
-		</tr>
-	</table>
-</body>
-</html>
diff --git a/vendor/paypal/merchant-sdk-php/samples/install.php b/vendor/paypal/merchant-sdk-php/samples/install.php
deleted file mode 100644
index dcd615ff..00000000
--- a/vendor/paypal/merchant-sdk-php/samples/install.php
+++ /dev/null
@@ -1,451 +0,0 @@
-<?php
-
-/**
- *  Downloads PayPal PHP SDK dependencies based on your composer.json file
- */
-
-define('DS', DIRECTORY_SEPARATOR);
-
-define('COMPOSER_FILE', 'composer.json');
-
-// name of the bootstrap file in custom installation
-define('BOOTSTRAP_FILE', 'PPBootStrap.php');
-
-// name of the SDK configuration file
-define('CONFIGURATION_FILE', 'sdk_config.ini');
-
-// URL from where the composer.json is downloaded if not present
-define('COMPOSER_URL', 'https://raw.github.com/paypal/merchant-sdk-php/stable-php5.3/samples/composer.json');
-
-// Flag to control whether composer should be used for installation
-$useComposer = false;
-
-init($useComposer);
-createAutoload();
-createConfig(CONFIGURATION_FILE);
-createBootStrap(BOOTSTRAP_FILE);
-echo "Installation successful";
-exit(0);
-
-
-function init($useComposer) {
-
-	// download if composer.json is not present
-	if(!file_exists(COMPOSER_FILE)) {
-		$fp = fopen(COMPOSER_FILE, "w");
-		curlExec(COMPOSER_URL, $fp);
-		fclose($fp);
-	}
-
-	// check if composer is installed
-	if($useComposer) {
-		@exec('composer', $output, $status);
-		if( $status == 0) {
-			@exec('composer update', $output, $status);
-			var_dump($output);
-			exit($status);
-		} else {
-			@exec('composer.phar', $output, $status);
-			if( $status == 0)
-			{
-				@exec('composer.phar update', $output, $status);
-				var_dump($output);
-				exit($status);
-			}
-		}
-	} else {
-		echo "composer not installed or 'useComposer' is set to false in install.php." . PHP_EOL;
-		echo "Running custom installation ... " . PHP_EOL;
-		$extensions = array('zip', 'curl', 'openssl');
-		foreach($extensions as $e) {
-			if (!extension_loaded($e)) {
-				echo PHP_EOL . "Please enable the $e extension. This script requires the " . implode(", ", $extensions) . " extensions to work correctly.";
-				exit(1);
-			}
-		}
-
-		$json = @file_get_contents(COMPOSER_FILE);
-		$json_a = json_decode($json, true);
-		//array $processsed contains list of dependencies that have already been downloaded
-		$processed = array();
-		foreach (getDependency($json_a) as $dependency ) {
-			customInstall($dependency, $dependency['group'], $processed);
-		}
-	}
-}
-
-/*
- * get the correct tag based on the tag in composer.json
-* ex: get v3.1.4 if the entry in composer.json is 3.1.*
-* @param $inputTag the tag in composer.json
-* @param array $array array of all the tags fetched from github
-*/
-function getTag($inputTag, $tagArray, $branchArray)
-{
-	natsort($tagArray);
-	if(strpos($inputTag, '*') === 0 )
-	{
-		return end($tagArray);
-	}
-	else if(((strpos($inputTag, '>')) !== false) && (strpos($inputTag, '>') >=0))
-	{
-		if(!in_array($inputTag, $tagArray))
-		{
-			echo "error: invalid version tag in composer.json";
-			exit();
-		}
-		return end($tagArray);
-	}
-	else
-	{
-		if(strpos($inputTag, '<=') === 0)
-		{
-			$strippedTag = 'v'.str_replace('<=', '', $inputTag);
-			foreach ($tagArray as $version)
-			{
-				if(version_compare($strippedTag, strtolower($version)) == 1 || version_compare($strippedTag, strtolower($version)) == 0)
-				{
-					$tag = $version;
-				}
-			}
-			if(!in_array($tag, $tagArray))
-			{
-				echo "error: invalid version tag in composer.json";
-				exit();
-			}
-			return $tag;
-		}
-		else if(strpos($inputTag, '<') === 0)
-		{
-			$strippedTag = 'v'.str_replace('<', '', $inputTag);
-			foreach ($tagArray as $version)
-			{
-				if(version_compare($strippedTag, strtolower($version)) == 1)
-				{
-					$tag = $version;
-				}
-			}
-			if(!in_array($tag, $tagArray))
-			{
-				echo "error: invalid version tag in composer.json";
-				exit();
-			}
-			return $tag;
-		}
-		else if(strpos($inputTag, '*'))
-		{
-			$exp = explode('*', $inputTag);
-			$tag = 'v'.str_replace('*', '0', $inputTag);
-
-			foreach ($tagArray as $version)
-			{
-				if(strpos($version, $exp['0']) == 1 && version_compare($tag, $version) == -1)
-				{
-					$tag = $version;
-				}
-			}
-			if(!in_array($tag, $tagArray))
-			{
-				echo "error: invalid version tag in composer.json";
-				exit();
-			}
-			return $tag;
-		}
-		else
-		{
-			$inputTag = str_replace('dev-', '', $inputTag);
-			if(!in_array($inputTag, $tagArray) && !in_array($inputTag, $branchArray))
-			{
-				echo "error: invalid version tag or branch in composer.json";
-				exit();
-			}
-			return $inputTag;
-		}
-	}
-}
-
-/*
- * extract the tags/branches from github reference API response
- */
-function extractRef($url)
-{
-	$reference = json_decode(curlExec($url));
-	if(strpos($reference['0']->ref, 'refs/tags/') === 0)
-	{
-		foreach ($reference as $ref)
-		{
-			$array[] = str_replace('refs/tags/', '', $ref->ref);
-		}
-	}
-	else 
-	{
-		foreach ($reference as $ref)
-		{
-			$array[] = str_replace('refs/heads/', '', $ref->ref);
-		}
-	}
-	
-	return $array;
-}
-/**
- * @param array $dependency
- * @param array $installDir	directory where the dependency must be copied to
- * @param array $processed contains list of directories already scanned for dependency
- */
-function customInstall($dependency, $installDir, &$processed) {
-	$tagUrl = sprintf('https://api.github.com/repos/%s/%s/git/refs/tags/',
-			$dependency['group'], $dependency['artifact']);
-	$branchUrl = sprintf('https://api.github.com/repos/%s/%s/git/refs/heads/',
-			$dependency['group'], $dependency['artifact']);
-	$branchArray = extractRef($branchUrl);
-	$tagsArray = extractRef($tagUrl);
-	$dependency['branch'] = getTag($dependency['branch'], $tagsArray, $branchArray);
-	// download zip from github
-	$downloadUrl = sprintf('https://api.github.com/repos/%s/%s/zipball/%s',
-			$dependency['group'], $dependency['artifact'], $dependency['branch']);
-	if(!in_array($downloadUrl, $processed)) {
-		echo "Downloading " . $dependency['artifact'] . ' - ' . $dependency['branch'] . PHP_EOL;
-		$dest = 'vendor/' . $installDir . '/';
-		$fileZip = tempnam(sys_get_temp_dir(), 'ppzip');
-		$fp = fopen($fileZip, "w");
-
-		curlExec($downloadUrl, $fp);
-		$processed[] = $downloadUrl;
-
-		// extract the downloaded zip
-		$zip = new ZipArchive;
-		if($zip->open($fileZip) != "true") {
-			echo PHP_EOL . "Could not open $fileZip";
-			exit;
-		}
-		$zip->extractTo($dest);
-		$zip->close();
-		fclose($fp);
-		unlink($fileZip);
-
-		// scan extracted directory for nested dependency
-		foreach (glob("$dest/**/composer.json") as $composer) {
-			$json = file_get_contents($composer);
-			$json_a = json_decode($json, true);
-			$dependencies =  getDependency($json_a);
-			foreach ($dependencies as $dependency ) {
-				customInstall($dependency, $dependency['group'], $processed);
-			}
-		}
-	}
-}
-
-/*
- * @param array $json_a composer.json converted to array
-*/
-function getDependency($json_a) {
-	if( !array_key_exists('require', $json_a)) {
-		return array();
-	}
-
-	$res = array();
-	foreach ($json_a['require'] as $key => $val) {
-		if(strpos($key, '/')) {
-			$parts = explode('/', $key);
-			// Convert versions such as "dev-xyz" to "xyz"
-			$pos = strpos($val, '-');
-			if($pos == null || empty($pos)) {
-				$branch = $val;
-			} else {
-				$branch = substr($val, $pos+1);
-			}
-			$batch['group'] = $parts[0] ;
-			$batch['artifact'] = $parts[1];
-			$batch['branch'] = $branch;
-			$res[] = $batch;
-		}
-
-	}
-	return $res;
-}
-
-/*
- * curl execute
-* @param $targetUrl url to hit
-* @param $writeToFile file to which the received data to be written
-*/
-function curlExec($targetUrl, $writeToFile = null) {
-	$ch = curl_init();
-	curl_setopt($ch, CURLOPT_URL, $targetUrl);
-	curl_setopt($ch, CURLOPT_FAILONERROR, true);
-	curl_setopt($ch, CURLOPT_HEADER, 0);
-	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
-	curl_setopt($ch, CURLOPT_AUTOREFERER, true);
-	curl_setopt($ch, CURLOPT_USERAGENT, 'curl/installScript');
-	curl_setopt($ch, CURLOPT_BINARYTRANSFER,true);
-	curl_setopt($ch, CURLOPT_TIMEOUT, 60);
-	curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
-	curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
-	curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true);
-	if($writeToFile != null)
-	{
-		curl_setopt($ch, CURLOPT_FILE, $writeToFile);
-	}
-	$res = curl_exec($ch);
-	if (!$res) {
-		echo PHP_EOL . "cURL error number:" .curl_errno($ch) . " for $targetUrl";
-		echo PHP_EOL . "cURL error:" . curl_error($ch);
-		exit;
-	}
-	curl_close($ch);
-	return $res;
-}
-
-/*
- * get the namespace and file location map
-* @param array $json_a composer.json converted to array
-* @param $composerPath path to composer.json
-*/
-function getNamespaceMapping($json_a, $composerPath)
-{
-	$composerPath = str_replace("composer.json", "", $composerPath);
-	if(!isset($json_a['autoload']['psr-0']))
-	{
-		echo "error: This install script only suppoorts namespace based SDK";
-		exit();
-	}
-	foreach ($json_a['autoload']['psr-0'] as $namespace => $path)
-	{
-		$pathArr[$namespace] = 'self::$vendorDir .' . $composerPath.$path;
-	}
-	return $pathArr;
-}
-/**
- * creates namespace map to load the classes
- */
-function createAutoload() {
-	$dest = 'vendor/paypal/';
-	$classes = array();
-	foreach (glob("$dest/**/composer.json") as $composer) {
-		$json = file_get_contents($composer);
-		$json_a = json_decode($json, true);
-
-		foreach (getNamespaceMapping($json_a, $composer) as $key => $value) {
-			$classes[$key][] = $value;
-		}
-
-	}
-
-	$libraryPath = dirname(__FILE__) . '/';
-	$loaderClass = 'PPAutoloader';
-	$loaderFile  = $loaderClass . '.php';
-	echo "Generating autoload file ".PHP_EOL;
-
-	ksort($classes, SORT_STRING);
-	$classList = var_export($classes, true);
-	$classList = str_replace('\'self::$vendorDir .', 'self::$vendorDir .\'/' , $classList);
-	$script = <<< SCRIPT
-<?php
-	 /**
-      * Basic class-map auto loader generated by install.php.
-	  * Do not modify.
-	  */
-	 class {$loaderClass} {
-        private static \$vendorDir = '';
-        private static \$map = array();
-
-        public static function loadClass(\$class) {
-			if ('\\\\' == \$class[0]) {
-				\$class = substr(\$class, 1);
-			}
-			
-			if (false !== \$pos = strrpos(\$class, '\\\\')) {
-				// namespaced class name
-				\$classPath = str_replace('\\\\', DIRECTORY_SEPARATOR, substr(\$class, 0, \$pos)) . DIRECTORY_SEPARATOR;
-				\$className = substr(\$class, \$pos + 1);
-			} else {
-				// PEAR-like class name
-				\$classPath = null;
-				\$className = \$class;
-			}
-			
-			\$classPath .= str_replace('_', DIRECTORY_SEPARATOR, \$className) . '.php';
-            foreach (self::\$map as \$prefix => \$dirs) {
-	        	if (0 === strpos(\$class, \$prefix)) {
-	        		foreach (\$dirs as \$dir) {
-	        			if (file_exists(\$dir . DIRECTORY_SEPARATOR . \$classPath)) {
-	        				include \$dir . DIRECTORY_SEPARATOR . \$classPath;
-                            return;
-	        			}
-	        		}
-	        	}
-	        }
-    	}
-
-		public static function register() {
-            self::\$vendorDir = dirname(__FILE__);
-         	self::\$map = {$classList};
-	        spl_autoload_register(array(__CLASS__, 'loadClass'), true);
-    	}
-}
-SCRIPT;
-
-	file_put_contents($loaderFile, $script);
-}
-
-/**
- * Creates a config file if one is not present
- * @param string $configFile name of the configuration file
- */
-function createConfig($configFile) {
-	if(!file_exists($configFile)) {
-		echo "Generating $configFile. You must update it with your account details." . PHP_EOL;
-		$script = <<< SCRIPT
-
-; Integration mode - Must be one of sandbox/live
-mode = sandbox
-
-;Account credentials
-[Account]
-; Update your account credentials from developer portal here
-acct1.UserName =
-acct1.Password =
-acct1.Signature =
-
-;Connection Information
-[Http]
-http.ConnectionTimeOut = 30
-http.Retry = 1
-
-;Logging Information
-[Log]
-log.FileName=PayPal.log
-log.LogLevel=INFO
-log.LogEnabled=true
-
-SCRIPT;
-		file_put_contents($configFile, $script);
-	}
-}
-
-/**
- *  initiates and installs the SDK
- */
-function createBootStrap($bootstrapFile) {
-
-	if(!file_exists($bootstrapFile)) {
-		$script = <<< SCRIPT
-<?php
-/**
- * Include this file in your application. This file sets up the required classloader based on
- * whether you used composer or the custom installer.
- */
-
-// Let the SDK know where the config file resides.
-define('PP_CONFIG_PATH', dirname(__FILE__));
-
-if(file_exists( dirname(__FILE__). '/vendor/autoload.php')) {
-    require 'vendor/autoload.php';
-} else {
-    require 'PPAutoloader.php';
-    PPAutoloader::register();
-}
-SCRIPT;
-		file_put_contents($bootstrapFile, $script);
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/.gitattributes b/vendor/paypal/sdk-core-php/.gitattributes
new file mode 100644
index 00000000..dbbf9625
--- /dev/null
+++ b/vendor/paypal/sdk-core-php/.gitattributes
@@ -0,0 +1,8 @@
+tests/ export-ignore
+.releasinator.rb export-ignore
+.travis.yml export-ignore
+CONTRIBUTING.md export-ignore
+Gemfile export-ignore
+Gemfile.lock export-ignore
+Rakefile export-ignore
+build.xml export-ignore
diff --git a/vendor/paypal/sdk-core-php/.github/ISSUE_TEMPLATE.md b/vendor/paypal/sdk-core-php/.github/ISSUE_TEMPLATE.md
index 6d297ed3..a250e509 100644
--- a/vendor/paypal/sdk-core-php/.github/ISSUE_TEMPLATE.md
+++ b/vendor/paypal/sdk-core-php/.github/ISSUE_TEMPLATE.md
@@ -1,9 +1,10 @@
-### Required Information
+### General information
 
-- PHP Version:
-- SDK-Core-PHP Version:
-- Debug ID(s):
+* SDK/Library version: <!-- Example: 4.7.2 -->
+* Environment: <!-- Is this issue in Sandbox or Production? -->
+* `PayPal-Debug-ID` values: <!-- Report PayPal-Debug-IDs from any logs -->
+* Language, language version, and OS: <!-- Example: Java 1.8.0_101-b13 on Ubuntu 16.10 -->
 
-### Issue Description
-> Please include as many details (logs, steps to reproduce) as you can to help us reproduce this issue faster.
+### Issue description
 
+<!-- To help us quickly reproduce your issue, include as many details as possible, such as logs, steps to reproduce, and so on.  If the issue reports a new feature, follow the [user story](https://en.wikipedia.org/wiki/User_story) format to clearly describe the use case. -->
diff --git a/vendor/paypal/sdk-core-php/.releasinator.rb b/vendor/paypal/sdk-core-php/.releasinator.rb
deleted file mode 100644
index 5f77b73a..00000000
--- a/vendor/paypal/sdk-core-php/.releasinator.rb
+++ /dev/null
@@ -1,61 +0,0 @@
-#### releasinator config ####
-configatron.product_name = "sdk-core-php"
-
-# Disabling validate:branch task as it checks for `master` branch to be default. We have `namespace-5.3`
-Rake::Task["validate:branch"].clear
-
-# List of items to confirm from the person releasing.  Required, but empty list is ok.
-configatron.prerelease_checklist_items = [
-  "Sanity check the namespace-php-5.3 branch."
-]
-
-def validate_version_match()
-  if constant_version() != @current_release.version
-    Printer.fail("lib/PayPal/Core/PPConstants.php version #{constant_version} does not match changelog version #{@current_release.version}.")
-    abort()
-  end
-  Printer.success("PPConstants.php version #{constant_version} matches latest changelog version.")
-end
-
-def validate_tests()
-   CommandProcessor.command("vendor/bin/phpunit", live_output=true)
-end
-
-configatron.custom_validation_methods = [
-  method(:validate_version_match),
-  method(:validate_tests)
-]
-
-# there are no separate build steps, so it is just empty method
-def build_method
-end
-
-# The command that builds the sdk.  Required.
-configatron.build_method = method(:build_method)
-
-# Creating and pushing a tag will automatically create a release, so it is just empty method
-def publish_to_package_manager(version)
-end
-
-# The method that publishes the sdk to the package manager.  Required.
-configatron.publish_to_package_manager_method = method(:publish_to_package_manager)
-
-
-def wait_for_package_manager(version)
-end
-
-# The method that waits for the package manager to be done.  Required
-configatron.wait_for_package_manager_method = method(:wait_for_package_manager)
-
-# Whether to publish the root repo to GitHub.  Required.
-configatron.release_to_github = true
-
-def constant_version()
-  f=File.open("lib/PayPal/Core/PPConstants.php", 'r') do |f|
-    f.each_line do |line|
-      if line.match (/SDK_VERSION = \'\d*\.\d*\.\d*\'/) # SDK_VERSION = '1.7.1'
-        return line.strip.split('= ')[1].strip.split('\'')[1]
-      end
-    end
-  end
-end
diff --git a/vendor/paypal/sdk-core-php/.travis.yml b/vendor/paypal/sdk-core-php/.travis.yml
deleted file mode 100644
index 0b320931..00000000
--- a/vendor/paypal/sdk-core-php/.travis.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-language: php
-
-php:
-  - 5.3
-  - 5.4
-  - 5.5
-  - 5.6
-  - 7.0
-
-install:
-  - composer install
-
-script:
-  - vendor/bin/phpunit
diff --git a/vendor/paypal/sdk-core-php/CHANGELOG.md b/vendor/paypal/sdk-core-php/CHANGELOG.md
index 541efbd9..c4219cdf 100644
--- a/vendor/paypal/sdk-core-php/CHANGELOG.md
+++ b/vendor/paypal/sdk-core-php/CHANGELOG.md
@@ -1,6 +1,10 @@
 
 # CHANGELOG
 
+## 3.4.0 (Nov 13, 2017)
+   * Add http.TimeOut config value to make curl timeout configurable.
+   * Fix logging bug on shutdown.
+
 ## 3.3.2 (Oct 25, 2016)
    * Fixes issue with built-in types.
    * Fixes token authorization bug.
diff --git a/vendor/paypal/sdk-core-php/CONTRIBUTING.md b/vendor/paypal/sdk-core-php/CONTRIBUTING.md
deleted file mode 100644
index ea00cc57..00000000
--- a/vendor/paypal/sdk-core-php/CONTRIBUTING.md
+++ /dev/null
@@ -1,7 +0,0 @@
-## Contributing
-
-* If you find solution to an [issue/improvements](https://github.com/paypal/sdk-core-php/issues) in sdk that would be helpful to everyone, feel free to send us a pull request.
-* The best help we could get from everyone is in writing more and more samples. We have a limited set of samples, and would appreciate if the community can help us write more and more of those, covering corner cases, that may be extremely useful to anyone using this SDK.
-* The ideal approach to create a fix would be to fork the repository, create a branch in your repository, and make a pull request out of it.
-* It is desirable if there is enough comments/documentation and Tests included in the pull request.
-* For general idea of contribution, please follow the guidelines mentioned [here](https://guides.github.com/activities/contributing-to-open-source/).
diff --git a/vendor/paypal/sdk-core-php/Gemfile b/vendor/paypal/sdk-core-php/Gemfile
deleted file mode 100644
index ae3dd9b7..00000000
--- a/vendor/paypal/sdk-core-php/Gemfile
+++ /dev/null
@@ -1,3 +0,0 @@
-source 'https://rubygems.org'
-
-gem 'releasinator', '~> 0.4'
diff --git a/vendor/paypal/sdk-core-php/Gemfile.lock b/vendor/paypal/sdk-core-php/Gemfile.lock
deleted file mode 100644
index 5604c72e..00000000
--- a/vendor/paypal/sdk-core-php/Gemfile.lock
+++ /dev/null
@@ -1,37 +0,0 @@
-GEM
-  remote: https://rubygems.org/
-  specs:
-    addressable (2.4.0)
-    colorize (0.7.7)
-    configatron (4.5.0)
-    faraday (0.9.2)
-      multipart-post (>= 1.2, < 3)
-    github-markup (1.4.0)
-    json (1.8.3)
-    multipart-post (2.0.0)
-    octokit (4.3.0)
-      sawyer (~> 0.7.0, >= 0.5.3)
-    redcarpet (3.3.4)
-    releasinator (0.4.0)
-      colorize (~> 0.7)
-      configatron (~> 4.5)
-      json (~> 1.8)
-      octokit (~> 4.0)
-      semantic (~> 1.4)
-      vandamme (~> 0.0.11)
-    sawyer (0.7.0)
-      addressable (>= 2.3.5, < 2.5)
-      faraday (~> 0.8, < 0.10)
-    semantic (1.4.1)
-    vandamme (0.0.11)
-      github-markup (~> 1.3)
-      redcarpet (~> 3.3.2)
-
-PLATFORMS
-  ruby
-
-DEPENDENCIES
-  releasinator (~> 0.4)
-
-BUNDLED WITH
-   1.12.3
diff --git a/vendor/paypal/sdk-core-php/Rakefile b/vendor/paypal/sdk-core-php/Rakefile
deleted file mode 100644
index 33a443c3..00000000
--- a/vendor/paypal/sdk-core-php/Rakefile
+++ /dev/null
@@ -1,2 +0,0 @@
-spec = Gem::Specification.find_by_name 'releasinator'
-load "#{spec.gem_dir}/lib/tasks/releasinator.rake"
diff --git a/vendor/paypal/sdk-core-php/build.xml b/vendor/paypal/sdk-core-php/build.xml
deleted file mode 100644
index d2b4614d..00000000
--- a/vendor/paypal/sdk-core-php/build.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE project>
-<project name="PayPal_Core_SDK" default="build" basedir=".">
-
-	<property name="basedir" value="." />
-	<property name="release.dir" value="${basedir}/release" />
-	<property name="output.dir" value="${basedir}/build" />
-	<property name="phplint.out" value="${output.dir}/phplint.txt" />
-	<property name="phploc.out" value="${output.dir}/phploc.xml" />
-	
-	<property name="test.dir" value="tests" />
-	<property name="test.out" value="${output.dir}/junit.xml" />
-	
-	<property name="coverage.dir" value="${output.dir}/coverage" />	
-	<property name="clover.out" value="${coverage.dir}/clover.xml" />
-	
-	<fileset id="src.files" dir="lib" includes="**/*.php" />
-	
-	<!-- Init tasks -->
-	<target name="checkos">
-		<condition property="isWindows">
-			<os family="windows" />
-		</condition>
-		<condition property="isLinux">
-			<os family="unix" />
-		</condition>
-	</target>
-
-	<target name="init_windows" depends="checkos" if="isWindows">
-	   <property name="phpunit.bin" value="phpunit.bat" />
-	   <property name="phploc.bin" value="phploc.bat" />
-	</target>
-
-	<target name="init_unix" depends="checkos" if="isLinux">
-	   <property name="phpunit.bin" value="phpunit" />
-	   <property name="phploc.bin" value="phploc" />
-	</target>
-	
-	<target name="init" depends="init_unix,init_windows" />
-	
-	<target name="clean">
-		<delete dir="${output.dir}" />
-		<mkdir dir="${output.dir}"/>
-	</target>
-
-	<!-- Code analysis tasks -->
-	<target name="phplint" depends="init">		
-		<delete file="${phplint.out}"/>
-		<apply executable="php" failonerror="true" output="${phplint.out}" append="true">
-			<arg value="-l" />
-			<fileset refid="src.files" />
-		</apply>
-	</target>
-
-	<target name="phploc" depends="init">
-		<exec command="${phploc.bin} --log-xml ${phploc.out} ." dir="${basedir}/lib"  />
-	</target>
-
-	<!-- Test tasks -->
-	<target name="test" depends="init">
-		<exec dir="${basedir}" executable="${phpunit.bin}" failonerror="true">
-			<arg line="--testdox -c phpunit.xml ${test.dir}" />
-		</exec>
-	</target>
-
-	<target name="coverage" depends="init">
-		<mkdir dir="${output.dir}/coverage"/>
-		<exec command="${phpunit.bin} --coverage-html=${coverage.dir} --coverage-clover=${clover.out} -c phpunit.xml ${test.dir}" />
-	</target>
-	<!-- Requires phing -->	
-	<target name="convert-test-report">
-		<mkdir dir="${output.dir}/test"/>
-		<phpunitreport infile="${test.out}" 
-			format="frames" 
-			todir="${output.dir}/test" />
-	</target>
-
-	<!-- Main tasks -->
-	<target name="report" depends="init, clean, phplint, coverage, phploc" description="Runs code checks and coverage reports" />
-	<target name="build" depends="init, clean, test" />
-</project>
diff --git a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConfigManager.php b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConfigManager.php
index d73bf3f9..c6402237 100644
--- a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConfigManager.php
+++ b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConfigManager.php
@@ -13,6 +13,7 @@ class PPConfigManager
     //default config values
     public static $defaults = array(
       "http.ConnectionTimeOut" => "30",
+      "http.TimeOut"           => "60",
       "http.Retry"             => "5",
     );
 
diff --git a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConnectionManager.php b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConnectionManager.php
index 16e671ea..65d3b8d6 100644
--- a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConnectionManager.php
+++ b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConnectionManager.php
@@ -27,7 +27,10 @@ class PPConnectionManager
     public function getConnection($httpConfig, $config)
     {
         if (isset($config["http.ConnectionTimeOut"])) {
-            $httpConfig->setHttpTimeout($config["http.ConnectionTimeOut"]);
+            $httpConfig->setHttpConnectionTimeout($config["http.ConnectionTimeOut"]);
+        }
+        if (isset($config["http.TimeOut"])) {
+            $httpConfig->setHttpTimeout($config["http.TimeOut"]);
         }
         if (isset($config["http.Proxy"])) {
             $httpConfig->setHttpProxy($config["http.Proxy"]);
diff --git a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConstants.php b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConstants.php
index 44725863..62d818a4 100644
--- a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConstants.php
+++ b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPConstants.php
@@ -4,7 +4,7 @@ namespace PayPal\Core;
 class PPConstants
 {
     const SDK_NAME = 'sdk-core-php';
-    const SDK_VERSION = '3.3.2';
+    const SDK_VERSION = '3.4.0';
 
     const MERCHANT_SANDBOX_SIGNATURE_ENDPOINT = "https://api-3t.sandbox.paypal.com/2.0";;
     const MERCHANT_SANDBOX_CERT_ENDPOINT = "https://api.sandbox.paypal.com/2.0";;
diff --git a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPHttpConfig.php b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPHttpConfig.php
index 7c4e8d17..d5cf4d2d 100644
--- a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPHttpConfig.php
+++ b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPHttpConfig.php
@@ -148,12 +148,22 @@ class PPHttpConfig
      *
      * @param integer $timeout
      */
-    public function setHttpTimeout($timeout)
+    public function setHttpConnectionTimeout($timeout)
     {
         $this->curlOptions[CURLOPT_CONNECTTIMEOUT] = $timeout;
     }
 
     /**
+     * Set timeout in seconds
+     *
+     * @param integer $timeout
+     */
+    public function setHttpTimeout($timeout)
+    {
+        $this->curlOptions[CURLOPT_TIMEOUT] = $timeout;
+    }
+
+    /**
      * Set HTTP proxy information
      *
      * @param string $proxy
diff --git a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPLoggingManager.php b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPLoggingManager.php
index 898fde89..2f3ca90b 100644
--- a/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPLoggingManager.php
+++ b/vendor/paypal/sdk-core-php/lib/PayPal/Core/PPLoggingManager.php
@@ -37,17 +37,20 @@ class PPLoggingManager
             $this->loggerFile   = ($config['log.FileName']) ? $config['log.FileName'] : ini_get('error_log');
             $loggingLevel       = strtoupper($config['log.LogLevel']);
             $this->loggingLevel = (isset($loggingLevel) && defined(__NAMESPACE__ . "\\PPLoggingLevel::$loggingLevel")) ? constant(__NAMESPACE__ . "\\PPLoggingLevel::$loggingLevel") : PPLoggingManager::DEFAULT_LOGGING_LEVEL;
-            register_shutdown_function(array($this,'flush'));
         }
     }
 
+    public function __destruct()
+    {
+        $this->flush();
+    }
  
-    public function flush(){
-        if($this->loggerMessage){
-            error_log($this->loggerMessage,3,$this->loggerFile);
+    public function flush()
+    {
+        if($this->loggerMessage) {
+            error_log($this->loggerMessage, 3, $this->loggerFile);
         }
-    } 
-
+    }
 
     private function log($message, $level = PPLoggingLevel::INFO)
     {
diff --git a/vendor/paypal/sdk-core-php/tests/CallTest.php b/vendor/paypal/sdk-core-php/tests/CallTest.php
deleted file mode 100644
index ccd54d22..00000000
--- a/vendor/paypal/sdk-core-php/tests/CallTest.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-use PayPal\Auth\OAuthTokenCredential;
-use PayPal\Rest\Call;
-
-class CallTest  {
-
-	public function testExecuteWithExplicitCredentials() {
-		$cred = new OAuthTokenCredential(\Constants::CLIENT_ID, \Constants::CLIENT_SECRET);
-		$data = '"request":"test message"';
-
-		$call = new Call();
-		$ret = $call->execute('/v1/payments/echo', "POST", $data, $cred);
-		$this->assertEquals($data, $ret);
-	}
-
-	public function testExecuteWithInvalidCredentials() {
-
-		$cred = new OAuthTokenCredential('test', 'dummy');
-		$data = '"request":"test message"';
-
-		$call = new Call();
-		$this->setExpectedException('\PPConnectionException');
-		$ret = $call->execute('/v1/payments/echo', "POST", $data, $cred);
-
-	}
-
-
-	public function testExecuteWithDefaultCredentials() {
-
-		$data = '"request":"test message"';
-
-		$call = new Call();
-		$ret = $call->execute('/v1/payments/echo', "POST", $data);
-		$this->assertEquals($data, $ret);
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/Constants.php b/vendor/paypal/sdk-core-php/tests/Constants.php
deleted file mode 100644
index 01bfd099..00000000
--- a/vendor/paypal/sdk-core-php/tests/Constants.php
+++ /dev/null
@@ -1,5 +0,0 @@
-<?php
-class Constants {
-	const CLIENT_ID = 'EBWKjlELKMYqRNQ6sYvFo64FtaRLRR5BdHEESmha49TM';
-	const CLIENT_SECRET = 'EO422dn3gQLgDbuwqTjzrFgFtaRLRR5BdHEESmha49TM';
-}
diff --git a/vendor/paypal/sdk-core-php/tests/Mocks.php b/vendor/paypal/sdk-core-php/tests/Mocks.php
deleted file mode 100644
index 69edeca8..00000000
--- a/vendor/paypal/sdk-core-php/tests/Mocks.php
+++ /dev/null
@@ -1,23 +0,0 @@
-<?php
-
-use PayPal\Handler\IPPHandler;
-
-class MockNVPClass {
-    public function toNVPString() {
-        return 'invoiceID=INV2-6657-UHKM-3LWC-JHF7';
-    }
-}
-
-class MockHandler  implements IPPHandler {
-
-    public function handle($httpConfig, $request, $options) {
-        $config = $options['config'];
-        $httpConfig->setUrl('https://svcs.sandbox.paypal.com/Invoice/GetInvoiceDetails');
-        $httpConfig->addHeader('X-PAYPAL-REQUEST-DATA-FORMAT', 'NV');
-        $httpConfig->addHeader('X-PAYPAL-RESPONSE-DATA-FORMAT', 'NV');
-        $httpConfig->addHeader('X-PAYPAL-SECURITY-USERID', 'jb-us-seller_api1.paypal.com');
-        $httpConfig->addHeader('X-PAYPAL-SECURITY-PASSWORD', 'WX4WTU3S8MY44S7F');
-        $httpConfig->addHeader('X-PAYPAL-SECURITY-SIGNATURE', 'AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy');
-    }
-}
-
diff --git a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdAddressTest.php b/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdAddressTest.php
deleted file mode 100644
index b6266f30..00000000
--- a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdAddressTest.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php 
-use PayPal\Auth\Openid\PPOpenIdAddress;
-/**
- * Test class for PPOpenIdAddress.
- *
- */
-class PPOpenIdAddressTest extends \PHPUnit_Framework_TestCase {
-	
-	private $addr;
-
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp() {
-		$this->addr = self::getTestData();
-	}
-	
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown()
-	{
-	}
-	
-	public static function getTestData() {
-		$addr = new PPOpenIdAddress();
-		$addr->setCountry("US")->setLocality("San Jose")
-		->setPostalCode("95112")->setRegion("CA")
-		->setStreetAddress("1, North 1'st street");
-		return $addr;
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSerializationDeserialization() {				
-		$addrCopy = new PPOpenIdAddress();
-		$addrCopy->fromJson($this->addr->toJson());
-		
-		$this->assertEquals($this->addr, $addrCopy);
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdErrorTest.php b/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdErrorTest.php
deleted file mode 100644
index e0e583b6..00000000
--- a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdErrorTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php 
-
-use PayPal\Auth\Openid\PPOpenIdError;
-/**
- * Test class for PPOpenIdError.
- *
- */
-class PPOpenIdErrorTest extends PHPUnit_Framework_TestCase {
-	
-	private $error;
-
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp() {
-		$this->error = new PPOpenIdError();
-		$this->error->setErrorDescription('error description')
-			->setErrorUri('http://developer.paypal.com/api/error')
-			->setError('VALIDATION_ERROR');
-	}
-	
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown()
-	{
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSerializationDeserialization() {				
-		$errorCopy = new PPOpenIdError();
-		$errorCopy->fromJson($this->error->toJson());
-		
-		$this->assertEquals($this->error, $errorCopy);
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdSessionTest.php b/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdSessionTest.php
deleted file mode 100644
index 8d6c0bfa..00000000
--- a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdSessionTest.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?php
-use PayPal\Common\PPApiContext;
-use PayPal\Auth\Openid\PPOpenIdSession;
-/**
- * Test class for PPOpenIdSession.
- *
- */
-class PPOpenIdSessionTest extends \PHPUnit_Framework_TestCase {
-	
-	private $context;
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp()
-	{
-		$this->context = new PPApiContext(
-			array(
-				'acct1.ClientId' => 'DummyId',
-				'acct1.ClientSecret' => 'A8VERY8SECRET8VALUE0',
-				'mode' => 'live'
-			)
-		);
-	}
-	
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown()
-	{
-	}
-	
-
-	/**
-	 * @test
-	 */
-	public function testLoginUrlForMultipleScopes() {
-	
-		$clientId = "AQkquBDf1zctJOWGKWUEtKXm6qVhueUEMvXO_-MCI4DQQ4-LWvkDLIN2fGsd";
-		$redirectUri = 'https://devtools-paypal.com/';
-		$scope = array('this', 'that', 'and more');
-
-		$expectedBaseUrl = "https://www.sandbox.paypal.com/signin/authorize";;
-	
-		$this->assertEquals($expectedBaseUrl . "?client_id=$clientId&response_type=code&scope=this+that+and+more+openid&redirect_uri=" . urlencode($redirectUri),
-				PPOpenIdSession::getAuthorizationUrl($redirectUri, $scope, $clientId), "Failed case - custom scope");
-	
-		$scope = array();
-		$this->assertEquals($expectedBaseUrl . "?client_id=$clientId&response_type=code&scope=openid+profile+address+email+phone+" . urlencode("https://uri.paypal.com/services/paypalattributes";) ."+". urlencode('https://uri.paypal.com/services/expresscheckout') . "&redirect_uri=" . urlencode($redirectUri),
-				PPOpenIdSession::getAuthorizationUrl($redirectUri, $scope, $clientId), "Failed case - default scope");
-
-	
-		$scope = array('openid');
-		$this->assertEquals($expectedBaseUrl . "?client_id=$clientId&response_type=code&scope=openid&redirect_uri=" . urlencode($redirectUri),
-				PPOpenIdSession::getAuthorizationUrl($redirectUri, $scope, $clientId), "Failed case - openid scope");
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testLoginWithCustomConfig() {
-	
-		$redirectUri = 'http://mywebsite.com';
-		$scope = array('this', 'that', 'and more');
-	
-		$expectedBaseUrl = "https://www.paypal.com/signin/authorize";;
-			
-		$this->assertEquals($expectedBaseUrl . "?client_id=DummyId&response_type=code&scope=this+that+and+more+openid&redirect_uri=" . urlencode($redirectUri),
-				PPOpenIdSession::getAuthorizationUrl($redirectUri, $scope, "DummyId", null, null, $this->context), "Failed case - custom config");
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testLogoutWithCustomConfig() {
-		
-		$redirectUri = 'http://mywebsite.com';
-		$idToken = 'abc';
-		
-		$expectedBaseUrl = "https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/endsession";;
-			
-		$this->assertEquals($expectedBaseUrl . "?id_token=$idToken&redirect_uri=" . urlencode($redirectUri) . "&logout=true",
-				PPOpenIdSession::getLogoutUrl($redirectUri, $idToken, $this->context), "Failed case - custom config");
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdTokeninfoTest.php b/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdTokeninfoTest.php
deleted file mode 100644
index dfbb55a5..00000000
--- a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdTokeninfoTest.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php 
-use PayPal\Auth\Openid\PPOpenIdTokeninfo;
-
-/**
- * Test class for PPOpenIdTokeninfo.
- *
- */
-class PPOpenIdTokeninfoTest extends \PHPUnit_Framework_TestCase {
-	
-	public $token;
-
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp() {
-		$this->token = new PPOpenIdTokeninfo();
-		$this->token->setAccessToken("Access token")
-					->setExpiresIn(900)
-					->setRefreshToken("Refresh token")
-					->setIdToken("id token")
-					->setScope("openid address")
-					->setTokenType("Bearer");
-	}
-	
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown()
-	{
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSerializationDeserialization() {				
-		$tokenCopy = new PPOpenIdTokeninfo();
-		$tokenCopy->fromJson($this->token->toJson());
-		
-		$this->assertEquals($this->token, $tokenCopy);
-	}
-	
-	/**
-	 * @t1est
-	 */
-	public function t1estOperations() {
-
-		$clientId = 'AQkquBDf1zctJOWGKWUEtKXm6qVhueUEMvXO_-MCI4DQQ4-LWvkDLIN2fGsd';
-		$clientSecret = 'ELtVxAjhT7cJimnz5-Nsx9k2reTKSVfErNQF-CmrwJgxRtylkGTKlU4RvrX';
-
-		$params = array(
-			'code' => '<FILLME>',
-			'redirect_uri' => 'https://devtools-paypal.com/',
-			'client_id' => $clientId,
-			'client_secret' => $clientSecret
-		);
-		$accessToken = PPOpenIdTokeninfo::createFromAuthorizationCode($params);
-		$this->assertNotNull($accessToken);
-
-		$params = array(
-			'refresh_token' => $accessToken->getRefreshToken(),
-			'client_id' => $clientId,
-			'client_secret' => $clientSecret
-		);
-		$accessToken = $accessToken->createFromRefreshToken($params);
-		$this->assertNotNull($accessToken);
-	}
-
-}
diff --git a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdUserinfoTest.php b/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdUserinfoTest.php
deleted file mode 100644
index 3e14c879..00000000
--- a/vendor/paypal/sdk-core-php/tests/Openid/PPOpenIdUserinfoTest.php
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-use PayPal\Auth\Openid\PPOpenIdUserinfo;
-/**
- * Test class for PPOpenIdUserinfo.
- *
- */
-class PPOpenIdUserinfoTest extends \PHPUnit_Framework_TestCase {
-	
-
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp()
-	{
-	}
-	
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown()
-	{
-	}
-	
-
-	/**
-	 * @test
-	 */
-	public function testSerializationDeserialization() {
-		$user = new PPOpenIdUserinfo();
-		$user->setAccountType("PERSONAL")->setAgeRange("20-30")->setBirthday("1970-01-01")
-			->setEmail("me@xxxxxxxxx")->setEmailVerified(true)
-			->setFamilyName("Doe")->setMiddleName("A")->setGivenName("John")
-			->setLocale("en-US")->setGender("male")->setName("John A Doe")
-			->setPayerId("A-XZASASA")->setPhoneNumber("1-408-111-1111")
-			->setPicture("http://gravatar.com/me.jpg";)
-			->setSub("me@xxxxxxxxx")->setUserId("userId")
-			->setVerified(true)->setVerifiedAccount(true)
-			->setZoneinfo("America/PST")->setLanguage('en_US')
-			->setAddress(PPOpenIdAddressTest::getTestData());
-		
-		$userCopy = new PPOpenIdUserinfo();
-		$userCopy->fromJson($user->toJSON());
-		
-		$this->assertEquals($user, $userCopy);
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testInvalidParamUserInfoCall() {
-		$this->setExpectedException('PayPal\Exception\PPConnectionException');
-		PPOpenIdUserinfo::getUserinfo(array('access_token' => 'accessToken'));
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/PPAPIServiceTest.php b/vendor/paypal/sdk-core-php/tests/PPAPIServiceTest.php
deleted file mode 100644
index d4694833..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPAPIServiceTest.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-require_once 'Mocks.php';
-
-use PayPal\Core\PPAPIService;
-use PayPal\Core\PPRequest;
-use PayPal\Common\PPApiContext;
-
-
-/**
- * Test class for PPAPIService.
- *
- */
-class PPAPIServiceTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var PPAPIService
-     */
-    protected $object;
-
-    private $config = array(
-    		'acct1.UserName' => 'jb-us-seller_api1.paypal.com'	,
-    		'acct1.Password' => 'WX4WTU3S8MY44S7F'	,
-    		'acct1.Signature' => 	'AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy'	,
-    		'acct1.AppId' => 	'APP-80W284485P519543T'	,
-    		'acct2.UserName' => 	'certuser_biz_api1.paypal.com'	,
-    		'acct2.Password' => 	'D6JNKKULHN3G5B8A'	,
-    		'acct2.CertPath' => 	'cert_key.pem'	,
-    		'acct2.AppId' => 	'APP-80W284485P519543T'	,
-    		'http.ConnectionTimeOut' => 	'30'	,
-    		'http.Retry' => 	'5'	,
-    		'service.RedirectURL' => 	'https://www.sandbox.paypal.com/webscr&cmd='	,
-    		'service.DevCentralURL' => 'https://developer.paypal.com'	,
-    		'service.EndPoint.IPN' => 'https://www.sandbox.paypal.com/cgi-bin/webscr'	,
-    		'service.EndPoint.Invoice' => 'https://svcs.sandbox.paypal.com/'	,
-    		'service.SandboxEmailAddress' => 'platform_sdk_seller@xxxxxxxxx',
-    		'log.FileName' => 'PayPal.log'	,
-    		'log.LogLevel' => 	'INFO'	,
-    		'log.LogEnabled' => 	'1'	,
-
-
-    );
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        $this->object = new PPAPIService(null, 'Invoice', 'NV', new PPApiContext($this->config), array());
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-
-    /**
-     * @test
-     */
-    public function testSetServiceName()
-    {
-    	$this->assertEquals('Invoice', $this->object->serviceName);
-    	$this->object->setServiceName('AdaptiveAccounts');
-        $this->assertEquals('AdaptiveAccounts', $this->object->serviceName);
-    }
-
-    /**
-     * @test
-     */
-    public function testMakeRequestWithoutHandlers() {
-    	$this->object->setServiceName('Invoice');
-    	$this->setExpectedException('PayPal\Exception\PPConnectionException');
-	$req = new PPRequest(new MockNVPClass(), "NV");
-	$this->object->makeRequest('GetInvoiceDetails', $req);
-    }
-
-    /**
-     * @test
-     */
-    public function testMakeRequestWithHandlers() {
-    	$this->object->addHandler(new MockHandler());
-	$req = new PPRequest(new MockNVPClass(), "NV");
-    	$ret = $this->object->makeRequest('GetInvoiceDetails', $req);
-
-    	$this->assertArrayHasKey('response', $ret);
-    	$this->assertContains("responseEnvelope.timestamp=", $ret['response']);
-    }
-}
diff --git a/vendor/paypal/sdk-core-php/tests/PPBaseServiceTest.php b/vendor/paypal/sdk-core-php/tests/PPBaseServiceTest.php
deleted file mode 100644
index eacc54a2..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPBaseServiceTest.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-
-require_once 'Mocks.php';
-
-use PayPal\Core\PPBaseService;
-/**
- * Test class for PPBaseService.
- *
- */
-class PPBaseServiceTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var PPBaseService
-     */
-    protected $object;
-
-    private $config = array(
-    		'acct1.UserName' => 'jb-us-seller_api1.paypal.com'	,
-    		'acct1.Password' => 'WX4WTU3S8MY44S7F'	,
-    		'acct1.Signature' => 	'AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy'	,
-    		'acct1.AppId' => 	'APP-80W284485P519543T'	,
-    		'acct2.UserName' => 	'certuser_biz_api1.paypal.com'	,
-    		'acct2.Password' => 	'D6JNKKULHN3G5B8A'	,
-    		'acct2.CertPath' => 	'cert_key.pem'	,
-    		'acct2.AppId' => 	'APP-80W284485P519543T'	,
-    		'http.ConnectionTimeOut' => 	'30'	,
-    		'http.Retry' => 	'5'	,
-    		'service.RedirectURL' => 	'https://www.sandbox.paypal.com/webscr&cmd='	,
-    		'service.DevCentralURL' => 'https://developer.paypal.com'	,
-    		'service.EndPoint.IPN' => 'https://www.sandbox.paypal.com/cgi-bin/webscr'	,
-    		'service.EndPoint.Invoice' => 'https://svcs.sandbox.paypal.com/'	,
-    		'service.SandboxEmailAddress' => 'platform_sdk_seller@xxxxxxxxx',
-    		'log.FileName' => 'PayPal.log'	,
-    		'log.LogLevel' => 	'INFO'	,
-    		'log.LogEnabled' => 	'1'	,
-    );
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        $this->object = new PPBaseService('Invoice', 'NV', $this->config, array(new MockHandler()));
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-
-    /**
-     * @test
-     */
-    public function testGetServiceName()
-    {
-        $this->assertEquals('Invoice', $this->object->getServiceName() );
-    }
-
-    /**
-     * @test
-     */
-    public function testMakeRequestWithHandlers() {
-        $req = new MockNVPClass();
-    	$ret = $this->object->call(null, 'GetInvoiceDetails', $req, null);
-    	$this->assertContains("responseEnvelope.timestamp=", $ret);
-    	$this->assertEquals($req->toNVPString(), $this->object->getLastRequest());
-    	$this->assertEquals($ret, $this->object->getLastResponse());
-
-    }
-
-    public function testMakeRequestWithServiceHandlerAndCallHandler()
-    {
-        $handler = $this->getMock('\PayPal\Handler\IPPHandler');
-        $handler
-            ->expects($this->once())
-            ->method('handle');
-
-        $req = new MockNVPClass();
-        $ret = $this->object->call(null, 'GetInvoiceDetails', $req, null, array($handler));
-    }
-
-    public function testMultipleCallsDoesntIncludePreviousCallHandlers()
-    {
-        $firstHandler = $this->getMock('\PayPal\Handler\IPPHandler');
-        $firstHandler
-            ->expects($this->once())
-            ->method('handle');
-
-        $req = new MockNVPClass();
-        $ret = $this->object->call(null, 'GetInvoiceDetails', $req, null, array($firstHandler));
-
-        $secondHandler = $this->getMock('\PayPal\Handler\IPPHandler');
-        $secondHandler
-            ->expects($this->once())
-            ->method('handle');
-
-        $req = new MockNVPClass();
-        $ret = $this->object->call(null, 'GetInvoiceDetails', $req, null, array($secondHandler));
-    }
-}
diff --git a/vendor/paypal/sdk-core-php/tests/PPBootStrap.php b/vendor/paypal/sdk-core-php/tests/PPBootStrap.php
deleted file mode 100644
index a4e4d8ad..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPBootStrap.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-/**
- * Please run composer update from the root folder to run test cases
- */
-
-if(file_exists(dirname(__FILE__) . '/../vendor/autoload.php')) {
-	define('PP_CONFIG_PATH', dirname(__FILE__));
-    require dirname(__FILE__) . '/../vendor/autoload.php';
-}
-require dirname(__FILE__) . '/Constants.php';
diff --git a/vendor/paypal/sdk-core-php/tests/PPCertificateCredentialTest.php b/vendor/paypal/sdk-core-php/tests/PPCertificateCredentialTest.php
deleted file mode 100644
index 6716e406..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPCertificateCredentialTest.php
+++ /dev/null
@@ -1,106 +0,0 @@
-<?php
-use PayPal\Auth\PPCertificateCredential;
-use PayPal\Exception\PPMissingCredentialException;
-/**
- * Test class for PPCertificateCredential.
- *
- */
-class PPCertificateCredentialTest extends \PHPUnit_Framework_TestCase
-{
-	/**
-	 * @var PPCertificateCredential
-	 */
-	protected $credential;
-
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp()
-	{
-		$this->credential = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037", "cacert.pem");
-		$this->credential->setApplicationId('APP-80W284485P519543T');
-	}
-
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown()
-	{
-	}
-
-	/**@test
-	 */
-	public function testValidateUname()
-	{
-		$this->setExpectedException('PayPal\Exception\PPMissingCredentialException');
-		$credUname = new PPCertificateCredential("", "1255077037", "cacert.pem");
-		$credUname->validate();
-		$setNotExpectedException('PPMissingCredentialException');
-		$credCorrect = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037", "cacert.pem");
-		$var = $credCorrect->validate();
-		$this->assertNull($var);
-	}
-	/**
-	 * @test
-	 */
-	public function testValidatePwd()
-	{
-		$this->setExpectedException('PayPal\Exception\PPMissingCredentialException');
-		$credpwd = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "", "cacert.pem");
-		$credpwd->validate();
-
-	}
-	/**
-	 * @test
-	 */
-	public function testValidateCertPath()
-	{
-		$this->setExpectedException('PayPal\Exception\PPMissingCredentialException');
-		$credCertPath = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037", "");
-		$credCertPath->validate();
-	}
-	/**
-	 * @test
-	 */
-	public function testGetAppId()
-	{
-		$credAppid = new PPCertificateCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037", "cacert.pem");
-		$credAppid->setApplicationId("APP-ID");
-		$this->assertEquals($credAppid->getApplicationId(), "APP-ID");
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGetUserName()
-	{
-		$this->assertEquals('platfo_1255077030_biz_api1.gmail.com', $this->credential->getUserName());
-
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGetPassword()
-	{
-		$this->assertEquals('1255077037', $this->credential->getPassword());
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGetCertificatePath()
-	{
-		$this->assertStringEndsWith(dirname(__FILE__). DIRECTORY_SEPARATOR .'cacert.pem', $this->credential->getCertificatePath());
-	}
-
-	/**@test
-	 */
-	public function testGetApplicationId()
-	{
-		$this->assertEquals('APP-80W284485P519543T', $this->credential->getApplicationId());
-	}
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPConfigManagerTest.php b/vendor/paypal/sdk-core-php/tests/PPConfigManagerTest.php
deleted file mode 100644
index 45bae0b9..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPConfigManagerTest.php
+++ /dev/null
@@ -1,98 +0,0 @@
-<?php
-use PayPal\Core\PPConfigManager;
-/**
- * Test class for PPConfigManager.
- *
- */
-class PPConfigManagerTest extends \PHPUnit_Framework_TestCase
-{
-	/**
-	 * @var PPConfigManager
-	 */
-	protected $object;
-
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp()
-	{
-		$this->object = PPConfigManager::getInstance();
-	}
-
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown()
-	{
-	}
-
-
-
-	/**
-	 * @test
-	 */
-	public function testGetInstance()
-	{
-		$instance = $this->object->getInstance();
-		$this->assertTrue($instance instanceof PPConfigManager);
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGet()
-	{
-		$ret = $this->object->get('acct1');
-		$this->assertContains('jb-us-seller_api1.paypal.com', $ret);
-		$this->assertArrayHasKey('acct1.UserName', $ret);
-		$this->assertTrue(sizeof($ret) == 7);
-	
-		$ret = $this->object->get('acct1.UserName');
-		$this->assertEquals('jb-us-seller_api1.paypal.com', $ret);
-
-		$ret = $this->object->get("acct");
-		$this->assertEquals(sizeof($ret), 10);
-
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGetIniPrefix()
-	{
-		$ret = $this->object->getIniPrefix();
-		$this->assertContains('acct1', $ret);
-		$this->assertEquals(sizeof($ret), 2);
-		
-		$ret = $this->object->getIniPrefix('jb-us-seller_api1.paypal.com');
-		$this->assertEquals('acct1', $ret);
-	}
-
-	/**
-	 * @test
-	 */
-	public function testMergeWithDefaults()
-	{
-		// Test file based config params and defaults
-		$config = PPConfigManager::getInstance()->getConfigWithDefaults(array());
-		$this->assertArrayHasKey('mode', $config, 'file config not read when no custom config is passed');
-		$this->assertEquals('sandbox', $config['mode']);
-		$this->assertEquals(60, $config['http.ConnectionTimeOut']);
-
-		// Test custom config params and defaults
-		$config = PPConfigManager::getInstance()->getConfigWithDefaults(array('mode' => 'custom'));
-		$this->assertArrayHasKey('mode', $config);
-		$this->assertEquals('custom', $config['mode']);
-		$this->assertEquals(30, $config['http.ConnectionTimeOut']);
-
-		// Test override for default connection params
-		$config = PPConfigManager::getInstance()->getConfigWithDefaults(
-				array('mode' => 'custom', 'http.ConnectionTimeOut' => 100));
-		$this->assertArrayHasKey('mode', $config);
-		$this->assertEquals('custom', $config['mode']);
-		$this->assertEquals(100, $config['http.ConnectionTimeOut']);
-	}
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPConfigurationExceptionTest.php b/vendor/paypal/sdk-core-php/tests/PPConfigurationExceptionTest.php
deleted file mode 100644
index 95249e47..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPConfigurationExceptionTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-use PayPal\Exception\PPConfigurationException;
-/**
- * Test class for PPConfigurationException.
- *
- */
-class PPConfigurationExceptionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var PPConfigurationException
-     */
-    protected $object;
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        $this->object = new PPConfigurationException('Test PPConfigurationException');
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-    public function testPPConfigurationException()
-    {
-    	$this->assertEquals('Test PPConfigurationException', $this->object->getMessage());
-    }
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPConnectionExceptionTest.php b/vendor/paypal/sdk-core-php/tests/PPConnectionExceptionTest.php
deleted file mode 100644
index f51892b8..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPConnectionExceptionTest.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-use PayPal\Exception\PPConnectionException;
-/**
- * Test class for PPConnectionException.
- *
- */
-class PPConnectionExceptionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var PPConnectionException
-     */
-    protected $object;
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        $this->object = new PPConnectionException('http://testURL', 'test message');
-        $this->object->setData('response payload for connection');
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-
-    /**
-     * @test
-     */
-    public function testGetUrl()
-    {
-    	$this->assertEquals('http://testURL', $this->object->getUrl());
-    }
-    
-    /**
-     * @test
-     */
- 	public function testGetData()
-    {
-    	$this->assertEquals('response payload for connection', $this->object->getData());    	
-    }
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPConnectionManagerTest.php b/vendor/paypal/sdk-core-php/tests/PPConnectionManagerTest.php
deleted file mode 100644
index 9db9701a..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPConnectionManagerTest.php
+++ /dev/null
@@ -1,76 +0,0 @@
-<?php
-use PayPal\Core\PPConnectionManager;
-use PayPal\Core\PPHttpConnection;
-use PayPal\Core\PPHttpConfig;
-/**
- * Test class for PPConnectionManager.
- *
- */
-class PPConnectionManagerTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var PPConnectionManager
-     */
-    protected $object;
-    
-    private $config = array(
-    		'acct1.UserName' => 'jb-us-seller_api1.paypal.com'	,
-    		'acct1.Password' => 'WX4WTU3S8MY44S7F'	,
-    		'acct1.Signature' => 	'AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy'	,
-    		'acct1.AppId' => 	'APP-80W284485P519543T'	,
-    		'acct2.UserName' => 	'certuser_biz_api1.paypal.com'	,
-    		'acct2.Password' => 	'D6JNKKULHN3G5B8A'	,
-    		'acct2.CertPath' => 	'cert_key.pem'	,
-    		'acct2.AppId' => 	'APP-80W284485P519543T'	,
-    		'http.ConnectionTimeOut' => 	'30'	,
-    		'http.Retry' => 	'5'	,
-    		'service.RedirectURL' => 	'https://www.sandbox.paypal.com/webscr&cmd='	,
-    		'service.DevCentralURL' => 'https://developer.paypal.com'	,
-    		'service.EndPoint.IPN' => 'https://www.sandbox.paypal.com/cgi-bin/webscr'	,
-    		'service.EndPoint.AdaptivePayments' => 'https://svcs.sandbox.paypal.com/'	,
-    		'service.SandboxEmailAddress' => 'platform_sdk_seller@xxxxxxxxx',
-    		'log.FileName' => 'PayPal.log'	,
-    		'log.LogLevel' => 	'INFO'	,
-    		'log.LogEnabled' => 	'1'	,
-    
-    
-    );
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        $this->object =  PPConnectionManager::getInstance();
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-
-    /**
-     * @test
-     */
-    public function testGetInstance()
-    {
-        $instance = $this->object->getInstance();
-		$this->assertTrue($instance instanceof PPConnectionManager);
-    }
-
-    /**
-     * @test
-     */
-    public function testGetConnection()
-    {
-        $conn = $this->object->getConnection(new PPHttpConfig("http://domain.com";), $this->config);
-        $this->assertNotNull($conn);
-        $this->assertTrue($conn instanceof PPHttpConnection);
-        $this->assertEquals("PayPal\Core\PPHttpConnection", get_class($conn));
-    }
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPCredentialManagerTest.php b/vendor/paypal/sdk-core-php/tests/PPCredentialManagerTest.php
deleted file mode 100644
index 4dc4e557..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPCredentialManagerTest.php
+++ /dev/null
@@ -1,153 +0,0 @@
-<?php
-use PayPal\Core\PPCredentialManager;
-/**
- * Test class for PPCredentialManager.
- *
- */
-class PPCredentialManagerTest extends \PHPUnit_Framework_TestCase
-{
-	/**
-	 * @var PPCredentialManager
-	 */
-	protected $object;
-
-	private $config = array(
-			'acct1.UserName' => 		'jb-us-seller_api1.paypal.com',
-			'acct1.Password' => 		'WX4WTU3S8MY44S7F',
-			'acct1.Signature' => 		'AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy',
-			'acct1.AppId' => 			'APP-80W284485P519543T',
-			'acct1.Subject' => 			'email@xxxxxxxxxx',
-			'acct2.UserName' => 		'certuser_biz_api1.paypal.com',
-			'acct2.Password' => 		'D6JNKKULHN3G5B8A',
-			'acct2.CertPath' => 		'cert_key.pem',
-			'acct2.AppId' => 			'APP-80W284485P519543T',
-			'acct3.ClientId' => 		'client-id',
-			'acct3.ClientSecret' => 	'client-secret',
-			'http.ConnectionTimeOut' => '30',
-			'http.Retry' => 			'5',
-			'service.RedirectURL' => 	'https://www.sandbox.paypal.com/webscr&cmd=',
-			'service.DevCentralURL' => 	'https://developer.paypal.com',
-			'service.EndPoint.IPN' => 	'https://www.sandbox.paypal.com/cgi-bin/webscr',
-			'service.EndPoint.AdaptivePayments' => 'https://svcs.sandbox.paypal.com/',
-			'service.SandboxEmailAddress' => 'platform_sdk_seller@xxxxxxxxx',
-			'log.FileName' => 			'PayPal.log',
-			'log.LogLevel' => 			'INFO',
-			'log.LogEnabled' => 		'1',
-	);
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp()
-	{
-		$this->object = PPCredentialManager::getInstance($this->config);
-	}
-
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown()
-	{
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGetInstance()
-	{
-		$instance = $this->object->getInstance($this->config);
-		$this->assertTrue($instance instanceof PPCredentialManager);
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGetSpecificCredentialObject()
-	{
-		$cred = $this->object->getCredentialObject('jb-us-seller_api1.paypal.com');
-		$this->assertNotNull($cred);
-		$this->assertEquals('jb-us-seller_api1.paypal.com', $cred->getUsername());
-		
-		$cred = $this->object->getCredentialObject('certuser_biz_api1.paypal.com');
-		$this->assertNotNull($cred);
-		$this->assertEquals('certuser_biz_api1.paypal.com', $cred->getUsername());
-		$this->assertStringEndsWith('cert_key.pem', $cred->getCertificatePath());		
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testGetInvalidCredentialObject()
-	{
-		$this->setExpectedException('PayPal\Exception\PPInvalidCredentialException');
-		$cred = $this->object->getCredentialObject('invalid_biz_api1.gmail.com');
-	}
-		
-	/**
-	 * @test
-	 */
-	public function testGetDefaultCredentialObject()
-	{
-		$cred = $this->object->getCredentialObject();
-		$this->assertEquals('jb-us-seller_api1.paypal.com', $cred->getUsername());
-		
-		// Test to see if default account for REST credentials works
-		// as expected
-		$o = PPCredentialManager::getInstance(array(
-			'mode' => 'sandbox',
-			'acct1.ClientId' => 		'client-id',
-			'acct1.ClientSecret' => 	'client-secret',
-			'acct2.UserName' => 		'certuser_biz_api1.paypal.com',
-			'acct2.Password' => 		'D6JNKKULHN3G5B8A',
-			'acct2.CertPath' => 		'cert_key.pem',
-			'acct2.AppId' => 		'APP-80W284485P519543T'
-		));
-		$cred = $o->getCredentialObject();
-		$this->assertEquals('client-id', $cred['clientId']);
-	}	
-	
-	/**
-	 * @test
-	 */
-	public function testGetPlatformCredentialObject()
-	{
-		$cred = $this->object->getCredentialObject();
-		$this->assertEquals('APP-80W284485P519543T', $cred->getApplicationId());
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGetSubjectCredentialObject() {
-		$cred = $this->object->getCredentialObject('jb-us-seller_api1.paypal.com');
-
-		$this->assertNotNull($cred);
-		$this->assertNotNull($cred->getThirdPartyAuthorization());
-		$this->assertEquals('PayPal\Auth\PPSubjectAuthorization', get_class($cred->getThirdPartyAuthorization()));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testGetRestCredentialObject() {
-		$cred = $this->object->getCredentialObject('acct3');
-	
-		$this->assertNotNull($cred);
-
-		$this->assertArrayHasKey('clientId', $cred);
-		$this->assertEquals($this->config['acct3.ClientId'], $cred['clientId']);
-
-		$this->assertArrayHasKey('clientSecret', $cred);
-		$this->assertEquals($this->config['acct3.ClientSecret'], $cred['clientSecret']);
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testInvalidConfiguration() {
-		$this->setExpectedException('PayPal\Exception\PPMissingCredentialException');
-		$o = PPCredentialManager::getInstance(array('mode' => 'sandbox'));
-	}
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPHttpConfigTest.php b/vendor/paypal/sdk-core-php/tests/PPHttpConfigTest.php
deleted file mode 100644
index 099e38c5..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPHttpConfigTest.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-use PayPal\Core\PPHttpConfig;
-/**
- * Test class for PPAPIService.
- *
- */
-class PPHttpConfigTest extends PHPUnit_Framework_TestCase
-{
-   
-    protected $object;
-    
-    private $config = array(
-		'http.ConnectionTimeOut' => '30',
-		'http.Retry' => '5'	,    		
-    );
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-
-    /**
-     * @test
-     */
-    public function testHeaderFunctions()
-    {  
-    	$o = new PPHttpConfig();
-    	$o->addHeader('key1', 'value1');
-    	$o->addHeader('key2', 'value');
-    	$o->addHeader('key2', 'overwritten');
-    	
-    	$this->assertEquals(2, count($o->getHeaders()));
-    	$this->assertEquals('overwritten', $o->getHeader('key2'));
-    	$this->assertNull($o->getHeader('key3'));
-    	
-    	$o = new PPHttpConfig();
-    	$o->addHeader('key1', 'value1');
-    	$o->addHeader('key2', 'value');
-    	$o->addHeader('key2', 'and more', false);
-    	 
-    	$this->assertEquals(2, count($o->getHeaders()));
-    	$this->assertEquals('value;and more', $o->getHeader('key2'));
-    	
-    	$o->removeHeader('key2');
-    	$this->assertEquals(1, count($o->getHeaders()));
-    	$this->assertNull($o->getHeader('key2'));
-    }
-    
-    /**
-     * @test
-     */
-    public function testCurlOpts()
-    {
-    	$o = new PPHttpConfig();
-    	$o->setCurlOptions(array('k' => 'v'));
-    	
-    	$curlOpts = $o->getCurlOptions();
-    	$this->assertEquals(1, count($curlOpts));
-    	$this->assertEquals('v', $curlOpts['k']);
-    }
-    
-    /**
-     * @test
-     */
-    public function testUserAgent()
-    {
-    	$ua = 'UAString';
-    	$o = new PPHttpConfig();
-    	$o->setUserAgent($ua);
-    	
-    	$curlOpts= $o->getCurlOptions();
-    	$this->assertEquals($ua, $curlOpts[CURLOPT_USERAGENT]);
-    }
-    
-    /**
-     * @test
-     */
-    public function testSSLOpts()
-    {
-    	$sslCert = '../cacert.pem';
-    	$sslPass = 'passPhrase';
-    	
-    	$o = new PPHttpConfig();
-    	$o->setSSLCert($sslCert, $sslPass);
-    	 
-    	$curlOpts= $o->getCurlOptions();
-    	$this->assertArrayHasKey(CURLOPT_SSLCERT, $curlOpts);
-    	$this->assertEquals($sslPass, $curlOpts[CURLOPT_SSLCERTPASSWD]);
-    }
-    
-    /**
-     * @test
-     */
-    public function testProxyOpts()
-    {
-    	$proxy = 'http://me:secret@hostname:8081';
-    	 
-    	$o = new PPHttpConfig();
-    	$o->setHttpProxy($proxy);
-    
-    	$curlOpts= $o->getCurlOptions();
-    	$this->assertEquals('hostname:8081', $curlOpts[CURLOPT_PROXY]);
-    	$this->assertEquals('me:secret', $curlOpts[CURLOPT_PROXYUSERPWD]);
-    	
-    	$this->setExpectedException('PayPal\Exception\PPConfigurationException');
-    	$o->setHttpProxy('invalid string');
-    }
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPIPNMessageTest.php b/vendor/paypal/sdk-core-php/tests/PPIPNMessageTest.php
deleted file mode 100644
index b30106c7..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPIPNMessageTest.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-use PayPal\IPN\PPIPNMessage;
-use PayPal\Core\PPConstants;
-/**
- * Test class for PPIPNMessage.
- *
- */
-class PPIPNMessageTest extends \PHPUnit_Framework_TestCase {
-	/**
-	 * @test
-	 */
-	
-	public function passGoodIPN() {
-		
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testIPNWithCustomConfig() {
-		$ipnData = "id=123&item=oreo's";
-		$ipn = new PPIPNMessage($ipnData, array('mode' => 'sandbox'));
-		$this->assertEquals(false, $ipn->validate());
-
-		$ipnData = "id=123&item=oreo's";
-		$ipn = new PPIPNMessage($ipnData, array('mode' => 'live'));
-		$this->assertEquals(false, $ipn->validate());
-
-		$ipnData = "id=123&item=oreo's";
-		$ipn = new PPIPNMessage($ipnData, array('service.EndPoint.IPN' => PPConstants::IPN_SANDBOX_ENDPOINT));
-		$this->assertEquals(false, $ipn->validate());
-
-		$this->setExpectedException('PayPal\Exception\PPConfigurationException');
-		$ipn = new PPIPNMessage($ipnData, array('mode' => 'invalid'));
-		$ipn->validate();
-
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGetTransactionData() {
-
-		$ipnData = "txn_data=notavailable";
-		$ipn = new PPIPNMessage($ipnData, array('mode' => 'sandbox'));
-		$this->assertEquals('', $ipn->getTransactionId());
-
-		$ipnData = "txn_id=123&transaction_type=pay";
-		$ipn = new PPIPNMessage($ipnData, array('mode' => 'sandbox'));
-		$this->assertEquals(123, $ipn->getTransactionId());
-		$this->assertEquals('pay', $ipn->getTransactionType());
-
-		$ipnData = "transaction[0].id=5&transaction[1].id=10";
-		$ipn = new PPIPNMessage($ipnData, array('mode' => 'sandbox'));
-		$this->assertEquals(array(5,10), $ipn->getTransactionId());
-
-		$ipnData = "txn_id=123&transaction[0].id=5&transaction[1].id=10";
-		$ipn = new PPIPNMessage($ipnData, array('mode' => 'sandbox'));
-		$this->assertEquals(123, $ipn->getTransactionId());
-	}
-	
-	/**
-	 * @test
-	 */
-	public function failOnBadIPN() {
-		$ipn = new PPIPNMessage();
-		$this->assertEquals(false, $ipn->validate());
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function processIPNWithArrayElements() {
-		$ipnData = 'transaction[0].id=6WM123443434&transaction[0].status=Completed&transaction[1].id=2F12129812A1&transaction[1].status=Pending';
-		$ipn = new PPIPNMessage($ipnData);
-		
-		$rawData = $ipn->getRawData();
-		$this->assertEquals(4, count($rawData));
-		$this->assertEquals('6WM123443434', $rawData['transaction[0].id']);
-	}
-	
-	/**
-	 * @test
-	 */	
-	public function processIPNWithSpecialCharacters() {
-		$ipnData = "description=Jake's store";
-		
-		ini_set('get_magic_quotes_gpc', true);
-		$ipn = new PPIPNMessage($ipnData);
-		$rawData = $ipn->getRawData();		
-		$this->assertEquals($rawData['description'], "Jake's store");
-		
-		ini_set('get_magic_quotes_gpc', false);
-		$ipn = new PPIPNMessage($ipnData);
-		$rawData = $ipn->getRawData();
-		$this->assertEquals($rawData['description'], "Jake's store");
-		$this->assertEquals($rawData['description'], "Jake's store");
-	}
-	
-}
diff --git a/vendor/paypal/sdk-core-php/tests/PPInvalidCredentialExceptionTest.php b/vendor/paypal/sdk-core-php/tests/PPInvalidCredentialExceptionTest.php
deleted file mode 100644
index 7ed7c5a9..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPInvalidCredentialExceptionTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-use PayPal\Exception\PPInvalidCredentialException;
-/**
- * Test class for PPInvalidCredentialException.
- *
- */
-class PPInvalidCredentialExceptionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var PPInvalidCredentialException
-     */
-    protected $object;
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        $this->object = new PPInvalidCredentialException;
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-
-    /**
-     * @test
-     */
-    public function testErrorMessage()
-    {
-      $msg = $this->object->errorMessage();
-      $this->assertContains('Error on line', $msg);
-    }
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPLoggingManagerTest.php b/vendor/paypal/sdk-core-php/tests/PPLoggingManagerTest.php
deleted file mode 100644
index 5285ed84..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPLoggingManagerTest.php
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-use PayPal\Core\PPLoggingManager;
-/**
- * Test class for PPLoggingManager.
- *
- */
-class PPLoggingManagerTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var PPLoggingManager
-     */
-    protected $object;
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        $this->object = new PPLoggingManager('InvoiceTest');
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-
-    /**
-     * @test
-     */
-    public function testError()
-    {
-    	 $this->object->error('Test Error Message');
-
-    }
-
-    /**
-     * @test
-     */
-    public function testWarning()
-    {
-         $this->object->warning('Test Warning Message');
-    }
-
-    /**
-     * @test
-     */
-    public function testInfo()
-    {
-        $this->object->info('Test info Message');
-    }
-
-    /**
-     * @test
-     */
-    public function testFine()
-    {
-       $this->object->fine('Test fine Message');
-    }
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPMessageTest.php b/vendor/paypal/sdk-core-php/tests/PPMessageTest.php
deleted file mode 100644
index 83ca2bc8..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPMessageTest.php
+++ /dev/null
@@ -1,441 +0,0 @@
-<?php
-use PayPal\Core\PPMessage;
-use PayPal\Core\PPUtils;
-
-class SimpleTestClass extends PPMessage {
-	/**
-	 *
-	 * @access public
-	 * @var string
-	 */
-	public $field1;
-	
-	/**
-	 *
-	 * @access public
-	 * @var string
-	 */
-	public $field2;
-}
-
-class SimpleContainerTestClass extends PPMessage {
-	
-	/**
-	 * @access public
-	 * @var string
-	 */
-	public $field1;
-	
-	/**
-	 * @array
-	 * @access public
-	 * @var string
-	 */
-	public $list1;
-	
-	/**
-	 * @array
-	 * @access public
-	 * @var SimpleTestClass
-	 */
-	public $list2;
-	
-	/**
-	 * @array
-	 * @access public
-	 * @var AttributeTestClass
-	 */
-	public $list3;
-	
-	/**
-	 * @access public
-	 * @var SimpleTestClass
-	 */
-	public $nestedField;
-}
-
-class AttributeTestClass extends PPMessage {
-	
-	/**
-	 *
-	 * @access public
-	 * @attribute
-	 * @var string
-	 */
-	public $attrib1;
-
-	/**
-	 *
-	 * @access public
-	 * @attribute
-	 * @var string
-	 */
-	public $attrib2;
-	
-	/**
-	 *
-	 * @access public
-	 * @value
-	 * @var string
-	 */
-	public $value;
-	
-}
-
-/**
- * @hasAttribute
- *
- */
-class AttributeContainerTestClass extends PPMessage {
-	/**
-	 *
-	 * @access public
-	 * @var AttributeTestClass
-	 */
-	public $member;
-	
-		/**
-	 * 
-     * @array
-	 * @access public
-	 * @var AttributeTestClass
-	 */ 
-	public $arrayMember;
-
-}
-
-
-/**
- * Test class for PPMessage.
- *
- */
-class PPMessageTest extends PHPUnit_Framework_TestCase
-{
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp() {
-		
-	}
-	
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown() {
-	}
-	
-	/**
-	 * @test
-	 */
-	public function attributeSerialization() {
-		$o = new AttributeTestClass();
-		$o->attrib1 = "abc";
-		$o->attrib2 = "random value";
-		$c = new AttributeContainerTestClass();
-		$c->member = $o;
-		
-		$this->assertEquals("attrib1=abc&attrib2=random+value", $o->toNVPString());		
-		$this->assertEquals("member.attrib1=abc&member.attrib2=random+value", $c->toNVPString());		
-		
-		$o->value = "value";
-		$this->assertEquals("attrib1=abc&attrib2=random+value&=value", $o->toNVPString());
-		$this->assertEquals("member.attrib1=abc&member.attrib2=random+value&member=value", $c->toNVPString());
-
-				
-	}
-	
-	/**
-	 * @test
-	 */
-	public function attributeSerializationInArrays() {
-		$o = new AttributeTestClass();
-		$o->attrib1 = "abc";
-		$o->attrib2 = "random value";
-		$o->value = "value";
-		
-		$c = new AttributeContainerTestClass();
-		$c->member = $o;
-		
-		$o = new AttributeTestClass();
-		$o->attrib1 = "abc";
-		$o->attrib2 = "random value";
-		$c->arrayMember = array($o);
-		
-		$this->assertEquals("member.attrib1=abc&member.attrib2=random+value&member=value&arrayMember(0).attrib1=abc&arrayMember(0).attrib2=random+value", 
-				$c->toNVPString());
-		
-		$c->arrayMember[0]->value = "value";
-		$this->assertEquals("member.attrib1=abc&member.attrib2=random+value&member=value&arrayMember(0).attrib1=abc&arrayMember(0).attrib2=random+value&arrayMember(0)=value",
-				$c->toNVPString());
-		
-	}
-	
-	/**
-	 * @test
-	 */
-	public function attributeDeserialization() {
-		
-		// Attributes and value present
-		$responseMap = array(
-			"member.attrib1" => "abc",
-			"member.attrib2" => "random+value",
-			"member" => "value"
-		);	
-		$c = new AttributeContainerTestClass();
-		$c->init($responseMap);
-		
-		$this->assertNotNull($c->member);
-		$this->assertEquals("abc", $c->member->attrib1);
-		$this->assertEquals("random value", $c->member->attrib2);
-		$this->assertEquals("value", $c->member->value);
-
-		// Only value present		
-		$responseMap = array(
-			"member" => "value"
-		);		
-		$c = new AttributeContainerTestClass();
-		$c->init($responseMap);
-		
-		$this->assertNotNull($c->member);
-		$this->assertEquals("value", $c->member->value);
-		
-
-		// Only attributes present		
-		$responseMap = array(
-			"member.attrib1" => "abc",
-			"member.attrib2" => "random+value"
-		);
-		$c = new AttributeContainerTestClass();
-		$c->init($responseMap);
-		
-		$this->assertNotNull($c->member);
-		$this->assertEquals("abc", $c->member->attrib1);
-		$this->assertEquals("random value", $c->member->attrib2);		
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	public function attributeDeserializationInArrays() {
-	
-		// Only value present. Single item in list
-		$responseMap = array(
-				"arrayMember(0)" => "value+1"
-		);
-		$c = new AttributeContainerTestClass();
-		$c->init($responseMap);
-		$this->assertNotNull($c->arrayMember[0]);
-		$this->assertEquals("value 1", $c->arrayMember[0]->value);
-		
-		
-		// Only attributes present. Single item in list
-		$responseMap = array(
-			"arrayMember(0).attrib1" => "abc",
-			"arrayMember(0).attrib2" => "random+value",				
-		);
-		$c = new AttributeContainerTestClass();
-		$c->init($responseMap);
-		
-		$this->assertNotNull($c->arrayMember[0]);
-		$this->assertEquals("abc", $c->arrayMember[0]->attrib1);
-		$this->assertEquals("random value", $c->arrayMember[0]->attrib2);		
-		
-		
-		// Attributes and value present. Mulitple items in list
-		$responseMap = array(
-			"arrayMember(0).attrib1" => "abc",
-			"arrayMember(0).attrib2" => "random+value",
-			"arrayMember(0)" => "value",
-			"arrayMember(0).attrib1" => "xyz",
-			"arrayMember(1).attrib1" => "attribute1"
-		);
-		$c->init($responseMap);
-
-		$this->assertEquals("value", $c->arrayMember[0]->value);
-		$this->assertEquals("xyz", $c->arrayMember[0]->attrib1);
-		$this->assertEquals("random value", $c->arrayMember[0]->attrib2);
-		
-		$this->assertEquals("attribute1", $c->arrayMember[1]->attrib1);
-		$this->assertNull($c->arrayMember[1]->value);
-		
-	}
-
-
-	/**
-	 * @test
-	 */
-	public function simpleSerialization() {
-		
-		$o = new SimpleTestClass();
-		$o->field1 = "fieldvalue1";
-		$o->field2 = "fieldvalue2";
-		
-		$this->assertEquals("field1=fieldvalue1&field2=fieldvalue2", $o->toNVPString(''));
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function simpleDeserialization() {
-	
-		$map = array(
-			"field1" => "fieldvalue1",
-			"field2" => "field+value2"
-		);
-		$o = new SimpleTestClass();
-		$o->init($map);
-	
-		$this->assertEquals("fieldvalue1", $o->field1);
-		$this->assertEquals("field value2", $o->field2);
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function nestedSerialization() {
-	
-		$o = new SimpleTestClass();
-		$o->field1 = "fieldvalue1";
-		$o->field2 = "fieldvalue2";
-	
-		$c = new SimpleContainerTestClass();
-		$c->nestedField = $o;
-		$c->field1 = "abc";
-	
-		$this->assertEquals("field1=abc&nestedField.field1=fieldvalue1&nestedField.field2=fieldvalue2", $c->toNVPString(''));
-	}
-
-	
-	/**
-	 * @test
-	 */
-	public function nestedDeserialization() {
-		
-		$map = array(
-			"field1" => "abc",
-			"nestedField.field1" => "fieldvalue1",
-			"nestedField.field2" => "field+value2"
-		);
-	
-		$c = new SimpleContainerTestClass();
-		$c->init($map);
-
-		$this->assertEquals("abc", $c->field1);
-		$this->assertEquals("fieldvalue1", $c->nestedField->field1);
-		$this->assertEquals("field value2", $c->nestedField->field2);
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function simpleListSerialization() {
-	
-		$c = new SimpleContainerTestClass();
-		$c->list1 = array('Array', "of", "some strings");
-		$c->field1 = "abc";
-	
-		$this->assertEquals("field1=abc&list1(0)=Array&list1(1)=of&list1(2)=some+strings", $c->toNVPString(''));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function simpleListDeserialization() {
-	
-		$map = array(
-			"field1" => "abc",
-			"list1(0)" => "Array",
-			"list1(1)" => "of",
-			"list1(2)" => "some+strings"
-		);
-				
-		$c = new SimpleContainerTestClass();
-		$c->init($map);
-	
-		$this->assertEquals("abc", $c->field1);
-		$this->assertEquals(3, count($c->list1));
-		$this->assertEquals("some strings", $c->list1[2]);
-	}
-	
-	/**
-	 * @test
-	 */
-	public function complexListSerialization() {
-	
-		$o1 = new SimpleTestClass();
-		$o1->field1 = "somevalue1";
-		$o1->field2 = "somevalue2";
-	
-		$o2 = new SimpleTestClass();
-		$o2->field1 = "another value1";
-		$o2->field2 = "anothervalue2";
-		
-		$c = new SimpleContainerTestClass();
-		$c->list2 = array($o1, $o2);
-	
-		$this->assertEquals("list2(0).field1=somevalue1&list2(0).field2=somevalue2&list2(1).field1=another+value1&list2(1).field2=anothervalue2", 
-				$c->toNVPString(''));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function complexListDeserialization() {
-		
-		$map = array(
-			"list2(0).field1" => "somevalue1",
-			"list2(0).field2" => "somevalue2",
-			"list2(1).field1" => "another+value1",
-			"list2(1).field2" => "anothervalue2"
-		);
-		
-		$c = new SimpleContainerTestClass();
-		$c->init($map);
-	
-		$this->assertEquals(2, count($c->list2));
-		$this->assertEquals("somevalue1", $c->list2[0]->field1);
-		$this->assertEquals("another value1", $c->list2[1]->field1);
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function serializeAndDeserialize() {
-		
-		$o1 = new AttributeTestClass();
-		$o1->value = "some value";
-		$o1->attrib1 = "someattrib";
-		
-		$o2 = new AttributeTestClass();
-		$o2->value = "some value2";
-		
-		$o3 = new AttributeTestClass();
-		$o3->attrib1 = "attribute";
-		$o3->value = "some value3";
-		
-		$c = new SimpleContainerTestClass();
-		$c->list3 = array($o1, $o2, $o3);
-		
-		$newC = new SimpleContainerTestClass();
-		$newC->init(PPUtils::nvpToMap($c->toNVPString(''))); //TODO: Mock nvpToMap
-		
-		$this->assertEquals($c, $newC);
-	}
-
-	/**
-	 * @test
-	 */
-	public function deserializeAndSerialize() {		
-		$nvpString = "list2(0).field1=somevalue1&list2(0).field2=somevalue2&list2(1).field1=another+value1&list2(1).field2=anothervalue2&list3(0).attrib1=somevalue1&list3(0).attrib2=somevalue2&list3(0)=value+field&list3(1).attrib1=another+value1&list3(2)=anothervalue2";
-		$newC = new SimpleContainerTestClass();
-		$newC->init(PPUtils::nvpToMap($nvpString)); //TODO: Mock nvpToMap		
-		$this->assertEquals($nvpString, $newC->toNVPString());
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/PPMissingCredentialExceptionTest.php b/vendor/paypal/sdk-core-php/tests/PPMissingCredentialExceptionTest.php
deleted file mode 100644
index ec8e7521..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPMissingCredentialExceptionTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-use PayPal\Exception\PPMissingCredentialException;
-
-/**
- * Test class for PPMissingCredentialException.
- *
- */
-class PPMissingCredentialExceptionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var PPMissingCredentialException
-     */
-    protected $object;
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        $this->object = new PPMissingCredentialException;
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-
-    /**
-     * @test
-     */
-    public function testErrorMessage()
-    {
-		$msg = $this->object->errorMessage();
-		$this->assertContains('Error on line', $msg);
-    }
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPModelTest.php b/vendor/paypal/sdk-core-php/tests/PPModelTest.php
deleted file mode 100644
index d0c9a878..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPModelTest.php
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php
-
-use PayPal\Common\PPModel;
-
-class SimpleModelTestClass extends PPModel {
-	/**
-	 *
-	 * @access public
-	 * @param string $field1
-	 */
-	public function setField1($field1) {
-		$this->field1 = $field1;
-		return $this;
-	}
-	
-	/**
-	 *
-	 * @access public
-	 * @return string
-	 */
-	public function getField1() {
-		return $this->field1;
-	}
-	
-	/**
-	 *
-	 * @access public
-	 * @param string $field2
-	 */
-	public function setField2($field2) {
-		$this->field2 = $field2;
-		return $this;
-	}
-	
-	/**
-	 *
-	 * @access public
-	 * @return string
-	 */
-	public function getField2() {
-		return $this->field2;
-	}
-	
-}
-
-
-
-class ContainerModelTestClass extends PPModel {
-
-	/**
-	 *
-	 * @access public
-	 * @param string $field1
-	 */
-	public function setField1($field1) {
-		$this->field1 = $field1;
-		return $this;
-	}
-
-	/**
-	 *
-	 * @access public
-	 * @return string
-	 */
-	public function getField1() {
-		return $this->field1;
-	}
-
-	/**
-	 *
-	 * @access public
-	 * @param SimpleModelTestClass $field1
-	 */
-	public function setNested1($nested1) {
-		$this->nested1 = $nested1;
-		return $this;
-	}
-
-	/**
-	 *
-	 * @access public
-	 * @return SimpleModelTestClass
-	 */
-	public function getNested1() {
-		return $this->nested1;
-	}
-
-
-}
-
-class ListModelTestClass extends PPModel {
-
-	/**
-	 *
-	 * @access public
-	 * @param string $list1
-	 */
-	public function setList1($list1) {
-		$this->list1 = $list1;
-	}
-
-	/**
-	 *
-	 * @access public
-	 * @return string
-	 */
-	public function getList1() {
-		return $this->list1;
-	}
-
-	/**
-	 *
-	 * @access public
-	 * @param SimpleModelTestClass $list2 array of SimpleModelTestClass
-	 */
-	public function setList2($list2) {
-		$this->list2 = $list2;
-		return $this;
-	}
-
-	/**
-	 *
-	 * @access public
-	 * @return SimpleModelTestClass array of SimpleModelTestClass
-	 */
-	public function getList2() {
-		return $this->list2;
-	}
-
-
-}
-
-/**
- * Test class for PPModel.
- *
- */
-class PPModelTest extends PHPUnit_Framework_TestCase
-{
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp() {
-		
-	}
-	
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown() {
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSimpleConversion() {
-		$o = new SimpleModelTestClass();
-		$o->setField1('value 1');
-		$o->setField2("value 2");
-		
-		$this->assertEquals('{"field1":"value 1","field2":"value 2"}', $o->toJSON());
-		
-		$oCopy = new SimpleModelTestClass();
-		$oCopy->fromJson($o->toJSON());		
-		$this->assertEquals($o, $oCopy);
-				
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSpecialChars() {
-		$o = new SimpleModelTestClass();
-		$o->setField1('value "1');
-		$o->setField2("value 2");
-	
-		$this->assertEquals('{"field1":"value \"1","field2":"value 2"}', $o->toJSON());
-	
-		$oCopy = new SimpleModelTestClass();
-		$oCopy->fromJson($o->toJSON());
-		$this->assertEquals($o, $oCopy);
-	
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function testNestedConversion() {
-		$child = new SimpleModelTestClass();
-		$child->setField1('value 1');
-		$child->setField2("value 2");
-		
-		$parent = new ContainerModelTestClass();
-		$parent->setField1("parent");
-		$parent->setNested1($child);
-	
-		$this->assertEquals('{"field1":"parent","nested1":{"field1":"value 1","field2":"value 2"}}', 
-				$parent->toJSON());
-	
-		$parentCopy = new ContainerModelTestClass();
-		$parentCopy->fromJson($parent->toJSON());
-		$this->assertEquals($parent, $parentCopy);
-	
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function testListConversion() {
-		$c1 = new SimpleModelTestClass();
-		$c1->setField1("a")->setField2('value');
-		
-		$c2 = new SimpleModelTestClass();
-		$c1->setField1("another")->setField2('object');
-		
-		$parent = new ListModelTestClass();
-		$parent->setList1(array('simple', 'list', 'with', 'integer', 'keys'));
-		$parent->setList2(array($c1, $c2));
-		
-		$parentCopy = new ListModelTestClass();
-		$parentCopy->fromJson($parent->toJSON());
-		$this->assertEquals($parent, $parentCopy);
-	
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/PPSignatureCredentialTest.php b/vendor/paypal/sdk-core-php/tests/PPSignatureCredentialTest.php
deleted file mode 100644
index 2d48a9dd..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPSignatureCredentialTest.php
+++ /dev/null
@@ -1,103 +0,0 @@
-<?php
-use PayPal\Auth\PPSignatureCredential;
-use PayPal\Auth\PPTokenAuthorization;
-use PayPal\Auth\PPSubjectAuthorization;
-/**
- * Test class for PPSignatureCredential.
- *
- */
-class PPSignatureCredentialTest extends PHPUnit_Framework_TestCase
-{
-	/**
-	 * @var PPSignatureCredential
-	 */
-	protected $merchantCredential;
-
-	protected $platformCredential;
-
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp()
-	{
-		$this->merchantCredential = new PPSignatureCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037","Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf");
-
-		$this->platformCredential = new PPSignatureCredential("platfo_1255077030_biz_api1.gmail.com", "1255077037","Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf");
-		$this->platformCredential->setApplicationId("APP-80W284485P519543T");
-	}
-
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown()
-	{
-	}
-
-	/**
-	 * @test
-	 */
-	public function testValidateUsername()
-	{
-		$this->setExpectedException('PayPal\Exception\PPMissingCredentialException');
-		$cred = new PPSignatureCredential("", "1255077037","Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf");
-		$cred->validate();
-	}
-
-	/**
-	 * @test
-	 */
-	public function testValidatepwd()
-	{
-		$this->setExpectedException('PayPal\Exception\PPMissingCredentialException');
-		$cred = new PPSignatureCredential("platfo_1255077030_biz_api1.gmail.com", "","Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf");
-		$cred->validate();
-	}
-
-	/**
-	 * @test
-	 */
-	public function testGetSignature()
-	{
-		$this->assertEquals('Abg0gYcQyxQvnf2HDJkKtA-p6pqhA1k-KTYE0Gcy1diujFio4io5Vqjf', $this->merchantCredential->getSignature());
-	}
-	/**
-	 * @test
-	 */
-	public function testGetUserName()
-	{
-		$this->assertEquals('platfo_1255077030_biz_api1.gmail.com', $this->merchantCredential->getUserName());
-	}
-	/**
-	 * @test
-	 */
-	public function testGetPassword()
-	{
-		$this->assertEquals('1255077037', $this->merchantCredential->getPassword());
-	}
-	/**
-	 * @test
-	 */
-	public function testGetAppId()
-	{
-		$this->assertEquals('APP-80W284485P519543T', $this->platformCredential->getApplicationId());
-	}
-	
-	public function testThirdPartyAuthorization() {
-		$authorizerEmail = "merchant@xxxxxxxxxx";
-		$thirdPartyAuth = new PPSubjectAuthorization($authorizerEmail);		
-		$cred = new PPSignatureCredential("username", "pwd", "signature");
-		$cred->setThirdPartyAuthorization($thirdPartyAuth);		
-		$this->assertEquals($cred->getThirdPartyAuthorization()->getSubject(), $authorizerEmail);
-		
-		$accessToken = "atoken";
-		$tokenSecret = "asecret";
-		$thirdPartyAuth = new PPTokenAuthorization($accessToken, $tokenSecret);
-		$cred->setThirdPartyAuthorization($thirdPartyAuth);
-		$this->assertEquals($cred->getThirdPartyAuthorization()->getAccessToken(), $accessToken);
-		$this->assertEquals($cred->getThirdPartyAuthorization()->getTokenSecret(), $tokenSecret);
-	}
-
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPTransformerException.php b/vendor/paypal/sdk-core-php/tests/PPTransformerException.php
deleted file mode 100644
index 7ad630e3..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPTransformerException.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-namespace PayPal\Exception;
-class PPTransformerException extends \Exception{
-
-	public function __construct($message = null, $code = 0) {
-		parent::__construct($message, $code);
-	}
-
-	public function errorMessage()
-	{
-		$errorMsg = 'Error on line '.$this->getLine().' in '.$this->getFile()
-		.': <b>'.$this->getMessage().'</b>';
-
-		return $errorMsg;
-	}
-
-}
diff --git a/vendor/paypal/sdk-core-php/tests/PPUtilsTest.php b/vendor/paypal/sdk-core-php/tests/PPUtilsTest.php
deleted file mode 100644
index f94f019a..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPUtilsTest.php
+++ /dev/null
@@ -1,204 +0,0 @@
-<?php
-use PayPal\Core\PPUtils;
-/**
- * Test class for PPUtils.
- *
- */
-class PPUtilsTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @var PPUtils
-     */
-    protected $object;
-
-    /**
-     * Sets up the fixture, for example, opens a network connection.
-     * This method is called before a test is executed.
-     */
-    protected function setUp()
-    {
-        $this->object = new PPUtils();
-    }
-
-    /**
-     * Tears down the fixture, for example, closes a network connection.
-     * This method is called after a test is executed.
-     */
-    protected function tearDown()
-    {
-    }
-
-    /**
-     * @test
-     */
-    public function testNvpToMap()
-    {
-       $arr = $this->object->nvpToMap('requestEnvelope.detailLevel=ReturnAll&requestEnvelope.errorLanguage=en_US&invoice.merchantEmail=jb-us-seller1@xxxxxxxxxx&invoice.payerEmail=jbui-us-personal1@xxxxxxxxxx&invoice.items[0].name=product1&invoice.items[0].quantity=10.0&invoice.items[0].unitPrice=1.2&invoice.currencyCode=USD&invoice.paymentTerms=DueOnReceipt');
-       $this->assertArrayHasKey('requestEnvelope.detailLevel', $arr);
-       $this->assertArrayHasKey('requestEnvelope.errorLanguage', $arr);
-       $this->assertEquals(is_array($arr),true);
-    }
-
-    /**
-     * @test
-     */
-    public function testArray_match_key()
-    {
-	$arr = array('key1' => 'somevalue', 'key2' => 'someothervalue');
-	$this->assertEquals(true, PPUtils::array_match_key($arr, "key"));
-		
-		$arr = array('key1' => 'somevalue', 'key2' => 'someothervalue');
-		$this->assertEquals(false, PPUtils::array_match_key($arr, "prefix"));
-		
-		$arr = unserialize('a:10:{s:26:"responseEnvelope.timestamp";s:35:"2011-04-19T04%3A32%3A29.469-07%3A00";s:20:"responseEnvelope.ack";s:7:"Failure";s:30:"responseEnvelope.correlationId";s:13:"c2514f258ddf1";s:22:"responseEnvelope.build";s:7:"1829457";s:16:"error(0).errorId";s:6:"580027";s:15:"error(0).domain";s:8:"PLATFORM";s:17:"error(0).severity";s:5:"Error";s:17:"error(0).category";s:11:"Application";s:16:"error(0).message";s:44:"Prohibited+request+parameter%3A+businessInfo";s:21:"error(0).parameter(0)";s:12:"businessInfo";}');
-		$this->assertEquals(true, PPUtils::array_match_key($arr, "error(0)."));
-    }
-
-    /**
-     * @test
-     */
-    public function testGetLocalIPAddress()
-    {
-        $ip = $this->object->getLocalIPAddress();
-        $this->assertEquals($ip, filter_var($ip, FILTER_VALIDATE_IP));
-        
-        $_SERVER['SERVER_ADDR'] = '127.0.0.1';
-        $ip = $this->object->getLocalIPAddress();
-        $this->assertEquals($ip, filter_var($ip, FILTER_VALIDATE_IP));
-    }
-
-    /**
-     * @test
-     */
-    public function testValidXmlToArray() {
-
-    	$requestPayload = '<SetExpressCheckoutResponse xmlns="urn:ebay:api:PayPalAPI"><Timestamp xmlns="urn:ebay:apis:eBLBaseComponents">2013-07-23T05:51:03Z</Timestamp><Ack xmlns="urn:ebay:apis:eBLBaseComponents"><Nested>Success</Nested></Ack><CorrelationID xmlns="urn:ebay:apis:eBLBaseComponents">1cf4475882d05</CorrelationID><Version xmlns="urn:ebay:apis:eBLBaseComponents">94.0</Version><Build xmlns="urn:ebay:apis:eBLBaseComponents">6941909</Build><Token xsi:type="ebl:ExpressCheckoutTokenType" attrib="someValue">EC-6KT84265CE1992425</Token></SetExpressCheckoutResponse>';
-
-    	$xml = '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:cc="urn:ebay:apis:CoreComponentTypes" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"; xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"; xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext"; xmlns:ed="urn:ebay:apis:EnhancedDataTypes" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" xmlns:ns="urn:ebay:api:PayPalAPI">'
-		. '<SOAP-ENV:Header><Security xmlns="http://schemas.xmlsoap.org/ws/2002/12/secext"; xsi:type="wsse:SecurityType"></Security><RequesterCredentials xmlns="urn:ebay:api:PayPalAPI" xsi:type="ebl:CustomSecurityHeaderType"><Credentials xmlns="urn:ebay:apis:eBLBaseComponents" xsi:type="ebl:UserIdPasswordType"><Username xsi:type="xs:string"></Username><Password xsi:type="xs:string"></Password><Signature xsi:type="xs:string"></Signature><Subject xsi:type="xs:string"></Subject></Credentials></RequesterCredentials></SOAP-ENV:Header>'
-		. '<SOAP-ENV:Body id="_0">'
-		. $requestPayload
-		. '</SOAP-ENV:Body></SOAP-ENV:Envelope>';
-
-    	$ret = PPUtils::xmlToArray($xml);
-    	
-        $this->assertEquals("SetExpressCheckoutResponse", $ret[0]['name']);
-
-        $ret = $ret[0]['children'];
-    	$this->assertEquals(6, count($ret));
-    	
-	// Token node
-    	$this->assertFalse(array_key_exists('children', $ret[5]));
-    	$this->assertEquals("Token", $ret[5]['name']);
-    	$this->assertEquals("EC-6KT84265CE1992425", $ret[5]['text']);
-    	
-    	$this->assertEquals(1, count($ret[5]['attributes']));
-    	$k = key($ret[5]['attributes']);
-    	$this->assertEquals("attrib", $k);
-    	$this->assertEquals("someValue", $ret[5]['attributes'][$k]);
-    	
-    	// Ack Node
-    	$this->assertEquals("Ack", $ret[1]['name']);
-    	$this->assertEquals(1, count($ret[1]['children']));
-    	$this->assertEquals("Nested", $ret[1]['children'][0]['name']);
-    	$this->assertEquals("Success", $ret[1]['children'][0]['text']);
-
-    }
-
-    /**
-	 * @test
-	 */
-	 function testSoapFaultXml() {
-		$xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";><soapenv:Header/><soapenv:Body> <soapenv:Fault xmlns:axis2ns237961="http://schemas.xmlsoap.org/soap/envelope/";><faultcode>axis2ns237961:Server</faultcode><faultstring>Authentication failed. API credentials are incorrect.</faultstring><detail><ns3:FaultMessage xmlns:ns3="http://svcs.paypal.com/types/common"; xmlns:ns2="http://svcs.paypal.com/types/ap";><responseEnvelope><timestamp>2013-09-03T04:36:14.931-07:00</timestamp><ack>Failure</ack><correlationId>ebeb480862a99</correlationId><build>6941298</build></responseEnvelope><error><errorId>520003</errorId><domain>PLATFORM</domain><subdomain>Application</subdomain><severity>Error</severity><category>Application</category><message>Authentication failed. API credentials are incorrect.</message></error></ns3:FaultMessage></detail></soapenv:Fault></soapenv:Body></soapenv:Envelope>';
-
-		$ret = PPUtils::xmlToArray($xml);
-		$this->assertEquals("soapenv:Fault", $ret[0]['name']);
-	 }
-
-    /**
-     * @test
-     */
-    public function testGetProperties() {
-    	$o = new MockReflectionTestType();
-    	$ret = PPUtils::objectProperties($o);
-
-    	//TODO: Check count
-    	$this->assertEquals(6, count($ret), "Not all properties have been read");
-    	$this->assertEquals('fieldWithSpecialChar', $ret['fieldwith-specialchar']);
-
-    }
-    
-    /**
-     * @test
-     */
-    public function testGetPropertyType() {
-
-    	$this->assertEquals('string', PPUtils::propertyType('MockReflectionTestType', 'noAnnotations'));
-    	$this->assertEquals('SomeType', PPUtils::propertyType('MockReflectionTestType', 'value'));
-
-    	$this->assertEquals(true, PPUtils::isPropertyArray('MockReflectionTestType', 'arrayMember'));
-    	$this->assertEquals(false, PPUtils::isPropertyArray('MockReflectionTestType', 'value'));
-    }
-    
-    /**
-     * @test
-     */
-    public function testGetAttributeType() {
-    	$this->assertEquals(true, PPUtils::isAttributeProperty('MockReflectionTestType', 'currencyID'));
-    	$this->assertEquals(false, PPUtils::isAttributeProperty('MockReflectionTestType', 'value'));
-    	$this->assertEquals(false, PPUtils::isAttributeProperty('MockReflectionTestType', 'noAnnotations'));
-    }
-}
-
-/**
- * @hasAttribute
- * On requests, you must set the currencyID attribute to one of
- * the three-character currency codes for any of the supported
- * PayPal currencies. Limitations: Must not exceed $10,000 USD
- * in any currency. No currency symbol. Decimal separator must
- * be a period (.), and the thousands separator must be a comma
- * (,).
- */
-class MockReflectionTestType {
-
-	/**
-	 *
-	 * @access public
-	 * @namespace cc
-	 * @attribute
-	 * @var string
-	 */
-	public $currencyID;
-
-	/**
-	 *
-	 * @access public
-	 * @namespace cc
-	 * @value
-	 * @var SomeType
-	 */
-	public $value;
-
-	/**
-	 * @name fieldWith-SpecialChar
-	 * @access public
-	 * @var string
-	 */
-	public $fieldWithSpecialChar;
-
-	/**
-	 * @access public
-	 * @array
-	 * @var string
-	 */
-	public $arrayMember;
-
-	/**
-	 *
-	 */
-	public $noAnnotations;
-
-
-
-}
-?>
diff --git a/vendor/paypal/sdk-core-php/tests/PPXMLMessageTest.php b/vendor/paypal/sdk-core-php/tests/PPXMLMessageTest.php
deleted file mode 100644
index 7fe319e5..00000000
--- a/vendor/paypal/sdk-core-php/tests/PPXMLMessageTest.php
+++ /dev/null
@@ -1,596 +0,0 @@
-<?php
-use PayPal\Core\PPXmlFaultMessage;
-use PayPal\Core\PPXmlMessage;
-use PayPal\Core\PPUtils;
-
-class SimpleXMLTestClass extends PPXmlMessage {
-	/**
-	 *
-	 * @access public
-	 * @namespace ebl
-	 * @var string
-	 */
-	public $field1;
-	
-	/**
-	 *
-	 * @access public
-	 * @namespace ebl
-	 * @var string
-	 */
-	public $field2;
-	
-	/**
-	 * @name fieldWith-FunnyName
-	 * @access public
-	 * @namespace ebl
-	 * @var string
-	 */
-	public $fieldWithFunnyName;
-}
-
-class SimpleContainerXMLTestClass extends PPXmlMessage {
-	
-	/**
-	 * @access public
-	 * @namespace ebl
-	 * @var string
-	 */
-	public $field1;
-	
-	/**
-	 * @array
-	 * @access public
-	 * @namespace ebl
-	 * @var string
-	 */
-	public $list1;
-	
-	/**
-	 * @array
-	 * @access public
-	 * @namespace ebl
-	 * @var SimpleXMLTestClass
-	 */
-	public $list2;
-	
-	/**
-	 * @array
-	 * @access public
-	 * @namespace ebl
-	 * @var AttributeXMLTestClass
-	 */
-	public $list3;
-	
-	/**
-	 * @access public
-	 * @namespace ebl
-	 * @var SimpleXMLTestClass
-	 */
-	public $nestedField;
-}
-
-class AttributeXMLTestClass extends PPXmlMessage {
-	
-	/**
-	 *
-	 * @access public
-	 * @attribute
-	 * @var string
-	 */
-	public $attrib1;
-
-	/**
-	 *
-	 * @access public
-	 * @attribute
-	 * @var string
-	 */
-	public $attrib2;
-	
-	/**
-	 *
-	 * @access public
-	 * @namespace ebl
-	 * @value
-	 * @var string
-	 */
-	public $value;
-	
-}
-
-class AttributeComplexXMLTestClass extends PPXmlMessage {
-	
-	/**
-	 *
-	 * @access public
-	 * @attribute
-	 * @var string
-	 */
-	public $attrib1;
-
-	/**
-	 *
-	 * @access public
-	 * @attribute
-	 * @var string
-	 */
-	public $attrib2;
-	
-	/**
-	 *
-	 * @access public
-	 * @var string
-	 */
-	public $value1;
-	
-	/**
-	 *
-	 * @access public
-	 * @var string
-	 */
-	public $value2;
-	
-}
-
-
-/**
- * @hasAttribute
- *
- */
-class AttributeContainerXMLTestClass extends PPXmlMessage {
-	/**
-	 *
-	 * @access public
-	 * @namespace ebl
-	 * @var AttributeXMLTestClass
-	 */
-	public $member;
-	
-		/**
-	 * 
-     * @array
-	 * @access public
-	 * @namespace ebl
-	 * @var AttributeXMLTestClass
-	 */ 
-	public $arrayMember;
-
-}
-
-class FaultDetailsType extends PPXmlMessage {
-
-    /**
-     * @access public
-     * @namespace ebl
-     * @var string
-     */
-    public $ErrorCode;
-
-    /**
-     * @access public
-     * @namespace ebl
-     * @var string
-     */
-    public $Severity;
-
-    /**
-     *
-     * @access public
-     * @namespace ebl
-     * @var string
-     */
-    public $DetailedMessage;
-
-
-}
-
-class FaultMessage extends PPXmlFaultMessage {
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var ResponseEnvelope
-     */
-    public $responseEnvelope;
-
-    /**
-     *
-     * @array
-     * @access public
-     * @namespace
-     * @var ErrorData
-     */
-    public $error;
-
-}
-
-class ResponseEnvelope extends PPXmlMessage {
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $timestamp;
-
-    /**
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $ack;
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $correlationId;
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $build;
-}
-
-class ErrorData extends PPXmlMessage {
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var Long
-     */
-    public $errorId;
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $domain;
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $subdomain;
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $severity;
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $category;
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $message;
-
-    /**
-     *
-     * @access public
-     * @namespace
-     * @var string
-     */
-    public $exceptionId;
-
-    /**
-     *
-     * @array
-     * @access public
-     * @namespace
-     * @var ErrorParameter
-     */
-    public $parameter;
-}
-
-class ErrorParameter extends PPXmlMessage {
-
-    /**
-     *
-     * @access public
-     * @namespace common
-     * @attribute
-     * @var string
-     */
-    public $name;
-
-    /**
-     *
-     * @access public
-     * @value
-     * @var string
-     */
-    public $value;
-}
-
-/**
- * Test class for PPXmlMessage.
- *
- */
-class PPXmlMessageTest extends PHPUnit_Framework_TestCase
-{
-	/**
-	 * Sets up the fixture, for example, opens a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected function setUp() {
-		
-	}
-	
-	/**
-	 * Tears down the fixture, for example, closes a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected function tearDown() {
-	}
-	
-	
-	private function wrapInSoapMessage($str) {
-		$str = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"; xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; xmlns:xsd="http://www.w3.org/2001/XMLSchema"; xmlns:xs="http://www.w3.org/2001/XMLSchema"; xmlns:cc="urn:ebay:apis:CoreComponentTypes" xmlns:wsu="http://schemas.xmlsoap.org/ws/2002/07/utility"; xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:ds="http://www.w3.org/2000/09/xmldsig#"; xmlns:wsse="http://schemas.xmlsoap.org/ws/2002/12/secext"; xmlns:ed="urn:ebay:apis:EnhancedDataTypes" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" xmlns:ns="urn:ebay:api:PayPalAPI">'
-			. '<SOAP-ENV:Body id="_0">'
-    		. $str
-    		. '</SOAP-ENV:Body></SOAP-ENV:Envelope>';
-		return PPUtils::xmlToArray($str);
-	}
-
-	/**
-	 * @test
-	 */
-	public function testToSOAP() {
-		$o = new SimpleXMLTestClass();
-		$o->field1 = "fieldvalue1";
-		$o->field2 = "fieldvalue2";
-		
-		$this->assertEquals($o->toXMLString(), $o->toSOAP());
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSimpleSerialization() {
-		
-		$o = new SimpleXMLTestClass();
-		$o->field1 = "fieldvalue1";
-		$o->field2 = "fieldvalue2";
-
-		$this->assertEquals("<ebl:field1>fieldvalue1</ebl:field1><ebl:field2>fieldvalue2</ebl:field2>", $o->toXMLString(''));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSpecialCharsSerialization() {
-	
-		$o = new SimpleXMLTestClass();
-		$o->field1 = "fieldvalue1";
-		$o->fieldWithFunnyName = "fieldvalue2";
-	
-		$this->assertEquals("<ebl:field1>fieldvalue1</ebl:field1><ebl:fieldWith-FunnyName>fieldvalue2</ebl:fieldWith-FunnyName>", $o->toXMLString(''));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testNestedSerialization() {
-	
-		$child = new SimpleXMLTestClass();
-		$child->field1 = "fieldvalue1";
-		$child->field2 = "fieldvalue2";
-		
-		$parent = new SimpleContainerXMLTestClass();
-		$parent->field1 = 'parent';
-		$parent->nestedField = $child;
-		
-		
-		$this->assertEquals("<ebl:field1>parent</ebl:field1><ebl:nestedField><ebl:field1>fieldvalue1</ebl:field1><ebl:field2>fieldvalue2</ebl:field2></ebl:nestedField>", $parent->toXMLString(''));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testListSerialization() {	
-		
-		$parent = new SimpleContainerXMLTestClass();
-		$parent->list1 = array('i', 'am', 'an array');	
-		
-		$this->assertEquals('<ebl:list1>i</ebl:list1><ebl:list1>am</ebl:list1><ebl:list1>an array</ebl:list1>', $parent->toXMLString(''));
-		
-		
-		$child1 = new SimpleXMLTestClass();
-		$child1->field1 = "c1v1";
-		$child1->field2 = "c1v2";
-		$child2 = new SimpleXMLTestClass();
-		$child2->field1 = "c2v1";
-		$child2->field2 = "c2v2";
-		$parent->list2 = array($child1, $child2);
-		
-		$this->assertEquals('<ebl:list1>i</ebl:list1><ebl:list1>am</ebl:list1><ebl:list1>an array</ebl:list1>'
-				. '<ebl:list2><ebl:field1>c1v1</ebl:field1><ebl:field2>c1v2</ebl:field2></ebl:list2>'
-				. '<ebl:list2><ebl:field1>c2v1</ebl:field1><ebl:field2>c2v2</ebl:field2></ebl:list2>'
-			, $parent->toXMLString(''));
-	}
-
-	/**
-	 * @test
-	 */
-	public function testAttributeSerialization() {
-	
-		$o = new AttributeXMLTestClass();
-		$o->attrib1 = "a value";
-		$o->attrib2 = "another value";
-		$o->value = "value";
-		
-		$this->assertEquals('attrib1="a value" attrib2="another value">value', $o->toXMLString(''));
-		
-	
-		$o = new AttributeXMLTestClass();		
-		$o->value = "value";
-		
-		$this->assertEquals(' >value', $o->toXMLString(''));
-		
-		$o = new AttributeXMLTestClass();
-		$o->attrib1 = "a value";
-		$o->attrib2 = "another value";
-		
-		$this->assertEquals('attrib1="a value" attrib2="another value">', $o->toXMLString(''));
-
-		$o = new AttributeXMLTestClass();
-		$o->attrib1 = "a value";
-		$o->attrib2 = "another value";
-		$o->value = "value";
-		
-		$this->assertEquals('attrib1="a value" attrib2="another value">value', $o->toXMLString());
-		
-		$o = new AttributeComplexXMLTestClass();
-		$o->attrib1 = "a value";
-		$o->attrib2 = "another value";
-		$o->value1 = "value1";
-		$o->value2 = "value2";
-		
-		$this->assertEquals('attrib1="a value" attrib2="another value"><ebl:value1>value1</ebl:value1><ebl:value2>value2</ebl:value2>', $o->toXMLString());
-
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSimpleDeserialization() {
-		
-		$str = $this->wrapInSoapMessage("<SimpleXMLTestClass><field1>fieldvalue1</field1><field2>0</field2></SimpleXMLTestClass>");
-		
-		$o = new SimpleXMLTestClass();
-		$o->init($str);
-		
-		$this->assertEquals("fieldvalue1", $o->field1);
-		$this->assertSame("0", $o->field2);
-
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSpecialCharsDeserialization() {
-	
-		$str = $this->wrapInSoapMessage("<SimpleXMLTestClass><field1>fieldvalue1</field1><fieldWith-FunnyName>fieldvalue2</fieldWith-FunnyName></SimpleXMLTestClass>");
-		$o = new SimpleXMLTestClass();
-		$o->init($str);
-		
-		$this->assertEquals('fieldvalue1', $o->field1);
-		$this->assertEquals('fieldvalue2', $o->fieldWithFunnyName);
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testAttributeDeserialization() {
-	
-		$str = $this->wrapInSoapMessage('<AttributeContainerXMLTestClass><member attrib1="a value" attrib2="another value">value</member></AttributeContainerXMLTestClass>');
-		$o = new AttributeContainerXMLTestClass();
-		$o->init($str);
-	
-		$this->assertNotNull($o->member);
-		$this->assertEquals("value", $o->member->value);
-		$this->assertEquals("a value", $o->member->attrib1);
-		$this->assertEquals("another value", $o->member->attrib2);
-		
-		
-		$str = $this->wrapInSoapMessage('<AttributeContainerXMLTestClass><member>value</member></AttributeContainerXMLTestClass>');
-		$o = new AttributeContainerXMLTestClass();
-		$o->init($str);		
-		
-		$this->assertNotNull($o->member);
-// 		$this->assertEquals("value", $o->member->value);
-// 		$this->assertNull($o->member->attrib1);
-// 		$this->assertNull($o->member->attrib2);
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testListDeserialization() {
-		
-		
-		
-		$str = $this->wrapInSoapMessage('<SimpleContainerXMLTestClass><list1>i</list1><list1>am</list1><list1>an array</list1></SimpleContainerXMLTestClass>');
-		$parent = new SimpleContainerXMLTestClass();
-		$parent->init($str);
-		
-		$this->assertNotNull($parent->list1);
- 		$this->assertEquals(true, is_array($parent->list1));
- 		$this->assertEquals(3, count($parent->list1));
- 		$this->assertEquals('an array', $parent->list1[2]);
-		
-		
-		$str = $this->wrapInSoapMessage('<SimpleContainerXMLTestClass><list1>i</list1><list1>am</list1><list1>an array</list1>'
-				. '<list2><field1>c1v1</field1><field2>c1v2</field2></list2>'
-				. '<list2><field1>c2v1</field1><field2>c2v2</field2></list2></SimpleContainerXMLTestClass>');
-		$parent = new SimpleContainerXMLTestClass();
-		$parent->init($str);
-		
-		$this->assertNotNull($parent->list2);
-		$this->assertEquals(true, is_array($parent->list2));
-		$this->assertEquals(2, count($parent->list2));
-		$this->assertEquals('SimpleXMLTestClass', get_class($parent->list2[0]));
-		$this->assertEquals('c1v2', $parent->list2[0]->field2);
-		$this->assertEquals('c2v1', $parent->list2[1]->field1);
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testNestedDeserialization() {
-		
-		$str = $this->wrapInSoapMessage("<SimpleContainerXMLTestClass><field1>parent</field1><nestedField><field1>fieldvalue1</field1><field2>fieldvalue2</field2></nestedField></SimpleContainerXMLTestClass>");
-		$o = new SimpleContainerXMLTestClass();
-		$o->init($str);
-		
-		$this->assertEquals("parent", $o->field1);
-		$this->assertNotNull($o->nestedField);
-		$this->assertEquals("fieldvalue1", $o->nestedField->field1);
-		$this->assertEquals("fieldvalue2", $o->nestedField->field2);
-		
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function testSoapFaults() {
-		$xml = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";><soapenv:Header/><soapenv:Body> <soapenv:Fault xmlns:axis2ns237961="http://schemas.xmlsoap.org/soap/envelope/";><faultcode>axis2ns237961:Server</faultcode><faultstring>Authentication failed. API credentials are incorrect.</faultstring><detail><ns3:FaultMessage xmlns:ns3="http://svcs.paypal.com/types/common"; xmlns:ns2="http://svcs.paypal.com/types/ap";><responseEnvelope><timestamp>2013-09-03T04:36:14.931-07:00</timestamp><ack>Failure</ack><correlationId>ebeb480862a99</correlationId><build>6941298</build></responseEnvelope><error><errorId>520003</errorId><domain>PLATFORM</domain><subdomain>Application</subdomain><severity>Error</severity><category>Application</category><message>Authentication failed. API credentials are incorrect.</message></error></ns3:FaultMessage></detail></soapenv:Fault></soapenv:Body></soapenv:Envelope>';
-
-		$map = PPUtils::xmlToArray($xml);
-
-		$o = new FaultMessage();
-		$o->init($map, false);
-		
-		$this->assertEquals("Failure", $o->responseEnvelope->ack);
-		$this->assertEquals("Application", $o->error[0]->category);
-	}
-	
-}
diff --git a/vendor/paypal/sdk-core-php/tests/formatters/FormatterFactoryTest.php b/vendor/paypal/sdk-core-php/tests/formatters/FormatterFactoryTest.php
deleted file mode 100644
index 5cb98036..00000000
--- a/vendor/paypal/sdk-core-php/tests/formatters/FormatterFactoryTest.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-use PayPal\Formatter\FormatterFactory;
-class FormatterFactoryTest extends PHPUnit_Framework_TestCase {
-	
-	/**
-	 * @test
-	 */
-	public function testValidBinding() {
-		$this->assertEquals('PayPal\Formatter\PPNVPFormatter', get_class(FormatterFactory::factory('NV')));
-		$this->assertEquals('PayPal\Formatter\PPSOAPFormatter', get_class(FormatterFactory::factory('SOAP')));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testInvalidBinding() {
-		$this->setExpectedException('\InvalidArgumentException');
-		FormatterFactory::factory('Unknown');
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/formatters/PPNVPFormatterTest.php b/vendor/paypal/sdk-core-php/tests/formatters/PPNVPFormatterTest.php
deleted file mode 100644
index 48e0d00a..00000000
--- a/vendor/paypal/sdk-core-php/tests/formatters/PPNVPFormatterTest.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-use PayPal\Core\PPRequest;
-use PayPal\Formatter\PPNVPFormatter;
-class PPNVPFormatterTest extends PHPUnit_Framework_TestCase {
-	
-	private $object;
-	
-	public function setup() {
-		$this->object = new PPNVPFormatter();
-	}
-	/**
-	 * @test
-	 */
-	public function testValidSerializationCall() {
-		$data = new MockNVPObject();
-		$this->assertEquals($data->toNVPString(),
-				$this->object->toString(new PPRequest($data, 'NVP'))
-		);
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testInvalidCall() {
-		$this->setExpectedException('BadMethodCallException');
-		$this->object->toObject('somestring');
-	}
-}
-
-class MockNVPObject {
-	public function toNVPString() {
-		return 'dummy nvp string';
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/formatters/PPSOAPFormatterTest.php b/vendor/paypal/sdk-core-php/tests/formatters/PPSOAPFormatterTest.php
deleted file mode 100644
index a7d74e9d..00000000
--- a/vendor/paypal/sdk-core-php/tests/formatters/PPSOAPFormatterTest.php
+++ /dev/null
@@ -1,70 +0,0 @@
-<?php
-use PayPal\Core\PPRequest;
-use PayPal\Formatter\PPSOAPFormatter;
-
-class PPSOAPFormatterTest extends PHPUnit_Framework_TestCase {
-	
-	private $object;
-	
-	public function setup() {
-		$this->object = new PPSOAPFormatter();
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSimpleSerializationCall() {
-		$data = new MockSOAPObject();
-		
-		$expected = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/";  ><soapenv:Header></soapenv:Header><soapenv:Body>'
-					. $data->toXMLString()
-					. '</soapenv:Body></soapenv:Envelope>';
-		$this->assertEquals($expected,
-				$this->object->toString(new PPRequest($data, 'SOAP'))
-		);
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSerializationWithNSCall() {
-		$data = new MockSOAPObject();		
-		$request = new PPRequest($data, 'SOAP');
-		$request->addBindingInfo("namespace", 'ns="http://myns";');
-		
-		$expected = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; ns="http://myns"; ><soapenv:Header></soapenv:Header><soapenv:Body>'
-		. $data->toXMLString()
-		. '</soapenv:Body></soapenv:Envelope>';
-		$this->assertEquals($expected, $this->object->toString($request));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testSerializationWithCredentialCall() {
-		$data = new MockSOAPObject();
-		$request = new PPRequest($data, 'SOAP');
-		$request->addBindingInfo("namespace", 'ns="http://myns";');
-		$request->addBindingInfo("securityHeader", "<abc><xyz>1</xyz></abc>");
-		
-	
-		$expected = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"; ns="http://myns"; ><soapenv:Header><abc><xyz>1</xyz></abc></soapenv:Header><soapenv:Body>'
-		. $data->toXMLString()
-		. '</soapenv:Body></soapenv:Envelope>';
-		$this->assertEquals($expected, $this->object->toString($request));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testInvalidCall() {
-		$this->setExpectedException('BadMethodCallException');
-		$this->object->toObject('somestring');
-	}
-}
-
-class MockSOAPObject {
-	public function toXMLString() {
-		return '<dummy>XML string</dummy>';
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/handlers/PPAuthenticationHandlerTest.php b/vendor/paypal/sdk-core-php/tests/handlers/PPAuthenticationHandlerTest.php
deleted file mode 100644
index 3f7829b9..00000000
--- a/vendor/paypal/sdk-core-php/tests/handlers/PPAuthenticationHandlerTest.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-use PayPal\Auth\PPSignatureCredential;
-use PayPal\Auth\PPTokenAuthorization;
-use PayPal\Core\PPHttpConfig;
-use PayPal\Core\PPRequest;
-use PayPal\Handler\PPAuthenticationHandler;
-
-class PPAuthenticationHandlerTest extends PHPUnit_Framework_TestCase {
-	
-	protected function setup() {
-		
-	}
-	
-	protected function tearDown() {
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testValidConfiguration() {
-		
-		$credential = new PPSignatureCredential('user', 'pass', 'sign');
-		$credential->setThirdPartyAuthorization(new PPTokenAuthorization('accessToken', 'tokenSecret'));
-		$options = array('config' => array('mode' => 'sandbox'), 'serviceName' => 'DoExpressCheckout', 'port' => 'PayPalAPI');
-		
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		$req->setCredential($credential);
-		
-		$httpConfig = new PPHttpConfig('http://api.paypal.com');
-		
-		$handler = new PPAuthenticationHandler();
-		$handler->handle($httpConfig, $req, $options);		
-		$this->assertArrayHasKey('X-PP-AUTHORIZATION', $httpConfig->getHeaders());
-		
-		$options['port'] = 'abc';
-		$handler->handle($httpConfig, $req, $options);
-		$this->assertArrayHasKey('X-PAYPAL-AUTHORIZATION', $httpConfig->getHeaders());
-		
-		unset($options['port']);
-		$handler->handle($httpConfig, $req, $options);
-		$this->assertArrayHasKey('X-PAYPAL-AUTHORIZATION', $httpConfig->getHeaders());
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/handlers/PPCertificateAuthHandlerTest.php b/vendor/paypal/sdk-core-php/tests/handlers/PPCertificateAuthHandlerTest.php
deleted file mode 100644
index 4c034bd9..00000000
--- a/vendor/paypal/sdk-core-php/tests/handlers/PPCertificateAuthHandlerTest.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-use PayPal\Auth\PPCertificateCredential;
-use PayPal\Auth\PPSubjectAuthorization;
-use PayPal\Auth\PPTokenAuthorization;
-use PayPal\Handler\PPCertificateAuthHandler;
-use PayPal\Core\PPHttpConfig;
-use PayPal\Core\PPRequest;
-
-class PPCertificateAuthHandlerTest extends PHPUnit_Framework_TestCase {
-	
-	protected function setup() {
-		
-	}
-	
-	protected function tearDown() {
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testHeadersAddedForNVP() {
-		
-		$req = new PPRequest(new StdClass(), 'NV');
-		$options = array('config' => array('mode' => 'sandbox'), 'serviceName' => 'AdaptivePayments', 'apiMethod' => 'ConvertCurrency');
-						
-		$handler = new PPCertificateAuthHandler();
-		
-		// Test that no headers are added if no credential is passed
-		$httpConfig = new PPHttpConfig();
-		$handler->handle($httpConfig, $req, $options);		
-		$this->assertEquals(0, count($httpConfig->getHeaders()));
-		
-		// Test that the 3 token headers are added for first party API calls
-		$httpConfig = new PPHttpConfig();
-		$cred = new PPCertificateCredential('user', 'pass', 'cacert.pem');		
-		$req->setCredential($cred);
-		
-		$handler->handle($httpConfig, $req, $options);		
-		$this->assertEquals(2, count($httpConfig->getHeaders()));
-		$this->assertArrayHasKey(CURLOPT_SSLCERT, $httpConfig->getCurlOptions());
-		
-		// Test addition of 'subject' HTTP header for subject based third party auth
-		$httpConfig = new PPHttpConfig();
-		$cred = new PPCertificateCredential('user', 'pass', 'cacert.pem');
-		$cred->setThirdPartyAuthorization(new PPSubjectAuthorization('email@xxxxxxxxxx'));
-		$req->setCredential($cred);
-		
-		$handler->handle($httpConfig, $req, $options);
-		$this->assertEquals(3, count($httpConfig->getHeaders()));
-		$this->assertArrayHasKey('X-PAYPAL-SECURITY-SUBJECT', $httpConfig->getHeaders());
-		$this->assertArrayHasKey(CURLOPT_SSLCERT, $httpConfig->getCurlOptions());
-		
-		// Test that no auth related HTTP headers (username, password, sign?) are 
-		// added for token based third party auth
-		$httpConfig = new PPHttpConfig();
-		$req->getCredential()->setThirdPartyAuthorization(new PPTokenAuthorization('token', 'tokenSecret'));
-				
-		$handler->handle($httpConfig, $req, $options);		
-		$this->assertEquals(0, count($httpConfig->getHeaders()));
-		$this->assertArrayHasKey(CURLOPT_SSLCERT, $httpConfig->getCurlOptions());
-	
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function testHeadersAddedForSOAP() {
-	
-		$options = array('config' => array('mode' => 'sandbox'), 'serviceName' => 'AdaptivePayments', 'apiMethod' => 'ConvertCurrency');		
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		
-		$handler = new PPCertificateAuthHandler();
-		
-		// Test that no headers are added if no credential is passed
-		$httpConfig = new PPHttpConfig();
-		$handler->handle($httpConfig, $req, $options);
-		$this->assertEquals('', $req->getBindingInfo('securityHeader'));		
-		
-		// Test that the 3 token SOAP headers are added for first party API calls
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		$req->setCredential(new PPCertificateCredential('user', 'pass', 'cacert.pem'));
-		$handler->handle($httpConfig, $req, $options);
-		
-		$this->assertContains('<ebl:Username>', $req->getBindingInfo('securityHeader'));
-		$this->assertContains('<ebl:Password>', $req->getBindingInfo('securityHeader'));		
-		$this->assertArrayHasKey(CURLOPT_SSLCERT, $httpConfig->getCurlOptions());
-		
-		// Test addition of 'subject' SOAP header for subject based third party auth
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		$cred = new PPCertificateCredential('user', 'pass', 'cacert.pem');
-		$cred->setThirdPartyAuthorization(new PPSubjectAuthorization('email@xxxxxxxxxx'));
-		$req->setCredential($cred);
-		$handler->handle($httpConfig, $req, $options);
-		
-		$this->assertContains('<ebl:Username>', $req->getBindingInfo('securityHeader'));
-		$this->assertContains('<ebl:Password>', $req->getBindingInfo('securityHeader'));		
-		$this->assertContains('<ebl:Subject>', $req->getBindingInfo('securityHeader'));
-		$this->assertArrayHasKey(CURLOPT_SSLCERT, $httpConfig->getCurlOptions());
-		
-	
-		// Test that no auth related HTTP headers (username, password, sign?) are
-		// added for token based third party auth
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		$req->setCredential(new PPCertificateCredential('user', 'pass', 'cacert.pem'));
-		$req->getCredential()->setThirdPartyAuthorization(new PPTokenAuthorization('token', 'tokenSecret'));		
-		$handler->handle($httpConfig, $req, $options);
-
-		$this->assertContains('<ns:RequesterCredentials/>', $req->getBindingInfo('securityHeader'));
-		$this->assertEquals(0, count($httpConfig->getHeaders()));
-		$this->assertArrayHasKey(CURLOPT_SSLCERT, $httpConfig->getCurlOptions());
-	}
-	
-}
diff --git a/vendor/paypal/sdk-core-php/tests/handlers/PPGenericServiceHandlerTest.php b/vendor/paypal/sdk-core-php/tests/handlers/PPGenericServiceHandlerTest.php
deleted file mode 100644
index d86cec52..00000000
--- a/vendor/paypal/sdk-core-php/tests/handlers/PPGenericServiceHandlerTest.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-use PayPal\Handler\PPGenericServiceHandler;
-use PayPal\Core\PPHttpConfig;
-use PayPal\Core\PPRequest;
-
-class PPGenericServiceHandlerTest extends PHPUnit_Framework_TestCase {
-	
-	protected function setup() {
-		
-	}
-	
-	protected function tearDown() {
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testHeadersAdded() {
-		$bindingType = 'bindingType';
-		$devEmail = 'developer@xxxxxxxxxx';
-		
-		
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPGenericServiceHandler('sdkname', 'sdkversion');
-		$handler->handle($httpConfig, 
-				new PPRequest(new StdClass(), $bindingType), 
-				array('config' => array('service.SandboxEmailAddress' => $devEmail))
-		);
-		
-		$headers = $httpConfig->getHeaders();		
-		$this->assertEquals(6, count($headers));
-		$this->assertArrayHasKey('X-PAYPAL-DEVICE-IPADDRESS', $headers);
-		$this->assertArrayHasKey('X-PAYPAL-REQUEST-SOURCE', $headers);		
-		$this->assertEquals($bindingType, $headers['X-PAYPAL-REQUEST-DATA-FORMAT']);
-		$this->assertEquals($bindingType, $headers['X-PAYPAL-RESPONSE-DATA-FORMAT']);
-		$this->assertEquals($devEmail, $headers['X-PAYPAL-SANDBOX-EMAIL-ADDRESS']);
-		
-	}
-	
-	/**
-	 * @test
-	 */
-	 public function testSourceHeader() {
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPGenericServiceHandler('sdkname', 'sdkversion');
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'NV'),
-				array('config' => array())
-		);
-
-		$headers = $httpConfig->getHeaders();
-		$this->assertArrayHasKey('X-PAYPAL-REQUEST-SOURCE', $headers);
-		$this->assertRegExp('/.*sdkname.*/', $headers['X-PAYPAL-REQUEST-SOURCE']);
-		$this->assertRegExp('/.*sdkversion.*/', $headers['X-PAYPAL-REQUEST-SOURCE']);
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/handlers/PPMerchantServiceHandlerTest.php b/vendor/paypal/sdk-core-php/tests/handlers/PPMerchantServiceHandlerTest.php
deleted file mode 100644
index e52ba674..00000000
--- a/vendor/paypal/sdk-core-php/tests/handlers/PPMerchantServiceHandlerTest.php
+++ /dev/null
@@ -1,153 +0,0 @@
-<?php
-use PayPal\Auth\PPSignatureCredential;
-use PayPal\Auth\PPCertificateCredential;
-use PayPal\Auth\PPTokenAuthorization;
-use PayPal\Handler\PPMerchantServiceHandler;
-use PayPal\Core\PPConstants;
-use PayPal\Core\PPHttpConfig;
-use PayPal\Core\PPRequest;
-
-class PPMerchantServiceHandlerTest extends PHPUnit_Framework_TestCase {
-	
-	private $options;
-	
-	protected function setup() {
-		$this->options = array(
-			'config' => array(
-				'mode' => 'sandbox', 
-				'acct1.UserName' => 'siguser', 
-				'acct1.Password' => 'pass', 
-				'acct1.Signature' => 'signature', 
-				'acct2.UserName' => 'certuser', 
-				'acct2.Password' => 'pass', 
-				'acct2.CertPath' => 'pathtocert', 
-			), 
-			'serviceName' => 'PayPalAPIInterfaceService', 
-			'apiMethod' => 'DoExpressCheckout',
-			'port' => 'apiAA'
-		);
-	}
-	
-	protected function tearDown() {
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testHeadersAdded() {
-		
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPMerchantServiceHandler(null, 'sdkname', 'sdkversion');
-		$handler->handle($httpConfig, $req, $this->options);
-		
-		$this->assertEquals(5, count($httpConfig->getHeaders()), "Basic headers not added");
-		
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testModeBasedEndpointForSignatureCredential() {
-		
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPMerchantServiceHandler(null, 'sdkname', 'sdkversion');
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		$req->setCredential(new PPSignatureCredential('a', 'b', 'c'));
-		
-		$handler->handle($httpConfig, $req, $this->options);
-		$this->assertEquals(PPConstants::MERCHANT_SANDBOX_SIGNATURE_ENDPOINT, $httpConfig->getUrl());
-		
-		$options = $this->options;
-		$options['config']['mode'] = 'live';
-		$handler->handle($httpConfig, $req, $options);
-		$this->assertEquals(PPConstants::MERCHANT_LIVE_SIGNATURE_ENDPOINT, $httpConfig->getUrl());
-		
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function testModeBasedEndpointForCertificateCredential() {
-	
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPMerchantServiceHandler('certuser', 'sdkname', 'sdkversion');
-		$req = new PPRequest(new StdClass(), 'SOAP');
-	
-		$handler->handle($httpConfig, $req, $this->options);
-		$this->assertEquals(PPConstants::MERCHANT_SANDBOX_CERT_ENDPOINT, $httpConfig->getUrl());
-	
-		$options = $this->options;
-		$options['config']['mode'] = 'live';
-		$handler->handle($httpConfig, $req, $options);
-		$this->assertEquals(PPConstants::MERCHANT_LIVE_CERT_ENDPOINT, $httpConfig->getUrl());
-	
-	}
-	
-	
-	public function testCustomEndpoint() {
-
-		$customEndpoint = 'http://myhost/';
-		$options = $this->options;
-		$options['config']['service.EndPoint'] = $customEndpoint;
-		
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPMerchantServiceHandler(null, 'sdkname', 'sdkversion');
-		
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'SOAP'), $options			
-		);
-		$this->assertEquals("$customEndpoint", $httpConfig->getUrl(), "Custom endpoint not processed");
-	
-		$options['config']['service.EndPoint'] = 'abc';
-		$options['config']["service.EndPoint.". $options['port']] = $customEndpoint;
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'SOAP'), $options
-		);
-		$this->assertEquals("$customEndpoint", $httpConfig->getUrl(), "Custom endpoint not processed");
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	 public function testInvalidConfigurations() {
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPMerchantServiceHandler(null, 'sdkname', 'sdkversion');
-		
-		$this->setExpectedException('PayPal\Exception\PPMissingCredentialException');
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'SOAP'),
-				array('config' => array())
-		);
-		$this->setExpectedException('PayPal\Exception\PPConfigurationException');
-		
-		
-		$options = $this->options;
-		unset($options['mode']);
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'SOAP'),
-				$options
-		);
-	 }
-
-	/**
-	 * @test
-	 */
-	 public function testSourceHeader() {
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPMerchantServiceHandler(null, 'sdkname', 'sdkversion');
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'SOAP'),
-				$this->options
-		);
-
-		$headers = $httpConfig->getHeaders();
-		$this->assertArrayHasKey('X-PAYPAL-REQUEST-SOURCE', $headers);
-		$this->assertRegExp('/.*sdkname.*/', $headers['X-PAYPAL-REQUEST-SOURCE']);
-		$this->assertRegExp('/.*sdkversion.*/', $headers['X-PAYPAL-REQUEST-SOURCE']);
-	}
-}
diff --git a/vendor/paypal/sdk-core-php/tests/handlers/PPOpenIdHandlerTest.php b/vendor/paypal/sdk-core-php/tests/handlers/PPOpenIdHandlerTest.php
deleted file mode 100644
index 46897f5a..00000000
--- a/vendor/paypal/sdk-core-php/tests/handlers/PPOpenIdHandlerTest.php
+++ /dev/null
@@ -1,104 +0,0 @@
-<?php
-use PayPal\Common\PPApiContext;
-use PayPal\Core\PPConstants;
-use PayPal\Core\PPHttpConfig;
-use PayPal\Core\PPRequest;
-use PayPal\Handler\PPOpenIdHandler;
-
-class PPOpenIdHandlerTest extends PHPUnit_Framework_TestCase {
-	
-	protected function setup() {
-		
-	}
-	
-	protected function tearDown() {
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testInvalidConfiguration() {
-		$httpConfig = new PPHttpConfig();
-		$apiContext = new PPApiContext(array('mode' => 'unknown', 'acct1.ClientId' => 'clientId', 'acct1.ClientSecret' => 'clientSecret'));
-		$handler = new PPOpenIdHandler();
-	
-		$this->setExpectedException('PayPal\Exception\PPConfigurationException');
-		$handler->handle($httpConfig, 'payload', array('path' => '/path', 'apiContext' => $apiContext));
-		
-		
-		$httpConfig = new PPHttpConfig();
-		$apiContext = new PPApiContext(array('acct1.ClientId' => 'clientId', 'acct1.ClientSecret' => 'clientSecret'));
-		$handler = new PPOpenIdHandler($apiContext);
-		
-		$this->setExpectedException('PayPal\Exception\PPConfigurationException');
-		$handler->handle($httpConfig, 'payload', array('path' => '/path', 'apiContext' => $apiContext));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testHeadersAdded() {
-		$httpConfig = new PPHttpConfig();
-		$apiContext = new PPApiContext(array('mode' => 'sandbox', 'acct1.ClientId' => 'clientId', 'acct1.ClientSecret' => 'clientSecret'));
-		
-		$handler = new PPOpenIdHandler();
-		$handler->handle($httpConfig, 'payload', array('apiContext' => $apiContext));
-		
-		$this->assertArrayHasKey('Authorization', $httpConfig->getHeaders());
-		$this->assertArrayHasKey('User-Agent', $httpConfig->getHeaders());			
-		$this->assertContains('PayPalSDK', $httpConfig->getHeader('User-Agent'));
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testModeBasedEndpoint() {
-		$httpConfig = new PPHttpConfig();
-		$apiContext = new PPApiContext(array('mode' => 'sandbox', 'acct1.ClientId' => 'clientId', 'acct1.ClientSecret' => 'clientSecret'));		
-		$handler = new PPOpenIdHandler();
-		
-		$handler->handle($httpConfig, 'payload', array('path' => '/path', 'apiContext' => $apiContext));
-		$this->assertEquals(PPConstants::REST_SANDBOX_ENDPOINT . "path", $httpConfig->getUrl());
-		
-		
-		$httpConfig = new PPHttpConfig();
-		$apiContext = new PPApiContext(array('mode' => 'live', 'acct1.ClientId' => 'clientId', 'acct1.ClientSecret' => 'clientSecret'));
-		$handler = new PPOpenIdHandler();
-		
-		$handler->handle($httpConfig, 'payload', array('path' => '/path', 'apiContext' => $apiContext));
-		$this->assertEquals(PPConstants::REST_LIVE_ENDPOINT . "path", $httpConfig->getUrl());
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testCustomEndpoint() {
-		$customEndpoint = 'http://mydomain';
-		$httpConfig = new PPHttpConfig();
-		$apiContext = new PPApiContext(array('service.EndPoint' => $customEndpoint, 'acct1.ClientId' => 'clientId', 'acct1.ClientSecret' => 'clientSecret'));
-		$handler = new PPOpenIdHandler();
-		
-		$handler->handle($httpConfig, 'payload', array('path' => '/path', 'apiContext' => $apiContext));
-		$this->assertEquals("$customEndpoint/path", $httpConfig->getUrl());
-		
-		
-		$customEndpoint = 'http://mydomain/';
-		$httpConfig = new PPHttpConfig();
-		$apiContext = new PPApiContext(array('service.EndPoint' => $customEndpoint, 'acct1.ClientId' => 'clientId', 'acct1.ClientSecret' => 'clientSecret'));
-		$handler = new PPOpenIdHandler();
-		
-		$handler->handle($httpConfig, 'payload', array('path' => '/path', 'apiContext' => $apiContext));
-		$this->assertEquals("${customEndpoint}path", $httpConfig->getUrl());
-		
-		
-		$customEndpoint = 'http://mydomain';
-		$httpConfig = new PPHttpConfig();
-		$apiContext = new PPApiContext(array('service.EndPoint' => 'xyz', 'openid.EndPoint' => $customEndpoint, 'acct1.ClientId' => 'clientId', 'acct1.ClientSecret' => 'clientSecret'));
-		$handler = new PPOpenIdHandler();
-		
-		$handler->handle($httpConfig, 'payload', array('path' => '/path', 'apiContext' => $apiContext));
-		$this->assertEquals("$customEndpoint/path", $httpConfig->getUrl());
-	}
-	
-}
diff --git a/vendor/paypal/sdk-core-php/tests/handlers/PPPlatformServiceHandlerTest.php b/vendor/paypal/sdk-core-php/tests/handlers/PPPlatformServiceHandlerTest.php
deleted file mode 100644
index db221930..00000000
--- a/vendor/paypal/sdk-core-php/tests/handlers/PPPlatformServiceHandlerTest.php
+++ /dev/null
@@ -1,150 +0,0 @@
-<?php
-use PayPal\Auth\PPSignatureCredential;
-use PayPal\Core\PPConstants;
-use PayPal\Core\PPHttpConfig;
-use PayPal\Core\PPRequest;
-use PayPal\Handler\PPPlatformServiceHandler;
-
-class PPPlatformServiceHandlerTest extends PHPUnit_Framework_TestCase {
-
-	private $options;
-	
-	protected function setup() {
-		$this->options = array(
-			'config' => array(
-				'mode' => 'sandbox', 
-				'acct1.UserName' => 'user', 
-				'acct1.Password' => 'pass', 
-				'acct1.Signature' => 'sign', 
-				'acct1.AppId' => 'APP',
-				'acct2.UserName' => 'certuser', 
-				'acct2.Password' => 'pass', 
-				'acct2.CertPath' => 'pathtocert', 
-			), 
-			'serviceName' => 'AdaptivePayments', 
-			'apiMethod' => 'ConvertCurrency');
-	}
-	
-	protected function tearDown() {
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testDefaultAPIAccount() {
-		
-		$req = new PPRequest(new StdClass(), 'NV');
-
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPPlatformServiceHandler(null, 'sdkname', 'sdkversion');
-		$handler->handle($httpConfig, $req, $this->options);
-		$this->assertEquals($this->options['config']['acct1.Signature'], $req->getCredential()->getSignature());
-
-		
-		$cred = new PPSignatureCredential('user', 'pass', 'sig');
-		$cred->setApplicationId('appId');
-		
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPPlatformServiceHandler($cred, 'sdkname', 'sdkversion');
-		$handler->handle($httpConfig, $req, $this->options);		
-		
-		$this->assertEquals($cred, $req->getCredential());
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testHeadersAdded() {
-		
-		$req = new PPRequest(new StdClass(), 'NV');
-		
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPPlatformServiceHandler(null, 'sdkname', 'sdkversion');
-		$handler->handle($httpConfig, $req, $this->options);
-		
-		$this->assertEquals(9, count($httpConfig->getHeaders()), "Basic headers not added");
-		
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPPlatformServiceHandler('certuser', 'sdkname', 'sdkversion');
-		$handler->handle($httpConfig, $req, $this->options);
-		
-		$this->assertEquals(7, count($httpConfig->getHeaders()));
-		$this->assertEquals('certuser', $req->getCredential()->getUsername());
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testEndpoint() {
-		$serviceName = 'AdaptivePayments';
-		$apiMethod = 'ConvertCurrency';
-		
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPPlatformServiceHandler(null, 'sdkname', 'sdkversion');
-		
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'NV'),
-				$this->options
-		);
-		$this->assertEquals(PPConstants::PLATFORM_SANDBOX_ENDPOINT . "$serviceName/$apiMethod", $httpConfig->getUrl());
-
-		$options = $this->options;
-		$options['config']['mode'] = 'live';
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'NV'),
-				$options
-		);
-		$this->assertEquals(PPConstants::PLATFORM_LIVE_ENDPOINT . "$serviceName/$apiMethod", $httpConfig->getUrl());
-		
-		
-		$customEndpoint = 'http://myhost/';
-		$options = $this->options;
-		$options['config']['service.EndPoint'] = $customEndpoint;
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'NV'),
-				$options
-		);
-		$this->assertEquals("$customEndpoint$serviceName/$apiMethod", $httpConfig->getUrl(), "Custom endpoint not processed");
-		
-	}
-
-	/**
-	 * @test
-	 */
-	 public function testInvalidConfigurations() {
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPPlatformServiceHandler(null, 'sdkname', 'sdkversion');
-		
-		$this->setExpectedException('PayPal\Exception\PPMissingCredentialException');
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'NV'),
-				array('config' => array())
-		);
-		
-		$this->setExpectedException('PayPal\Exception\PPConfigurationException');
-		$options = $this->options;
-		unset($options['mode']);
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'NV'),
-				$options
-		);
-	 }
-
-	/**
-	 * @test
-	 */
-	 public function testSourceHeader() {
-		$httpConfig = new PPHttpConfig();
-		$handler = new PPPlatformServiceHandler(null, 'sdkname', 'sdkversion');
-		$handler->handle($httpConfig,
-				new PPRequest(new StdClass(), 'NV'),
-				$this->options
-		);
-
-		$headers = $httpConfig->getHeaders();
-		$this->assertArrayHasKey('X-PAYPAL-REQUEST-SOURCE', $headers);
-		$this->assertRegExp('/.*sdkname.*/', $headers['X-PAYPAL-REQUEST-SOURCE']);
-		$this->assertRegExp('/.*sdkversion.*/', $headers['X-PAYPAL-REQUEST-SOURCE']);
-	 }
-}
diff --git a/vendor/paypal/sdk-core-php/tests/handlers/PPSignatureAuthHandlerTest.php b/vendor/paypal/sdk-core-php/tests/handlers/PPSignatureAuthHandlerTest.php
deleted file mode 100644
index e6363df4..00000000
--- a/vendor/paypal/sdk-core-php/tests/handlers/PPSignatureAuthHandlerTest.php
+++ /dev/null
@@ -1,113 +0,0 @@
-<?php
-
-use PayPal\Auth\PPSignatureCredential;
-use PayPal\Auth\PPSubjectAuthorization;
-use PayPal\Auth\PPTokenAuthorization;
-use PayPal\Core\PPHttpConfig;
-use PayPal\Core\PPRequest;
-use PayPal\Handler\PPSignatureAuthHandler;
-
-class PPSignatureAuthHandlerTest extends PHPUnit_Framework_TestCase {
-	
-	protected function setup() {
-		
-	}
-	
-	protected function tearDown() {
-	
-	}
-	
-	/**
-	 * @test
-	 */
-	public function testHeadersAddedForNVP() {
-		
-		$req = new PPRequest(new StdClass(), 'NV');
-		$options = array('config' => array('mode' => 'sandbox'), 'serviceName' => 'AdaptivePayments', 'apiMethod' => 'ConvertCurrency');
-						
-		$handler = new PPSignatureAuthHandler();
-		
-		// Test that no headers are added if no credential is passed
-		$httpConfig = new PPHttpConfig();
-		$handler->handle($httpConfig, $req, $options);		
-		$this->assertEquals(0, count($httpConfig->getHeaders()));
-		
-		// Test that the 3 token headers are added for first party API calls
-		$httpConfig = new PPHttpConfig();
-		$cred = new PPSignatureCredential('user', 'pass', 'sign');		
-		$req->setCredential($cred);
-		
-		$handler->handle($httpConfig, $req, $options);		
-		$this->assertEquals(3, count($httpConfig->getHeaders()));
-
-		// Test addition of 'subject' HTTP header for subject based third party auth
-		$httpConfig = new PPHttpConfig();
-		$cred = new PPSignatureCredential('user', 'pass', 'sign');
-		$cred->setThirdPartyAuthorization(new PPSubjectAuthorization('email@xxxxxxxxxx'));
-		$req->setCredential($cred);
-		
-		$handler->handle($httpConfig, $req, $options);
-		$this->assertEquals(4, count($httpConfig->getHeaders()));
-		$this->assertArrayHasKey('X-PAYPAL-SECURITY-SUBJECT', $httpConfig->getHeaders());
-	
-		// Test that no auth related HTTP headers (username, password, sign?) are 
-		// added for token based third party auth
-		$httpConfig = new PPHttpConfig();
-		$req->getCredential()->setThirdPartyAuthorization(new PPTokenAuthorization('token', 'tokenSecret'));
-				
-		$handler->handle($httpConfig, $req, $options);		
-		$this->assertEquals(0, count($httpConfig->getHeaders()));
-	
-	}
-	
-	
-	/**
-	 * @test
-	 */
-	public function testHeadersAddedForSOAP() {
-	
-		$options = array('config' => array('mode' => 'sandbox'), 'serviceName' => 'AdaptivePayments', 'apiMethod' => 'ConvertCurrency');		
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		
-		$handler = new PPSignatureAuthHandler();
-		
-		// Test that no headers are added if no credential is passed
-		$httpConfig = new PPHttpConfig();
-		$handler->handle($httpConfig, $req, $options);
-		$this->assertEquals('', $req->getBindingInfo('securityHeader'));
-		
-		
-		// Test that the 3 token SOAP headers are added for first party API calls
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		$req->setCredential(new PPSignatureCredential('user', 'pass', 'sign'));
-		$handler->handle($httpConfig, $req, $options);
-		
-		$this->assertContains('<ebl:Username>', $req->getBindingInfo('securityHeader'));
-		$this->assertContains('<ebl:Password>', $req->getBindingInfo('securityHeader'));
-		$this->assertContains('<ebl:Signature>', $req->getBindingInfo('securityHeader'));
-	
-		// Test addition of 'subject' SOAP header for subject based third party auth
-		$req = new PPRequest(new StdClass(), 'SOAP');
-		$cred = new PPSignatureCredential('user', 'pass', 'sign');
-		$cred->setThirdPartyAuthorization(new PPSubjectAuthorization('email@xxxxxxxxxx'));
-		$req->setCredential($cred);
-		$handler->handle($httpConfig, $req, $options);
-		
-		$this->assertContains('<ebl:Username>', $req->getBindingInfo('securityHeader'));
-		$this->assertContains('<ebl:Password>', $req->getBindingInfo('securityHeader'));
-		$this->assertContains('<ebl:Signature>', $req->getBindingInfo('securityHeader'));
-		$this->assertContains('<ebl:Subject>', $req->getBindingInfo('securityHeader'));
-		
-	
-		// Test that no auth related HTTP headers (username, password, sign?) are
-		// added for token based third party auth
-		$req->getCredential()->setThirdPartyAuthorization(new PPTokenAuthorization('token', 'tokenSecret'));		
-		$handler->handle($httpConfig, $req, $options);
-
-		$this->assertContains('<ns:RequesterCredentials/>', $req->getBindingInfo('securityHeader'));
-		$this->assertEquals(0, count($httpConfig->getHeaders()));
-	
-	}
-	
-	
-}
diff --git a/vendor/paypal/sdk-core-php/tests/sdk_config.ini b/vendor/paypal/sdk-core-php/tests/sdk_config.ini
deleted file mode 100644
index 4d810099..00000000
--- a/vendor/paypal/sdk-core-php/tests/sdk_config.ini
+++ /dev/null
@@ -1,33 +0,0 @@
-;Account credentials
-[Account]
-
-acct1.ClientId = AQkquBDf1zctJOWGKWUEtKXm6qVhueUEMvXO_-MCI4DQQ4-LWvkDLIN2fGsd
-acct1.ClientSecret = EL1tVxAjhT7cJimnz5-Nsx9k2reTKSVfErNQF-CmrwJgxRtylkGTKlU4RvrX 
-acct1.UserName = jb-us-seller_api1.paypal.com
-acct1.Password = WX4WTU3S8MY44S7F
-acct1.Signature = AFcWxV21C7fd0v3bYYYRCpSSRl31A7yDhhsPUU2XhtMoZXsWHFxu-RWy
-acct1.AppId = APP-80W284485P519543T
-# Subject is optional and is required only in case of third party authorization 
-acct1.Subject = 
-
-; Certificate Credentials Test Account
-acct2.UserName = platfo_1255170694_biz_api1.gmail.com
-acct2.Password = 2DPPKUPKB7DQLXNR
-; Certificate path relative to config folder or absolute path in file system
-acct2.CertPath = cacert.pem
-
-
-;Connection Information
-[Http]
-http.ConnectionTimeOut = 60
-;http.Retry = 1
-;http.Proxy
-
-;Logging Information
-[Log]
-log.FileName=../PayPal.log
-log.LogLevel=INFO
-log.LogEnabled=true
-
-mode = sandbox
- 
diff --git a/vendor/phpdocumentor/reflection-docblock/.coveralls.yml b/vendor/phpdocumentor/reflection-docblock/.coveralls.yml
new file mode 100644
index 00000000..c512a3d5
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/.coveralls.yml
@@ -0,0 +1,3 @@
+service_name: travis-ci
+coverage_clover: coverage.xml
+json_path: coverage.json
diff --git a/vendor/phpdocumentor/reflection-docblock/.gitignore b/vendor/phpdocumentor/reflection-docblock/.gitignore
deleted file mode 100644
index 3ce5adbb..00000000
--- a/vendor/phpdocumentor/reflection-docblock/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-.idea
-vendor
diff --git a/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml b/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml
deleted file mode 100644
index 5061d523..00000000
--- a/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml
+++ /dev/null
@@ -1,32 +0,0 @@
-before_commands:
-    - "composer install --no-dev --prefer-source"
-
-tools:
-    external_code_coverage: true
-    php_code_sniffer:
-        enabled: true
-        config:
-            standard: PSR2
-        filter:
-            paths: ["src/*", "tests/*"]
-    php_cpd:
-        enabled: true
-        excluded_dirs: ["tests", "vendor"]
-    php_loc:
-        enabled: true
-        excluded_dirs: ["tests", "vendor"]
-    php_mess_detector:
-        enabled: true
-        config:
-            ruleset: phpmd.xml.dist
-            design_rules: { eval_expression: false }
-        filter:
-            paths: ["src/*"]
-    php_pdepend:
-        enabled: true
-        excluded_dirs: ["tests", "vendor"]
-    php_analyzer:
-        enabled: true
-        filter:
-            paths: ["src/*", "tests/*"]
-    sensiolabs_security_checker: true
diff --git a/vendor/phpdocumentor/reflection-docblock/.travis.yml b/vendor/phpdocumentor/reflection-docblock/.travis.yml
deleted file mode 100644
index 920958df..00000000
--- a/vendor/phpdocumentor/reflection-docblock/.travis.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-language: php
-php:
-  - 5.5
-  - 5.6
-  - 7.0
-  - hhvm
-  - nightly
-
-matrix:
-  allow_failures:
-    - php:
-        - hhvm
-        - nightly
-
-cache:
-  directories:
-    - $HOME/.composer/cache
-
-script:
-  - vendor/bin/phpunit --coverage-clover=coverage.clover -v
-  - composer update --no-interaction --prefer-source
-  - vendor/bin/phpunit -v
-
-before_script:
-  - composer install --no-interaction
-
-after_script:
-  - wget https://scrutinizer-ci.com/ocular.phar
-  - php ocular.phar code-coverage:upload --format=php-clover coverage.clover
-
-notifications:
-  irc: "irc.freenode.org#phpdocumentor"
-  email:
-    - mike.vanriel@xxxxxxxxxxx
-    - ashnazg@xxxxxxx
-    - boen.robot@xxxxxxxxx
diff --git a/vendor/phpdocumentor/reflection-docblock/README.md b/vendor/phpdocumentor/reflection-docblock/README.md
index a1984a15..5a7d326d 100644
--- a/vendor/phpdocumentor/reflection-docblock/README.md
+++ b/vendor/phpdocumentor/reflection-docblock/README.md
@@ -10,16 +10,12 @@ that is 100% compatible with the [PHPDoc standard](http://phpdoc.org/docs/latest
 With this component, a library can provide support for annotations via DocBlocks
 or otherwise retrieve information that is embedded in a DocBlock.
 
-> **Note**: *this is a core component of phpDocumentor and is constantly being
-> optimized for performance.*
-
 Installation
 ------------
 
-You can install the component in the following ways:
-
-* Use the official Github repository (https://github.com/phpDocumentor/ReflectionDocBlock)
-* Via Composer (http://packagist.org/packages/phpdocumentor/reflection-docblock)
+```bash
+composer require phpdocumentor/reflection-docblock
+```
 
 Usage
 -----
@@ -52,18 +48,20 @@ $docblock = $factory->create($docComment);
 ```
 
 The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock`
-whose methods can be queried as shown in the following example.
+whose methods can be queried:
 
 ```php
-// Should contain the summary for this DocBlock
+// Contains the summary for this DocBlock
 $summary = $docblock->getSummary();
 
-// Contains an object of type \phpDocumentor\Reflection\DocBlock\Description; 
-// you can either cast it to string or use the render method to get a string 
-// representation of the Description.
+// Contains \phpDocumentor\Reflection\DocBlock\Description object
 $description = $docblock->getDescription();
-```
 
-> For more examples it would be best to review the scripts in the `/examples` 
-> folder.
+// You can either cast it to string
+$description = (string) $docblock->getDescription();
+
+// Or use the render method to get a string representation of the Description.
+$description = $docblock->getDescription()->render();
+```
 
+> For more examples it would be best to review the scripts in the [`/examples` folder](/examples).
diff --git a/vendor/phpdocumentor/reflection-docblock/composer.json b/vendor/phpdocumentor/reflection-docblock/composer.json
index 558046ca..e3dc38a9 100644
--- a/vendor/phpdocumentor/reflection-docblock/composer.json
+++ b/vendor/phpdocumentor/reflection-docblock/composer.json
@@ -10,9 +10,9 @@
         }
     ],
     "require": {
-        "php": ">=5.5",
-        "phpdocumentor/reflection-common": "^1.0@dev",
-        "phpdocumentor/type-resolver": "^0.3.0",
+        "php": "^7.0",
+        "phpdocumentor/reflection-common": "^1.0.0",
+        "phpdocumentor/type-resolver": "^0.4.0",
         "webmozart/assert": "^1.0"
     },
     "autoload": {
@@ -22,7 +22,13 @@
         "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]}
     },
     "require-dev": {
-        "mockery/mockery": "^0.9.4",
-        "phpunit/phpunit": "^4.4"
+        "mockery/mockery": "^1.0",
+        "phpunit/phpunit": "^6.4",
+        "doctrine/instantiator": "~1.0.5"
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "4.x-dev"
+        }
     }
 }
diff --git a/vendor/phpdocumentor/reflection-docblock/easy-coding-standard.neon b/vendor/phpdocumentor/reflection-docblock/easy-coding-standard.neon
new file mode 100644
index 00000000..7c2ba6e2
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/easy-coding-standard.neon
@@ -0,0 +1,31 @@
+includes:
+    - temp/ecs/config/clean-code.neon
+    - temp/ecs/config/psr2-checkers.neon
+    - temp/ecs/config/spaces.neon
+    - temp/ecs/config/common.neon
+
+checkers:
+    PhpCsFixer\Fixer\Operator\ConcatSpaceFixer:
+        spacing: one
+
+parameters:
+    exclude_checkers:
+        # from temp/ecs/config/common.neon
+        - PhpCsFixer\Fixer\ClassNotation\OrderedClassElementsFixer
+        - PhpCsFixer\Fixer\PhpUnit\PhpUnitStrictFixer
+        - PhpCsFixer\Fixer\ControlStructure\YodaStyleFixer
+        # from temp/ecs/config/spaces.neon
+        - PhpCsFixer\Fixer\Operator\NotOperatorWithSuccessorSpaceFixer
+
+    skip:
+        SlevomatCodingStandard\Sniffs\Classes\UnusedPrivateElementsSniff:
+            # WIP code
+            - src/DocBlock/StandardTagFactory.php
+        PHP_CodeSniffer\Standards\Generic\Sniffs\CodeAnalysis\EmptyStatementSniff:
+            # WIP code
+            - src/DocBlock/StandardTagFactory.php
+        PHP_CodeSniffer\Standards\Squiz\Sniffs\Classes\ValidClassNameSniff:
+            - src/DocBlock/Tags/Return_.php
+            - src/DocBlock/Tags/Var_.php
+        PHP_CodeSniffer\Standards\Generic\Sniffs\NamingConventions\CamelCapsFunctionNameSniff:
+            - */tests/**
diff --git a/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php b/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php
deleted file mode 100644
index 6d67dea4..00000000
--- a/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-require_once(__DIR__ . '/../vendor/autoload.php');
-
-use phpDocumentor\Reflection\DocBlockFactory;
-
-$docComment = <<<DOCCOMMENT
-/**
- * This is an example of a summary.
- *
- * This is a Description. A Summary and Description are separated by either
- * two subsequent newlines (thus a whiteline in between as can be seen in this
- * example), or when the Summary ends with a dot (`.`) and some form of
- * whitespace.
- */
-DOCCOMMENT;
-
-$factory  = DocBlockFactory::createInstance();
-$docblock = $factory->create($docComment);
-
-// Should contain the first line of the DocBlock
-$summary = $docblock->getSummary();
-
-// Contains an object of type Description; you can either cast it to string or use
-// the render method to get a string representation of the Description.
-//
-// In subsequent examples we will be fiddling a bit more with the Description.
-$description = $docblock->getDescription();
diff --git a/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php b/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php
deleted file mode 100644
index 23995889..00000000
--- a/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-require_once(__DIR__ . '/../vendor/autoload.php');
-
-use phpDocumentor\Reflection\DocBlockFactory;
-
-$docComment = <<<DOCCOMMENT
-/**
- * This is an example of a summary.
- *
- * @see \phpDocumentor\Reflection\DocBlock\StandardTagFactory
- */
-DOCCOMMENT;
-
-$factory  = DocBlockFactory::createInstance();
-$docblock = $factory->create($docComment);
-
-// You can check if a DocBlock has one or more see tags
-$hasSeeTag = $docblock->hasTag('see');
-
-// Or we can get a complete list of all tags
-$tags = $docblock->getTags();
-
-// But we can also grab all tags of a specific type, such as `see`
-$seeTags = $docblock->getTagsByName('see');
diff --git a/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php b/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php
deleted file mode 100644
index 6bc10baf..00000000
--- a/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-require_once(__DIR__ . '/../vendor/autoload.php');
-
-use phpDocumentor\Reflection\DocBlock\Serializer;
-use phpDocumentor\Reflection\DocBlockFactory;
-
-$docComment = <<<DOCCOMMENT
-/**
- * This is an example of a summary.
- *
- * And here is an example of the description
- * of a DocBlock that can span multiple lines.
- *
- * @see \phpDocumentor\Reflection\DocBlock\StandardTagFactory
- */
-DOCCOMMENT;
-
-$factory  = DocBlockFactory::createInstance();
-$docblock = $factory->create($docComment);
-
-// Create the serializer that will reconstitute the DocBlock back to its original form.
-$serializer = new Serializer();
-
-// Reconstitution is performed by the `getDocComment()` method.
-$reconstitutedDocComment = $serializer->getDocComment($docblock);
-
diff --git a/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php b/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php
deleted file mode 100644
index 026d6069..00000000
--- a/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php
+++ /dev/null
@@ -1,135 +0,0 @@
-<?php
-/**
- * In this example we demonstrate how you can add your own Tag using a Static Factory method in your Tag class.
- */
-
-require_once(__DIR__ . '/../vendor/autoload.php');
-
-use phpDocumentor\Reflection\DocBlock\Serializer;
-use phpDocumentor\Reflection\DocBlock\Tags\Factory\StaticMethod;
-use phpDocumentor\Reflection\DocBlockFactory;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\DocBlock\Tags\BaseTag;
-use phpDocumentor\Reflection\Types\Context;
-use Webmozart\Assert\Assert;
-
-/**
- * An example of a custom tag called `my-tag` with an optional description.
- *
- * A Custom Tag is a class that can consist of two parts:
- *
- * 1. a method `create` that is a static factory for this class.
- * 2. methods and properties that have this object act as an immutable Value Object representing a Tag instance.
- *
- * The static factory `create` is used to convert a tag line (without the tag name) into an instance of the
- * same tag object with the right constructor parameters set. This method has a dynamic list of parameters so that you
- * can inject various dependencies, see the method's DocBlock for more information.
- *
- * An object of this class, and its methods and properties, represent a single instance of that tag in your
- * documentation in the form of a Value Object whose properties should not be changed after instantiation (it should be
- * immutable).
- *
- * > Important: Tag classes that act as Factories using the `create` method should implement the TagFactory interface.
- */
-final class MyTag extends BaseTag implements StaticMethod
-{
-    /**
-     * A required property that is used by Formatters to reconstitute the complete tag line.
-     *
-     * @see Formatter
-     *
-     * @var string
-     */
-    protected $name = 'my-tag';
-
-    /**
-     * The constructor for this Tag; this should contain all properties for this object.
-     *
-     * @param Description $description An example of how to add a Description to the tag; the Description is often
-     *                                 an optional variable so passing null is allowed in this instance (though you can
-     *                                 also construct an empty description object).
-     *
-     * @see BaseTag for the declaration of the description property and getDescription method.
-     */
-    public function __construct(Description $description = null)
-    {
-        $this->description = $description;
-    }
-
-    /**
-     * A static Factory that creates a new instance of the current Tag.
-     *
-     * In this example the MyTag tag can be created by passing a description text as $body. Because we have added
-     * a $descriptionFactory that is type-hinted as DescriptionFactory we can now construct a new Description object
-     * and pass that to the constructor.
-     *
-     * > You could directly instantiate a Description object here but that won't be parsed for inline tags and Types
-     * > won't be resolved. The DescriptionFactory will take care of those actions.
-     *
-     * The `create` method's interface states that this method only features a single parameter (`$body`) but the
-     * {@see TagFactory} will read the signature of this method and if it has more parameters then it will try
-     * to find declarations for it in the ServiceLocator of the TagFactory (see {@see TagFactory::$serviceLocator}).
-     *
-     * > Important: all properties following the `$body` should default to `null`, otherwise PHP will error because
-     * > it no longer matches the interface. This is why you often see the default tags check that an optional argument
-     * > is not null nonetheless.
-     *
-     * @param string             $body
-     * @param DescriptionFactory $descriptionFactory
-     * @param Context|null       $context The Context is used to resolve Types and FQSENs, although optional
-     *                                    it is highly recommended to pass it. If you omit it then it is assumed that
-     *                                    the DocBlock is in the global namespace and has no `use` statements.
-     *
-     * @see Tag for the interface declaration of the `create` method.
-     * @see Tag::create() for more information on this method's workings.
-     *
-     * @return MyTag
-     */
-    public static function create($body, DescriptionFactory $descriptionFactory = null, Context $context = null)
-    {
-        Assert::string($body);
-        Assert::notNull($descriptionFactory);
-
-        return new static($descriptionFactory->create($body, $context));
-    }
-
-    /**
-     * Returns a rendition of the original tag line.
-     *
-     * This method is used to reconstitute a DocBlock into its original form by the {@see Serializer}. It should
-     * feature all parts of the tag so that the serializer can put it back together.
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        return (string)$this->description;
-    }
-}
-
-$docComment = <<<DOCCOMMENT
-/**
- * This is an example of a summary.
- *
- * @my-tag I have a description
- */
-DOCCOMMENT;
-
-// Make a mapping between the tag name `my-tag` and the Tag class containing the Factory Method `create`.
-$customTags = ['my-tag' => MyTag::class];
-
-// Do pass the list of custom tags to the Factory for the DocBlockFactory.
-$factory = DocBlockFactory::createInstance($customTags);
-// You can also add Tags later using `$factory->registerTagHandler()` with a tag name and Tag class name.
-
-// Create the DocBlock
-$docblock = $factory->create($docComment);
-
-// Take a look: the $customTagObjects now contain an array with your newly added tag
-$customTagObjects = $docblock->getTagsByName('my-tag');
-
-// As an experiment: let's reconstitute the DocBlock and observe that because we added a __toString() method
-// to the tag class that we can now also see it.
-$serializer              = new Serializer();
-$reconstitutedDocComment = $serializer->getDocComment($docblock);
diff --git a/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php b/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php
deleted file mode 100644
index 5ec772fe..00000000
--- a/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-require_once(__DIR__ . '/../../vendor/autoload.php');
-
-use phpDocumentor\Reflection\DocBlockFactory;
-
-$docComment = <<<DOCCOMMENT
-/**
- * This is an example of a summary.
- *
- * You can escape the @-sign by surrounding it with braces, for example: {@}. And escape a closing brace within an
- * inline tag by adding an opening brace in front of it like this: {}.
- *
- * Here are example texts where you can see how they could be used in a real life situation:
- *
- *     This is a text with an {@internal inline tag where a closing brace ({}) is shown}.
- *     Or an {@internal inline tag with a literal {{@}link{} in it}.
- *
- * Do note that an {@internal inline tag that has an opening brace ({) does not break out}.
- */
-DOCCOMMENT;
-
-$factory  = DocBlockFactory::createInstance();
-$docblock = $factory->create($docComment);
-
-// Escaping is automatic so this happens in the DescriptionFactory.
-$description = $docblock->getDescription();
-
-// This is the rendition that we will receive of the Description.
-$receivedDocComment = <<<DOCCOMMENT
-/**
- * This is an example of a summary.
- *
- * You can escape the @-sign by surrounding it with braces, for example: {@}. And escape a closing brace within an
- * inline tag by adding an opening brace in front of it like this: {}.
- *
- * Here are example texts where you can see how they could be used in a real life situation:
- *
- *     This is a text with an {@internal inline tag where a closing brace ({}) is shown}.
- *     Or an {@internal inline tag with a literal {{@}link{} in it}.
- *
- * Do note that an {@internal inline tag that has an opening brace ({) does not break out}.
- */
-DOCCOMMENT;
-
-// Render it using the default PassthroughFormatter
-$foundDescription = $description->render();
diff --git a/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist b/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist
deleted file mode 100644
index 9abf85cf..00000000
--- a/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<ruleset
-    name="ProxyManager rules"
-    xmlns="http://pmd.sf.net/ruleset/1.0.0";
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd";
-    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd";
->
-    <rule ref="rulesets/codesize.xml"/>
-    <rule ref="rulesets/unusedcode.xml"/>
-    <rule ref="rulesets/design.xml">
-        <!-- eval is needed to generate runtime classes -->
-        <exclude name="EvalExpression"/>
-    </rule>
-    <rule ref="rulesets/naming.xml">
-        <exclude name="LongVariable"/>
-    </rule>
-    <rule ref="rulesets/naming.xml/LongVariable">
-        <properties>
-            <property name="minimum">40</property>
-        </properties>
-    </rule>
-</ruleset>
diff --git a/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist b/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist
deleted file mode 100644
index 3c2e9a37..00000000
--- a/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<phpunit
-        colors="true"
-        checkForUnintentionallyCoveredCode="true"
-        beStrictAboutOutputDuringTests="true"
-        forceCoversAnnotation="true"
-        verbose="true"
-        bootstrap="vendor/autoload.php"
-        >
-  <testsuites>
-    <testsuite name="unit">
-        <directory>./tests/unit</directory>
-    </testsuite>
-      <testsuite name="integration">
-          <directory>./tests/integration</directory>
-      </testsuite>
-  </testsuites>
-  <filter>
-    <whitelist>
-        <directory suffix=".php">./src/</directory>
-    </whitelist>
-    <blacklist>
-      <directory>./vendor/</directory>
-    </blacklist>
-  </filter>
-  <listeners>
-    <listener
-            class="Mockery\Adapter\Phpunit\TestListener"
-            file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"
-            />
-  </listeners>
-</phpunit>
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php
index 39911406..46605b78 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php
@@ -24,7 +24,7 @@ final class DocBlock
     private $description = null;
 
     /** @var Tag[] An array containing all the tags in this docblock; except inline. */
-    private $tags = array();
+    private $tags = [];
 
     /** @var Types\Context Information about the context of this DocBlock. */
     private $context = null;
@@ -55,8 +55,7 @@ final class DocBlock
         Location $location = null,
         $isTemplateStart = false,
         $isTemplateEnd = false
-    )
-    {
+    ) {
         Assert::string($summary);
         Assert::boolean($isTemplateStart);
         Assert::boolean($isTemplateEnd);
@@ -171,11 +170,11 @@ final class DocBlock
     {
         Assert::string($name);
 
-        $result = array();
+        $result = [];
 
         /** @var Tag $tag */
         foreach ($this->getTags() as $tag) {
-            if ($tag->getName() != $name) {
+            if ($tag->getName() !== $name) {
                 continue;
             }
 
@@ -198,7 +197,7 @@ final class DocBlock
 
         /** @var Tag $tag */
         foreach ($this->getTags() as $tag) {
-            if ($tag->getName() == $name) {
+            if ($tag->getName() === $name) {
                 return true;
             }
         }
@@ -207,6 +206,23 @@ final class DocBlock
     }
 
     /**
+     * Remove a tag from this DocBlock.
+     *
+     * @param Tag $tag The tag to remove.
+     *
+     * @return void
+     */
+    public function removeTag(Tag $tagToRemove)
+    {
+        foreach ($this->tags as $key => $tag) {
+            if ($tag === $tagToRemove) {
+                unset($this->tags[$key]);
+                break;
+            }
+        }
+    }
+
+    /**
      * Adds a tag to this DocBlock.
      *
      * @param Tag $tag The tag to add.
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php
index d1d7fc64..25a79e00 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php
@@ -71,6 +71,16 @@ class Description
     }
 
     /**
+     * Returns the tags for this DocBlock.
+     *
+     * @return Tag[]
+     */
+    public function getTags()
+    {
+        return $this->tags;
+    }
+
+    /**
      * Renders this description as a string where the provided formatter will format the tags in the expected string
      * format.
      *
@@ -88,6 +98,7 @@ class Description
         foreach ($this->tags as $tag) {
             $tags[] = '{' . $formatter->format($tag) . '}';
         }
+
         return vsprintf($this->bodyTemplate, $tags);
     }
 
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php
index f34d0f7e..48f9c219 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php
@@ -188,5 +188,4 @@ class DescriptionFactory
 
         return implode("\n", $lines);
     }
-
 }
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php
index 3cc5dab3..571ed749 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php
@@ -10,7 +10,7 @@
  * @link      http://phpdoc.org
  */
 
-namespace phpDocumentor\Reflection;
+namespace phpDocumentor\Reflection\DocBlock;
 
 use phpDocumentor\Reflection\DocBlock\Tags\Example;
 
@@ -23,7 +23,7 @@ class ExampleFinder
     private $sourceDirectory = '';
 
     /** @var string[] */
-    private $exampleDirectories = array();
+    private $exampleDirectories = [];
 
     /**
      * Attempts to find the example contents for the given descriptor.
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php
index e0faacb7..0f355f58 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php
@@ -81,7 +81,12 @@ class Serializer
             )
         );
 
-        $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n";
+        $comment = "{$firstIndent}/**\n";
+        if ($text) {
+            $comment .= "{$indent} * {$text}\n";
+            $comment .= "{$indent} *\n";
+        }
+
         $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment);
         $comment .= $indent . ' */';
 
@@ -121,6 +126,7 @@ class Serializer
             $text = wordwrap($text, $wrapLength);
             return $text;
         }
+
         return $text;
     }
 
@@ -138,6 +144,7 @@ class Serializer
             if ($wrapLength !== null) {
                 $tagText = wordwrap($tagText, $wrapLength);
             }
+
             $tagText = str_replace("\n", "\n{$indent} * ", $tagText);
 
             $comment .= "{$indent} * {$tagText}\n";
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php
index 8efd84e2..5a8143cf 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php
@@ -166,7 +166,7 @@ final class StandardTagFactory implements TagFactory
      */
     private function extractTagParts($tagLine)
     {
-        $matches = array();
+        $matches = [];
         if (! preg_match('/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)/us', $tagLine, $matches)) {
             throw new \InvalidArgumentException(
                 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors'
@@ -196,8 +196,7 @@ final class StandardTagFactory implements TagFactory
         $arguments        = $this->getArgumentsForParametersFromWiring(
             $this->fetchParametersForHandlerFactoryMethod($handlerClassName),
             $this->getServiceLocatorWithDynamicParameters($context, $name, $body)
-        )
-        ;
+        );
 
         return call_user_func_array([$handlerClassName, 'create'], $arguments);
     }
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php
index 31b4f82c..8d65403f 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php
@@ -12,11 +12,11 @@
 
 namespace phpDocumentor\Reflection\DocBlock\Tags;
 
+use phpDocumentor\Reflection\DocBlock\Description;
 use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
 use phpDocumentor\Reflection\Fqsen;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\Types\Context as TypeContext;
 use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
 use Webmozart\Assert\Assert;
 
 /**
@@ -49,8 +49,7 @@ final class Covers extends BaseTag implements Factory\StaticMethod
         DescriptionFactory $descriptionFactory = null,
         FqsenResolver $resolver = null,
         TypeContext $context = null
-    )
-    {
+    ) {
         Assert::string($body);
         Assert::notEmpty($body);
 
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php
index 7c1039fa..822c3050 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php
@@ -12,9 +12,9 @@
 
 namespace phpDocumentor\Reflection\DocBlock\Tags;
 
-use phpDocumentor\Reflection\Types\Context as TypeContext;
 use phpDocumentor\Reflection\DocBlock\Description;
 use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
 use Webmozart\Assert\Assert;
 
 /**
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php
index 571ef8df..ecb199b4 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php
@@ -12,7 +12,9 @@
 
 namespace phpDocumentor\Reflection\DocBlock\Tags;
 
+use phpDocumentor\Reflection\DocBlock\Description;
 use phpDocumentor\Reflection\DocBlock\Tag;
+use Webmozart\Assert\Assert;
 
 /**
  * Reflection class for a {@}example tag in a Docblock.
@@ -22,7 +24,7 @@ final class Example extends BaseTag
     /**
      * @var string Path to a file to use as an example. May also be an absolute URI.
      */
-    private $filePath = '';
+    private $filePath;
 
     /**
      * @var bool Whether the file path component represents an URI. This determines how the file portion
@@ -31,6 +33,33 @@ final class Example extends BaseTag
     private $isURI = false;
 
     /**
+     * @var int
+     */
+    private $startingLine;
+
+    /**
+     * @var int
+     */
+    private $lineCount;
+
+    public function __construct($filePath, $isURI, $startingLine, $lineCount, $description)
+    {
+        Assert::notEmpty($filePath);
+        Assert::integer($startingLine);
+        Assert::greaterThanEq($startingLine, 0);
+
+        $this->filePath = $filePath;
+        $this->startingLine = $startingLine;
+        $this->lineCount = $lineCount;
+        $this->name = 'example';
+        if ($description !== null) {
+            $this->description = trim($description);
+        }
+
+        $this->isURI = $isURI;
+    }
+
+    /**
      * {@inheritdoc}
      */
     public function getContent()
@@ -43,7 +72,7 @@ final class Example extends BaseTag
                     :$this->filePath;
             }
 
-            $this->description = $filePath . ' ' . parent::getContent();
+            return trim($filePath . ' ' . parent::getDescription());
         }
 
         return $this->description;
@@ -71,16 +100,29 @@ final class Example extends BaseTag
         $lineCount    = null;
         $description  = null;
 
-        // Starting line / Number of lines / Description
-        if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $matches[3], $matches)) {
-            $startingLine = (int)$matches[1];
-            if (isset($matches[2]) && $matches[2] !== '') {
-                $lineCount = (int)$matches[2];
-            }
+        if (array_key_exists(3, $matches)) {
             $description = $matches[3];
+
+            // Starting line / Number of lines / Description
+            if (preg_match('/^([1-9]\d*)(?:\s+((?1))\s*)?(.*)$/sux', $matches[3], $contentMatches)) {
+                $startingLine = (int)$contentMatches[1];
+                if (isset($contentMatches[2]) && $contentMatches[2] !== '') {
+                    $lineCount = (int)$contentMatches[2];
+                }
+
+                if (array_key_exists(3, $contentMatches)) {
+                    $description = $contentMatches[3];
+                }
+            }
         }
 
-        return new static($filePath, $fileUri, $startingLine, $lineCount, $description);
+        return new static(
+            $filePath !== null?$filePath:$fileUri,
+            $fileUri !== null,
+            $startingLine,
+            $lineCount,
+            $description
+        );
     }
 
     /**
@@ -95,64 +137,40 @@ final class Example extends BaseTag
     }
 
     /**
-     * Sets the file path.
-     *
-     * @param string $filePath The new file path to use for the example.
+     * Returns a string representation for this tag.
      *
-     * @return $this
+     * @return string
      */
-    public function setFilePath($filePath)
+    public function __toString()
     {
-        $this->isURI = false;
-        $this->filePath = trim($filePath);
-
-        $this->description = null;
-        return $this;
+        return $this->filePath . ($this->description ? ' ' . $this->description : '');
     }
 
     /**
-     * Sets the file path as an URI.
-     *
-     * This function is equivalent to {@link setFilePath()}, except that it
-     * converts an URI to a file path before that.
-     *
-     * There is no getFileURI(), as {@link getFilePath()} is compatible.
+     * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute).
      *
-     * @param string $uri The new file URI to use as an example.
+     * @param string $uri
      *
-     * @return $this
+     * @return bool
      */
-    public function setFileURI($uri)
+    private function isUriRelative($uri)
     {
-        $this->isURI   = true;
-        $this->description = null;
-
-        $this->filePath = $this->isUriRelative($uri)
-            ? rawurldecode(str_replace(array('/', '\\'), '%2F', $uri))
-            : $this->filePath = $uri;
-
-        return $this;
+        return false === strpos($uri, ':');
     }
 
     /**
-     * Returns a string representation for this tag.
-     *
-     * @return string
+     * @return int
      */
-    public function __toString()
+    public function getStartingLine()
     {
-        return $this->filePath . ($this->description ? ' ' . $this->description->render() : '');
+        return $this->startingLine;
     }
 
     /**
-     * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute).
-     *
-     * @param string $uri
-     *
-     * @return bool
+     * @return int
      */
-    private function isUriRelative($uri)
+    public function getLineCount()
     {
-        return false === strpos($uri, ':');
+        return $this->lineCount;
     }
 }
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php
index e4c53e00..88b4ebf8 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php
@@ -57,7 +57,7 @@ class Generic extends BaseTag implements Factory\StaticMethod
         Assert::stringNotEmpty($name);
         Assert::notNull($descriptionFactory);
 
-        $description = $descriptionFactory && $body ? $descriptionFactory->create($body, $context) : null;
+        $description = $descriptionFactory && $body !== "" ? $descriptionFactory->create($body, $context) : null;
 
         return new static($name, $description);
     }
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php
index d3c1cd11..75225299 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php
@@ -135,7 +135,7 @@ final class Method extends BaseTag implements Factory\StaticMethod
 
         if (is_string($arguments) && strlen($arguments) > 0) {
             $arguments = explode(',', $arguments);
-            foreach($arguments as &$argument) {
+            foreach ($arguments as &$argument) {
                 $argument = explode(' ', self::stripRestArg(trim($argument)), 2);
                 if ($argument[0][0] === '$') {
                     $argumentName = substr($argument[0], 1);
@@ -214,10 +214,13 @@ final class Method extends BaseTag implements Factory\StaticMethod
             if (is_string($argument)) {
                 $argument = [ 'name' => $argument ];
             }
+
             if (! isset($argument['type'])) {
                 $argument['type'] = new Void_();
             }
+
             $keys = array_keys($argument);
+            sort($keys);
             if ($keys !== [ 'name', 'type' ]) {
                 throw new \InvalidArgumentException(
                     'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true)
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php
index 1a51dc0d..7d699d88 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php
@@ -77,7 +77,7 @@ final class Param extends BaseTag implements Factory\StaticMethod
         }
 
         // if the next item starts with a $ or ...$ it must be the variable name
-        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$' || substr($parts[0], 0, 4) === '...$')) {
+        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] === '$' || substr($parts[0], 0, 4) === '...$')) {
             $variableName = array_shift($parts);
             array_shift($parts);
 
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php
index 3c597133..f0ef7c07 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php
@@ -70,7 +70,7 @@ class Property extends BaseTag implements Factory\StaticMethod
         }
 
         // if the next item starts with a $ or ...$ it must be the variable name
-        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) {
+        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] === '$')) {
             $variableName = array_shift($parts);
             array_shift($parts);
 
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php
index bf2b8056..e41c0c1c 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php
@@ -70,7 +70,7 @@ class PropertyRead extends BaseTag implements Factory\StaticMethod
         }
 
         // if the next item starts with a $ or ...$ it must be the variable name
-        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) {
+        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] === '$')) {
             $variableName = array_shift($parts);
             array_shift($parts);
 
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php
index db37e0fb..cfdb0ed0 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php
@@ -70,7 +70,7 @@ class PropertyWrite extends BaseTag implements Factory\StaticMethod
         }
 
         // if the next item starts with a $ or ...$ it must be the variable name
-        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) {
+        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] === '$')) {
             $variableName = array_shift($parts);
             array_shift($parts);
 
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php
new file mode 100644
index 00000000..dc7b8b6d
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Fqsen.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @copyright 2010-2017 Mike van Riel<mike@xxxxxxxxxx>
+ *  @license   http://www.opensource.org/licenses/mit-license.php MIT
+ *  @link      http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Reference;
+
+use phpDocumentor\Reflection\Fqsen as RealFqsen;
+
+/**
+ * Fqsen reference used by {@see phpDocumentor\Reflection\DocBlock\Tags\See}
+ */
+final class Fqsen implements Reference
+{
+    /**
+     * @var RealFqsen
+     */
+    private $fqsen;
+
+    /**
+     * Fqsen constructor.
+     */
+    public function __construct(RealFqsen $fqsen)
+    {
+        $this->fqsen = $fqsen;
+    }
+
+    /**
+     * @return string string representation of the referenced fqsen
+     */
+    public function __toString()
+    {
+        return (string)$this->fqsen;
+    }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php
new file mode 100644
index 00000000..a3ffd24c
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Reference.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @copyright 2010-2017 Mike van Riel<mike@xxxxxxxxxx>
+ *  @license   http://www.opensource.org/licenses/mit-license.php MIT
+ *  @link      http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Reference;
+
+/**
+ * Interface for references in {@see phpDocumentor\Reflection\DocBlock\Tags\See}
+ */
+interface Reference
+{
+    public function __toString();
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php
new file mode 100644
index 00000000..2671d5e1
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Reference/Url.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * This file is part of phpDocumentor.
+ *
+ *  For the full copyright and license information, please view the LICENSE
+ *  file that was distributed with this source code.
+ *
+ *  @copyright 2010-2017 Mike van Riel<mike@xxxxxxxxxx>
+ *  @license   http://www.opensource.org/licenses/mit-license.php MIT
+ *  @link      http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Reference;
+
+use Webmozart\Assert\Assert;
+
+/**
+ * Url reference used by {@see phpDocumentor\Reflection\DocBlock\Tags\See}
+ */
+final class Url implements Reference
+{
+    /**
+     * @var string
+     */
+    private $uri;
+
+    /**
+     * Url constructor.
+     */
+    public function __construct($uri)
+    {
+        Assert::stringNotEmpty($uri);
+        $this->uri = $uri;
+    }
+
+    public function __toString()
+    {
+        return $this->uri;
+    }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php
index 09a5870e..ca5bda70 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php
@@ -43,8 +43,7 @@ final class Return_ extends BaseTag implements Factory\StaticMethod
         TypeResolver $typeResolver = null,
         DescriptionFactory $descriptionFactory = null,
         TypeContext $context = null
-    )
-    {
+    ) {
         Assert::string($body);
         Assert::allNotNull([$typeResolver, $descriptionFactory]);
 
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php
index 64ee3d8e..9e9e723b 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php
@@ -12,11 +12,13 @@
 
 namespace phpDocumentor\Reflection\DocBlock\Tags;
 
+use phpDocumentor\Reflection\DocBlock\Description;
 use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\DocBlock\Tags\Reference\Fqsen as FqsenRef;
+use phpDocumentor\Reflection\DocBlock\Tags\Reference\Reference;
+use phpDocumentor\Reflection\DocBlock\Tags\Reference\Url;
 use phpDocumentor\Reflection\FqsenResolver;
 use phpDocumentor\Reflection\Types\Context as TypeContext;
-use phpDocumentor\Reflection\DocBlock\Description;
 use Webmozart\Assert\Assert;
 
 /**
@@ -26,16 +28,16 @@ class See extends BaseTag implements Factory\StaticMethod
 {
     protected $name = 'see';
 
-    /** @var Fqsen */
+    /** @var Reference */
     protected $refers = null;
 
     /**
      * Initializes this tag.
      *
-     * @param Fqsen $refers
+     * @param Reference $refers
      * @param Description $description
      */
-    public function __construct(Fqsen $refers, Description $description = null)
+    public function __construct(Reference $refers, Description $description = null)
     {
         $this->refers = $refers;
         $this->description = $description;
@@ -56,13 +58,18 @@ class See extends BaseTag implements Factory\StaticMethod
         $parts       = preg_split('/\s+/Su', $body, 2);
         $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null;
 
-        return new static($resolver->resolve($parts[0], $context), $description);
+        // https://tools.ietf.org/html/rfc2396#section-3
+        if (preg_match('/\w:\/\/\w/i', $parts[0])) {
+            return new static(new Url($parts[0]), $description);
+        }
+
+        return new static(new FqsenRef($resolver->resolve($parts[0], $context)), $description);
     }
 
     /**
-     * Returns the structural element this tag refers to.
+     * Returns the ref of this tag.
      *
-     * @return Fqsen
+     * @return Reference
      */
     public function getReference()
     {
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php
index 3d002ed3..835fb0dc 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php
@@ -12,9 +12,9 @@
 
 namespace phpDocumentor\Reflection\DocBlock\Tags;
 
-use phpDocumentor\Reflection\Types\Context as TypeContext;
 use phpDocumentor\Reflection\DocBlock\Description;
 use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
 use Webmozart\Assert\Assert;
 
 /**
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php
index b0646b96..247b1b3b 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php
@@ -59,6 +59,7 @@ final class Source extends BaseTag implements Factory\StaticMethod
             if (isset($matches[2]) && $matches[2] !== '') {
                 $lineCount = (int)$matches[2];
             }
+
             $description = $matches[3];
         }
 
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php
index e23c694b..8907c951 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php
@@ -70,7 +70,7 @@ class Var_ extends BaseTag implements Factory\StaticMethod
         }
 
         // if the next item starts with a $ or ...$ it must be the variable name
-        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] == '$')) {
+        if (isset($parts[0]) && (strlen($parts[0]) > 0) && ($parts[0][0] === '$')) {
             $variableName = array_shift($parts);
             array_shift($parts);
 
@@ -112,7 +112,7 @@ class Var_ extends BaseTag implements Factory\StaticMethod
     public function __toString()
     {
         return ($this->type ? $this->type . ' ' : '')
-        . '$' . $this->variableName
-        . ($this->description ? ' ' . $this->description : '');
+            . (empty($this->variableName) ? null : ('$' . $this->variableName))
+            . ($this->description ? ' ' . $this->description : '');
     }
 }
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php
index 3e0e5bef..7bb04207 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php
@@ -12,9 +12,9 @@
 
 namespace phpDocumentor\Reflection\DocBlock\Tags;
 
-use phpDocumentor\Reflection\Types\Context as TypeContext;
 use phpDocumentor\Reflection\DocBlock\Description;
 use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
 use Webmozart\Assert\Assert;
 
 /**
diff --git a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php
index 9ec2455d..1bdb8f4d 100644
--- a/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php
+++ b/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php
@@ -93,7 +93,7 @@ final class DocBlockFactory implements DocBlockFactoryInterface
         return new DocBlock(
             $summary,
             $description ? $this->descriptionFactory->create($description, $context) : null,
-            array_filter($this->parseTagBlock($tags, $context), function($tag) {
+            array_filter($this->parseTagBlock($tags, $context), function ($tag) {
                 return $tag instanceof Tag;
             }),
             $context,
@@ -120,11 +120,11 @@ final class DocBlockFactory implements DocBlockFactoryInterface
         $comment = trim(preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u', '$1', $comment));
 
         // reg ex above is not able to remove */ from a single line docblock
-        if (substr($comment, -2) == '*/') {
+        if (substr($comment, -2) === '*/') {
             $comment = trim(substr($comment, 0, -2));
         }
 
-        return str_replace(array("\r\n", "\r"), "\n", $comment);
+        return str_replace(["\r\n", "\r"], "\n", $comment);
     }
 
     /**
@@ -143,7 +143,7 @@ final class DocBlockFactory implements DocBlockFactoryInterface
         // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the
         // performance impact of running a regular expression
         if (strpos($comment, '@') === 0) {
-            return array('', '', '', $comment);
+            return ['', '', '', $comment];
         }
 
         // clears all extra horizontal whitespace from the line endings to prevent parsing issues
@@ -241,7 +241,7 @@ final class DocBlockFactory implements DocBlockFactoryInterface
      */
     private function splitTagBlockIntoTagLines($tags)
     {
-        $result = array();
+        $result = [];
         foreach (explode("\n", $tags) as $tag_line) {
             if (isset($tag_line[0]) && ($tag_line[0] === '@')) {
                 $result[] = $tag_line;
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/integration/InterpretingDocBlocksTest.php b/vendor/phpdocumentor/reflection-docblock/tests/integration/InterpretingDocBlocksTest.php
deleted file mode 100644
index 91b8eb36..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/integration/InterpretingDocBlocksTest.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection;
-
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
-use phpDocumentor\Reflection\DocBlock\Tag;
-use phpDocumentor\Reflection\DocBlock\Tags\See;
-
-/**
- * @coversNothing
- */
-class InterpretingDocBlocksTest extends \PHPUnit_Framework_TestCase
-{
-    public function testInterpretingASimpleDocBlock()
-    {
-        /**
-         * @var DocBlock    $docblock
-         * @var string      $summary
-         * @var Description $description
-         */
-        include(__DIR__ . '/../../examples/01-interpreting-a-simple-docblock.php');
-
-        $descriptionText = <<<DESCRIPTION
-This is a Description. A Summary and Description are separated by either
-two subsequent newlines (thus a whiteline in between as can be seen in this
-example), or when the Summary ends with a dot (`.`) and some form of
-whitespace.
-DESCRIPTION;
-
-        $this->assertInstanceOf(DocBlock::class, $docblock);
-        $this->assertSame('This is an example of a summary.', $summary);
-        $this->assertInstanceOf(Description::class, $description);
-        $this->assertSame($descriptionText, $description->render());
-        $this->assertEmpty($docblock->getTags());
-    }
-
-    public function testInterpretingTags()
-    {
-        /**
-         * @var DocBlock $docblock
-         * @var boolean  $hasSeeTag
-         * @var Tag[]    $tags
-         * @var See[]    $seeTags
-         */
-        include(__DIR__ . '/../../examples/02-interpreting-tags.php');
-
-        $this->assertTrue($hasSeeTag);
-        $this->assertCount(1, $tags);
-        $this->assertCount(1, $seeTags);
-
-        $this->assertInstanceOf(See::class, $tags[0]);
-        $this->assertInstanceOf(See::class, $seeTags[0]);
-
-        $seeTag = $seeTags[0];
-        $this->assertSame('\\' . StandardTagFactory::class, (string)$seeTag->getReference());
-        $this->assertSame('', (string)$seeTag->getDescription());
-    }
-
-    public function testDescriptionsCanEscapeAtSignsAndClosingBraces()
-    {
-        /**
-         * @var string      $docComment
-         * @var DocBlock    $docblock
-         * @var Description $description
-         * @var string      $receivedDocComment
-         * @var string      $foundDescription
-         */
-
-        include(__DIR__ . '/../../examples/playing-with-descriptions/02-escaping.php');
-        $this->assertSame(<<<'DESCRIPTION'
-You can escape the @-sign by surrounding it with braces, for example: @. And escape a closing brace within an
-inline tag by adding an opening brace in front of it like this: }.
-
-Here are example texts where you can see how they could be used in a real life situation:
-
-    This is a text with an {@internal inline tag where a closing brace (}) is shown}.
-    Or an {@internal inline tag with a literal {@link} in it}.
-
-Do note that an {@internal inline tag that has an opening brace ({) does not break out}.
-DESCRIPTION
-            ,
-            $foundDescription
-        )
-        ;
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php b/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php
deleted file mode 100644
index 92ac22ed..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php
+++ /dev/null
@@ -1,35 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection;
-
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
-use phpDocumentor\Reflection\DocBlock\Tag;
-use phpDocumentor\Reflection\DocBlock\Tags\See;
-
-/**
- * @coversNothing
- */
-class ReconstitutingADocBlockTest extends \PHPUnit_Framework_TestCase
-{
-    public function testReconstituteADocBlock()
-    {
-        /**
-         * @var string $docComment
-         * @var string $reconstitutedDocComment
-         */
-        include(__DIR__ . '/../../examples/03-reconstituting-a-docblock.php');
-
-        $this->assertSame($docComment, $reconstitutedDocComment);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php b/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php
deleted file mode 100644
index 984811b1..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection;
-
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
-use phpDocumentor\Reflection\DocBlock\Tag;
-use phpDocumentor\Reflection\DocBlock\Tags\See;
-
-/**
- * @coversNothing
- */
-class UsingTagsTest extends \PHPUnit_Framework_TestCase
-{
-    public function testAddingYourOwnTagUsingAStaticMethodAsFactory()
-    {
-        /**
-         * @var object[] $customTagObjects
-         * @var string   $docComment
-         * @var string   $reconstitutedDocComment
-         */
-        include(__DIR__ . '/../../examples/04-adding-your-own-tag.php');
-
-        $this->assertInstanceOf(\MyTag::class, $customTagObjects[0]);
-        $this->assertSame('my-tag', $customTagObjects[0]->getName());
-        $this->assertSame('I have a description', (string)$customTagObjects[0]->getDescription());
-        $this->assertSame($docComment, $reconstitutedDocComment);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php
deleted file mode 100644
index d3043f9a..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Tags\Link;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\DescriptionFactory
- * @covers ::<private>
- */
-class DescriptionFactoryTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses         phpDocumentor\Reflection\DocBlock\Description
-     * @dataProvider provideSimpleExampleDescriptions
-     */
-    public function testDescriptionCanParseASimpleString($contents)
-    {
-        $tagFactory = m::mock(TagFactory::class);
-        $tagFactory->shouldReceive('create')->never();
-
-        $factory     = new DescriptionFactory($tagFactory);
-        $description = $factory->create($contents, new Context(''));
-
-        $this->assertSame($contents, $description->render());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses         phpDocumentor\Reflection\DocBlock\Description
-     * @dataProvider provideEscapeSequences
-     */
-    public function testEscapeSequences($contents, $expected)
-    {
-        $tagFactory = m::mock(TagFactory::class);
-        $tagFactory->shouldReceive('create')->never();
-
-        $factory     = new DescriptionFactory($tagFactory);
-        $description = $factory->create($contents, new Context(''));
-
-        $this->assertSame($expected, $description->render());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses   phpDocumentor\Reflection\DocBlock\Description
-     * @uses   phpDocumentor\Reflection\DocBlock\Tags\Link
-     * @uses   phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses   phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   phpDocumentor\Reflection\Types\Context
-     */
-    public function testDescriptionCanParseAStringWithInlineTag()
-    {
-        $contents   = 'This is text for a {@link http://phpdoc.org/ description} that uses an inline tag.';
-        $context    = new Context('');
-        $tagFactory = m::mock(TagFactory::class);
-        $tagFactory->shouldReceive('create')
-            ->once()
-            ->with('@link http://phpdoc.org/ description', $context)
-            ->andReturn(new Link('http://phpdoc.org/', new Description('description')))
-        ;
-
-        $factory     = new DescriptionFactory($tagFactory);
-        $description = $factory->create($contents, $context);
-
-        $this->assertSame($contents, $description->render());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses   phpDocumentor\Reflection\DocBlock\Description
-     * @uses   phpDocumentor\Reflection\DocBlock\Tags\Link
-     * @uses   phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses   phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   phpDocumentor\Reflection\Types\Context
-     */
-    public function testDescriptionCanParseAStringStartingWithInlineTag()
-    {
-        $contents   = '{@link http://phpdoc.org/ This} is text for a description that starts with an inline tag.';
-        $context    = new Context('');
-        $tagFactory = m::mock(TagFactory::class);
-        $tagFactory->shouldReceive('create')
-            ->once()
-            ->with('@link http://phpdoc.org/ This', $context)
-            ->andReturn(new Link('http://phpdoc.org/', new Description('This')))
-        ;
-
-        $factory     = new DescriptionFactory($tagFactory);
-        $description = $factory->create($contents, $context);
-
-        $this->assertSame($contents, $description->render());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses   phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testIfSuperfluousStartingSpacesAreRemoved()
-    {
-        $factory         = new DescriptionFactory(m::mock(TagFactory::class));
-        $descriptionText = <<<DESCRIPTION
-This is a multiline
-  description that you commonly
-  see with tags.
-
-      It does have a multiline code sample
-      that should align, no matter what
-
-  All spaces superfluous spaces on the
-  second and later lines should be
-  removed but the code sample should
-  still be indented.
-DESCRIPTION;
-
-        $expectedDescription = <<<DESCRIPTION
-This is a multiline
-description that you commonly
-see with tags.
-
-    It does have a multiline code sample
-    that should align, no matter what
-
-All spaces superfluous spaces on the
-second and later lines should be
-removed but the code sample should
-still be indented.
-DESCRIPTION;
-
-        $description = $factory->create($descriptionText, new Context(''));
-
-        $this->assertSame($expectedDescription, $description->render());
-    }
-
-    /**
-     * Provides a series of example strings that the parser should correctly interpret and return.
-     *
-     * @return string[][]
-     */
-    public function provideSimpleExampleDescriptions()
-    {
-        return [
-            ['This is text for a description.'],
-            ['This is text for a description containing { that is literal.'],
-            ['This is text for a description containing } that is literal.'],
-            ['This is text for a description with {just a text} that is not a tag.'],
-        ];
-    }
-
-    public function provideEscapeSequences()
-    {
-        return [
-            ['This is text for a description with a {@}.', 'This is text for a description with a @.'],
-            ['This is text for a description with a {}.', 'This is text for a description with a }.'],
-        ];
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php
deleted file mode 100644
index b5917a9e..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter;
-use phpDocumentor\Reflection\DocBlock\Tags\Generic;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Description
- */
-class DescriptionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers ::__construct
-     * @covers ::render
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     */
-    public function testDescriptionCanRenderUsingABodyWithPlaceholdersAndTags()
-    {
-        $body = 'This is a %1$s body.';
-        $expected = 'This is a {@internal significant } body.';
-        $tags = [new Generic('internal', new Description('significant '))];
-
-        $fixture = new Description($body, $tags);
-
-        // without formatter (thus the PassthroughFormatter by default)
-        $this->assertSame($expected, $fixture->render());
-
-        // with a custom formatter
-        $formatter = m::mock(PassthroughFormatter::class);
-        $formatter->shouldReceive('format')->with($tags[0])->andReturn('@internal significant ');
-        $this->assertSame($expected, $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::render
-     * @covers ::__toString
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     */
-    public function testDescriptionCanBeCastToString()
-    {
-        $body = 'This is a %1$s body.';
-        $expected = 'This is a {@internal significant } body.';
-        $tags = [new Generic('internal', new Description('significant '))];
-
-        $fixture = new Description($body, $tags);
-
-        $this->assertSame($expected, (string)$fixture);
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testBodyTemplateMustBeAString()
-    {
-        new Description([]);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php
deleted file mode 100644
index cb2b400f..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php
+++ /dev/null
@@ -1,201 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Serializer
- * @covers ::<private>
- */
-class SerializerTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers ::__construct
-     * @covers ::getDocComment
-     * @uses phpDocumentor\Reflection\DocBlock\Description
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses phpDocumentor\Reflection\DocBlock
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
-     */
-    public function testReconstructsADocCommentFromADocBlock()
-    {
-        $expected = <<<'DOCCOMMENT'
-/**
- * This is a summary
- *
- * This is a description
- *
- * @unknown-tag Test description for the unknown tag
- */
-DOCCOMMENT;
-
-        $fixture = new Serializer();
-
-        $docBlock = new DocBlock(
-            'This is a summary',
-            new Description('This is a description'),
-            [
-                new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
-            ]
-        );
-
-        $this->assertSame($expected, $fixture->getDocComment($docBlock));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getDocComment
-     * @uses phpDocumentor\Reflection\DocBlock\Description
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses phpDocumentor\Reflection\DocBlock
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
-     */
-    public function testAddPrefixToDocBlock()
-    {
-        $expected = <<<'DOCCOMMENT'
-aa/**
-aa * This is a summary
-aa *
-aa * This is a description
-aa *
-aa * @unknown-tag Test description for the unknown tag
-aa */
-DOCCOMMENT;
-
-        $fixture = new Serializer(2, 'a');
-
-        $docBlock = new DocBlock(
-            'This is a summary',
-            new Description('This is a description'),
-            [
-                new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
-            ]
-        );
-
-        $this->assertSame($expected, $fixture->getDocComment($docBlock));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getDocComment
-     * @uses phpDocumentor\Reflection\DocBlock\Description
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses phpDocumentor\Reflection\DocBlock
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
-     */
-    public function testAddPrefixToDocBlockExceptFirstLine()
-    {
-        $expected = <<<'DOCCOMMENT'
-/**
-aa * This is a summary
-aa *
-aa * This is a description
-aa *
-aa * @unknown-tag Test description for the unknown tag
-aa */
-DOCCOMMENT;
-
-        $fixture = new Serializer(2, 'a', false);
-
-        $docBlock = new DocBlock(
-            'This is a summary',
-            new Description('This is a description'),
-            [
-                new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
-            ]
-        );
-
-        $this->assertSame($expected, $fixture->getDocComment($docBlock));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getDocComment
-     * @uses phpDocumentor\Reflection\DocBlock\Description
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses phpDocumentor\Reflection\DocBlock
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
-     */
-    public function testWordwrapsAroundTheGivenAmountOfCharacters()
-    {
-        $expected = <<<'DOCCOMMENT'
-/**
- * This is a
- * summary
- *
- * This is a
- * description
- *
- * @unknown-tag
- * Test
- * description
- * for the
- * unknown tag
- */
-DOCCOMMENT;
-
-        $fixture = new Serializer(0, '', true, 15);
-
-        $docBlock = new DocBlock(
-            'This is a summary',
-            new Description('This is a description'),
-            [
-                new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
-            ]
-        );
-
-        $this->assertSame($expected, $fixture->getDocComment($docBlock));
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testInitializationFailsIfIndentIsNotAnInteger()
-    {
-        new Serializer([]);
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testInitializationFailsIfIndentStringIsNotAString()
-    {
-        new Serializer(0, []);
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testInitializationFailsIfIndentFirstLineIsNotABoolean()
-    {
-        new Serializer(0, '', []);
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testInitializationFailsIfLineLengthIsNotNullNorAnInteger()
-    {
-        new Serializer(0, '', false, []);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php
deleted file mode 100644
index 0247da04..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php
+++ /dev/null
@@ -1,361 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Tags\Author;
-use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
-use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter;
-use phpDocumentor\Reflection\DocBlock\Tags\Generic;
-use phpDocumentor\Reflection\DocBlock\Tags\Return_;
-use phpDocumentor\Reflection\DocBlock\Tags\See;
-use phpDocumentor\Reflection\Fqsen;
-use phpDocumentor\Reflection\FqsenResolver;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass phpDocumentor\Reflection\DocBlock\StandardTagFactory
- * @covers ::<private>
- */
-class StandardTagFactoryTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testCreatingAGenericTag()
-    {
-        $expectedTagName         = 'unknown-tag';
-        $expectedDescriptionText = 'This is a description';
-        $expectedDescription     = new Description($expectedDescriptionText);
-        $context                 = new Context('');
-
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $descriptionFactory
-            ->shouldReceive('create')
-            ->once()
-            ->with($expectedDescriptionText, $context)
-            ->andReturn($expectedDescription)
-        ;
-
-        $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
-        $tagFactory->addService($descriptionFactory, DescriptionFactory::class);
-
-        /** @var Generic $tag */
-        $tag = $tagFactory->create('@' . $expectedTagName . ' This is a description', $context);
-
-        $this->assertInstanceOf(Generic::class, $tag);
-        $this->assertSame($expectedTagName, $tag->getName());
-        $this->assertSame($expectedDescription, $tag->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Author
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     */
-    public function testCreatingASpecificTag()
-    {
-        $context    = new Context('');
-        $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
-
-        /** @var Author $tag */
-        $tag = $tagFactory->create('@author Mike van Riel <me@xxxxxxxxxxxxxxx>', $context);
-
-        $this->assertInstanceOf(Author::class, $tag);
-        $this->assertSame('author', $tag->getName());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\See
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     */
-    public function testAnEmptyContextIsCreatedIfNoneIsProvided()
-    {
-        $fqsen              = '\Tag';
-        $resolver           = m::mock(FqsenResolver::class)
-            ->shouldReceive('resolve')
-            ->with('Tag', m::type(Context::class))
-            ->andReturn(new Fqsen($fqsen))
-            ->getMock()
-        ;
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $descriptionFactory->shouldIgnoreMissing();
-
-        $tagFactory = new StandardTagFactory($resolver);
-        $tagFactory->addService($descriptionFactory, DescriptionFactory::class);
-
-        /** @var See $tag */
-        $tag = $tagFactory->create('@see Tag');
-
-        $this->assertInstanceOf(See::class, $tag);
-        $this->assertSame($fqsen, (string)$tag->getReference());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Author
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     */
-    public function testPassingYourOwnSetOfTagHandlers()
-    {
-        $context    = new Context('');
-        $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class), ['user' => Author::class]);
-
-        /** @var Author $tag */
-        $tag = $tagFactory->create('@user Mike van Riel <me@xxxxxxxxxxxxxxx>', $context);
-
-        $this->assertInstanceOf(Author::class, $tag);
-        $this->assertSame('author', $tag->getName());
-    }
-
-    /**
-     * @covers ::create
-     * @uses                     phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses                     phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @expectedException \InvalidArgumentException
-     * @expectedExceptionMessage The tag "@user/myuser" does not seem to be wellformed, please check it for errors
-     */
-    public function testExceptionIsThrownIfProvidedTagIsNotWellformed()
-    {
-        $this->markTestIncomplete(
-            'For some reason this test fails; once I have access to a RegEx analyzer I will have to test the regex'
-        )
-        ;
-        $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
-        $tagFactory->create('@user[myuser');
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::addParameter
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     */
-    public function testAddParameterToServiceLocator()
-    {
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-        $tagFactory->addParameter('myParam', 'myValue');
-
-        $this->assertAttributeSame(
-            [FqsenResolver::class => $resolver, 'myParam' => 'myValue'],
-            'serviceLocator',
-            $tagFactory
-        )
-        ;
-    }
-
-    /**
-     * @covers ::addService
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     */
-    public function testAddServiceToServiceLocator()
-    {
-        $service = new PassthroughFormatter();
-
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-        $tagFactory->addService($service);
-
-        $this->assertAttributeSame(
-            [FqsenResolver::class => $resolver, PassthroughFormatter::class => $service],
-            'serviceLocator',
-            $tagFactory
-        )
-        ;
-    }
-
-    /**
-     * @covers ::addService
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     */
-    public function testInjectConcreteServiceForInterfaceToServiceLocator()
-    {
-        $interfaceName = Formatter::class;
-        $service       = new PassthroughFormatter();
-
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-        $tagFactory->addService($service, $interfaceName);
-
-        $this->assertAttributeSame(
-            [FqsenResolver::class => $resolver, $interfaceName => $service],
-            'serviceLocator',
-            $tagFactory
-        )
-        ;
-    }
-
-    /**
-     * @covers ::registerTagHandler
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::create
-     * @uses phpDocumentor\Reflection\DocBlock\Tags\Author
-     */
-    public function testRegisteringAHandlerForANewTag()
-    {
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-
-        $tagFactory->registerTagHandler('my-tag', Author::class);
-
-        // Assert by trying to create one
-        $tag = $tagFactory->create('@my-tag Mike van Riel <me@xxxxxxxxxxxxxxx>');
-        $this->assertInstanceOf(Author::class, $tag);
-    }
-
-    /**
-     * @covers ::registerTagHandler
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @expectedException \InvalidArgumentException
-     */
-    public function testHandlerRegistrationFailsIfProvidedTagNameIsNotAString()
-    {
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-
-        $tagFactory->registerTagHandler([], Author::class);
-    }
-
-    /**
-     * @covers ::registerTagHandler
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @expectedException \InvalidArgumentException
-     */
-    public function testHandlerRegistrationFailsIfProvidedTagNameIsEmpty()
-    {
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-
-        $tagFactory->registerTagHandler('', Author::class);
-    }
-
-    /**
-     * @covers ::registerTagHandler
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @expectedException \InvalidArgumentException
-     */
-    public function testHandlerRegistrationFailsIfProvidedTagNameIsNamespaceButNotFullyQualified()
-    {
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-
-        $tagFactory->registerTagHandler('Name\Spaced\Tag', Author::class);
-    }
-
-    /**
-     * @covers ::registerTagHandler
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @expectedException \InvalidArgumentException
-     */
-    public function testHandlerRegistrationFailsIfProvidedHandlerIsNotAString()
-    {
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-
-        $tagFactory->registerTagHandler('my-tag', []);
-    }
-
-    /**
-     * @covers ::registerTagHandler
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @expectedException \InvalidArgumentException
-     */
-    public function testHandlerRegistrationFailsIfProvidedHandlerIsEmpty()
-    {
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-
-        $tagFactory->registerTagHandler('my-tag', '');
-    }
-
-    /**
-     * @covers ::registerTagHandler
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @expectedException \InvalidArgumentException
-     */
-    public function testHandlerRegistrationFailsIfProvidedHandlerIsNotAnExistingClassName()
-    {
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-
-        $tagFactory->registerTagHandler('my-tag', 'IDoNotExist');
-    }
-
-    /**
-     * @covers ::registerTagHandler
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @expectedException \InvalidArgumentException
-     */
-    public function testHandlerRegistrationFailsIfProvidedHandlerDoesNotImplementTheTagInterface()
-    {
-        $resolver   = m::mock(FqsenResolver::class);
-        $tagFactory = new StandardTagFactory($resolver);
-
-        $tagFactory->registerTagHandler('my-tag', 'stdClass');
-    }
-
-    /**
-     * @covers ::create
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
-     * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
-     * @uses phpDocumentor\Reflection\Docblock\Description
-     * @uses phpDocumentor\Reflection\Docblock\Tags\Return_
-     * @uses phpDocumentor\Reflection\Docblock\Tags\BaseTag
-     */
-    public function testReturntagIsMappedCorrectly()
-    {
-        $context    = new Context('');
-
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $descriptionFactory
-            ->shouldReceive('create')
-            ->once()
-            ->with('', $context)
-            ->andReturn(new Description(''))
-        ;
-
-        $typeResolver = new TypeResolver();
-
-        $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
-        $tagFactory->addService($descriptionFactory, DescriptionFactory::class);
-        $tagFactory->addService($typeResolver, TypeResolver::class);
-
-
-        /** @var Return_ $tag */
-        $tag = $tagFactory->create('@return mixed', $context);
-
-        $this->assertInstanceOf(Return_::class, $tag);
-        $this->assertSame('return', $tag->getName());
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php
deleted file mode 100644
index a54954f8..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Author
- * @covers ::<private>
- */
-class AuthorTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Author('Mike van Riel', 'mike@xxxxxxxxxx');
-
-        $this->assertSame('author', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Author::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Author('Mike van Riel', 'mike@xxxxxxxxxx');
-
-        $this->assertSame('@author Mike van Riel<mike@xxxxxxxxxx>', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Author('Mike van Riel', 'mike@xxxxxxxxxx');
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getAuthorName
-     */
-    public function testHasTheAuthorName()
-    {
-        $expected = 'Mike van Riel';
-
-        $fixture = new Author($expected, 'mike@xxxxxxxxxx');
-
-        $this->assertSame($expected, $fixture->getAuthorName());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getAuthorName
-     * @expectedException \InvalidArgumentException
-     */
-    public function testInitializationFailsIfAuthorNameIsNotAString()
-    {
-        new Author([], 'mike@xxxxxxxxxx');
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getEmail
-     */
-    public function testHasTheAuthorMailAddress()
-    {
-        $expected = 'mike@xxxxxxxxxx';
-
-        $fixture = new Author('Mike van Riel', $expected);
-
-        $this->assertSame($expected, $fixture->getEmail());
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testInitializationFailsIfEmailIsNotAString()
-    {
-        new Author('Mike van Riel', []);
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testInitializationFailsIfEmailIsNotValid()
-    {
-        new Author('Mike van Riel', 'mike');
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Author('Mike van Riel', 'mike@xxxxxxxxxx');
-
-        $this->assertSame('Mike van Riel<mike@xxxxxxxxxx>', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::<public>
-     */
-    public function testFactoryMethod()
-    {
-        $fixture = Author::create('Mike van Riel <mike@xxxxxxxxxx>');
-
-        $this->assertSame('Mike van Riel<mike@xxxxxxxxxx>', (string)$fixture);
-        $this->assertSame('Mike van Riel', $fixture->getAuthorName());
-        $this->assertSame('mike@xxxxxxxxxx', $fixture->getEmail());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::<public>
-     */
-    public function testFactoryMethodReturnsNullIfItCouldNotReadBody()
-    {
-        $this->assertNull(Author::create('dfgr<'));
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php
deleted file mode 100644
index a2b5e4b3..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php
+++ /dev/null
@@ -1,155 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\Fqsen;
-use phpDocumentor\Reflection\FqsenResolver;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Covers
- * @covers ::<private>
- */
-class CoversTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
-
-        $this->assertSame('covers', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Covers::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
-
-        $this->assertSame('@covers \DateTime Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getReference
-     */
-    public function testHasReferenceToFqsen()
-    {
-        $expected = new Fqsen('\DateTime');
-
-        $fixture = new Covers($expected);
-
-        $this->assertSame($expected, $fixture->getReference());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Covers(new Fqsen('\DateTime'), $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
-
-        $this->assertSame('\DateTime Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\FqsenResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Fqsen
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $resolver = m::mock(FqsenResolver::class);
-        $context = new Context('');
-
-        $fqsen = new Fqsen('\DateTime');
-        $description = new Description('My Description');
-
-        $descriptionFactory
-            ->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-        $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);
-
-        $fixture = Covers::create('DateTime My Description', $descriptionFactory, $resolver, $context);
-
-        $this->assertSame('\DateTime My Description', (string)$fixture);
-        $this->assertSame($fqsen, $fixture->getReference());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        $this->assertNull(Covers::create([]));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotEmpty()
-    {
-        $this->assertNull(Covers::create(''));
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php
deleted file mode 100644
index 8be9ad7e..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Deprecated
- * @covers ::<private>
- */
-class DeprecatedTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Deprecated('1.0', new Description('Description'));
-
-        $this->assertSame('deprecated', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Deprecated('1.0', new Description('Description'));
-
-        $this->assertSame('@deprecated 1.0 Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Deprecated('1.0', new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getVersion
-     */
-    public function testHasVersionNumber()
-    {
-        $expected = '1.0';
-
-        $fixture = new Deprecated($expected);
-
-        $this->assertSame($expected, $fixture->getVersion());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Deprecated('1.0', $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Deprecated('1.0', new Description('Description'));
-
-        $this->assertSame('1.0 Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context = new Context('');
-
-        $version = '1.0';
-        $description = new Description('My Description');
-
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Deprecated::create('1.0 My Description', $descriptionFactory, $context);
-
-        $this->assertSame('1.0 My Description', (string)$fixture);
-        $this->assertSame($version, $fixture->getVersion());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethodCreatesEmptyDeprecatedTag()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $descriptionFactory->shouldReceive('create')->never();
-
-        $fixture = Deprecated::create('', $descriptionFactory, new Context(''));
-
-        $this->assertSame('', (string)$fixture);
-        $this->assertSame(null, $fixture->getVersion());
-        $this->assertSame(null, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfVersionIsNotString()
-    {
-        $this->assertNull(Deprecated::create([]));
-    }
-
-    /**
-     * @covers ::create
-     */
-    public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex()
-    {
-        $this->assertEquals(new Deprecated(), Deprecated::create('dkhf<'));
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php
deleted file mode 100644
index 045a197f..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\Tags\Generic;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
- */
-class PassthroughFormatterTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers ::format
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic
-     */
-    public function testFormatterCallsToStringAndReturnsAStandardRepresentation()
-    {
-        $expected = '@unknown-tag This is a description';
-
-        $fixture = new PassthroughFormatter();
-
-        $this->assertSame(
-            $expected,
-            $fixture->format(new Generic('unknown-tag', new Description('This is a description')))
-        );
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php
deleted file mode 100644
index 02fa5300..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @generic      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Generic
- * @covers ::<private>
- */
-class GenericTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Generic('generic', new Description('Description'));
-
-        $this->assertSame('generic', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Generic::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Generic('generic', new Description('Description'));
-
-        $this->assertSame('@generic Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Generic('generic', new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Generic('generic', $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Generic('generic', new Description('Description'));
-
-        $this->assertSame('Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context = new Context('');
-
-        $generics = 'generic';
-        $description = new Description('My Description');
-
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Generic::create('My Description', 'generic', $descriptionFactory, $context);
-
-        $this->assertSame('My Description', (string)$fixture);
-        $this->assertSame($generics, $fixture->getName());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfNameIsNotString()
-    {
-        Generic::create('', []);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfNameIsNotEmpty()
-    {
-        Generic::create('', '');
-    }
-
-    /**
-     * @covers ::create
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfNameContainsIllegalCharacters()
-    {
-        Generic::create('', 'name/myname');
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php
deleted file mode 100644
index 9940aec7..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php
+++ /dev/null
@@ -1,158 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Link
- * @covers ::<private>
- */
-class LinkTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Link('http://this.is.my/link', new Description('Description'));
-
-        $this->assertSame('link', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Link::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Link('http://this.is.my/link', new Description('Description'));
-
-        $this->assertSame('@link http://this.is.my/link Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Link('http://this.is.my/link', new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getLink
-     */
-    public function testHasLinkUrl()
-    {
-        $expected = 'http://this.is.my/link';
-
-        $fixture = new Link($expected);
-
-        $this->assertSame($expected, $fixture->getLink());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Link('http://this.is.my/link', $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Link('http://this.is.my/link', new Description('Description'));
-
-        $this->assertSame('http://this.is.my/link Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context = new Context('');
-
-        $links = 'http://this.is.my/link';
-        $description = new Description('My Description');
-
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Link::create('http://this.is.my/link My Description', $descriptionFactory, $context);
-
-        $this->assertSame('http://this.is.my/link My Description', (string)$fixture);
-        $this->assertSame($links, $fixture->getLink());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethodCreatesEmptyLinkTag()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $descriptionFactory->shouldReceive('create')->never();
-
-        $fixture = Link::create('', $descriptionFactory, new Context(''));
-
-        $this->assertSame('', (string)$fixture);
-        $this->assertSame('', $fixture->getLink());
-        $this->assertSame(null, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfVersionIsNotString()
-    {
-        $this->assertNull(Link::create([]));
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php
deleted file mode 100644
index 5d6e981e..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php
+++ /dev/null
@@ -1,437 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Array_;
-use phpDocumentor\Reflection\Types\Compound;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\Integer;
-use phpDocumentor\Reflection\Types\Object_;
-use phpDocumentor\Reflection\Types\String_;
-use phpDocumentor\Reflection\Types\Void_;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Method
- * @covers ::<private>
- */
-class MethodTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Method('myMethod');
-
-        $this->assertSame('method', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Method::isStatic
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Method::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $arguments = [
-            ['name' => 'argument1', 'type' => new String_()],
-            ['name' => 'argument2', 'type' => new Object_()]
-        ];
-        $fixture = new Method('myMethod', $arguments, new Void_(), true, new Description('My Description'));
-
-        $this->assertSame(
-            '@method static void myMethod(string $argument1, object $argument2) My Description',
-            $fixture->render()
-        );
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Method('myMethod');
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getMethodName
-     */
-    public function testHasMethodName()
-    {
-        $expected = 'myMethod';
-
-        $fixture = new Method($expected);
-
-        $this->assertSame($expected, $fixture->getMethodName());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getArguments
-     */
-    public function testHasArguments()
-    {
-        $arguments = [
-            [ 'name' => 'argument1', 'type' => new String_() ]
-        ];
-
-        $fixture = new Method('myMethod', $arguments);
-
-        $this->assertSame($arguments, $fixture->getArguments());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getArguments
-     */
-    public function testArgumentsMayBePassedAsString()
-    {
-        $arguments = ['argument1'];
-        $expected = [
-            [ 'name' => $arguments[0], 'type' => new Void_() ]
-        ];
-
-        $fixture = new Method('myMethod', $arguments);
-
-        $this->assertEquals($expected, $fixture->getArguments());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getArguments
-     */
-    public function testArgumentTypeCanBeInferredAsVoid()
-    {
-        $arguments = [ [ 'name' => 'argument1' ] ];
-        $expected = [
-            [ 'name' => $arguments[0]['name'], 'type' => new Void_() ]
-        ];
-
-        $fixture = new Method('myMethod', $arguments);
-
-        $this->assertEquals($expected, $fixture->getArguments());
-    }
-
-    /**
-     * @covers ::create
-     */
-    public function testRestArgumentIsParsedAsRegularArg()
-    {
-        $expected = [
-            [ 'name' => 'arg1', 'type' => new Void_() ],
-            [ 'name' => 'rest', 'type' => new Void_() ],
-            [ 'name' => 'rest2', 'type' => new Array_() ],
-        ];
-
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $resolver           = new TypeResolver();
-        $context            = new Context('');
-        $description  = new Description('');
-        $descriptionFactory->shouldReceive('create')->with('', $context)->andReturn($description);
-
-        $fixture = Method::create(
-            'void myMethod($arg1, ...$rest, array ... $rest2)',
-            $resolver,
-            $descriptionFactory,
-            $context
-        );
-
-        $this->assertEquals($expected, $fixture->getArguments());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getReturnType
-     */
-    public function testHasReturnType()
-    {
-        $expected = new String_();
-
-        $fixture = new Method('myMethod', [], $expected);
-
-        $this->assertSame($expected, $fixture->getReturnType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getReturnType
-     */
-    public function testReturnTypeCanBeInferredAsVoid()
-    {
-        $fixture = new Method('myMethod', []);
-
-        $this->assertEquals(new Void_(), $fixture->getReturnType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::isStatic
-     */
-    public function testMethodCanBeStatic()
-    {
-        $expected = false;
-        $fixture = new Method('myMethod', [], null, $expected);
-        $this->assertSame($expected, $fixture->isStatic());
-
-        $expected = true;
-        $fixture = new Method('myMethod', [], null, $expected);
-        $this->assertSame($expected, $fixture->isStatic());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Method('myMethod', [], null, false, $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Method::isStatic
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $arguments = [
-            ['name' => 'argument1', 'type' => new String_()],
-            ['name' => 'argument2', 'type' => new Object_()]
-        ];
-        $fixture = new Method('myMethod', $arguments, new Void_(), true, new Description('My Description'));
-
-        $this->assertSame(
-            'static void myMethod(string $argument1, object $argument2) My Description',
-            (string)$fixture
-        );
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Fqsen
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $resolver           = new TypeResolver();
-        $context            = new Context('');
-
-        $description  = new Description('My Description');
-        $expectedArguments = [
-            [ 'name' => 'argument1', 'type' => new String_() ],
-            [ 'name' => 'argument2', 'type' => new Void_() ]
-        ];
-
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Method::create(
-            'static void myMethod(string $argument1, $argument2) My Description',
-            $resolver,
-            $descriptionFactory,
-            $context
-        );
-
-        $this->assertSame('static void myMethod(string $argument1, void $argument2) My Description', (string)$fixture);
-        $this->assertSame('myMethod', $fixture->getMethodName());
-        $this->assertEquals($expectedArguments, $fixture->getArguments());
-        $this->assertInstanceOf(Void_::class, $fixture->getReturnType());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    public function collectionReturnTypesProvider()
-    {
-        return [
-            ['int[]',    Array_::class, Integer::class, Compound::class],
-            ['int[][]',  Array_::class, Array_::class,  Compound::class],
-            ['Object[]', Array_::class, Object_::class, Compound::class],
-            ['array[]',  Array_::class, Array_::class,  Compound::class],
-        ];
-    }
-
-    /**
-     * @dataProvider collectionReturnTypesProvider
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\Types\Array_
-     * @uses \phpDocumentor\Reflection\Types\Compound
-     * @uses \phpDocumentor\Reflection\Types\Integer
-     * @uses \phpDocumentor\Reflection\Types\Object_
-     * @param string $returnType
-     * @param string $expectedType
-     * @param string $expectedValueType
-     * @param string null $expectedKeyType
-     */
-    public function testCollectionReturnTypes(
-        $returnType,
-        $expectedType,
-        $expectedValueType = null,
-        $expectedKeyType = null
-    ) { $resolver           = new TypeResolver();
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $descriptionFactory->shouldReceive('create')->with('', null)->andReturn(new Description(''));
-
-        $fixture = Method::create("$returnType myMethod(\$arg)", $resolver, $descriptionFactory);
-        $returnType = $fixture->getReturnType();
-        $this->assertInstanceOf($expectedType, $returnType);
-
-        if ($returnType instanceof Array_) {
-            $this->assertInstanceOf($expectedValueType, $returnType->getValueType());
-            $this->assertInstanceOf($expectedKeyType, $returnType->getKeyType());
-        }
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        Method::create([]);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsEmpty()
-    {
-        Method::create('');
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodReturnsNullIfBodyIsIncorrect()
-    {
-        $this->assertNull(Method::create('body('));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        Method::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        Method::create('body', new TypeResolver());
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testCreationFailsIfBodyIsNotString()
-    {
-        new Method([]);
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testCreationFailsIfBodyIsEmpty()
-    {
-        new Method('');
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testCreationFailsIfStaticIsNotBoolean()
-    {
-        new Method('body', [], null, []);
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testCreationFailsIfArgumentRecordContainsInvalidEntry()
-    {
-        new Method('body', [ [ 'name' => 'myName', 'unknown' => 'nah' ] ]);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Fqsen
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testCreateMethodParenthesisMissing()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $resolver           = new TypeResolver();
-        $context            = new Context('');
-
-        $description  = new Description('My Description');
-
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Method::create(
-            'static void myMethod My Description',
-            $resolver,
-            $descriptionFactory,
-            $context
-        );
-
-        $this->assertSame('static void myMethod() My Description', (string)$fixture);
-        $this->assertSame('myMethod', $fixture->getMethodName());
-        $this->assertEquals([], $fixture->getArguments());
-        $this->assertInstanceOf(Void_::class, $fixture->getReturnType());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php
deleted file mode 100644
index 0c718ab7..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php
+++ /dev/null
@@ -1,228 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\String_;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Param
- * @covers ::<private>
- */
-class ParamTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Param('myParameter', null, false, new Description('Description'));
-
-        $this->assertSame('param', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Param::isVariadic
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Param::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Param('myParameter', new String_(), true, new Description('Description'));
-        $this->assertSame('@param string ...$myParameter Description', $fixture->render());
-
-        $fixture = new Param('myParameter', new String_(), false, new Description('Description'));
-        $this->assertSame('@param string $myParameter Description', $fixture->render());
-
-        $fixture = new Param('myParameter', null, false, new Description('Description'));
-        $this->assertSame('@param $myParameter Description', $fixture->render());
-
-        $fixture = new Param('myParameter');
-        $this->assertSame('@param $myParameter', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Param('myParameter');
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getVariableName
-     */
-    public function testHasVariableName()
-    {
-        $expected = 'myParameter';
-
-        $fixture = new Param($expected);
-
-        $this->assertSame($expected, $fixture->getVariableName());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getType
-     */
-    public function testHasType()
-    {
-        $expected = new String_();
-
-        $fixture = new Param('myParameter', $expected);
-
-        $this->assertSame($expected, $fixture->getType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::isVariadic
-     */
-    public function testIfParameterIsVariadic()
-    {
-        $fixture = new Param('myParameter', new String_(), false);
-        $this->assertFalse($fixture->isVariadic());
-
-        $fixture = new Param('myParameter', new String_(), true);
-        $this->assertTrue($fixture->isVariadic());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Param('1.0', null, false, $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::isVariadic
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @uses   \phpDocumentor\Reflection\Types\String_
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Param('myParameter', new String_(), true, new Description('Description'));
-
-        $this->assertSame('string ...$myParameter Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $typeResolver = new TypeResolver();
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context = new Context('');
-
-        $description = new Description('My Description');
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Param::create('string ...$myParameter My Description', $typeResolver, $descriptionFactory, $context);
-
-        $this->assertSame('string ...$myParameter My Description', (string)$fixture);
-        $this->assertSame('myParameter', $fixture->getVariableName());
-        $this->assertInstanceOf(String_::class, $fixture->getType());
-        $this->assertTrue($fixture->isVariadic());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::<public>
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfEmptyBodyIsGiven()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        Param::create('', new TypeResolver(), $descriptionFactory);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        Param::create([]);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        Param::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        Param::create('body', new TypeResolver());
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfVariableNameIsNotString()
-    {
-        new Param([]);
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfVariadicIsNotBoolean()
-    {
-        new Param('', null, []);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php
deleted file mode 100644
index c3fb7700..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php
+++ /dev/null
@@ -1,201 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\String_;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead
- * @covers ::<private>
- */
-class PropertyReadTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new PropertyRead('myProperty', null, new Description('Description'));
-
-        $this->assertSame('property-read', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new PropertyRead('myProperty', new String_(), new Description('Description'));
-        $this->assertSame('@property-read string $myProperty Description', $fixture->render());
-
-        $fixture = new PropertyRead('myProperty', null, new Description('Description'));
-        $this->assertSame('@property-read $myProperty Description', $fixture->render());
-
-        $fixture = new PropertyRead('myProperty');
-        $this->assertSame('@property-read $myProperty', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new PropertyRead('myProperty');
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getVariableName
-     */
-    public function testHasVariableName()
-    {
-        $expected = 'myProperty';
-
-        $fixture = new PropertyRead($expected);
-
-        $this->assertSame($expected, $fixture->getVariableName());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getType
-     */
-    public function testHasType()
-    {
-        $expected = new String_();
-
-        $fixture = new PropertyRead('myProperty', $expected);
-
-        $this->assertSame($expected, $fixture->getType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new PropertyRead('1.0', null, $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @uses   \phpDocumentor\Reflection\Types\String_
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new PropertyRead('myProperty', new String_(), new Description('Description'));
-
-        $this->assertSame('string $myProperty Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $typeResolver = new TypeResolver();
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context = new Context('');
-
-        $description = new Description('My Description');
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = PropertyRead::create('string $myProperty My Description', $typeResolver, $descriptionFactory,
-            $context);
-
-        $this->assertSame('string $myProperty My Description', (string)$fixture);
-        $this->assertSame('myProperty', $fixture->getVariableName());
-        $this->assertInstanceOf(String_::class, $fixture->getType());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::<public>
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfEmptyBodyIsGiven()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        PropertyRead::create('', new TypeResolver(), $descriptionFactory);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        PropertyRead::create([]);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        PropertyRead::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        PropertyRead::create('body', new TypeResolver());
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfVariableNameIsNotString()
-    {
-        new PropertyRead([]);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php
deleted file mode 100644
index 908dfb28..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php
+++ /dev/null
@@ -1,200 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\String_;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Property
- * @covers ::<private>
- */
-class PropertyTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Property('myProperty', null, new Description('Description'));
-
-        $this->assertSame('property', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Property::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Property('myProperty', new String_(), new Description('Description'));
-        $this->assertSame('@property string $myProperty Description', $fixture->render());
-
-        $fixture = new Property('myProperty', null, new Description('Description'));
-        $this->assertSame('@property $myProperty Description', $fixture->render());
-
-        $fixture = new Property('myProperty');
-        $this->assertSame('@property $myProperty', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Property('myProperty');
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getVariableName
-     */
-    public function testHasVariableName()
-    {
-        $expected = 'myProperty';
-
-        $fixture = new Property($expected);
-
-        $this->assertSame($expected, $fixture->getVariableName());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getType
-     */
-    public function testHasType()
-    {
-        $expected = new String_();
-
-        $fixture = new Property('myProperty', $expected);
-
-        $this->assertSame($expected, $fixture->getType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Property('1.0', null, $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @uses   \phpDocumentor\Reflection\Types\String_
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Property('myProperty', new String_(), new Description('Description'));
-
-        $this->assertSame('string $myProperty Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $typeResolver = new TypeResolver();
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context = new Context('');
-
-        $description = new Description('My Description');
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Property::create('string $myProperty My Description', $typeResolver, $descriptionFactory, $context);
-
-        $this->assertSame('string $myProperty My Description', (string)$fixture);
-        $this->assertSame('myProperty', $fixture->getVariableName());
-        $this->assertInstanceOf(String_::class, $fixture->getType());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::<public>
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfEmptyBodyIsGiven()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        Property::create('', new TypeResolver(), $descriptionFactory);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        Property::create([]);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        Property::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        Property::create('body', new TypeResolver());
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfVariableNameIsNotString()
-    {
-        new Property([]);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php
deleted file mode 100644
index 5ea6524c..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php
+++ /dev/null
@@ -1,201 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\String_;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite
- * @covers ::<private>
- */
-class PropertyWriteTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new PropertyWrite('myProperty', null, new Description('Description'));
-
-        $this->assertSame('property-write', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new PropertyWrite('myProperty', new String_(), new Description('Description'));
-        $this->assertSame('@property-write string $myProperty Description', $fixture->render());
-
-        $fixture = new PropertyWrite('myProperty', null, new Description('Description'));
-        $this->assertSame('@property-write $myProperty Description', $fixture->render());
-
-        $fixture = new PropertyWrite('myProperty');
-        $this->assertSame('@property-write $myProperty', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new PropertyWrite('myProperty');
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getVariableName
-     */
-    public function testHasVariableName()
-    {
-        $expected = 'myProperty';
-
-        $fixture = new PropertyWrite($expected);
-
-        $this->assertSame($expected, $fixture->getVariableName());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getType
-     */
-    public function testHasType()
-    {
-        $expected = new String_();
-
-        $fixture = new PropertyWrite('myProperty', $expected);
-
-        $this->assertSame($expected, $fixture->getType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new PropertyWrite('1.0', null, $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @uses   \phpDocumentor\Reflection\Types\String_
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new PropertyWrite('myProperty', new String_(), new Description('Description'));
-
-        $this->assertSame('string $myProperty Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $typeResolver = new TypeResolver();
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context = new Context('');
-
-        $description = new Description('My Description');
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = PropertyWrite::create('string $myProperty My Description', $typeResolver, $descriptionFactory,
-            $context);
-
-        $this->assertSame('string $myProperty My Description', (string)$fixture);
-        $this->assertSame('myProperty', $fixture->getVariableName());
-        $this->assertInstanceOf(String_::class, $fixture->getType());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::<public>
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfEmptyBodyIsGiven()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        PropertyWrite::create('', new TypeResolver(), $descriptionFactory);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        PropertyWrite::create([]);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        PropertyWrite::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        PropertyWrite::create('body', new TypeResolver());
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfVariableNameIsNotString()
-    {
-        new PropertyWrite([]);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php
deleted file mode 100644
index 2bc54391..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\String_;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Return_
- * @covers ::<private>
- */
-class ReturnTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Return_(new String_(), new Description('Description'));
-
-        $this->assertSame('return', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Return_::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Return_(new String_(), new Description('Description'));
-
-        $this->assertSame('@return string Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Return_(new String_(), new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getType
-     */
-    public function testHasType()
-    {
-        $expected = new String_();
-
-        $fixture = new Return_($expected);
-
-        $this->assertSame($expected, $fixture->getType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Return_(new String_(), $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Return_(new String_(), new Description('Description'));
-
-        $this->assertSame('string Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\String_
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $resolver = new TypeResolver();
-        $context = new Context('');
-
-        $type = new String_();
-        $description = new Description('My Description');
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Return_::create('string My Description', $resolver, $descriptionFactory, $context);
-
-        $this->assertSame('string My Description', (string)$fixture);
-        $this->assertEquals($type, $fixture->getType());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        $this->assertNull(Return_::create([]));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotEmpty()
-    {
-        $this->assertNull(Return_::create(''));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        Return_::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        Return_::create('body', new TypeResolver());
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php
deleted file mode 100644
index 8d3e3e8c..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\Fqsen;
-use phpDocumentor\Reflection\FqsenResolver;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\See
- * @covers ::<private>
- */
-class SeeTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\See::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
-
-        $this->assertSame('see', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\See::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\See::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
-
-        $this->assertSame('@see \DateTime Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\See::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getReference
-     */
-    public function testHasReferenceToFqsen()
-    {
-        $expected = new Fqsen('\DateTime');
-
-        $fixture = new See($expected);
-
-        $this->assertSame($expected, $fixture->getReference());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new See(new Fqsen('\DateTime'), $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
-
-        $this->assertSame('\DateTime Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\FqsenResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Fqsen
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $resolver = m::mock(FqsenResolver::class);
-        $context = new Context('');
-
-        $fqsen = new Fqsen('\DateTime');
-        $description = new Description('My Description');
-
-        $descriptionFactory
-            ->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-        $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);
-
-        $fixture = See::create('DateTime My Description', $resolver, $descriptionFactory, $context);
-
-        $this->assertSame('\DateTime My Description', (string)$fixture);
-        $this->assertSame($fqsen, $fixture->getReference());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        $this->assertNull(See::create([]));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotEmpty()
-    {
-        $this->assertNull(See::create(''));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        See::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        See::create('body', new FqsenResolver());
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php
deleted file mode 100644
index 3f42db5d..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Since
- * @covers ::<private>
- */
-class SinceTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Since('1.0', new Description('Description'));
-
-        $this->assertSame('since', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Since::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Since('1.0', new Description('Description'));
-
-        $this->assertSame('@since 1.0 Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Since('1.0', new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getVersion
-     */
-    public function testHasVersionNumber()
-    {
-        $expected = '1.0';
-
-        $fixture = new Since($expected);
-
-        $this->assertSame($expected, $fixture->getVersion());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Since('1.0', $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Since('1.0', new Description('Description'));
-
-        $this->assertSame('1.0 Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context            = new Context('');
-
-        $version     = '1.0';
-        $description = new Description('My Description');
-
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Since::create('1.0 My Description', $descriptionFactory, $context);
-
-        $this->assertSame('1.0 My Description', (string)$fixture);
-        $this->assertSame($version, $fixture->getVersion());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethodCreatesEmptySinceTag()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $descriptionFactory->shouldReceive('create')->never();
-
-        $fixture = Since::create('', $descriptionFactory, new Context(''));
-
-        $this->assertSame('', (string)$fixture);
-        $this->assertSame(null, $fixture->getVersion());
-        $this->assertSame(null, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfSinceIsNotString()
-    {
-        $this->assertNull(Since::create([]));
-    }
-
-    /**
-     * @covers ::create
-     */
-    public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex()
-    {
-        $this->assertNull(Since::create('dkhf<'));
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php
deleted file mode 100644
index cbf01f65..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php
+++ /dev/null
@@ -1,199 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\String_;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Source
- * @covers ::<private>
- */
-class SourceTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Source(1, null, new Description('Description'));
-
-        $this->assertSame('source', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Source::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Source(1, 10, new Description('Description'));
-        $this->assertSame('@source 1 10 Description', $fixture->render());
-
-        $fixture = new Source(1, null, new Description('Description'));
-        $this->assertSame('@source 1 Description', $fixture->render());
-
-        $fixture = new Source(1);
-        $this->assertSame('@source 1', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Source(1);
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getStartingLine
-     */
-    public function testHasStartingLine()
-    {
-        $expected = 1;
-
-        $fixture = new Source($expected);
-
-        $this->assertSame($expected, $fixture->getStartingLine());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getLineCount
-     */
-    public function testHasLineCount()
-    {
-        $expected = 2;
-
-        $fixture = new Source(1, $expected);
-
-        $this->assertSame($expected, $fixture->getLineCount());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Source('1', null, $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @uses   \phpDocumentor\Reflection\Types\String_
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Source(1, 10, new Description('Description'));
-
-        $this->assertSame('1 10 Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context            = new Context('');
-
-        $description = new Description('My Description');
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Source::create('1 10 My Description', $descriptionFactory, $context);
-
-        $this->assertSame('1 10 My Description', (string)$fixture);
-        $this->assertSame(1, $fixture->getStartingLine());
-        $this->assertSame(10, $fixture->getLineCount());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::<public>
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfEmptyBodyIsGiven()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        Source::create('', $descriptionFactory);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        Source::create([]);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        Source::create('1');
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfStartingLineIsNotInteger()
-    {
-        new Source('blabla');
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfLineCountIsNotIntegerOrNull()
-    {
-        new Source('1', []);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php
deleted file mode 100644
index 657d6ca5..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php
+++ /dev/null
@@ -1,170 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\String_;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Throws
- * @covers ::<private>
- */
-class ThrowsTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Throws(new String_(), new Description('Description'));
-
-        $this->assertSame('throws', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Throws::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Throws(new String_(), new Description('Description'));
-
-        $this->assertSame('@throws string Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Throws(new String_(), new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getType
-     */
-    public function testHasType()
-    {
-        $expected = new String_();
-
-        $fixture = new Throws($expected);
-
-        $this->assertSame($expected, $fixture->getType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Throws(new String_(), $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Throws(new String_(), new Description('Description'));
-
-        $this->assertSame('string Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\String_
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $resolver           = new TypeResolver();
-        $context            = new Context('');
-
-        $type        = new String_();
-        $description = new Description('My Description');
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Throws::create('string My Description', $resolver, $descriptionFactory, $context);
-
-        $this->assertSame('string My Description', (string)$fixture);
-        $this->assertEquals($type, $fixture->getType());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        $this->assertNull(Throws::create([]));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotEmpty()
-    {
-        $this->assertNull(Throws::create(''));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        Throws::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        Throws::create('body', new TypeResolver());
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php
deleted file mode 100644
index 419f7e36..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php
+++ /dev/null
@@ -1,174 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\Fqsen;
-use phpDocumentor\Reflection\FqsenResolver;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Uses
- * @covers ::<private>
- */
-class UsesTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
-
-        $this->assertSame('uses', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Uses::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
-
-        $this->assertSame('@uses \DateTime Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getReference
-     */
-    public function testHasReferenceToFqsen()
-    {
-        $expected = new Fqsen('\DateTime');
-
-        $fixture = new Uses($expected);
-
-        $this->assertSame($expected, $fixture->getReference());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Uses(new Fqsen('\DateTime'), $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
-
-        $this->assertSame('\DateTime Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\FqsenResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Fqsen
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $resolver           = m::mock(FqsenResolver::class);
-        $context            = new Context('');
-
-        $fqsen       = new Fqsen('\DateTime');
-        $description = new Description('My Description');
-
-        $descriptionFactory
-            ->shouldReceive('create')->with('My Description', $context)->andReturn($description)
-        ;
-        $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);
-
-        $fixture = Uses::create('DateTime My Description', $resolver, $descriptionFactory, $context);
-
-        $this->assertSame('\DateTime My Description', (string)$fixture);
-        $this->assertSame($fqsen, $fixture->getReference());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        $this->assertNull(Uses::create([]));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotEmpty()
-    {
-        $this->assertNull(Uses::create(''));
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        Uses::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        Uses::create('body', new FqsenResolver());
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php
deleted file mode 100644
index 34f290ad..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php
+++ /dev/null
@@ -1,200 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\String_;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Var_
- * @covers ::<private>
- */
-class VarTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Var_('myVariable', null, new Description('Description'));
-
-        $this->assertSame('var', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Var_::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Var_('myVariable', new String_(), new Description('Description'));
-        $this->assertSame('@var string $myVariable Description', $fixture->render());
-
-        $fixture = new Var_('myVariable', null, new Description('Description'));
-        $this->assertSame('@var $myVariable Description', $fixture->render());
-
-        $fixture = new Var_('myVariable');
-        $this->assertSame('@var $myVariable', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Var_('myVariable');
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getVariableName
-     */
-    public function testHasVariableName()
-    {
-        $expected = 'myVariable';
-
-        $fixture = new Var_($expected);
-
-        $this->assertSame($expected, $fixture->getVariableName());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getType
-     */
-    public function testHasType()
-    {
-        $expected = new String_();
-
-        $fixture = new Var_('myVariable', $expected);
-
-        $this->assertSame($expected, $fixture->getType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Var_('1.0', null, $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @uses   \phpDocumentor\Reflection\Types\String_
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Var_('myVariable', new String_(), new Description('Description'));
-
-        $this->assertSame('string $myVariable Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $typeResolver       = new TypeResolver();
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context            = new Context('');
-
-        $description = new Description('My Description');
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Var_::create('string $myVariable My Description', $typeResolver, $descriptionFactory, $context);
-
-        $this->assertSame('string $myVariable My Description', (string)$fixture);
-        $this->assertSame('myVariable', $fixture->getVariableName());
-        $this->assertInstanceOf(String_::class, $fixture->getType());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::<public>
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfEmptyBodyIsGiven()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        Var_::create('', new TypeResolver(), $descriptionFactory);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfBodyIsNotString()
-    {
-        Var_::create([]);
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfResolverIsNull()
-    {
-        Var_::create('body');
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\TypeResolver
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
-    {
-        Var_::create('body', new TypeResolver());
-    }
-
-    /**
-     * @covers ::__construct
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfVariableNameIsNotString()
-    {
-        new Var_([]);
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php
deleted file mode 100644
index 5c487fd3..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php
+++ /dev/null
@@ -1,166 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\DocBlock\Tags;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Version
- * @covers ::<private>
- */
-class VersionTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfCorrectTagNameIsReturned()
-    {
-        $fixture = new Version('1.0', new Description('Description'));
-
-        $this->assertSame('version', $fixture->getName());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Version::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
-     */
-    public function testIfTagCanBeRenderedUsingDefaultFormatter()
-    {
-        $fixture = new Version('1.0', new Description('Description'));
-
-        $this->assertSame('@version 1.0 Description', $fixture->render());
-    }
-
-    /**
-     * @uses   \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
-     */
-    public function testIfTagCanBeRenderedUsingSpecificFormatter()
-    {
-        $fixture = new Version('1.0', new Description('Description'));
-
-        $formatter = m::mock(Formatter::class);
-        $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
-
-        $this->assertSame('Rendered output', $fixture->render($formatter));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getVersion
-     */
-    public function testHasVersionNumber()
-    {
-        $expected = '1.0';
-
-        $fixture = new Version($expected);
-
-        $this->assertSame($expected, $fixture->getVersion());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testHasDescription()
-    {
-        $expected = new Description('Description');
-
-        $fixture = new Version('1.0', $expected);
-
-        $this->assertSame($expected, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::__toString
-     * @uses   \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testStringRepresentationIsReturned()
-    {
-        $fixture = new Version('1.0', new Description('Description'));
-
-        $this->assertSame('1.0 Description', (string)$fixture);
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethod()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $context            = new Context('');
-
-        $version     = '1.0';
-        $description = new Description('My Description');
-
-        $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
-
-        $fixture = Version::create('1.0 My Description', $descriptionFactory, $context);
-
-        $this->assertSame('1.0 My Description', (string)$fixture);
-        $this->assertSame($version, $fixture->getVersion());
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::<public>
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testFactoryMethodCreatesEmptyVersionTag()
-    {
-        $descriptionFactory = m::mock(DescriptionFactory::class);
-        $descriptionFactory->shouldReceive('create')->never();
-
-        $fixture = Version::create('', $descriptionFactory, new Context(''));
-
-        $this->assertSame('', (string)$fixture);
-        $this->assertSame(null, $fixture->getVersion());
-        $this->assertSame(null, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::create
-     * @expectedException \InvalidArgumentException
-     */
-    public function testFactoryMethodFailsIfVersionIsNotString()
-    {
-        $this->assertNull(Version::create([]));
-    }
-
-    /**
-     * @covers ::create
-     */
-    public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex()
-    {
-        $this->assertNull(Version::create('dkhf<'));
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php
deleted file mode 100644
index f1261b65..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php
+++ /dev/null
@@ -1,290 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection;
-
-use Mockery as m;
-use phpDocumentor\Reflection\DocBlock\Description;
-use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
-use phpDocumentor\Reflection\DocBlock\Tag;
-use phpDocumentor\Reflection\DocBlock\TagFactory;
-use phpDocumentor\Reflection\DocBlock\Tags\Param;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass phpDocumentor\Reflection\DocBlockFactory
- * @covers             ::<private>
- * @uses               \Webmozart\Assert\Assert
- * @uses               phpDocumentor\Reflection\DocBlock
- */
-class DocBlockFactoryTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers ::__construct
-     * @covers ::createInstance
-     * @uses \phpDocumentor\Reflection\DocBlock\StandardTagFactory
-     * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     */
-    public function testCreateFactoryUsingFactoryMethod()
-    {
-        $fixture = DocBlockFactory::createInstance();
-
-        $this->assertInstanceOf(DocBlockFactory::class, $fixture);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses   phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testCreateDocBlockFromReflection()
-    {
-        $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class));
-
-        $docBlock       = '/** This is a DocBlock */';
-        $classReflector = m::mock(\ReflectionClass::class);
-        $classReflector->shouldReceive('getDocComment')->andReturn($docBlock);
-        $docblock = $fixture->create($classReflector);
-
-        $this->assertInstanceOf(DocBlock::class, $docblock);
-        $this->assertSame('This is a DocBlock', $docblock->getSummary());
-        $this->assertEquals(new Description(''), $docblock->getDescription());
-        $this->assertSame([], $docblock->getTags());
-        $this->assertEquals(new Context(''), $docblock->getContext());
-        $this->assertNull($docblock->getLocation());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses   phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testCreateDocBlockFromStringWithDocComment()
-    {
-        $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class));
-
-        $docblock = $fixture->create('/** This is a DocBlock */');
-
-        $this->assertInstanceOf(DocBlock::class, $docblock);
-        $this->assertSame('This is a DocBlock', $docblock->getSummary());
-        $this->assertEquals(new Description(''), $docblock->getDescription());
-        $this->assertSame([], $docblock->getTags());
-        $this->assertEquals(new Context(''), $docblock->getContext());
-        $this->assertNull($docblock->getLocation());
-    }
-
-    /**
-     * @covers ::create
-     * @covers ::__construct
-     * @uses   phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testCreateDocBlockFromStringWithoutDocComment()
-    {
-        $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class));
-
-        $docblock = $fixture->create('This is a DocBlock');
-
-        $this->assertInstanceOf(DocBlock::class, $docblock);
-        $this->assertSame('This is a DocBlock', $docblock->getSummary());
-        $this->assertEquals(new Description(''), $docblock->getDescription());
-        $this->assertSame([], $docblock->getTags());
-        $this->assertEquals(new Context(''), $docblock->getContext());
-        $this->assertNull($docblock->getLocation());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses         phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses         phpDocumentor\Reflection\DocBlock\Description
-     * @dataProvider provideSummaryAndDescriptions
-     */
-    public function testSummaryAndDescriptionAreSeparated($given, $summary, $description)
-    {
-        $tagFactory = m::mock(TagFactory::class);
-        $fixture    = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
-
-        $docblock = $fixture->create($given);
-
-        $this->assertSame($summary, $docblock->getSummary());
-        $this->assertEquals(new Description($description), $docblock->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testDescriptionsRetainFormatting()
-    {
-        $tagFactory = m::mock(TagFactory::class);
-        $fixture    = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
-
-        $given = <<<DOCBLOCK
-/**
- * This is a summary.
- * This is a multiline Description
- * that contains a code block.
- *
- *     See here: a CodeBlock
- */
-DOCBLOCK;
-
-        $description = <<<DESCRIPTION
-This is a multiline Description
-that contains a code block.
-
-    See here: a CodeBlock
-DESCRIPTION;
-
-        $docblock = $fixture->create($given);
-
-        $this->assertEquals(new Description($description), $docblock->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testTagsAreInterpretedUsingFactory()
-    {
-        $tagString = <<<TAG
-@author Mike van Riel <me@xxxxxxxxxxxxxxx> This is with
-  multiline description.
-TAG;
-
-        $tag        = m::mock(Tag::class);
-        $tagFactory = m::mock(TagFactory::class);
-        $tagFactory->shouldReceive('create')->with($tagString, m::type(Context::class))->andReturn($tag);
-
-        $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
-
-        $given = <<<DOCBLOCK
-/**
- * This is a summary.
- *
- * @author Mike van Riel <me@xxxxxxxxxxxxxxx> This is with
- *   multiline description.
- */
-DOCBLOCK;
-
-        $docblock = $fixture->create($given, new Context(''));
-
-        $this->assertEquals([$tag], $docblock->getTags());
-    }
-
-    public function provideSummaryAndDescriptions()
-    {
-        return [
-            ['This is a DocBlock', 'This is a DocBlock', ''],
-            [
-                'This is a DocBlock. This should still be summary.',
-                'This is a DocBlock. This should still be summary.',
-                ''
-            ],
-            [
-                <<<DOCBLOCK
-This is a DocBlock.
-This should be a Description.
-DOCBLOCK
-                ,
-                'This is a DocBlock.',
-                'This should be a Description.'
-            ],
-            [
-                <<<DOCBLOCK
-This is a
-multiline Summary.
-This should be a Description.
-DOCBLOCK
-                ,
-                "This is a\nmultiline Summary.",
-                'This should be a Description.'
-            ],
-            [
-                <<<DOCBLOCK
-This is a Summary without dot but with a whiteline
-
-This should be a Description.
-DOCBLOCK
-                ,
-                'This is a Summary without dot but with a whiteline',
-                'This should be a Description.'
-            ],
-            [
-                <<<DOCBLOCK
-This is a Summary with dot and with a whiteline.
-
-This should be a Description.
-DOCBLOCK
-                ,
-                'This is a Summary with dot and with a whiteline.',
-                'This should be a Description.'
-            ],
-        ];
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     *
-     * @uses   phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses   phpDocumentor\Reflection\DocBlock\Description
-     * @uses   phpDocumentor\Reflection\Types\Context
-     * @uses   phpDocumentor\Reflection\DocBlock\Tags\Param
-     */
-    public function testTagsWithContextNamespace()
-    {
-        $tagFactoryMock = m::mock(TagFactory::class);
-        $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), $tagFactoryMock);
-        $context = new Context('MyNamespace');
-
-        $tagFactoryMock->shouldReceive('create')->with(m::any(), $context)->andReturn(new Param('param'));
-        $docblock = $fixture->create('/** @param MyType $param */', $context);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::create
-     *
-     * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
-     * @uses phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testTagsAreFilteredForNullValues()
-    {
-        $tagString = <<<TAG
-@author Mike van Riel <me@xxxxxxxxxxxxxxx> This is with
-  multiline description.
-TAG;
-
-        $tagFactory = m::mock(TagFactory::class);
-        $tagFactory->shouldReceive('create')->with($tagString, m::any())->andReturn(null);
-
-        $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
-
-        $given = <<<DOCBLOCK
-/**
- * This is a summary.
- *
- * @author Mike van Riel <me@xxxxxxxxxxxxxxx> This is with
- *   multiline description.
- */
-DOCBLOCK;
-
-        $docblock = $fixture->create($given, new Context(''));
-
-        $this->assertEquals([], $docblock->getTags());
-    }
-}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php b/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php
deleted file mode 100644
index 4a8d4ded..00000000
--- a/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php
+++ /dev/null
@@ -1,252 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection;
-
-use Mockery as m;
-use phpDocumentor\Reflection\Types\Context;
-
-/**
- * @coversDefaultClass phpDocumentor\Reflection\DocBlock
- * @covers ::<private>
- * @uses \Webmozart\Assert\Assert
- */
-class DocBlockTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers ::__construct
-     * @covers ::getSummary
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testDocBlockCanHaveASummary()
-    {
-        $summary = 'This is a summary';
-
-        $fixture = new DocBlock($summary);
-
-        $this->assertSame($summary, $fixture->getSummary());
-    }
-
-    /**
-     * @covers ::__construct
-     *
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfSummaryIsNotAString()
-    {
-        new DocBlock([]);
-    }
-
-    /**
-     * @covers ::__construct
-     *
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfTemplateStartIsNotABoolean()
-    {
-        new DocBlock('', null, [], null, null, ['is not boolean']);
-    }
-
-    /**
-     * @covers ::__construct
-     *
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfTemplateEndIsNotABoolean()
-    {
-        new DocBlock('', null, [], null, null, false, ['is not boolean']);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getDescription
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testDocBlockCanHaveADescription()
-    {
-        $description = new DocBlock\Description('');
-
-        $fixture = new DocBlock('', $description);
-
-        $this->assertSame($description, $fixture->getDescription());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getTags
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\DocBlock\Tag
-     */
-    public function testDocBlockCanHaveTags()
-    {
-        $tags = [
-            m::mock(DocBlock\Tag::class)
-        ];
-
-        $fixture = new DocBlock('', null, $tags);
-
-        $this->assertSame($tags, $fixture->getTags());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getTags
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\DocBlock\Tag
-     *
-     * @expectedException \InvalidArgumentException
-     */
-    public function testDocBlockAllowsOnlyTags()
-    {
-        $tags = [
-            null
-        ];
-
-        $fixture = new DocBlock('', null, $tags);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getTagsByName
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock::getTags
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\DocBlock\Tag
-     */
-    public function testFindTagsInDocBlockByName()
-    {
-        $tag1 = m::mock(DocBlock\Tag::class);
-        $tag2 = m::mock(DocBlock\Tag::class);
-        $tag3 = m::mock(DocBlock\Tag::class);
-        $tags = [$tag1, $tag2, $tag3];
-
-        $tag1->shouldReceive('getName')->andReturn('abc');
-        $tag2->shouldReceive('getName')->andReturn('abcd');
-        $tag3->shouldReceive('getName')->andReturn('ab');
-
-        $fixture = new DocBlock('', null, $tags);
-
-        $this->assertSame([$tag2], $fixture->getTagsByName('abcd'));
-        $this->assertSame([], $fixture->getTagsByName('Ebcd'));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getTagsByName
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfNameForTagsIsNotString()
-    {
-        $fixture = new DocBlock();
-        $fixture->getTagsByName([]);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::hasTag
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock::getTags
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\DocBlock\Tag
-     */
-    public function testCheckIfThereAreTagsWithAGivenName()
-    {
-        $tag1 = m::mock(DocBlock\Tag::class);
-        $tag2 = m::mock(DocBlock\Tag::class);
-        $tag3 = m::mock(DocBlock\Tag::class);
-        $tags = [$tag1, $tag2, $tag3];
-
-        $tag1->shouldReceive('getName')->twice()->andReturn('abc');
-        $tag2->shouldReceive('getName')->twice()->andReturn('abcd');
-        $tag3->shouldReceive('getName')->once();
-
-        $fixture = new DocBlock('', null, $tags);
-
-        $this->assertTrue($fixture->hasTag('abcd'));
-        $this->assertFalse($fixture->hasTag('Ebcd'));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::hasTag
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfNameForCheckingTagsIsNotString()
-    {
-        $fixture = new DocBlock();
-        $fixture->hasTag([]);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getContext
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Types\Context
-     */
-    public function testDocBlockKnowsInWhichNamespaceItIsAndWhichAliasesThereAre()
-    {
-        $context = new Context('');
-
-        $fixture = new DocBlock('', null, [], $context);
-
-        $this->assertSame($context, $fixture->getContext());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getLocation
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     * @uses \phpDocumentor\Reflection\Location
-     */
-    public function testDocBlockKnowsAtWhichLineItIs()
-    {
-        $location = new Location(10);
-
-        $fixture = new DocBlock('', null, [], null, $location);
-
-        $this->assertSame($location, $fixture->getLocation());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::isTemplateStart
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testDocBlockKnowsIfItIsTheStartOfADocBlockTemplate()
-    {
-        $fixture = new DocBlock('', null, [], null, null, true);
-
-        $this->assertTrue($fixture->isTemplateStart());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::isTemplateEnd
-     *
-     * @uses \phpDocumentor\Reflection\DocBlock\Description
-     */
-    public function testDocBlockKnowsIfItIsTheEndOfADocBlockTemplate()
-    {
-        $fixture = new DocBlock('', null, [], null, null, false, true);
-
-        $this->assertTrue($fixture->isTemplateEnd());
-    }
-}
diff --git a/vendor/phpdocumentor/type-resolver/.gitignore b/vendor/phpdocumentor/type-resolver/.gitignore
deleted file mode 100644
index 82cfc4e9..00000000
--- a/vendor/phpdocumentor/type-resolver/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-.idea
-composer.lock
-vendor
diff --git a/vendor/phpdocumentor/type-resolver/.scrutinizer.yml b/vendor/phpdocumentor/type-resolver/.scrutinizer.yml
deleted file mode 100644
index 7d7372a8..00000000
--- a/vendor/phpdocumentor/type-resolver/.scrutinizer.yml
+++ /dev/null
@@ -1,31 +0,0 @@
-before_commands:
-    - "composer install --no-dev --prefer-source"
-
-tools:
-    external_code_coverage: true
-    php_code_sniffer:
-        config:
-            standard: PSR2
-        filter:
-            paths: ["src/*", "tests/*"]
-    php_cpd:
-        enabled: true
-        excluded_dirs: ["tests", "vendor"]
-    php_loc:
-        enabled: true
-        excluded_dirs: ["tests", "vendor"]
-    php_mess_detector:
-        enabled: true
-        config:
-            ruleset: phpmd.xml.dist
-            design_rules: { eval_expression: false }
-        filter:
-            paths: ["src/*"]
-    php_pdepend:
-        enabled: true
-        excluded_dirs: ["tests", "vendor"]
-    php_analyzer:
-        enabled: true
-        filter:
-            paths: ["src/*", "tests/*"]
-    sensiolabs_security_checker: true
diff --git a/vendor/phpdocumentor/type-resolver/.travis.yml b/vendor/phpdocumentor/type-resolver/.travis.yml
deleted file mode 100644
index c882b141..00000000
--- a/vendor/phpdocumentor/type-resolver/.travis.yml
+++ /dev/null
@@ -1,34 +0,0 @@
-language: php
-php:
-  - 5.5
-  - 5.6
-  - 7.0
-  - hhvm
-  - nightly
-
-matrix:
-  allow_failures:
-    - php:
-      - hhvm
-      - nightly
-
-cache:
-  directories:
-    - $HOME/.composer/cache
-
-script:
-  - vendor/bin/phpunit --coverage-clover=coverage.clover -v
-  - composer update --no-interaction --prefer-source
-  - vendor/bin/phpunit -v
-
-before_script:
- - composer install --no-interaction
-
-after_script:
-  - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
-
-notifications:
-  irc: "irc.freenode.org#phpdocumentor"
-  email:
-    - me@xxxxxxxxxxxxxxx
-    - ashnazg@xxxxxxx
diff --git a/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php b/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php
deleted file mode 100644
index 682b1d3d..00000000
--- a/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-use phpDocumentor\Reflection\TypeResolver;
-
-require '../vendor/autoload.php';
-
-$typeResolver = new TypeResolver();
-
-// Will yield an object of type phpDocumentor\Types\Compound
-var_export($typeResolver->resolve('string|integer'));
-
-// Will return the string "string|int"
-var_dump((string)$typeResolver->resolve('string|integer'));
diff --git a/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php b/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php
deleted file mode 100644
index 70aa5e42..00000000
--- a/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php
+++ /dev/null
@@ -1,12 +0,0 @@
-<?php
-
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\TypeResolver;
-
-require '../vendor/autoload.php';
-
-$typeResolver = new TypeResolver();
-
-// Will use the namespace and aliases to resolve to \phpDocumentor\Types\Resolver|Mockery\MockInterface
-$context = new Context('\phpDocumentor', [ 'm' => 'Mockery' ]);
-var_dump((string)$typeResolver->resolve('Types\Resolver|m\MockInterface', $context));
diff --git a/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php b/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php
deleted file mode 100644
index 4f4282eb..00000000
--- a/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\FqsenResolver;
-
-require '../vendor/autoload.php';
-
-$fqsenResolver = new FqsenResolver();
-
-// Will use the namespace and aliases to resolve to a Fqsen object
-$context = new Context('\phpDocumentor\Types');
-
-// Method named: \phpDocumentor\Types\Types\Resolver::resolveFqsen()
-var_dump((string)$fqsenResolver->resolve('Types\Resolver::resolveFqsen()', $context));
-
-// Property named: \phpDocumentor\Types\Types\Resolver::$keyWords
-var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
diff --git a/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php b/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php
deleted file mode 100644
index 957c97dd..00000000
--- a/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-use phpDocumentor\Reflection\FqsenResolver;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\ContextFactory;
-
-require '../vendor/autoload.php';
-require 'Classy.php';
-
-$typeResolver = new TypeResolver();
-$fqsenResolver = new FqsenResolver();
-
-$contextFactory = new ContextFactory();
-$context = $contextFactory->createFromReflector(new ReflectionClass('My\\Example\\Classy'));
-
-// Class named: \phpDocumentor\Reflection\Types\Resolver
-var_dump((string)$typeResolver->resolve('Types\Resolver', $context));
-
-// String
-var_dump((string)$typeResolver->resolve('string', $context));
-
-// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords
-var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
-
-// Class named: \My\Example\string
-// - Shows the difference between the FqsenResolver and TypeResolver; the FqsenResolver will assume
-//   that the given value is not a type but most definitely a reference to another element. This is
-//   because conflicts between type keywords and class names can exist and if you know a reference
-//   is not a type but an element you can force that keywords are resolved.
-var_dump((string)$fqsenResolver->resolve('string', $context));
diff --git a/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php b/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php
deleted file mode 100644
index 10c0c883..00000000
--- a/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-use phpDocumentor\Reflection\FqsenResolver;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\ContextFactory;
-
-require '../vendor/autoload.php';
-require 'Classy.php';
-
-$typeResolver = new TypeResolver();
-$fqsenResolver = new FqsenResolver();
-
-$contextFactory = new ContextFactory();
-$context = $contextFactory->createFromReflector(new ReflectionMethod('My\\Example\\Classy', '__construct'));
-
-// Class named: \phpDocumentor\Reflection\Types\Resolver
-var_dump((string)$typeResolver->resolve('Types\Resolver', $context));
-
-// String
-var_dump((string)$typeResolver->resolve('string', $context));
-
-// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords
-var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
-
-// Class named: \My\Example\string
-// - Shows the difference between the FqsenResolver and TypeResolver; the FqsenResolver will assume
-//   that the given value is not a type but most definitely a reference to another element. This is
-//   because conflicts between type keywords and class names can exist and if you know a reference
-//   is not a type but an element you can force that keywords are resolved.
-var_dump((string)$fqsenResolver->resolve('string', $context));
diff --git a/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php b/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php
deleted file mode 100644
index a93728c8..00000000
--- a/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-use phpDocumentor\Reflection\FqsenResolver;
-use phpDocumentor\Reflection\TypeResolver;
-use phpDocumentor\Reflection\Types\ContextFactory;
-
-require '../vendor/autoload.php';
-
-$typeResolver = new TypeResolver();
-$fqsenResolver = new FqsenResolver();
-
-$contextFactory = new ContextFactory();
-$context = $contextFactory->createForNamespace('My\Example', file_get_contents('Classy.php'));
-
-// Class named: \phpDocumentor\Reflection\Types\Resolver
-var_dump((string)$typeResolver->resolve('Types\Resolver', $context));
-
-// String
-var_dump((string)$typeResolver->resolve('string', $context));
-
-// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords
-var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
diff --git a/vendor/phpdocumentor/type-resolver/examples/Classy.php b/vendor/phpdocumentor/type-resolver/examples/Classy.php
deleted file mode 100644
index 0705266f..00000000
--- a/vendor/phpdocumentor/type-resolver/examples/Classy.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace My\Example;
-
-use Mockery as m;
-use phpDocumentor\Reflection\Types;
-
-class Classy
-{
-    /**
-     * @var Types\Context
-     */
-    public function __construct($context)
-    {
-    }
-}
diff --git a/vendor/phpdocumentor/type-resolver/phpmd.xml.dist b/vendor/phpdocumentor/type-resolver/phpmd.xml.dist
deleted file mode 100644
index 9abf85cf..00000000
--- a/vendor/phpdocumentor/type-resolver/phpmd.xml.dist
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<ruleset
-    name="ProxyManager rules"
-    xmlns="http://pmd.sf.net/ruleset/1.0.0";
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-    xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd";
-    xsi:noNamespaceSchemaLocation="http://pmd.sf.net/ruleset_xml_schema.xsd";
->
-    <rule ref="rulesets/codesize.xml"/>
-    <rule ref="rulesets/unusedcode.xml"/>
-    <rule ref="rulesets/design.xml">
-        <!-- eval is needed to generate runtime classes -->
-        <exclude name="EvalExpression"/>
-    </rule>
-    <rule ref="rulesets/naming.xml">
-        <exclude name="LongVariable"/>
-    </rule>
-    <rule ref="rulesets/naming.xml/LongVariable">
-        <properties>
-            <property name="minimum">40</property>
-        </properties>
-    </rule>
-</ruleset>
diff --git a/vendor/phpdocumentor/type-resolver/phpunit.xml.dist b/vendor/phpdocumentor/type-resolver/phpunit.xml.dist
deleted file mode 100644
index 3246bef4..00000000
--- a/vendor/phpdocumentor/type-resolver/phpunit.xml.dist
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<phpunit 
-    colors="true" 
-    checkForUnintentionallyCoveredCode="true"
-    beStrictAboutOutputDuringTests="true"
-    forceCoversAnnotation="true"
-    verbose="true"
-    bootstrap="vendor/autoload.php"
->
-  <testsuites>
-    <testsuite name="unit">
-      <directory>./tests/unit</directory>
-    </testsuite>
-  </testsuites>
-  <filter>
-    <whitelist>
-        <directory suffix=".php">./src/</directory>
-    </whitelist>
-    <blacklist>
-      <directory>./examples/</directory>
-      <directory>./vendor/</directory>
-    </blacklist>
-  </filter>
-  <listeners>
-    <listener
-            class="Mockery\Adapter\Phpunit\TestListener"
-            file="vendor/mockery/mockery/library/Mockery/Adapter/Phpunit/TestListener.php"
-            />
-  </listeners>
-</phpunit>
diff --git a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
index 9df65b61..08b2a5f8 100644
--- a/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
+++ b/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
@@ -37,9 +37,9 @@ final class TypeResolver
         'float' => Types\Float_::class,
         'double' => Types\Float_::class,
         'object' => Object_::class,
-        'mixed' => Types\Mixed::class,
+        'mixed' => Types\Mixed_::class,
         'array' => Array_::class,
-        'resource' => Types\Resource::class,
+        'resource' => Types\Resource_::class,
         'void' => Types\Void_::class,
         'null' => Types\Null_::class,
         'scalar' => Types\Scalar::class,
diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Array_.php b/vendor/phpdocumentor/type-resolver/src/Types/Array_.php
index b699b106..49b7c6ea 100644
--- a/vendor/phpdocumentor/type-resolver/src/Types/Array_.php
+++ b/vendor/phpdocumentor/type-resolver/src/Types/Array_.php
@@ -19,7 +19,7 @@ use phpDocumentor\Reflection\Type;
  *
  * An array can be represented in two forms:
  *
- * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed'.
+ * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed_'.
  * 2. Types (`string[]`), where the value type is provided by preceding an opening and closing square bracket with a
  *    type name.
  */
@@ -43,7 +43,7 @@ final class Array_ implements Type
             $keyType = new Compound([ new String_(), new Integer() ]);
         }
         if ($valueType === null) {
-            $valueType = new Mixed();
+            $valueType = new Mixed_();
         }
 
         $this->valueType = $valueType;
@@ -77,7 +77,7 @@ final class Array_ implements Type
      */
     public function __toString()
     {
-        if ($this->valueType instanceof Mixed) {
+        if ($this->valueType instanceof Mixed_) {
             return 'array';
         }
 
diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php
index be997184..be986c31 100644
--- a/vendor/phpdocumentor/type-resolver/src/Types/Compound.php
+++ b/vendor/phpdocumentor/type-resolver/src/Types/Compound.php
@@ -12,6 +12,8 @@
 
 namespace phpDocumentor\Reflection\Types;
 
+use ArrayIterator;
+use IteratorAggregate;
 use phpDocumentor\Reflection\Type;
 
 /**
@@ -21,7 +23,7 @@ use phpDocumentor\Reflection\Type;
  * using an OR operator (`|`). This combination of types signifies that whatever is associated with this compound type
  * may contain a value with any of the given types.
  */
-final class Compound implements Type
+final class Compound implements Type, IteratorAggregate
 {
     /** @var Type[] */
     private $types;
@@ -80,4 +82,12 @@ final class Compound implements Type
     {
         return implode('|', $this->types);
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getIterator()
+    {
+        return new ArrayIterator($this->types);
+    }
 }
diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php b/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php
similarity index 95%
rename from vendor/phpdocumentor/type-resolver/src/Types/Mixed.php
rename to vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php
index 79695f45..c1c165f4 100644
--- a/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php
+++ b/vendor/phpdocumentor/type-resolver/src/Types/Mixed_.php
@@ -17,7 +17,7 @@ use phpDocumentor\Reflection\Type;
 /**
  * Value Object representing an unknown, or mixed, type.
  */
-final class Mixed implements Type
+final class Mixed_ implements Type
 {
     /**
      * Returns a rendered output of the Type as it would be used in a DocBlock.
diff --git a/vendor/phpdocumentor/type-resolver/src/Types/Resource.php b/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php
similarity index 94%
rename from vendor/phpdocumentor/type-resolver/src/Types/Resource.php
rename to vendor/phpdocumentor/type-resolver/src/Types/Resource_.php
index 2c2526b7..a1b613dc 100644
--- a/vendor/phpdocumentor/type-resolver/src/Types/Resource.php
+++ b/vendor/phpdocumentor/type-resolver/src/Types/Resource_.php
@@ -17,7 +17,7 @@ use phpDocumentor\Reflection\Type;
 /**
  * Value Object representing the 'resource' Type.
  */
-final class Resource implements Type
+final class Resource_ implements Type
 {
     /**
      * Returns a rendered output of the Type as it would be used in a DocBlock.
diff --git a/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php b/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php
deleted file mode 100644
index f226f8ed..00000000
--- a/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php
+++ /dev/null
@@ -1,395 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection;
-
-use Mockery as m;
-use phpDocumentor\Reflection\Types\Array_;
-use phpDocumentor\Reflection\Types\Compound;
-use phpDocumentor\Reflection\Types\Context;
-use phpDocumentor\Reflection\Types\Object_;
-
-/**
- * @coversDefaultClass phpDocumentor\Reflection\TypeResolver
- */
-class TypeResolverTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @param string $keyword
-     * @param string $expectedClass
-     *
-     * @covers ::__construct
-     * @covers ::resolve
-     * @covers ::<private>
-     *
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @uses phpDocumentor\Reflection\Types\Array_
-     * @uses phpDocumentor\Reflection\Types\Object_
-     *
-     * @dataProvider provideKeywords
-     */
-    public function testResolvingKeywords($keyword, $expectedClass)
-    {
-        $fixture = new TypeResolver();
-
-        $resolvedType = $fixture->resolve($keyword, new Context(''));
-
-        $this->assertInstanceOf($expectedClass, $resolvedType);
-    }
-
-    /**
-     * @param string $fqsen
-     *
-     * @covers ::__construct
-     * @covers ::resolve
-     * @covers ::<private>
-     *
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @uses phpDocumentor\Reflection\Types\Object_
-     * @uses phpDocumentor\Reflection\Fqsen
-     * @uses phpDocumentor\Reflection\FqsenResolver
-     *
-     * @dataProvider provideFqcn
-     */
-    public function testResolvingFQSENs($fqsen)
-    {
-        $fixture = new TypeResolver();
-
-        /** @var Object_ $resolvedType */
-        $resolvedType = $fixture->resolve($fqsen, new Context(''));
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen());
-        $this->assertSame($fqsen, (string)$resolvedType);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::resolve
-     * @covers ::<private>
-     *
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @uses phpDocumentor\Reflection\Types\Object_
-     * @uses phpDocumentor\Reflection\Fqsen
-     * @uses phpDocumentor\Reflection\FqsenResolver
-     */
-    public function testResolvingRelativeQSENsBasedOnNamespace()
-    {
-        $fixture = new TypeResolver();
-
-        /** @var Object_ $resolvedType */
-        $resolvedType = $fixture->resolve('DocBlock', new Context('phpDocumentor\Reflection'));
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen());
-        $this->assertSame('\phpDocumentor\Reflection\DocBlock', (string)$resolvedType);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::resolve
-     * @covers ::<private>
-     *
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @uses phpDocumentor\Reflection\Types\Object_
-     * @uses phpDocumentor\Reflection\Fqsen
-     * @uses phpDocumentor\Reflection\FqsenResolver
-     */
-    public function testResolvingRelativeQSENsBasedOnNamespaceAlias()
-    {
-        $fixture = new TypeResolver();
-
-        /** @var Object_ $resolvedType */
-        $resolvedType = $fixture->resolve(
-            'm\MockInterface',
-            new Context('phpDocumentor\Reflection', ['m' => '\Mockery'])
-        );
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen());
-        $this->assertSame('\Mockery\MockInterface', (string)$resolvedType);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::resolve
-     * @covers ::<private>
-     *
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @uses phpDocumentor\Reflection\Types\Array_
-     * @uses phpDocumentor\Reflection\Types\String_
-     */
-    public function testResolvingTypedArrays()
-    {
-        $fixture = new TypeResolver();
-
-        /** @var Array_ $resolvedType */
-        $resolvedType = $fixture->resolve('string[]', new Context(''));
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $resolvedType);
-        $this->assertSame('string[]', (string)$resolvedType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType->getKeyType());
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $resolvedType->getValueType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::resolve
-     * @covers ::<private>
-     *
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @uses phpDocumentor\Reflection\Types\Array_
-     * @uses phpDocumentor\Reflection\Types\String_
-     */
-    public function testResolvingNestedTypedArrays()
-    {
-        $fixture = new TypeResolver();
-
-        /** @var Array_ $resolvedType */
-        $resolvedType = $fixture->resolve('string[][]', new Context(''));
-
-        /** @var Array_ $childValueType */
-        $childValueType = $resolvedType->getValueType();
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $resolvedType);
-
-        $this->assertSame('string[][]', (string)$resolvedType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType->getKeyType());
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $childValueType);
-
-        $this->assertSame('string[]', (string)$childValueType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $childValueType->getKeyType());
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $childValueType->getValueType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::resolve
-     * @covers ::<private>
-     *
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @uses phpDocumentor\Reflection\Types\Compound
-     * @uses phpDocumentor\Reflection\Types\String_
-     * @uses phpDocumentor\Reflection\Types\Object_
-     * @uses phpDocumentor\Reflection\Fqsen
-     * @uses phpDocumentor\Reflection\FqsenResolver
-     */
-    public function testResolvingCompoundTypes()
-    {
-        $fixture = new TypeResolver();
-
-        /** @var Compound $resolvedType */
-        $resolvedType = $fixture->resolve('string|Reflection\DocBlock', new Context('phpDocumentor'));
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType);
-        $this->assertSame('string|\phpDocumentor\Reflection\DocBlock', (string)$resolvedType);
-
-        /** @var String $secondType */
-        $firstType = $resolvedType->get(0);
-
-        /** @var Object_ $secondType */
-        $secondType = $resolvedType->get(1);
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $firstType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $secondType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $secondType->getFqsen());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::resolve
-     * @covers ::<private>
-     *
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @uses phpDocumentor\Reflection\Types\Compound
-     * @uses phpDocumentor\Reflection\Types\Array_
-     * @uses phpDocumentor\Reflection\Types\Object_
-     * @uses phpDocumentor\Reflection\Fqsen
-     * @uses phpDocumentor\Reflection\FqsenResolver
-     */
-    public function testResolvingCompoundTypedArrayTypes()
-    {
-        $fixture = new TypeResolver();
-
-        /** @var Compound $resolvedType */
-        $resolvedType = $fixture->resolve('\stdClass[]|Reflection\DocBlock[]', new Context('phpDocumentor'));
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType);
-        $this->assertSame('\stdClass[]|\phpDocumentor\Reflection\DocBlock[]', (string)$resolvedType);
-
-        /** @var Array_ $secondType */
-        $firstType = $resolvedType->get(0);
-
-        /** @var Array_ $secondType */
-        $secondType = $resolvedType->get(1);
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $firstType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $secondType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $firstType->getValueType());
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $secondType->getValueType());
-    }
-
-    /**
-     * This test asserts that the parameter order is correct.
-     *
-     * When you pass two arrays separated by the compound operator (i.e. 'integer[]|string[]') then we always split the
-     * expression in its compound parts and then we parse the types with the array operators. If we were to switch the
-     * order around then 'integer[]|string[]' would read as an array of string or integer array; which is something
-     * other than what we intend.
-     *
-     * @covers ::__construct
-     * @covers ::resolve
-     * @covers ::<private>
-     *
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @uses phpDocumentor\Reflection\Types\Compound
-     * @uses phpDocumentor\Reflection\Types\Array_
-     * @uses phpDocumentor\Reflection\Types\Integer
-     * @uses phpDocumentor\Reflection\Types\String_
-     */
-    public function testResolvingCompoundTypesWithTwoArrays()
-    {
-        $fixture = new TypeResolver();
-
-        /** @var Compound $resolvedType */
-        $resolvedType = $fixture->resolve('integer[]|string[]', new Context(''));
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType);
-        $this->assertSame('int[]|string[]', (string)$resolvedType);
-
-        /** @var Array_ $firstType */
-        $firstType = $resolvedType->get(0);
-
-        /** @var Array_ $secondType */
-        $secondType = $resolvedType->get(1);
-
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $firstType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Integer', $firstType->getValueType());
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $secondType);
-        $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $secondType->getValueType());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::addKeyword
-     * @uses phpDocumentor\Reflection\TypeResolver::resolve
-     * @uses phpDocumentor\Reflection\TypeResolver::<private>
-     * @uses phpDocumentor\Reflection\Types\Context
-     */
-    public function testAddingAKeyword()
-    {
-        // Assign
-        $typeMock = m::mock(Type::class);
-
-        // Act
-        $fixture = new TypeResolver();
-        $fixture->addKeyword('mock', get_class($typeMock));
-
-        // Assert
-        $result = $fixture->resolve('mock', new Context(''));
-        $this->assertInstanceOf(get_class($typeMock), $result);
-        $this->assertNotSame($typeMock, $result);
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::addKeyword
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @expectedException \InvalidArgumentException
-     */
-    public function testAddingAKeywordFailsIfTypeClassDoesNotExist()
-    {
-        $fixture = new TypeResolver();
-        $fixture->addKeyword('mock', 'IDoNotExist');
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::addKeyword
-     * @uses phpDocumentor\Reflection\Types\Context
-     * @expectedException \InvalidArgumentException
-     */
-    public function testAddingAKeywordFailsIfTypeClassDoesNotImplementTypeInterface()
-    {
-        $fixture = new TypeResolver();
-        $fixture->addKeyword('mock', 'stdClass');
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::resolve
-     * @uses phpDocumentor\Reflection\Types\Context
-     *
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfTypeIsEmpty()
-    {
-        $fixture = new TypeResolver();
-        $fixture->resolve(' ', new Context(''));
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::resolve
-     * @uses phpDocumentor\Reflection\Types\Context
-     *
-     * @expectedException \InvalidArgumentException
-     */
-    public function testExceptionIsThrownIfTypeIsNotAString()
-    {
-        $fixture = new TypeResolver();
-        $fixture->resolve(['a'], new Context(''));
-    }
-
-    /**
-     * Returns a list of keywords and expected classes that are created from them.
-     *
-     * @return string[][]
-     */
-    public function provideKeywords()
-    {
-        return [
-            ['string', 'phpDocumentor\Reflection\Types\String_'],
-            ['int', 'phpDocumentor\Reflection\Types\Integer'],
-            ['integer', 'phpDocumentor\Reflection\Types\Integer'],
-            ['float', 'phpDocumentor\Reflection\Types\Float_'],
-            ['double', 'phpDocumentor\Reflection\Types\Float_'],
-            ['bool', 'phpDocumentor\Reflection\Types\Boolean'],
-            ['boolean', 'phpDocumentor\Reflection\Types\Boolean'],
-            ['resource', 'phpDocumentor\Reflection\Types\Resource'],
-            ['null', 'phpDocumentor\Reflection\Types\Null_'],
-            ['callable', 'phpDocumentor\Reflection\Types\Callable_'],
-            ['callback', 'phpDocumentor\Reflection\Types\Callable_'],
-            ['array', 'phpDocumentor\Reflection\Types\Array_'],
-            ['scalar', 'phpDocumentor\Reflection\Types\Scalar'],
-            ['object', 'phpDocumentor\Reflection\Types\Object_'],
-            ['mixed', 'phpDocumentor\Reflection\Types\Mixed'],
-            ['void', 'phpDocumentor\Reflection\Types\Void_'],
-            ['$this', 'phpDocumentor\Reflection\Types\This'],
-            ['static', 'phpDocumentor\Reflection\Types\Static_'],
-            ['self', 'phpDocumentor\Reflection\Types\Self_'],
-        ];
-    }
-
-    /**
-     * Provides a list of FQSENs to test the resolution patterns with.
-     *
-     * @return string[][]
-     */
-    public function provideFqcn()
-    {
-        return [
-            'namespace' => ['\phpDocumentor\Reflection'],
-            'class'     => ['\phpDocumentor\Reflection\DocBlock'],
-        ];
-    }
-}
diff --git a/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php b/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php
deleted file mode 100644
index 20d63c95..00000000
--- a/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php
+++ /dev/null
@@ -1,188 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\Types {
-
-// Added imports on purpose as mock for the unit tests, please do not remove.
-    use Mockery as m;
-    use phpDocumentor\Reflection\DocBlock,
-        phpDocumentor\Reflection\DocBlock\Tag;
-    use phpDocumentor;
-    use \ReflectionClass; // yes, the slash is part of the test
-
-    /**
-     * @coversDefaultClass \phpDocumentor\Reflection\Types\ContextFactory
-     * @covers ::<private>
-     */
-    class ContextFactoryTest extends \PHPUnit_Framework_TestCase
-    {
-        /**
-         * @covers ::createFromReflector
-         * @covers ::createForNamespace
-         * @uses phpDocumentor\Reflection\Types\Context
-         */
-        public function testReadsNamespaceFromClassReflection()
-        {
-            $fixture = new ContextFactory();
-            $context = $fixture->createFromReflector(new ReflectionClass($this));
-
-            $this->assertSame(__NAMESPACE__, $context->getNamespace());
-        }
-
-        /**
-         * @covers ::createFromReflector
-         * @covers ::createForNamespace
-         * @uses phpDocumentor\Reflection\Types\Context
-         */
-        public function testReadsAliasesFromClassReflection()
-        {
-            $fixture = new ContextFactory();
-            $expected = [
-                'm' => 'Mockery',
-                'DocBlock' => 'phpDocumentor\Reflection\DocBlock',
-                'Tag' => 'phpDocumentor\Reflection\DocBlock\Tag',
-                'phpDocumentor' => 'phpDocumentor',
-                'ReflectionClass' => 'ReflectionClass'
-            ];
-            $context = $fixture->createFromReflector(new ReflectionClass($this));
-
-            $this->assertSame($expected, $context->getNamespaceAliases());
-        }
-
-        /**
-         * @covers ::createForNamespace
-         * @uses phpDocumentor\Reflection\Types\Context
-         */
-        public function testReadsNamespaceFromProvidedNamespaceAndContent()
-        {
-            $fixture = new ContextFactory();
-            $context = $fixture->createForNamespace(__NAMESPACE__, file_get_contents(__FILE__));
-
-            $this->assertSame(__NAMESPACE__, $context->getNamespace());
-        }
-
-        /**
-         * @covers ::createForNamespace
-         * @uses phpDocumentor\Reflection\Types\Context
-         */
-        public function testReadsAliasesFromProvidedNamespaceAndContent()
-        {
-            $fixture = new ContextFactory();
-            $expected = [
-                'm'               => 'Mockery',
-                'DocBlock'        => 'phpDocumentor\Reflection\DocBlock',
-                'Tag'             => 'phpDocumentor\Reflection\DocBlock\Tag',
-                'phpDocumentor' => 'phpDocumentor',
-                'ReflectionClass' => 'ReflectionClass'
-            ];
-            $context = $fixture->createForNamespace(__NAMESPACE__, file_get_contents(__FILE__));
-
-            $this->assertSame($expected, $context->getNamespaceAliases());
-        }
-
-        /**
-         * @covers ::createForNamespace
-         * @uses phpDocumentor\Reflection\Types\Context
-         */
-        public function testTraitUseIsNotDetectedAsNamespaceUse()
-        {
-            $php = "<?php
-                namespace Foo;
-
-                trait FooTrait {}
-
-                class FooClass {
-                    use FooTrait;
-                }
-            ";
-
-            $fixture = new ContextFactory();
-            $context = $fixture->createForNamespace('Foo', $php);
-
-            $this->assertSame([], $context->getNamespaceAliases());
-        }
-
-        /**
-         * @covers ::createForNamespace
-         * @uses phpDocumentor\Reflection\Types\Context
-         */
-        public function testAllOpeningBracesAreCheckedWhenSearchingForEndOfClass()
-        {
-            $php = '<?php
-                namespace Foo;
-
-                trait FooTrait {}
-                trait BarTrait {}
-
-                class FooClass {
-                    use FooTrait;
-
-                    public function bar()
-                    {
-                        echo "{$baz}";
-                        echo "${baz}";
-                    }
-                }
-
-                class BarClass {
-                    use BarTrait;
-
-                    public function bar()
-                    {
-                        echo "{$baz}";
-                        echo "${baz}";
-                    }
-                }
-            ';
-
-            $fixture = new ContextFactory();
-            $context = $fixture->createForNamespace('Foo', $php);
-
-            $this->assertSame([], $context->getNamespaceAliases());
-        }
-
-        /**
-         * @covers ::createFromReflector
-         */
-        public function testEmptyFileName()
-        {
-            $fixture = new ContextFactory();
-            $context = $fixture->createFromReflector(new \ReflectionClass('stdClass'));
-
-            $this->assertSame([], $context->getNamespaceAliases());
-        }
-
-        /**
-         * @covers ::createFromReflector
-         */
-        public function testEvalDClass()
-        {
-            eval(<<<PHP
-namespace Foo;
-
-class Bar
-{
-}
-PHP
-);
-            $fixture = new ContextFactory();
-            $context = $fixture->createFromReflector(new \ReflectionClass('Foo\Bar'));
-
-            $this->assertSame([], $context->getNamespaceAliases());
-        }
-    }
-}
-
-namespace phpDocumentor\Reflection\Types\Mock {
-    // the following import should not show in the tests above
-    use phpDocumentor\Reflection\DocBlock\Description;
-}
diff --git a/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php b/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php
deleted file mode 100644
index 165f415d..00000000
--- a/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * This file is part of phpDocumentor.
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- *
- * @copyright 2010-2015 Mike van Riel<mike@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/mit-license.php MIT
- * @link      http://phpdoc.org
- */
-
-namespace phpDocumentor\Reflection\Types;
-
-use Mockery as m;
-
-/**
- * @coversDefaultClass \phpDocumentor\Reflection\Types\Context
- */
-class ContextTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @covers ::__construct
-     * @covers ::getNamespace
-     */
-    public function testProvidesANormalizedNamespace()
-    {
-        $fixture = new Context('\My\Space');
-        $this->assertSame('My\Space', $fixture->getNamespace());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getNamespace
-     */
-    public function testInterpretsNamespaceNamedGlobalAsRootNamespace()
-    {
-        $fixture = new Context('global');
-        $this->assertSame('', $fixture->getNamespace());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getNamespace
-     */
-    public function testInterpretsNamespaceNamedDefaultAsRootNamespace()
-    {
-        $fixture = new Context('default');
-        $this->assertSame('', $fixture->getNamespace());
-    }
-
-    /**
-     * @covers ::__construct
-     * @covers ::getNamespaceAliases
-     */
-    public function testProvidesNormalizedNamespaceAliases()
-    {
-        $fixture = new Context('', ['Space' => '\My\Space']);
-        $this->assertSame(['Space' => 'My\Space'], $fixture->getNamespaceAliases());
-    }
-}
diff --git a/vendor/phpmailer/phpmailer/.github/ISSUE_TEMPLATE.md b/vendor/phpmailer/phpmailer/.github/ISSUE_TEMPLATE.md
deleted file mode 100644
index 97776f1c..00000000
--- a/vendor/phpmailer/phpmailer/.github/ISSUE_TEMPLATE.md
+++ /dev/null
@@ -1 +0,0 @@
-Non-security issues and pull requests are no longer being accepted for the legacy PHPMailer 5.2 branch. Migrate to PHPMailer 6.0 (or later) and report your issue there.
\ No newline at end of file
diff --git a/vendor/phpmailer/phpmailer/.github/PULL_REQUEST_TEMPLATE.md b/vendor/phpmailer/phpmailer/.github/PULL_REQUEST_TEMPLATE.md
deleted file mode 100644
index 97776f1c..00000000
--- a/vendor/phpmailer/phpmailer/.github/PULL_REQUEST_TEMPLATE.md
+++ /dev/null
@@ -1 +0,0 @@
-Non-security issues and pull requests are no longer being accepted for the legacy PHPMailer 5.2 branch. Migrate to PHPMailer 6.0 (or later) and report your issue there.
\ No newline at end of file
diff --git a/vendor/phpmailer/phpmailer/LICENSE b/vendor/phpmailer/phpmailer/LICENSE
index 8e0763d1..f166cc57 100644
--- a/vendor/phpmailer/phpmailer/LICENSE
+++ b/vendor/phpmailer/phpmailer/LICENSE
@@ -1,8 +1,8 @@
-		  GNU LESSER GENERAL PUBLIC LICENSE
-		       Version 2.1, February 1999
+                  GNU LESSER GENERAL PUBLIC LICENSE
+                       Version 2.1, February 1999
 
  Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 
@@ -10,7 +10,7 @@
  as the successor of the GNU Library Public License, version 2, hence
  the version number 2.1.]
 
-			    Preamble
+                            Preamble
 
   The licenses for most software are designed to take away your
 freedom to share and change it.  By contrast, the GNU General Public
@@ -55,7 +55,7 @@ modified by someone else and passed on, the recipients should know
 that what they have is not the original version, so that the original
 author's reputation will not be affected by problems that might be
 introduced by others.
-
+
   Finally, software patents pose a constant threat to the existence of
 any free program.  We wish to make sure that a company cannot
 effectively restrict the users of a free program by obtaining a
@@ -111,8 +111,8 @@ modification follow.  Pay close attention to the difference between a
 "work based on the library" and a "work that uses the library".  The
 former contains code derived from the library, whereas the latter must
 be combined with the library in order to run.
-
-		  GNU LESSER GENERAL PUBLIC LICENSE
+
+                  GNU LESSER GENERAL PUBLIC LICENSE
    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
 
   0. This License Agreement applies to any software library or other
@@ -146,7 +146,7 @@ such a program is covered only if its contents constitute a work based
 on the Library (independent of the use of the Library in a tool for
 writing it).  Whether that is true depends on what the Library does
 and what the program that uses the Library does.
-  
+
   1. You may copy and distribute verbatim copies of the Library's
 complete source code as you receive it, in any medium, provided that
 you conspicuously and appropriately publish on each copy an
@@ -158,7 +158,7 @@ Library.
   You may charge a fee for the physical act of transferring a copy,
 and you may at your option offer warranty protection in exchange for a
 fee.
-
+
   2. You may modify your copy or copies of the Library or any portion
 of it, thus forming a work based on the Library, and copy and
 distribute such modifications or work under the terms of Section 1
@@ -216,7 +216,7 @@ instead of to this License.  (If a newer version than version 2 of the
 ordinary GNU General Public License has appeared, then you can specify
 that version instead if you wish.)  Do not make any other change in
 these notices.
-
+
   Once this change is made in a given copy, it is irreversible for
 that copy, so the ordinary GNU General Public License applies to all
 subsequent copies and derivative works made from that copy.
@@ -267,7 +267,7 @@ Library will still fall under Section 6.)
 distribute the object code for the work under the terms of Section 6.
 Any executables containing that work also fall under Section 6,
 whether or not they are linked directly with the Library itself.
-
+
   6. As an exception to the Sections above, you may also combine or
 link a "work that uses the Library" with the Library to produce a
 work containing portions of the Library, and distribute that work
@@ -312,7 +312,7 @@ of these things:
     from a designated place, offer equivalent access to copy the above
     specified materials from the same place.
 
-    e) verify that the user has already received a copy of these
+    e) Verify that the user has already received a copy of these
     materials or that you have already sent this user a copy.
 
   For an executable, the required form of the "work that uses the
@@ -329,7 +329,7 @@ restrictions of other proprietary libraries that do not normally
 accompany the operating system.  Such a contradiction means you cannot
 use both them and the Library together in an executable that you
 distribute.
-
+
   7. You may place library facilities that are a work based on the
 Library side-by-side in a single library together with other library
 facilities not covered by this License, and distribute such a combined
@@ -370,7 +370,7 @@ subject to these terms and conditions.  You may not impose any further
 restrictions on the recipients' exercise of the rights granted herein.
 You are not responsible for enforcing compliance by third parties with
 this License.
-
+
   11. If, as a consequence of a court judgment or allegation of patent
 infringement or for any other reason (not limited to patent issues),
 conditions are imposed on you (whether by court order, agreement or
@@ -422,7 +422,7 @@ conditions either of that version or of any later version published by
 the Free Software Foundation.  If the Library does not specify a
 license version number, you may choose any version ever published by
 the Free Software Foundation.
-
+
   14. If you wish to incorporate parts of the Library into other free
 programs whose distribution conditions are incompatible with these,
 write to the author to ask for permission.  For software which is
@@ -432,7 +432,7 @@ decision will be guided by the two goals of preserving the free status
 of all derivatives of our free software and of promoting the sharing
 and reuse of software generally.
 
-			    NO WARRANTY
+                            NO WARRANTY
 
   15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
 WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
@@ -455,8 +455,8 @@ FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
 SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
 DAMAGES.
 
-		     END OF TERMS AND CONDITIONS
-
+                     END OF TERMS AND CONDITIONS
+
            How to Apply These Terms to Your New Libraries
 
   If you develop a new library, and you want it to be of the greatest
@@ -485,7 +485,7 @@ convey the exclusion of warranty; and each file should have at least the
 
     You should have received a copy of the GNU Lesser General Public
     License along with this library; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 
 Also add information on how to contact you by electronic and paper mail.
 
@@ -499,6 +499,4 @@ necessary.  Here is a sample; alter the names:
   <signature of Ty Coon>, 1 April 1990
   Ty Coon, President of Vice
 
-That's all there is to it!
-
-
+That's all there is to it!
\ No newline at end of file
diff --git a/vendor/phpmailer/phpmailer/VERSION b/vendor/phpmailer/phpmailer/VERSION
index f23b9706..32779c18 100644
--- a/vendor/phpmailer/phpmailer/VERSION
+++ b/vendor/phpmailer/phpmailer/VERSION
@@ -1 +1 @@
-5.2.25
+5.2.27
\ No newline at end of file
diff --git a/vendor/phpmailer/phpmailer/class.phpmailer.php b/vendor/phpmailer/phpmailer/class.phpmailer.php
index 8042b384..12a95875 100644
--- a/vendor/phpmailer/phpmailer/class.phpmailer.php
+++ b/vendor/phpmailer/phpmailer/class.phpmailer.php
@@ -31,7 +31,7 @@ class PHPMailer
      * The PHPMailer Version number.
      * @var string
      */
-    public $Version = '5.2.25';
+    public $Version = '5.2.27';
 
     /**
      * Email priority.
@@ -659,6 +659,8 @@ class PHPMailer
         if ($exceptions !== null) {
             $this->exceptions = (boolean)$exceptions;
         }
+        //Pick an appropriate debug output format automatically
+        $this->Debugoutput = (strpos(PHP_SAPI, 'cli') !== false ? 'echo' : 'html');
     }
 
     /**
@@ -1294,9 +1296,12 @@ class PHPMailer
 
             // Sign with DKIM if enabled
             if (!empty($this->DKIM_domain)
-                && !empty($this->DKIM_selector)
-                && (!empty($this->DKIM_private_string)
-                   || (!empty($this->DKIM_private) && file_exists($this->DKIM_private))
+                and !empty($this->DKIM_selector)
+                and (!empty($this->DKIM_private_string)
+                    or (!empty($this->DKIM_private)
+                        and self::isPermittedPath($this->DKIM_private)
+                        and file_exists($this->DKIM_private)
+                    )
                 )
             ) {
                 $header_dkim = $this->DKIM_Add(
@@ -1462,6 +1467,18 @@ class PHPMailer
     }
 
     /**
+     * Check whether a file path is of a permitted type.
+     * Used to reject URLs and phar files from functions that access local file paths,
+     * such as addAttachment.
+     * @param string $path A relative or absolute path to a file.
+     * @return bool
+     */
+    protected static function isPermittedPath($path)
+    {
+        return !preg_match('#^[a-z]+://#i', $path);
+    }
+
+    /**
      * Send mail using the PHP mail() function.
      * @param string $header The message headers
      * @param string $body The message body
@@ -1789,7 +1806,7 @@ class PHPMailer
         // There is no English translation file
         if ($langcode != 'en') {
             // Make sure language file path is readable
-            if (!is_readable($lang_file)) {
+            if (!self::isPermittedPath($lang_file) or !is_readable($lang_file)) {
                 $foundlang = false;
             } else {
                 // Overwrite language-specific strings.
@@ -2497,6 +2514,8 @@ class PHPMailer
      * Add an attachment from a path on the filesystem.
      * Never use a user-supplied path to a file!
      * Returns false if the file could not be found or read.
+     * Explicitly *does not* support passing URLs; PHPMailer is not an HTTP client.
+     * If you need to do that, fetch the resource yourself and pass it in via a local file or string.
      * @param string $path Path to the attachment.
      * @param string $name Overrides the attachment name.
      * @param string $encoding File encoding (see $Encoding).
@@ -2508,7 +2527,7 @@ class PHPMailer
     public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
     {
         try {
-            if (!@is_file($path)) {
+            if (!self::isPermittedPath($path) or !@is_file($path)) {
                 throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
             }
 
@@ -2689,7 +2708,7 @@ class PHPMailer
     protected function encodeFile($path, $encoding = 'base64')
     {
         try {
-            if (!is_readable($path)) {
+            if (!self::isPermittedPath($path) or !file_exists($path)) {
                 throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
             }
             $magic_quotes = get_magic_quotes_runtime();
@@ -3033,7 +3052,7 @@ class PHPMailer
      */
     public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
     {
-        if (!@is_file($path)) {
+        if (!self::isPermittedPath($path) or !@is_file($path)) {
             $this->setError($this->lang('file_access') . $path);
             return false;
         }
diff --git a/vendor/phpmailer/phpmailer/class.pop3.php b/vendor/phpmailer/phpmailer/class.pop3.php
index f2c4e374..5a458e5d 100644
--- a/vendor/phpmailer/phpmailer/class.pop3.php
+++ b/vendor/phpmailer/phpmailer/class.pop3.php
@@ -34,7 +34,7 @@ class POP3
      * @var string
      * @access public
      */
-    public $Version = '5.2.25';
+    public $Version = '5.2.27';
 
     /**
      * Default POP3 port number.
diff --git a/vendor/phpmailer/phpmailer/class.smtp.php b/vendor/phpmailer/phpmailer/class.smtp.php
index d8af427e..118cb20f 100644
--- a/vendor/phpmailer/phpmailer/class.smtp.php
+++ b/vendor/phpmailer/phpmailer/class.smtp.php
@@ -30,7 +30,7 @@ class SMTP
      * The PHPMailer SMTP version number.
      * @var string
      */
-    const VERSION = '5.2.25';
+    const VERSION = '5.2.27';
 
     /**
      * SMTP line break constant.
@@ -81,7 +81,7 @@ class SMTP
      * @deprecated Use the `VERSION` constant instead
      * @see SMTP::VERSION
      */
-    public $Version = '5.2.25';
+    public $Version = '5.2.27';
 
     /**
      * SMTP server port number.
diff --git a/vendor/phpspec/prophecy/.gitignore b/vendor/phpspec/prophecy/.gitignore
deleted file mode 100644
index 88ee1c14..00000000
--- a/vendor/phpspec/prophecy/.gitignore
+++ /dev/null
@@ -1,5 +0,0 @@
-*.tgz
-*.phar
-/composer.lock
-/vendor
-/phpunit.xml
diff --git a/vendor/phpspec/prophecy/.travis.yml b/vendor/phpspec/prophecy/.travis.yml
deleted file mode 100644
index b2edfb48..00000000
--- a/vendor/phpspec/prophecy/.travis.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-language: php
-
-php: [5.3, 5.4, 5.5, 5.6, 7.0, 7.1]
-
-sudo: false
-
-cache:
-  directories:
-    - $HOME/.composer/cache
-
-branches:
-  except:
-    - /^bugfix\/.*$/
-    - /^feature\/.*$/
-    - /^optimization\/.*$/
-
-matrix:
-  fast_finish: true
-  include:
-    # Use the newer stack for HHVM as HHVM does not support Precise anymore since a long time and so Precise has an outdated version
-    - php: hhvm
-      sudo: required
-      dist: trusty
-      group: edge
-    - php: '7.0'
-      env: PHPDOCUMENTOR_REFLECTION_DOCBLOCK="^2.0"
-
-before_script:
-  - if [ -n "$PHPDOCUMENTOR_REFLECTION_DOCBLOCK" ]; then
-      composer require "phpdocumentor/reflection-docblock:${PHPDOCUMENTOR_REFLECTION_DOCBLOCK}" --no-update;
-    fi;
-  - travis_retry composer update --no-interaction
-
-script:
-  - vendor/bin/phpspec run -fpretty -v
-  - vendor/bin/phpunit
diff --git a/vendor/phpspec/prophecy/CHANGES.md b/vendor/phpspec/prophecy/CHANGES.md
index 6a3ad33a..37a4807f 100644
--- a/vendor/phpspec/prophecy/CHANGES.md
+++ b/vendor/phpspec/prophecy/CHANGES.md
@@ -1,3 +1,43 @@
+1.8.1 / 2019/06/13
+==================
+
+* [fixed] Don't try to patch final constructors (@NiR)
+
+1.8.0 / 2018/08/05
+==================
+
+* Support for void return types without explicit will (@crellbar)
+* Clearer error message for unexpected method calls (@meridius)
+* Clearer error message for aggregate exceptions (@meridius)
+* More verbose `shouldBeCalledOnce` expectation (@olvlvl)
+* Ability to double Throwable, or methods that extend it (@ciaranmcnulty)
+* [fixed] Doubling methods where class has additional arguments to interface (@webimpress)
+* [fixed] Doubling methods where arguments are nullable but default is not null (@webimpress)
+* [fixed] Doubling magic methods on parent class (@dsnopek)
+* [fixed] Check method predictions only once (@dontub)
+* [fixed] Argument::containingString throwing error when called with non-string (@dcabrejas)
+
+1.7.6 / 2018/04/18
+==================
+
+* Allow sebastian/comparator ^3.0 (@sebastianbergmann)
+
+1.7.5 / 2018/02/11
+==================
+
+* Support for object return type hints (thanks @greg0ire)
+
+1.7.4 / 2018/02/11
+==================
+
+* Fix issues with PHP 7.2 (thanks @greg0ire)
+* Support object type hints in PHP 7.2 (thanks @@jansvoboda11)
+
+1.7.3 / 2017/11/24
+==================
+
+* Fix SplInfo ClassPatch to work with Symfony 4 (Thanks @gnugat)
+
 1.7.2 / 2017-10-04
 ==================
 
diff --git a/vendor/phpspec/prophecy/CONTRIBUTING.md b/vendor/phpspec/prophecy/CONTRIBUTING.md
deleted file mode 100644
index 4a8169d0..00000000
--- a/vendor/phpspec/prophecy/CONTRIBUTING.md
+++ /dev/null
@@ -1,22 +0,0 @@
-Contributing
-------------
-
-Prophecy is an open source, community-driven project. If you'd like to contribute,
-feel free to do this, but remember to follow these few simple rules:
-
-- Make your feature addition or bug fix,
-- Add either specs or examples for any changes you're making (bugfixes or additions)
-  (please look into `spec/` folder for some examples). This is important so we don't break
-  it in a future version unintentionally,
-- Commit your code, but do not mess with `CHANGES.md`,
-
-Running tests
--------------
-
-Make sure that you don't break anything with your changes by running:
-
-```bash
-$> composer install --prefer-dist
-$> vendor/bin/phpspec run
-$> vendor/bin/phpunit
-```
diff --git a/vendor/phpspec/prophecy/composer.json b/vendor/phpspec/prophecy/composer.json
index fc9ba782..13b6658f 100644
--- a/vendor/phpspec/prophecy/composer.json
+++ b/vendor/phpspec/prophecy/composer.json
@@ -20,19 +20,19 @@
     "require": {
         "php":                               "^5.3|^7.0",
         "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
-        "sebastian/comparator":              "^1.1|^2.0",
+        "sebastian/comparator":              "^1.1|^2.0|^3.0",
         "doctrine/instantiator":             "^1.0.2",
         "sebastian/recursion-context":       "^1.0|^2.0|^3.0"
     },
 
     "require-dev": {
         "phpspec/phpspec": "^2.5|^3.2",
-        "phpunit/phpunit": "^4.8 || ^5.6.5"
+        "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1"
     },
 
     "autoload": {
-        "psr-0": {
-            "Prophecy\\": "src/"
+        "psr-4": {
+            "Prophecy\\": "src/Prophecy"
         }
     },
 
@@ -44,7 +44,7 @@
 
     "extra": {
         "branch-alias": {
-            "dev-master": "1.7.x-dev"
+            "dev-master": "1.8.x-dev"
         }
     }
 }
diff --git a/vendor/phpspec/prophecy/fixtures/EmptyClass.php b/vendor/phpspec/prophecy/fixtures/EmptyClass.php
deleted file mode 100644
index 4db3b50a..00000000
--- a/vendor/phpspec/prophecy/fixtures/EmptyClass.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class EmptyClass
-{
-}
diff --git a/vendor/phpspec/prophecy/fixtures/EmptyInterface.php b/vendor/phpspec/prophecy/fixtures/EmptyInterface.php
deleted file mode 100644
index 54e08e7a..00000000
--- a/vendor/phpspec/prophecy/fixtures/EmptyInterface.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-interface EmptyInterface
-{
-}
diff --git a/vendor/phpspec/prophecy/fixtures/FinalClass.php b/vendor/phpspec/prophecy/fixtures/FinalClass.php
deleted file mode 100644
index c20ea9f0..00000000
--- a/vendor/phpspec/prophecy/fixtures/FinalClass.php
+++ /dev/null
@@ -1,7 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-final class FinalClass
-{
-}
diff --git a/vendor/phpspec/prophecy/fixtures/ModifierInterface.php b/vendor/phpspec/prophecy/fixtures/ModifierInterface.php
deleted file mode 100644
index 7c722474..00000000
--- a/vendor/phpspec/prophecy/fixtures/ModifierInterface.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-interface ModifierInterface
-{
-    public function isAbstract();
-
-    public function getVisibility();
-}
diff --git a/vendor/phpspec/prophecy/fixtures/Named.php b/vendor/phpspec/prophecy/fixtures/Named.php
deleted file mode 100644
index fdfba098..00000000
--- a/vendor/phpspec/prophecy/fixtures/Named.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-interface Named
-{
-    public function getName();
-}
diff --git a/vendor/phpspec/prophecy/fixtures/OptionalDepsClass.php b/vendor/phpspec/prophecy/fixtures/OptionalDepsClass.php
deleted file mode 100644
index 85188aad..00000000
--- a/vendor/phpspec/prophecy/fixtures/OptionalDepsClass.php
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-use I\Simply;
-
-class OptionalDepsClass
-{
-    public function iHaveAStrangeTypeHintedArg(\I\Simply\Am\Nonexistent $class)
-    {
-    }
-
-    public function iHaveAnEvenStrangerTypeHintedArg(Simply\Am\Not $class)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/SpecialMethods.php b/vendor/phpspec/prophecy/fixtures/SpecialMethods.php
deleted file mode 100644
index fa72764a..00000000
--- a/vendor/phpspec/prophecy/fixtures/SpecialMethods.php
+++ /dev/null
@@ -1,36 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class SpecialMethods
-{
-    public function __construct()
-    {
-    }
-
-    function __destruct()
-    {
-    }
-
-    function __call($name, $arguments)
-    {
-    }
-
-    function __sleep()
-    {
-    }
-
-    function __wakeup()
-    {
-    }
-
-    function __toString()
-    {
-        return '';
-    }
-
-    function __invoke()
-    {
-    }
-
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithArguments.php b/vendor/phpspec/prophecy/fixtures/WithArguments.php
deleted file mode 100644
index bd5259f2..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithArguments.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithArguments
-{
-    public function methodWithArgs(array $arg_1 = array(), \ArrayAccess $arg_2, \ArrayAccess $arg_3 = null)
-    {
-    }
-    
-    public function methodWithoutTypeHints($arg)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithCallableArgument.php b/vendor/phpspec/prophecy/fixtures/WithCallableArgument.php
deleted file mode 100644
index 7d6d5f8f..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithCallableArgument.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithCallableArgument
-{
-    public function methodWithArgs(callable $arg_1, callable $arg_2 = null)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithFinalMethod.php b/vendor/phpspec/prophecy/fixtures/WithFinalMethod.php
deleted file mode 100644
index 7e651eb3..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithFinalMethod.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithFinalMethod
-{
-    final public function finalImplementation()
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithFinalVirtuallyPrivateMethod.php b/vendor/phpspec/prophecy/fixtures/WithFinalVirtuallyPrivateMethod.php
deleted file mode 100644
index f9ecc7f8..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithFinalVirtuallyPrivateMethod.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithFinalVirtuallyPrivateMethod
-{
-    final public function __toString()
-    {
-        return '';
-    }
-
-    final public function _getName()
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithProtectedAbstractMethod.php b/vendor/phpspec/prophecy/fixtures/WithProtectedAbstractMethod.php
deleted file mode 100644
index 4485e590..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithProtectedAbstractMethod.php
+++ /dev/null
@@ -1,8 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-abstract class WithProtectedAbstractMethod
-{
-    abstract protected function innerDetail();
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithReferences.php b/vendor/phpspec/prophecy/fixtures/WithReferences.php
deleted file mode 100644
index 4f3fd090..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithReferences.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithReferences
-{
-    public function methodWithReferenceArgument(&$arg_1, \ArrayAccess &$arg_2)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithReturnTypehints.php b/vendor/phpspec/prophecy/fixtures/WithReturnTypehints.php
deleted file mode 100644
index 045051fd..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithReturnTypehints.php
+++ /dev/null
@@ -1,18 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithReturnTypehints extends EmptyClass
-{
-    public function getSelf(): self {
-        return $this;
-    }
-
-    public function getName(): string {
-        return __CLASS__;
-    }
-    
-    public function getParent(): parent {
-        return $this;
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithStaticMethod.php b/vendor/phpspec/prophecy/fixtures/WithStaticMethod.php
deleted file mode 100644
index 491dd12b..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithStaticMethod.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithStaticMethod
-{
-    public static function innerDetail()
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithTypehintedVariadicArgument.php b/vendor/phpspec/prophecy/fixtures/WithTypehintedVariadicArgument.php
deleted file mode 100644
index 88f1d365..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithTypehintedVariadicArgument.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithTypehintedVariadicArgument
-{
-    function methodWithTypeHintedArgs(array ...$args)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithVariadicArgument.php b/vendor/phpspec/prophecy/fixtures/WithVariadicArgument.php
deleted file mode 100644
index 1cdb181b..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithVariadicArgument.php
+++ /dev/null
@@ -1,10 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithVariadicArgument
-{
-    function methodWithArgs(...$args)
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/fixtures/WithVirtuallyPrivateMethod.php b/vendor/phpspec/prophecy/fixtures/WithVirtuallyPrivateMethod.php
deleted file mode 100644
index 31b50d08..00000000
--- a/vendor/phpspec/prophecy/fixtures/WithVirtuallyPrivateMethod.php
+++ /dev/null
@@ -1,19 +0,0 @@
-<?php
-
-namespace Fixtures\Prophecy;
-
-class WithVirtuallyPrivateMethod
-{
-    public function __toString()
-    {
-        return '';
-    }
-
-    public function _getName()
-    {
-    }
-
-    public function isAbstract()
-    {
-    }
-}
diff --git a/vendor/phpspec/prophecy/phpunit.xml.dist b/vendor/phpspec/prophecy/phpunit.xml.dist
deleted file mode 100644
index 3ce8c277..00000000
--- a/vendor/phpspec/prophecy/phpunit.xml.dist
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.8/phpunit.xsd";
-         backupGlobals="false"
-         colors="true"
-         bootstrap="vendor/autoload.php"
->
-    <php>
-        <ini name="error_reporting" value="-1" />
-    </php>
-
-    <testsuites>
-        <testsuite name="PhpSpec Test Suite">
-            <directory>tests</directory>
-        </testsuite>
-    </testsuites>
-
-    <filter>
-        <whitelist>
-            <directory>./src/</directory>
-        </whitelist>
-    </filter>
-</phpunit>
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
deleted file mode 100644
index b82f1b89..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
+++ /dev/null
@@ -1,128 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\Token\TokenInterface;
-
-class ArgumentsWildcardSpec extends ObjectBehavior
-{
-    function it_wraps_non_token_arguments_into_ExactValueToken(\stdClass $object)
-    {
-        $this->beConstructedWith(array(42, 'zet', $object));
-
-        $class = get_class($object->getWrappedObject());
-        $hash  = spl_object_hash($object->getWrappedObject());
-
-        $this->__toString()->shouldReturn("exact(42), exact(\"zet\"), exact($class:$hash Object (\n    'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
-    }
-
-    function it_generates_string_representation_from_all_tokens_imploded(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->__toString()->willReturn('token_1');
-        $token2->__toString()->willReturn('token_2');
-        $token3->__toString()->willReturn('token_3');
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->__toString()->shouldReturn('token_1, token_2, token_3');
-    }
-
-    function it_exposes_list_of_tokens(TokenInterface $token)
-    {
-        $this->beConstructedWith(array($token));
-
-        $this->getTokens()->shouldReturn(array($token));
-    }
-
-    function it_returns_score_of_1_if_there_are_no_tokens_and_arguments()
-    {
-        $this->beConstructedWith(array());
-
-        $this->scoreArguments(array())->shouldReturn(1);
-    }
-
-    function it_should_return_match_score_based_on_all_tokens_score(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(5);
-        $token2->isLast()->willReturn(false);
-        $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2, $obj))->shouldReturn(18);
-    }
-
-    function it_returns_false_if_there_is_less_arguments_than_tokens(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(5);
-        $token2->isLast()->willReturn(false);
-        $token3->scoreArgument(null)->willReturn(false);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2))->shouldReturn(false);
-    }
-
-    function it_returns_false_if_there_is_less_tokens_than_arguments(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(5);
-        $token2->isLast()->willReturn(false);
-        $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2, $obj, 4))->shouldReturn(false);
-    }
-
-    function it_should_return_false_if_one_of_the_tokens_returns_false(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(false);
-        $token2->isLast()->willReturn(false);
-        $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2, $obj))->shouldReturn(false);
-    }
-
-    function it_should_calculate_score_until_last_token(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->scoreArgument('one')->willReturn(3);
-        $token1->isLast()->willReturn(false);
-
-        $token2->scoreArgument(2)->willReturn(7);
-        $token2->isLast()->willReturn(true);
-
-        $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
-        $token3->isLast()->willReturn(false);
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->scoreArguments(array('one', 2, $obj))->shouldReturn(10);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php
deleted file mode 100644
index a43e923c..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class AnyValueTokenSpec extends ObjectBehavior
-{
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function its_string_representation_is_star()
-    {
-        $this->__toString()->shouldReturn('*');
-    }
-
-    function it_scores_any_argument_as_3()
-    {
-        $this->scoreArgument(42)->shouldReturn(3);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php
deleted file mode 100644
index c29076f5..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class AnyValuesTokenSpec extends ObjectBehavior
-{
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_last()
-    {
-        $this->shouldBeLast();
-    }
-
-    function its_string_representation_is_star_with_followup()
-    {
-        $this->__toString()->shouldReturn('* [, ...]');
-    }
-
-    function it_scores_any_argument_as_2()
-    {
-        $this->scoreArgument(42)->shouldReturn(2);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php
deleted file mode 100644
index 8799d6d5..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php
+++ /dev/null
@@ -1,55 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class ApproximateValueTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(10.12345678, 4);
-    }
-
-    function it_is_initializable()
-    {
-        $this->shouldHaveType('Prophecy\Argument\Token\ApproximateValueToken');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_10_if_rounded_argument_matches_rounded_value()
-    {
-        $this->scoreArgument(10.12345)->shouldReturn(10);
-    }
-
-    function it_does_not_score_if_rounded_argument_does_not_match_rounded_value()
-    {
-        $this->scoreArgument(10.1234)->shouldReturn(false);
-    }
-
-    function it_uses_a_default_precision_of_zero()
-    {
-        $this->beConstructedWith(10.7);
-        $this->scoreArgument(11.4)->shouldReturn(10);
-    }
-
-    function it_does_not_score_if_rounded_argument_is_not_numeric()
-    {
-        $this->scoreArgument('hello')->shouldReturn(false);
-    }
-
-    function it_has_simple_string_representation()
-    {
-        $this->__toString()->shouldBe('â??10.1235');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php
deleted file mode 100644
index cc81fe01..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class ArrayCountTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(2);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_6_if_argument_array_has_proper_count()
-    {
-        $this->scoreArgument(array(1,2))->shouldReturn(6);
-    }
-
-    function it_scores_6_if_argument_countable_object_has_proper_count(\Countable $countable)
-    {
-        $countable->count()->willReturn(2);
-        $this->scoreArgument($countable)->shouldReturn(6);
-    }
-
-    function it_does_not_score_if_argument_is_neither_array_nor_countable_object()
-    {
-        $this->scoreArgument('string')->shouldBe(false);
-        $this->scoreArgument(5)->shouldBe(false);
-        $this->scoreArgument(new \stdClass)->shouldBe(false);
-    }
-
-    function it_does_not_score_if_argument_array_has_wrong_count()
-    {
-        $this->scoreArgument(array(1))->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_argument_countable_object_has_wrong_count(\Countable $countable)
-    {
-        $countable->count()->willReturn(3);
-        $this->scoreArgument($countable)->shouldReturn(false);
-    }
-
-    function it_has_simple_string_representation()
-    {
-        $this->__toString()->shouldBe('count(2)');
-    }
-
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php
deleted file mode 100644
index 632118ae..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php
+++ /dev/null
@@ -1,202 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\Token\ExactValueToken;
-use Prophecy\Argument\Token\TokenInterface;
-use Prophecy\Exception\InvalidArgumentException;
-
-class ArrayEntryTokenSpec extends ObjectBehavior
-{
-    function let(TokenInterface $key, TokenInterface $value)
-    {
-        $this->beConstructedWith($key, $value);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_holds_key_and_value($key, $value)
-    {
-        $this->getKey()->shouldBe($key);
-        $this->getValue()->shouldBe($value);
-    }
-
-    function its_string_representation_tells_that_its_an_array_containing_the_key_value_pair($key, $value)
-    {
-        $key->__toString()->willReturn('key');
-        $value->__toString()->willReturn('value');
-        $this->__toString()->shouldBe('[..., key => value, ...]');
-    }
-
-    function it_wraps_non_token_value_into_ExactValueToken(TokenInterface $key, \stdClass $object)
-    {
-        $this->beConstructedWith($key, $object);
-        $this->getValue()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken');
-    }
-
-    function it_wraps_non_token_key_into_ExactValueToken(\stdClass $object, TokenInterface $value)
-    {
-        $this->beConstructedWith($object, $value);
-        $this->getKey()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken');
-    }
-
-    function it_scores_array_half_of_combined_scores_from_key_and_value_tokens($key, $value)
-    {
-        $key->scoreArgument('key')->willReturn(4);
-        $value->scoreArgument('value')->willReturn(6);
-        $this->scoreArgument(array('key'=>'value'))->shouldBe(5);
-    }
-
-    function it_scores_traversable_object_half_of_combined_scores_from_key_and_value_tokens(
-        TokenInterface $key,
-        TokenInterface $value,
-        \Iterator $object
-    ) {
-        $object->current()->will(function () use ($object) {
-            $object->valid()->willReturn(false);
-
-            return 'value';
-        });
-        $object->key()->willReturn('key');
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(true);
-        $key->scoreArgument('key')->willReturn(6);
-        $value->scoreArgument('value')->willReturn(2);
-        $this->scoreArgument($object)->shouldBe(4);
-    }
-
-    function it_throws_exception_during_scoring_of_array_accessible_object_if_key_is_not_ExactValueToken(
-        TokenInterface $key,
-        TokenInterface $value,
-        \ArrayAccess $object
-    ) {
-        $key->__toString()->willReturn('any_token');
-        $this->beConstructedWith($key,$value);
-        $errorMessage = 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL.
-                        'But you used `any_token`.';
-        $this->shouldThrow(new InvalidArgumentException($errorMessage))->duringScoreArgument($object);
-    }
-
-    function it_scores_array_accessible_object_half_of_combined_scores_from_key_and_value_tokens(
-        ExactValueToken $key,
-        TokenInterface $value,
-        \ArrayAccess $object
-    ) {
-        $object->offsetExists('key')->willReturn(true);
-        $object->offsetGet('key')->willReturn('value');
-        $key->getValue()->willReturn('key');
-        $key->scoreArgument('key')->willReturn(3);
-        $value->scoreArgument('value')->willReturn(1);
-        $this->scoreArgument($object)->shouldBe(2);
-    }
-
-    function it_accepts_any_key_token_type_to_score_object_that_is_both_traversable_and_array_accessible(
-        TokenInterface $key,
-        TokenInterface $value,
-        \ArrayIterator $object
-    ) {
-        $this->beConstructedWith($key, $value);
-        $object->current()->will(function () use ($object) {
-            $object->valid()->willReturn(false);
-
-            return 'value';
-        });
-        $object->key()->willReturn('key');
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(true);
-        $this->shouldNotThrow(new InvalidArgumentException)->duringScoreArgument($object);
-    }
-
-    function it_does_not_score_if_argument_is_neither_array_nor_traversable_nor_array_accessible()
-    {
-        $this->scoreArgument('string')->shouldBe(false);
-        $this->scoreArgument(new \stdClass)->shouldBe(false);
-    }
-
-    function it_does_not_score_empty_array()
-    {
-        $this->scoreArgument(array())->shouldBe(false);
-    }
-
-    function it_does_not_score_array_if_key_and_value_tokens_do_not_score_same_entry($key, $value)
-    {
-        $argument = array(1 => 'foo', 2 => 'bar');
-        $key->scoreArgument(1)->willReturn(true);
-        $key->scoreArgument(2)->willReturn(false);
-        $value->scoreArgument('foo')->willReturn(false);
-        $value->scoreArgument('bar')->willReturn(true);
-        $this->scoreArgument($argument)->shouldBe(false);
-    }
-
-    function it_does_not_score_traversable_object_without_entries(\Iterator $object)
-    {
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(false);
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function it_does_not_score_traversable_object_if_key_and_value_tokens_do_not_score_same_entry(
-        TokenInterface $key,
-        TokenInterface $value,
-        \Iterator $object
-    ) {
-        $object->current()->willReturn('foo');
-        $object->current()->will(function () use ($object) {
-            $object->valid()->willReturn(false);
-
-            return 'bar';
-        });
-        $object->key()->willReturn(1);
-        $object->key()->willReturn(2);
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(true);
-        $key->scoreArgument(1)->willReturn(true);
-        $key->scoreArgument(2)->willReturn(false);
-        $value->scoreArgument('foo')->willReturn(false);
-        $value->scoreArgument('bar')->willReturn(true);
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function it_does_not_score_array_accessible_object_if_it_has_no_offset_with_key_token_value(
-        ExactValueToken $key,
-        \ArrayAccess $object
-    ) {
-        $object->offsetExists('key')->willReturn(false);
-        $key->getValue()->willReturn('key');
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function it_does_not_score_array_accessible_object_if_key_and_value_tokens_do_not_score_same_entry(
-        ExactValueToken $key,
-        TokenInterface $value,
-        \ArrayAccess $object
-    ) {
-        $object->offsetExists('key')->willReturn(true);
-        $object->offsetGet('key')->willReturn('value');
-        $key->getValue()->willReturn('key');
-        $value->scoreArgument('value')->willReturn(false);
-        $key->scoreArgument('key')->willReturn(true);
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function its_score_is_capped_at_8($key, $value)
-    {
-        $key->scoreArgument('key')->willReturn(10);
-        $value->scoreArgument('value')->willReturn(10);
-        $this->scoreArgument(array('key'=>'value'))->shouldBe(8);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php
deleted file mode 100644
index e57ff8cd..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\Token\TokenInterface;
-
-class ArrayEveryEntryTokenSpec extends ObjectBehavior
-{
-    function let(TokenInterface $value)
-    {
-        $this->beConstructedWith($value);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_holds_value($value)
-    {
-        $this->getValue()->shouldBe($value);
-    }
-
-    function its_string_representation_tells_that_its_an_array_containing_only_value($value)
-    {
-        $value->__toString()->willReturn('value');
-        $this->__toString()->shouldBe('[value, ..., value]');
-    }
-
-    function it_wraps_non_token_value_into_ExactValueToken(\stdClass $stdClass)
-    {
-        $this->beConstructedWith($stdClass);
-        $this->getValue()->shouldHaveType('Prophecy\Argument\Token\ExactValueToken');
-    }
-
-    function it_does_not_score_if_argument_is_neither_array_nor_traversable()
-    {
-        $this->scoreArgument('string')->shouldBe(false);
-        $this->scoreArgument(new \stdClass)->shouldBe(false);
-    }
-
-    function it_does_not_score_empty_array()
-    {
-        $this->scoreArgument(array())->shouldBe(false);
-    }
-
-    function it_does_not_score_traversable_object_without_entries(\Iterator $object)
-    {
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(false);
-        $this->scoreArgument($object)->shouldBe(false);
-    }
-
-    function it_scores_avg_of_scores_from_value_tokens($value)
-    {
-        $value->scoreArgument('value1')->willReturn(6);
-        $value->scoreArgument('value2')->willReturn(3);
-        $this->scoreArgument(array('value1', 'value2'))->shouldBe(4.5);
-    }
-
-    function it_scores_false_if_entry_scores_false($value)
-    {
-        $value->scoreArgument('value1')->willReturn(6);
-        $value->scoreArgument('value2')->willReturn(false);
-        $this->scoreArgument(array('value1', 'value2'))->shouldBe(false);
-    }
-
-    function it_does_not_score_array_keys($value)
-    {
-        $value->scoreArgument('value')->willReturn(6);
-        $value->scoreArgument('key')->shouldNotBeCalled(0);
-        $this->scoreArgument(array('key' => 'value'))->shouldBe(6);
-    }
-
-    function it_scores_traversable_object_from_value_token(TokenInterface $value, \Iterator $object)
-    {
-        $object->current()->will(function ($args, $object) {
-            $object->valid()->willReturn(false);
-
-            return 'value';
-        });
-        $object->key()->willReturn('key');
-        $object->rewind()->willReturn(null);
-        $object->next()->willReturn(null);
-        $object->valid()->willReturn(true);
-        $value->scoreArgument('value')->willReturn(2);
-        $this->scoreArgument($object)->shouldBe(2);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php
deleted file mode 100644
index 4395bf09..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class CallbackTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('get_class');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_7_if_argument_matches_callback()
-    {
-        $this->beConstructedWith(function ($argument) { return 2 === $argument; });
-
-        $this->scoreArgument(2)->shouldReturn(7);
-    }
-
-    function it_does_not_scores_if_argument_does_not_match_callback()
-    {
-        $this->beConstructedWith(function ($argument) { return 2 === $argument; });
-
-        $this->scoreArgument(5)->shouldReturn(false);
-    }
-
-    function its_string_representation_should_tell_that_its_callback()
-    {
-        $this->__toString()->shouldReturn('callback()');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
deleted file mode 100644
index 14322f82..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class ExactValueTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(42);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_holds_value()
-    {
-        $this->getValue()->shouldReturn(42);
-    }
-
-    function it_scores_10_if_value_is_equal_to_argument()
-    {
-        $this->scoreArgument(42)->shouldReturn(10);
-        $this->scoreArgument('42')->shouldReturn(10);
-    }
-
-    function it_scores_10_if_value_is_an_object_and_equal_to_argument()
-    {
-        $value = new \DateTime();
-        $value2 = clone $value;
-
-        $this->beConstructedWith($value);
-        $this->scoreArgument($value2)->shouldReturn(10);
-    }
-
-    function it_does_not_scores_if_value_is_not_equal_to_argument()
-    {
-        $this->scoreArgument(50)->shouldReturn(false);
-        $this->scoreArgument(new \stdClass())->shouldReturn(false);
-    }
-
-    function it_does_not_scores_if_value_an_object_and_is_not_equal_to_argument()
-    {
-        $value = new ExactValueTokenFixtureB('ABC');
-        $value2 = new ExactValueTokenFixtureB('CBA');
-
-        $this->beConstructedWith($value);
-        $this->scoreArgument($value2)->shouldReturn(false);
-    }
-
-    function it_does_not_scores_if_value_type_and_is_not_equal_to_argument()
-    {
-        $this->beConstructedWith(false);
-        $this->scoreArgument(0)->shouldReturn(false);
-    }
-
-    function it_generates_proper_string_representation_for_integer()
-    {
-        $this->beConstructedWith(42);
-        $this->__toString()->shouldReturn('exact(42)');
-    }
-
-    function it_generates_proper_string_representation_for_string()
-    {
-        $this->beConstructedWith('some string');
-        $this->__toString()->shouldReturn('exact("some string")');
-    }
-
-    function it_generates_single_line_representation_for_multiline_string()
-    {
-        $this->beConstructedWith("some\nstring");
-        $this->__toString()->shouldReturn('exact("some\\nstring")');
-    }
-
-    function it_generates_proper_string_representation_for_double()
-    {
-        $this->beConstructedWith(42.3);
-        $this->__toString()->shouldReturn('exact(42.3)');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_true()
-    {
-        $this->beConstructedWith(true);
-        $this->__toString()->shouldReturn('exact(true)');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_false()
-    {
-        $this->beConstructedWith(false);
-        $this->__toString()->shouldReturn('exact(false)');
-    }
-
-    function it_generates_proper_string_representation_for_null()
-    {
-        $this->beConstructedWith(null);
-        $this->__toString()->shouldReturn('exact(null)');
-    }
-
-    function it_generates_proper_string_representation_for_empty_array()
-    {
-        $this->beConstructedWith(array());
-        $this->__toString()->shouldReturn('exact([])');
-    }
-
-    function it_generates_proper_string_representation_for_array()
-    {
-        $this->beConstructedWith(array('zet', 42));
-        $this->__toString()->shouldReturn('exact(["zet", 42])');
-    }
-
-    function it_generates_proper_string_representation_for_resource()
-    {
-        $resource = fopen(__FILE__, 'r');
-        $this->beConstructedWith($resource);
-        $this->__toString()->shouldReturn('exact(stream:'.$resource.')');
-    }
-
-    function it_generates_proper_string_representation_for_object(\stdClass $object)
-    {
-        $objHash = sprintf('%s:%s',
-            get_class($object->getWrappedObject()),
-            spl_object_hash($object->getWrappedObject())
-        );
-
-        $this->beConstructedWith($object);
-        $this->__toString()->shouldReturn("exact($objHash Object (\n    'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
-    }
-}
-
-class ExactValueTokenFixtureA
-{
-    public $errors;
-}
-
-class ExactValueTokenFixtureB extends ExactValueTokenFixtureA
-{
-    public $errors;
-    public $value = null;
-
-    public function __construct($value)
-    {
-        $this->value = $value;
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php
deleted file mode 100644
index 00c3a215..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class IdenticalValueTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(42);
-    }
-
-    function it_is_initializable()
-    {
-        $this->shouldHaveType('Prophecy\Argument\Token\IdenticalValueToken');
-    }
-
-    function it_scores_11_if_string_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith('foo');
-        $this->scoreArgument('foo')->shouldReturn(11);
-    }
-
-    function it_scores_11_if_boolean_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith(false);
-        $this->scoreArgument(false)->shouldReturn(11);
-    }
-
-    function it_scores_11_if_integer_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith(31);
-        $this->scoreArgument(31)->shouldReturn(11);
-    }
-
-    function it_scores_11_if_float_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith(31.12);
-        $this->scoreArgument(31.12)->shouldReturn(11);
-    }
-
-    function it_scores_11_if_array_value_is_identical_to_argument()
-    {
-        $this->beConstructedWith(array('foo' => 'bar'));
-        $this->scoreArgument(array('foo' => 'bar'))->shouldReturn(11);
-    }
-
-    function it_scores_11_if_object_value_is_identical_to_argument()
-    {
-        $object = new \stdClass();
-
-        $this->beConstructedWith($object);
-        $this->scoreArgument($object)->shouldReturn(11);
-    }
-
-    function it_scores_false_if_value_is_not_identical_to_argument()
-    {
-        $this->beConstructedWith(new \stdClass());
-        $this->scoreArgument('foo')->shouldReturn(false);
-    }
-
-    function it_scores_false_if_object_value_is_not_the_same_instance_than_argument()
-    {
-        $this->beConstructedWith(new \stdClass());
-        $this->scoreArgument(new \stdClass())->shouldReturn(false);
-    }
-
-    function it_scores_false_if_integer_value_is_not_identical_to_boolean_argument()
-    {
-        $this->beConstructedWith(1);
-        $this->scoreArgument(true)->shouldReturn(false);
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_generates_proper_string_representation_for_integer()
-    {
-        $this->beConstructedWith(42);
-        $this->__toString()->shouldReturn('identical(42)');
-    }
-
-    function it_generates_proper_string_representation_for_string()
-    {
-        $this->beConstructedWith('some string');
-        $this->__toString()->shouldReturn('identical("some string")');
-    }
-
-    function it_generates_single_line_representation_for_multiline_string()
-    {
-        $this->beConstructedWith("some\nstring");
-        $this->__toString()->shouldReturn('identical("some\\nstring")');
-    }
-
-    function it_generates_proper_string_representation_for_double()
-    {
-        $this->beConstructedWith(42.3);
-        $this->__toString()->shouldReturn('identical(42.3)');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_true()
-    {
-        $this->beConstructedWith(true);
-        $this->__toString()->shouldReturn('identical(true)');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_false()
-    {
-        $this->beConstructedWith(false);
-        $this->__toString()->shouldReturn('identical(false)');
-    }
-
-    function it_generates_proper_string_representation_for_null()
-    {
-        $this->beConstructedWith(null);
-        $this->__toString()->shouldReturn('identical(null)');
-    }
-
-    function it_generates_proper_string_representation_for_empty_array()
-    {
-        $this->beConstructedWith(array());
-        $this->__toString()->shouldReturn('identical([])');
-    }
-
-    function it_generates_proper_string_representation_for_array()
-    {
-        $this->beConstructedWith(array('zet', 42));
-        $this->__toString()->shouldReturn('identical(["zet", 42])');
-    }
-
-    function it_generates_proper_string_representation_for_resource()
-    {
-        $resource = fopen(__FILE__, 'r');
-        $this->beConstructedWith($resource);
-        $this->__toString()->shouldReturn('identical(stream:'.$resource.')');
-    }
-
-    function it_generates_proper_string_representation_for_object($object)
-    {
-        $objHash = sprintf('%s:%s',
-            get_class($object->getWrappedObject()),
-            spl_object_hash($object->getWrappedObject())
-        );
-
-        $this->beConstructedWith($object);
-        $this->__toString()->shouldReturn("identical($objHash Object (\n    'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php
deleted file mode 100644
index a79acf4c..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\Token\TokenInterface;
-
-class LogicalAndTokenSpec extends ObjectBehavior
-{
-    function it_implements_TokenInterface()
-    {
-        $this->beConstructedWith(array());
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->beConstructedWith(array());
-        $this->shouldNotBeLast();
-    }
-
-    function it_generates_string_representation_from_all_tokens_imploded(
-        TokenInterface $token1,
-        TokenInterface $token2,
-        TokenInterface $token3
-    ) {
-        $token1->__toString()->willReturn('token_1');
-        $token2->__toString()->willReturn('token_2');
-        $token3->__toString()->willReturn('token_3');
-
-        $this->beConstructedWith(array($token1, $token2, $token3));
-        $this->__toString()->shouldReturn('bool(token_1 AND token_2 AND token_3)');
-    }
-
-    function it_wraps_non_token_arguments_into_ExactValueToken()
-    {
-        $this->beConstructedWith(array(15, '1985'));
-        $this->__toString()->shouldReturn("bool(exact(15) AND exact(\"1985\"))");
-    }
-
-    function it_scores_the_maximum_score_from_all_scores_returned_by_tokens(TokenInterface $token1, TokenInterface $token2)
-    {
-        $token1->scoreArgument(1)->willReturn(10);
-        $token2->scoreArgument(1)->willReturn(5);
-        $this->beConstructedWith(array($token1, $token2));
-        $this->scoreArgument(1)->shouldReturn(10);
-    }
-
-    function it_does_not_score_if_there_are_no_arguments_or_tokens()
-    {
-        $this->beConstructedWith(array());
-        $this->scoreArgument('any')->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_either_of_tokens_does_not_score(TokenInterface $token1, TokenInterface $token2)
-    {
-        $token1->scoreArgument(1)->willReturn(10);
-        $token1->scoreArgument(2)->willReturn(false);
-
-        $token2->scoreArgument(1)->willReturn(false);
-        $token2->scoreArgument(2)->willReturn(10);
-
-        $this->beConstructedWith(array($token1, $token2));
-
-        $this->scoreArgument(1)->shouldReturn(false);
-        $this->scoreArgument(2)->shouldReturn(false);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php
deleted file mode 100644
index c2cbbad1..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php
+++ /dev/null
@@ -1,62 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\Token\TokenInterface;
-
-class LogicalNotTokenSpec extends ObjectBehavior
-{
-    function let(TokenInterface $token)
-    {
-        $this->beConstructedWith($token);
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_holds_originating_token($token)
-    {
-        $this->getOriginatingToken()->shouldReturn($token);
-    }
-
-    function it_has_simple_string_representation($token)
-    {
-        $token->__toString()->willReturn('value');
-        $this->__toString()->shouldBe('not(value)');
-    }
-
-    function it_wraps_non_token_argument_into_ExactValueToken()
-    {
-        $this->beConstructedWith(5);
-        $token = $this->getOriginatingToken();
-        $token->shouldhaveType('Prophecy\Argument\Token\ExactValueToken');
-        $token->getValue()->shouldBe(5);
-    }
-
-    function it_scores_4_if_preset_token_does_not_match_the_argument($token)
-    {
-        $token->scoreArgument('argument')->willReturn(false);
-        $this->scoreArgument('argument')->shouldBe(4);
-    }
-
-    function it_does_not_score_if_preset_token_matches_argument($token)
-    {
-        $token->scoreArgument('argument')->willReturn(5);
-        $this->scoreArgument('argument')->shouldBe(false);
-    }
-
-    function it_is_last_if_preset_token_is_last($token)
-    {
-        $token->isLast()->willReturn(true);
-        $this->shouldBeLast();
-    }
-
-    function it_is_not_last_if_preset_token_is_not_last($token)
-    {
-        $token->isLast()->willReturn(false);
-        $this->shouldNotBeLast();
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
deleted file mode 100644
index d71b22a0..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-
-class ObjectStateTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('getName', 'stdClass');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_8_if_argument_object_has_specific_method_state(\ReflectionClass $reflection)
-    {
-        $reflection->getName()->willReturn('stdClass');
-
-        $this->scoreArgument($reflection)->shouldReturn(8);
-    }
-
-    function it_scores_8_if_argument_object_has_specific_property_state(\stdClass $class)
-    {
-        $class->getName = 'stdClass';
-
-        $this->scoreArgument($class)->shouldReturn(8);
-    }
-
-    function it_does_not_score_if_argument_method_state_does_not_match()
-    {
-        $value = new ObjectStateTokenFixtureB('ABC');
-        $value2 = new ObjectStateTokenFixtureB('CBA');
-
-        $this->beConstructedWith('getSelf', $value);
-        $this->scoreArgument($value2)->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_argument_property_state_does_not_match(\stdClass $class)
-    {
-        $class->getName = 'SplFileInfo';
-
-        $this->scoreArgument($class)->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_argument_object_does_not_have_method_or_property(ObjectStateTokenFixtureA $class)
-    {
-        $this->scoreArgument($class)->shouldReturn(false);
-    }
-
-    function it_does_not_score_if_argument_is_not_object()
-    {
-        $this->scoreArgument(42)->shouldReturn(false);
-    }
-
-    function it_has_simple_string_representation()
-    {
-        $this->__toString()->shouldReturn('state(getName(), "stdClass")');
-    }
-}
-
-class ObjectStateTokenFixtureA
-{
-    public $errors;
-}
-
-class ObjectStateTokenFixtureB extends ObjectStateTokenFixtureA
-{
-    public $errors;
-    public $value = null;
-
-    public function __construct($value)
-    {
-        $this->value = $value;
-    }
-
-    public function getSelf()
-    {
-        return $this;
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php
deleted file mode 100644
index c7fd2652..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class StringContainsTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('a substring');
-    }
-
-    function it_is_initializable()
-    {
-        $this->shouldHaveType('Prophecy\Argument\Token\StringContainsToken');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_holds_value()
-    {
-        $this->getValue()->shouldReturn('a substring');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_6_if_the_argument_contains_the_value()
-    {
-        $this->scoreArgument('Argument containing a substring')->shouldReturn(6);
-    }
-
-    function it_does_not_score_if_the_argument_does_not_contain_the_value()
-    {
-        $this->scoreArgument('Argument will not match')->shouldReturn(false);
-    }
-
-    function its_string_representation_shows_substring()
-    {
-        $this->__toString()->shouldReturn('contains("a substring")');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
deleted file mode 100644
index 2829f31f..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
+++ /dev/null
@@ -1,57 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Argument\Token;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\Token\TokenInterface;
-
-class TypeTokenSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('integer');
-    }
-
-    function it_implements_TokenInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
-    }
-
-    function it_is_not_last()
-    {
-        $this->shouldNotBeLast();
-    }
-
-    function it_scores_5_if_argument_matches_simple_type()
-    {
-        $this->beConstructedWith('integer');
-
-        $this->scoreArgument(42)->shouldReturn(5);
-    }
-
-    function it_does_not_scores_if_argument_does_not_match_simple_type()
-    {
-        $this->beConstructedWith('integer');
-
-        $this->scoreArgument(42.0)->shouldReturn(false);
-    }
-
-    function it_scores_5_if_argument_is_an_instance_of_specified_class(\ReflectionObject $object)
-    {
-        $this->beConstructedWith('ReflectionClass');
-
-        $this->scoreArgument($object)->shouldReturn(5);
-    }
-
-    function it_has_simple_string_representation()
-    {
-        $this->__toString()->shouldReturn('type(integer)');
-    }
-
-    function it_scores_5_if_argument_is_an_instance_of_specified_interface(TokenInterface $interface)
-    {
-        $this->beConstructedWith('Prophecy\Argument\Token\TokenInterface');
-
-        $this->scoreArgument($interface)->shouldReturn(5);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
deleted file mode 100644
index 64232a4d..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
+++ /dev/null
@@ -1,107 +0,0 @@
-<?php
-
-namespace spec\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-
-class ArgumentSpec extends ObjectBehavior
-{
-    function it_has_a_shortcut_for_exact_argument_token()
-    {
-        $token = $this->exact(42);
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ExactValueToken');
-        $token->getValue()->shouldReturn(42);
-    }
-
-    function it_has_a_shortcut_for_any_argument_token()
-    {
-        $token = $this->any();
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValueToken');
-    }
-
-    function it_has_a_shortcut_for_multiple_arguments_token()
-    {
-        $token = $this->cetera();
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValuesToken');
-    }
-
-    function it_has_a_shortcut_for_type_token()
-    {
-        $token = $this->type('integer');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\TypeToken');
-    }
-
-    function it_has_a_shortcut_for_callback_token()
-    {
-        $token = $this->that('get_class');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\CallbackToken');
-    }
-
-    function it_has_a_shortcut_for_object_state_token()
-    {
-        $token = $this->which('getName', 'everzet');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ObjectStateToken');
-    }
-
-    function it_has_a_shortcut_for_logical_and_token()
-    {
-        $token = $this->allOf('integer', 5);
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalAndToken');
-    }
-
-    function it_has_a_shortcut_for_array_count_token()
-    {
-        $token = $this->size(5);
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayCountToken');
-    }
-
-    function it_has_a_shortcut_for_array_entry_token()
-    {
-        $token = $this->withEntry('key', 'value');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
-    }
-
-    function it_has_a_shortcut_for_array_every_entry_token()
-    {
-        $token = $this->withEveryEntry('value');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEveryEntryToken');
-    }
-
-    function it_has_a_shortcut_for_identical_value_token()
-    {
-        $token = $this->is('value');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\IdenticalValueToken');
-    }
-
-    function it_has_a_shortcut_for_array_entry_token_matching_any_key()
-    {
-        $token = $this->containing('value');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
-        $token->getKey()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken');
-    }
-
-    function it_has_a_shortcut_for_array_entry_token_matching_any_value()
-    {
-        $token = $this->withKey('key');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
-        $token->getValue()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken');
-    }
-
-    function it_has_a_shortcut_for_logical_not_token()
-    {
-        $token = $this->not('kagux');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalNotToken');
-    }
-
-    function it_has_a_shortcut_for_string_contains_token()
-    {
-        $token = $this->containingString('string');
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\StringContainsToken');
-    }
-
-    function it_has_a_shortcut_for_approximate_token()
-    {
-        $token = $this->approximate(10);
-        $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ApproximateValueToken');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
deleted file mode 100644
index ef888fdf..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
+++ /dev/null
@@ -1,173 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Call;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Promise\PromiseInterface;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-use Prophecy\Argument\ArgumentsWildcard;
-
-class CallCenterSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy)
-    {
-    }
-
-    function it_records_calls_made_through_makeCall_method(ObjectProphecy $objectProphecy, ArgumentsWildcard $wildcard)
-    {
-        $wildcard->scoreArguments(array(5, 2, 3))->willReturn(10);
-        $objectProphecy->getMethodProphecies()->willReturn(array());
-
-        $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3));
-
-        $calls = $this->findCalls('setValues', $wildcard);
-        $calls->shouldHaveCount(1);
-
-        $calls[0]->shouldBeAnInstanceOf('Prophecy\Call\Call');
-        $calls[0]->getMethodName()->shouldReturn('setValues');
-        $calls[0]->getArguments()->shouldReturn(array(5, 2, 3));
-        $calls[0]->getReturnValue()->shouldReturn(null);
-    }
-
-    function it_returns_null_for_any_call_through_makeCall_if_no_method_prophecies_added(
-        $objectProphecy
-    )
-    {
-        $objectProphecy->getMethodProphecies()->willReturn(array());
-
-        $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3))->shouldReturn(null);
-    }
-
-    function it_executes_promise_of_method_prophecy_that_matches_signature_passed_to_makeCall(
-        $objectProphecy,
-        MethodProphecy $method1,
-        MethodProphecy $method2,
-        MethodProphecy $method3,
-        ArgumentsWildcard $arguments1,
-        ArgumentsWildcard $arguments2,
-        ArgumentsWildcard $arguments3,
-        PromiseInterface $promise
-    ) {
-        $method1->getMethodName()->willReturn('getName');
-        $method1->getArgumentsWildcard()->willReturn($arguments1);
-        $arguments1->scoreArguments(array('world', 'everything'))->willReturn(false);
-
-        $method2->getMethodName()->willReturn('setTitle');
-        $method2->getArgumentsWildcard()->willReturn($arguments2);
-        $arguments2->scoreArguments(array('world', 'everything'))->willReturn(false);
-
-        $method3->getMethodName()->willReturn('getName');
-        $method3->getArgumentsWildcard()->willReturn($arguments3);
-        $method3->getPromise()->willReturn($promise);
-        $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200);
-
-        $objectProphecy->getMethodProphecies()->willReturn(array(
-            'method1' => array($method1),
-            'method2' => array($method2, $method3)
-        ));
-        $objectProphecy->getMethodProphecies('getName')->willReturn(array($method1, $method3));
-        $objectProphecy->reveal()->willReturn(new \stdClass());
-
-        $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method3)->willReturn(42);
-
-        $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))->shouldReturn(42);
-
-        $calls = $this->findCalls('getName', $arguments3);
-        $calls->shouldHaveCount(1);
-        $calls[0]->getReturnValue()->shouldReturn(42);
-    }
-
-    function it_executes_promise_of_method_prophecy_that_matches_with_highest_score_to_makeCall(
-        $objectProphecy,
-        MethodProphecy $method1,
-        MethodProphecy $method2,
-        MethodProphecy $method3,
-        ArgumentsWildcard $arguments1,
-        ArgumentsWildcard $arguments2,
-        ArgumentsWildcard $arguments3,
-        PromiseInterface $promise
-    ) {
-        $method1->getMethodName()->willReturn('getName');
-        $method1->getArgumentsWildcard()->willReturn($arguments1);
-        $arguments1->scoreArguments(array('world', 'everything'))->willReturn(50);
-
-        $method2->getMethodName()->willReturn('getName');
-        $method2->getArgumentsWildcard()->willReturn($arguments2);
-        $method2->getPromise()->willReturn($promise);
-        $arguments2->scoreArguments(array('world', 'everything'))->willReturn(300);
-
-        $method3->getMethodName()->willReturn('getName');
-        $method3->getArgumentsWildcard()->willReturn($arguments3);
-        $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200);
-
-        $objectProphecy->getMethodProphecies()->willReturn(array(
-            'method1' => array($method1),
-            'method2' => array($method2, $method3)
-        ));
-        $objectProphecy->getMethodProphecies('getName')->willReturn(array(
-            $method1, $method2, $method3
-        ));
-        $objectProphecy->reveal()->willReturn(new \stdClass());
-
-        $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method2)
-            ->willReturn('second');
-
-        $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))
-            ->shouldReturn('second');
-    }
-
-    function it_throws_exception_if_call_does_not_match_any_of_defined_method_prophecies(
-        $objectProphecy,
-        MethodProphecy $method,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $arguments->scoreArguments(array('world', 'everything'))->willReturn(false);
-        $arguments->__toString()->willReturn('arg1, arg2');
-
-        $objectProphecy->getMethodProphecies()->willReturn(array('method1' => array($method)));
-        $objectProphecy->getMethodProphecies('getName')->willReturn(array($method));
-
-        $this->shouldThrow('Prophecy\Exception\Call\UnexpectedCallException')
-            ->duringMakeCall($objectProphecy, 'getName', array('world', 'everything'));
-    }
-
-    function it_returns_null_if_method_prophecy_that_matches_makeCall_arguments_has_no_promise(
-        $objectProphecy,
-        MethodProphecy $method,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $method->getPromise()->willReturn(null);
-        $arguments->scoreArguments(array('world', 'everything'))->willReturn(100);
-
-        $objectProphecy->getMethodProphecies()->willReturn(array($method));
-        $objectProphecy->getMethodProphecies('getName')->willReturn(array($method));
-
-        $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))
-            ->shouldReturn(null);
-    }
-
-    function it_finds_recorded_calls_by_a_method_name_and_arguments_wildcard(
-        $objectProphecy,
-        ArgumentsWildcard $wildcard
-    ) {
-        $objectProphecy->getMethodProphecies()->willReturn(array());
-
-        $this->makeCall($objectProphecy, 'getName', array('world'));
-        $this->makeCall($objectProphecy, 'getName', array('everything'));
-        $this->makeCall($objectProphecy, 'setName', array(42));
-
-        $wildcard->scoreArguments(array('world'))->willReturn(false);
-        $wildcard->scoreArguments(array('everything'))->willReturn(10);
-
-        $calls = $this->findCalls('getName', $wildcard);
-
-        $calls->shouldHaveCount(1);
-        $calls[0]->getMethodName()->shouldReturn('getName');
-        $calls[0]->getArguments()->shouldReturn(array('everything'));
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php
deleted file mode 100644
index a622b493..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Call;
-
-use PhpSpec\ObjectBehavior;
-
-class CallSpec extends ObjectBehavior
-{
-    function let(\Exception $exception)
-    {
-        $this->beConstructedWith('setValues', array(5, 2), 42, $exception, 'some_file.php', 23);
-    }
-
-    function it_exposes_method_name_through_getter()
-    {
-        $this->getMethodName()->shouldReturn('setValues');
-    }
-
-    function it_exposes_arguments_through_getter()
-    {
-        $this->getArguments()->shouldReturn(array(5, 2));
-    }
-
-    function it_exposes_return_value_through_getter()
-    {
-        $this->getReturnValue()->shouldReturn(42);
-    }
-
-    function it_exposes_exception_through_getter($exception)
-    {
-        $this->getException()->shouldReturn($exception);
-    }
-
-    function it_exposes_file_and_line_through_getter()
-    {
-        $this->getFile()->shouldReturn('some_file.php');
-        $this->getLine()->shouldReturn(23);
-    }
-
-    function it_returns_shortpath_to_callPlace()
-    {
-        $this->getCallPlace()->shouldReturn('some_file.php:23');
-    }
-
-    function it_returns_unknown_as_callPlace_if_no_file_or_line_provided()
-    {
-        $this->beConstructedWith('setValues', array(), 0, null, null, null);
-
-        $this->getCallPlace()->shouldReturn('unknown');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php
deleted file mode 100644
index c174e73c..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Comparator;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class ClosureComparatorSpec extends ObjectBehavior
-{
-    function it_is_comparator()
-    {
-        $this->shouldHaveType('SebastianBergmann\Comparator\Comparator');
-    }
-
-    function it_accepts_only_closures()
-    {
-        $this->accepts(123, 321)->shouldReturn(false);
-        $this->accepts('string', 'string')->shouldReturn(false);
-        $this->accepts(false, true)->shouldReturn(false);
-        $this->accepts(true, false)->shouldReturn(false);
-        $this->accepts((object)array(), (object)array())->shouldReturn(false);
-        $this->accepts(function(){}, (object)array())->shouldReturn(false);
-        $this->accepts(function(){}, (object)array())->shouldReturn(false);
-
-        $this->accepts(function(){}, function(){})->shouldReturn(true);
-    }
-
-    function it_asserts_that_all_closures_are_different()
-    {
-        $this->shouldThrow()->duringAssertEquals(function(){}, function(){});
-    }
-
-    function it_asserts_that_all_closures_are_different_even_if_its_the_same_closure()
-    {
-        $closure = function(){};
-
-        $this->shouldThrow()->duringAssertEquals($closure, $closure);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php
deleted file mode 100644
index 6b13336d..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Comparator;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-
-class FactorySpec extends ObjectBehavior
-{
-    function it_extends_Sebastian_Comparator_Factory()
-    {
-        $this->shouldHaveType('SebastianBergmann\Comparator\Factory');
-    }
-
-    function it_should_have_ClosureComparator_registered()
-    {
-        $comparator = $this->getInstance()->getComparatorFor(function(){}, function(){});
-        $comparator->shouldHaveType('Prophecy\Comparator\ClosureComparator');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php
deleted file mode 100644
index 06bf6f17..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php
+++ /dev/null
@@ -1,39 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Comparator;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Prophet;
-
-class ProphecyComparatorSpec extends ObjectBehavior
-{
-    function it_is_a_comparator()
-    {
-        $this->shouldHaveType('SebastianBergmann\Comparator\ObjectComparator');
-    }
-
-    function it_accepts_only_prophecy_objects()
-    {
-        $this->accepts(123, 321)->shouldReturn(false);
-        $this->accepts('string', 'string')->shouldReturn(false);
-        $this->accepts(false, true)->shouldReturn(false);
-        $this->accepts(true, false)->shouldReturn(false);
-        $this->accepts((object)array(), (object)array())->shouldReturn(false);
-        $this->accepts(function(){}, (object)array())->shouldReturn(false);
-        $this->accepts(function(){}, function(){})->shouldReturn(false);
-
-        $prophet = new Prophet();
-        $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy');
-
-        $this->accepts($prophecy, $prophecy)->shouldReturn(true);
-    }
-
-    function it_asserts_that_an_object_is_equal_to_its_revealed_prophecy()
-    {
-        $prophet = new Prophet();
-        $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy');
-
-        $this->shouldNotThrow()->duringAssertEquals($prophecy->reveal(), $prophecy);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php
deleted file mode 100644
index 4fd28d7e..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ArgumentNode;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class DisableConstructorPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_100()
-    {
-        $this->getPriority()->shouldReturn(100);
-    }
-
-    function it_supports_anything(ClassNode $node)
-    {
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_makes_all_constructor_arguments_optional(
-        ClassNode $class,
-        MethodNode $method,
-        ArgumentNode $arg1,
-        ArgumentNode $arg2
-    ) {
-        $class->hasMethod('__construct')->willReturn(true);
-        $class->getMethod('__construct')->willReturn($method);
-        $method->getArguments()->willReturn(array($arg1, $arg2));
-
-        $arg1->setDefault(null)->shouldBeCalled();
-        $arg2->setDefault(null)->shouldBeCalled();
-
-        $method->setCode(Argument::type('string'))->shouldBeCalled();
-
-        $this->apply($class);
-    }
-
-    function it_creates_new_constructor_if_object_has_none(ClassNode $class)
-    {
-        $class->hasMethod('__construct')->willReturn(false);
-        $class->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))
-            ->shouldBeCalled();
-
-        $this->apply($class);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php
deleted file mode 100644
index 9d04421a..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class HhvmExceptionPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_minus_50()
-    {
-        $this->getPriority()->shouldReturn(-50);
-    }
-
-    function it_uses_parent_code_for_setTraceOptions(ClassNode $node, MethodNode $method, MethodNode $getterMethod)
-    {
-        $node->hasMethod('setTraceOptions')->willReturn(true);
-        $node->getMethod('setTraceOptions')->willReturn($method);
-        $node->hasMethod('getTraceOptions')->willReturn(true);
-        $node->getMethod('getTraceOptions')->willReturn($getterMethod);
-
-        $method->useParentCode()->shouldBeCalled();
-        $getterMethod->useParentCode()->shouldBeCalled();
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
deleted file mode 100644
index 1c454e62..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class KeywordPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_49()
-    {
-        $this->getPriority()->shouldReturn(49);
-    }
-
-    function it_will_remove_echo_and_eval_methods(
-        ClassNode $node,
-        MethodNode $method1,
-        MethodNode $method2,
-        MethodNode $method3
-    ) {
-        $node->removeMethod('eval')->shouldBeCalled();
-        $node->removeMethod('echo')->shouldBeCalled();
-
-        $method1->getName()->willReturn('echo');
-        $method2->getName()->willReturn('eval');
-        $method3->getName()->willReturn('notKeyword');
-
-        $node->getMethods()->willReturn(array(
-            'echo' => $method1,
-            'eval' => $method2,
-            'notKeyword' => $method3,
-        ));
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
deleted file mode 100644
index 8a516b0a..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
+++ /dev/null
@@ -1,146 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class MagicCallPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function it_supports_anything(ClassNode $node)
-    {
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_discovers_api_using_phpdoc(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApi');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_ignores_existing_methods(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiExtended');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled();
-        $node->addMethod(new MethodNode('definedMethod'))->shouldNotBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_ignores_empty_methods_from_phpdoc(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiInvalidMethodDefinition');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode(''))->shouldNotBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_discovers_api_using_phpdoc_from_implemented_interfaces(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplemented');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    /**
-     * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
-     */
-    function it_discovers_api_using_phpdoc_from_own_interfaces($node)
-    {
-        $node->getParentClass()->willReturn('stdClass');
-        $node->getInterfaces()->willReturn(array('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplemented'));
-
-        $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    /**
-     * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
-     */
-    function it_discovers_api_using_phpdoc_from_extended_parent_interfaces($node)
-    {
-        $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplementedExtended');
-        $node->getInterfaces()->willReturn(array());
-
-        $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_has_50_priority()
-    {
-        $this->getPriority()->shouldReturn(50);
-    }
-}
-
-/**
- * @method void undefinedMethod()
- */
-class MagicalApi
-{
-    /**
-     * @return void
-     */
-    public function definedMethod()
-    {
-
-    }
-}
-
-/**
- * @method void invalidMethodDefinition
- * @method void
- * @method
- */
-class MagicalApiInvalidMethodDefinition
-{
-}
-
-/**
- * @method void undefinedMethod()
- * @method void definedMethod()
- */
-class MagicalApiExtended extends MagicalApi
-{
-
-}
-
-/**
- */
-class MagicalApiImplemented implements MagicalApiInterface
-{
-
-}
-
-/**
- */
-class MagicalApiImplementedExtended extends MagicalApiImplemented
-{
-}
-
-/**
- * @method void implementedMethod()
- */
-interface MagicalApiInterface
-{
-
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php
deleted file mode 100644
index d2269b32..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class ProphecySubjectPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function it_has_priority_of_0()
-    {
-        $this->getPriority()->shouldReturn(0);
-    }
-
-    function it_supports_any_class(ClassNode $node)
-    {
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_forces_class_to_implement_ProphecySubjectInterface(ClassNode $node)
-    {
-        $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->shouldBeCalled();
-
-        $node->addProperty('objectProphecy', 'private')->willReturn(null);
-        $node->getMethods()->willReturn(array());
-        $node->hasMethod(Argument::any())->willReturn(false);
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-
-        $this->apply($node);
-    }
-
-    function it_forces_all_class_methods_except_constructor_to_proxy_calls_into_prophecy_makeCall(
-        ClassNode $node,
-        MethodNode $constructor,
-        MethodNode $method1,
-        MethodNode $method2,
-        MethodNode $method3
-    ) {
-        $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->willReturn(null);
-        $node->addProperty('objectProphecy', 'private')->willReturn(null);
-        $node->hasMethod(Argument::any())->willReturn(false);
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-
-        $constructor->getName()->willReturn('__construct');
-        $method1->getName()->willReturn('method1');
-        $method2->getName()->willReturn('method2');
-        $method3->getName()->willReturn('method3');
-
-        $node->getMethods()->willReturn(array(
-            'method1' => $method1,
-            'method2' => $method2,
-            'method3' => $method3,
-        ));
-
-        $constructor->setCode(Argument::any())->shouldNotBeCalled();
-
-        $method1->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
-            ->shouldBeCalled();
-        $method2->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
-            ->shouldBeCalled();
-        $method3->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
-            ->shouldBeCalled();
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php
deleted file mode 100644
index effd61e7..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ArgumentNode;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class ReflectionClassNewInstancePatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_50()
-    {
-        $this->getPriority()->shouldReturn(50);
-    }
-
-    function it_supports_ReflectionClass_only(ClassNode $reflectionClassNode, ClassNode $anotherClassNode)
-    {
-        $reflectionClassNode->getParentClass()->willReturn('ReflectionClass');
-        $anotherClassNode->getParentClass()->willReturn('stdClass');
-
-        $this->supports($reflectionClassNode)->shouldReturn(true);
-        $this->supports($anotherClassNode)->shouldReturn(false);
-    }
-
-    function it_makes_all_newInstance_arguments_optional(
-        ClassNode $class,
-        MethodNode $method,
-        ArgumentNode $arg1
-    ) {
-        $class->getMethod('newInstance')->willReturn($method);
-        $method->getArguments()->willReturn(array($arg1));
-        $arg1->setDefault(null)->shouldBeCalled();
-
-        $this->apply($class);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
deleted file mode 100644
index 5bc3958c..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
+++ /dev/null
@@ -1,85 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class SplFileInfoPatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function its_priority_is_50()
-    {
-        $this->getPriority()->shouldReturn(50);
-    }
-
-    function it_does_not_support_nodes_without_parent_class(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('stdClass');
-        $this->supports($node)->shouldReturn(false);
-    }
-
-    function it_supports_nodes_with_SplFileInfo_as_parent_class(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('SplFileInfo');
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_supports_nodes_with_derivative_of_SplFileInfo_as_parent_class(ClassNode $node)
-    {
-        $node->getParentClass()->willReturn('SplFileInfo');
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_adds_a_method_to_node_if_not_exists(ClassNode $node)
-    {
-        $node->hasMethod('__construct')->willReturn(false);
-        $node->addMethod(Argument::any())->shouldBeCalled();
-        $node->getParentClass()->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_updates_existing_method_if_found(ClassNode $node, MethodNode $method)
-    {
-        $node->hasMethod('__construct')->willReturn(true);
-        $node->getMethod('__construct')->willReturn($method);
-        $node->getParentClass()->shouldBeCalled();
-
-        $method->useParentCode()->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_should_not_supply_a_file_for_a_directory_iterator(ClassNode $node, MethodNode $method)
-    {
-        $node->hasMethod('__construct')->willReturn(true);
-        $node->getMethod('__construct')->willReturn($method);
-        $node->getParentClass()->willReturn('DirectoryIterator');
-
-        $method->setCode(Argument::that(function($value) {
-            return strpos($value, '.php') === false;
-        }))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-
-    function it_should_supply_a_file_for_a_spl_file_object(ClassNode $node, MethodNode $method)
-    {
-        $node->hasMethod('__construct')->willReturn(true);
-        $node->getMethod('__construct')->willReturn($method);
-        $node->getParentClass()->willReturn('SplFileObject');
-
-        $method->setCode(Argument::that(function($value) {
-            return strpos($value, '.php') !== false;
-        }))->shouldBeCalled();
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php
deleted file mode 100644
index abce2f1e..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\ClassPatch;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-
-class TraversablePatchSpec extends ObjectBehavior
-{
-    function it_is_a_patch()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
-    }
-
-    function it_supports_class_that_implements_only_Traversable(ClassNode $node)
-    {
-        $node->getInterfaces()->willReturn(array('Traversable'));
-
-        $this->supports($node)->shouldReturn(true);
-    }
-
-    function it_does_not_support_class_that_implements_Iterator(ClassNode $node)
-    {
-        $node->getInterfaces()->willReturn(array('Traversable', 'Iterator'));
-
-        $this->supports($node)->shouldReturn(false);
-    }
-
-    function it_does_not_support_class_that_implements_IteratorAggregate(ClassNode $node)
-    {
-        $node->getInterfaces()->willReturn(array('Traversable', 'IteratorAggregate'));
-
-        $this->supports($node)->shouldReturn(false);
-    }
-
-    function it_has_100_priority()
-    {
-        $this->getPriority()->shouldReturn(100);
-    }
-
-    function it_forces_node_to_implement_IteratorAggregate(ClassNode $node)
-    {
-        $node->addInterface('Iterator')->shouldBeCalled();
-
-        $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
-
-        $this->apply($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php
deleted file mode 100644
index b58b1a80..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php
+++ /dev/null
@@ -1,115 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\ClassPatch\ClassPatchInterface;
-use Prophecy\Doubler\Generator\ClassCreator;
-use Prophecy\Doubler\Generator\ClassMirror;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\NameGenerator;
-
-class DoublerSpec extends ObjectBehavior
-{
-    function let(ClassMirror $mirror, ClassCreator $creator, NameGenerator $namer)
-    {
-        $this->beConstructedWith($mirror, $creator, $namer);
-    }
-
-    function it_does_not_have_patches_by_default()
-    {
-        $this->getClassPatches()->shouldHaveCount(0);
-    }
-
-    function its_registerClassPatch_adds_a_patch_to_the_doubler(ClassPatchInterface $patch)
-    {
-        $this->registerClassPatch($patch);
-        $this->getClassPatches()->shouldReturn(array($patch));
-    }
-
-    function its_getClassPatches_sorts_patches_by_priority(
-        ClassPatchInterface $alt1,
-        ClassPatchInterface $alt2,
-        ClassPatchInterface $alt3,
-        ClassPatchInterface $alt4
-    ) {
-        $alt1->getPriority()->willReturn(2);
-        $alt2->getPriority()->willReturn(50);
-        $alt3->getPriority()->willReturn(10);
-        $alt4->getPriority()->willReturn(0);
-
-        $this->registerClassPatch($alt1);
-        $this->registerClassPatch($alt2);
-        $this->registerClassPatch($alt3);
-        $this->registerClassPatch($alt4);
-
-        $this->getClassPatches()->shouldReturn(array($alt2, $alt3, $alt1, $alt4));
-    }
-
-    function its_double_mirrors_alterates_and_instantiates_provided_class(
-        $mirror,
-        $creator,
-        $namer,
-        ClassPatchInterface $alt1,
-        ClassPatchInterface $alt2,
-        \ReflectionClass $class,
-        \ReflectionClass $interface1,
-        \ReflectionClass $interface2,
-        ClassNode $node
-    ) {
-        $mirror->reflect($class, array($interface1, $interface2))->willReturn($node);
-        $alt1->supports($node)->willReturn(true);
-        $alt2->supports($node)->willReturn(false);
-        $alt1->getPriority()->willReturn(1);
-        $alt2->getPriority()->willReturn(2);
-        $namer->name($class, array($interface1, $interface2))->willReturn('SplStack');
-        $class->getName()->willReturn('stdClass');
-        $interface1->getName()->willReturn('ArrayAccess');
-        $interface2->getName()->willReturn('Iterator');
-
-        $alt1->apply($node)->shouldBeCalled();
-        $alt2->apply($node)->shouldNotBeCalled();
-        $creator->create('SplStack', $node)->shouldBeCalled();
-
-        $this->registerClassPatch($alt1);
-        $this->registerClassPatch($alt2);
-
-        $this->double($class, array($interface1, $interface2))
-            ->shouldReturnAnInstanceOf('SplStack');
-    }
-
-    function it_double_instantiates_a_class_with_constructor_argument(
-        $mirror,
-        \ReflectionClass $class,
-        ClassNode $node,
-        $namer
-    ) {
-        $class->getName()->willReturn('ReflectionClass');
-        $mirror->reflect($class, array())->willReturn($node);
-        $namer->name($class, array())->willReturn('ReflectionClass');
-
-        $double = $this->double($class, array(), array('stdClass'));
-        $double->shouldBeAnInstanceOf('ReflectionClass');
-        $double->getName()->shouldReturn('stdClass');
-    }
-
-    function it_can_instantiate_class_with_final_constructor(
-        $mirror,
-        \ReflectionClass $class,
-        ClassNode $node,
-        $namer
-    ) {
-        $class->getName()->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
-        $mirror->reflect($class, array())->willReturn($node);
-        $namer->name($class, array())->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
-
-        $double = $this->double($class, array());
-
-        $double->shouldBeAnInstanceOf('spec\Prophecy\Doubler\WithFinalConstructor');
-    }
-}
-
-class WithFinalConstructor
-{
-    final public function __construct() {}
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
deleted file mode 100644
index b5a161a0..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
+++ /dev/null
@@ -1,309 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator;
-
-use phpDocumentor\Reflection\DocBlock\Tags\Method;
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Doubler\Generator\Node\ArgumentNode;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-
-class ClassCodeGeneratorSpec extends ObjectBehavior
-{
-    function it_generates_proper_php_code_for_specific_ClassNode(
-        ClassNode $class,
-        MethodNode $method1,
-        MethodNode $method2,
-        MethodNode $method3,
-        ArgumentNode $argument11,
-        ArgumentNode $argument12,
-        ArgumentNode $argument21,
-        ArgumentNode $argument31
-    ) {
-        $class->getParentClass()->willReturn('RuntimeException');
-        $class->getInterfaces()->willReturn(array(
-            'Prophecy\Doubler\Generator\MirroredInterface', 'ArrayAccess', 'ArrayIterator'
-        ));
-        $class->getProperties()->willReturn(array('name' => 'public', 'email' => 'private'));
-        $class->getMethods()->willReturn(array($method1, $method2, $method3));
-
-        $method1->getName()->willReturn('getName');
-        $method1->getVisibility()->willReturn('public');
-        $method1->returnsReference()->willReturn(false);
-        $method1->isStatic()->willReturn(true);
-        $method1->getArguments()->willReturn(array($argument11, $argument12));
-        $method1->hasReturnType()->willReturn(true);
-        $method1->getReturnType()->willReturn('string');
-        $method1->getCode()->willReturn('return $this->name;');
-
-        $method2->getName()->willReturn('getEmail');
-        $method2->getVisibility()->willReturn('protected');
-        $method2->returnsReference()->willReturn(false);
-        $method2->isStatic()->willReturn(false);
-        $method2->getArguments()->willReturn(array($argument21));
-        $method2->hasReturnType()->willReturn(false);
-        $method2->getCode()->willReturn('return $this->email;');
-
-        $method3->getName()->willReturn('getRefValue');
-        $method3->getVisibility()->willReturn('public');
-        $method3->returnsReference()->willReturn(true);
-        $method3->isStatic()->willReturn(false);
-        $method3->getArguments()->willReturn(array($argument31));
-        $method3->hasReturnType()->willReturn(false);
-        $method3->getCode()->willReturn('return $this->refValue;');
-
-        $argument11->getName()->willReturn('fullname');
-        $argument11->getTypeHint()->willReturn('array');
-        $argument11->isOptional()->willReturn(true);
-        $argument11->getDefault()->willReturn(null);
-        $argument11->isPassedByReference()->willReturn(false);
-        $argument11->isVariadic()->willReturn(false);
-
-        $argument12->getName()->willReturn('class');
-        $argument12->getTypeHint()->willReturn('ReflectionClass');
-        $argument12->isOptional()->willReturn(false);
-        $argument12->isPassedByReference()->willReturn(false);
-        $argument12->isVariadic()->willReturn(false);
-
-        $argument21->getName()->willReturn('default');
-        $argument21->getTypeHint()->willReturn('string');
-        $argument21->isOptional()->willReturn(true);
-        $argument21->getDefault()->willReturn('ever.zet@xxxxxxxxx');
-        $argument21->isPassedByReference()->willReturn(false);
-        $argument21->isVariadic()->willReturn(false);
-
-        $argument31->getName()->willReturn('refValue');
-        $argument31->getTypeHint()->willReturn(null);
-        $argument31->isOptional()->willReturn(false);
-        $argument31->getDefault()->willReturn();
-        $argument31->isPassedByReference()->willReturn(false);
-        $argument31->isVariadic()->willReturn(false);
-
-        $code = $this->generate('CustomClass', $class);
-
-        if (version_compare(PHP_VERSION, '7.0', '>=')) {
-            $expected = <<<'PHP'
-namespace  {
-class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator {
-public $name;
-private $email;
-
-public static function getName(array $fullname = NULL, \ReflectionClass $class): string {
-return $this->name;
-}
-protected  function getEmail(string $default = 'ever.zet@xxxxxxxxx') {
-return $this->email;
-}
-public  function &getRefValue( $refValue) {
-return $this->refValue;
-}
-
-}
-}
-PHP;
-        } else {
-            $expected = <<<'PHP'
-namespace  {
-class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator {
-public $name;
-private $email;
-
-public static function getName(array $fullname = NULL, \ReflectionClass $class) {
-return $this->name;
-}
-protected  function getEmail(\string $default = 'ever.zet@xxxxxxxxx') {
-return $this->email;
-}
-public  function &getRefValue( $refValue) {
-return $this->refValue;
-}
-
-}
-}
-PHP;
-        }
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-
-    function it_generates_proper_php_code_for_variadics(
-        ClassNode $class,
-        MethodNode $method1,
-        MethodNode $method2,
-        MethodNode $method3,
-        MethodNode $method4,
-        ArgumentNode $argument1,
-        ArgumentNode $argument2,
-        ArgumentNode $argument3,
-        ArgumentNode $argument4
-    ) {
-        $class->getParentClass()->willReturn('stdClass');
-        $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
-        $class->getProperties()->willReturn(array());
-        $class->getMethods()->willReturn(array(
-            $method1, $method2, $method3, $method4
-        ));
-
-        $method1->getName()->willReturn('variadic');
-        $method1->getVisibility()->willReturn('public');
-        $method1->returnsReference()->willReturn(false);
-        $method1->isStatic()->willReturn(false);
-        $method1->getArguments()->willReturn(array($argument1));
-        $method1->hasReturnType()->willReturn(false);
-        $method1->getCode()->willReturn('');
-
-        $method2->getName()->willReturn('variadicByRef');
-        $method2->getVisibility()->willReturn('public');
-        $method2->returnsReference()->willReturn(false);
-        $method2->isStatic()->willReturn(false);
-        $method2->getArguments()->willReturn(array($argument2));
-        $method2->hasReturnType()->willReturn(false);
-        $method2->getCode()->willReturn('');
-
-        $method3->getName()->willReturn('variadicWithType');
-        $method3->getVisibility()->willReturn('public');
-        $method3->returnsReference()->willReturn(false);
-        $method3->isStatic()->willReturn(false);
-        $method3->getArguments()->willReturn(array($argument3));
-        $method3->hasReturnType()->willReturn(false);
-        $method3->getCode()->willReturn('');
-
-        $method4->getName()->willReturn('variadicWithTypeByRef');
-        $method4->getVisibility()->willReturn('public');
-        $method4->returnsReference()->willReturn(false);
-        $method4->isStatic()->willReturn(false);
-        $method4->getArguments()->willReturn(array($argument4));
-        $method4->hasReturnType()->willReturn(false);
-        $method4->getCode()->willReturn('');
-
-        $argument1->getName()->willReturn('args');
-        $argument1->getTypeHint()->willReturn(null);
-        $argument1->isOptional()->willReturn(false);
-        $argument1->isPassedByReference()->willReturn(false);
-        $argument1->isVariadic()->willReturn(true);
-
-        $argument2->getName()->willReturn('args');
-        $argument2->getTypeHint()->willReturn(null);
-        $argument2->isOptional()->willReturn(false);
-        $argument2->isPassedByReference()->willReturn(true);
-        $argument2->isVariadic()->willReturn(true);
-
-        $argument3->getName()->willReturn('args');
-        $argument3->getTypeHint()->willReturn('\ReflectionClass');
-        $argument3->isOptional()->willReturn(false);
-        $argument3->isPassedByReference()->willReturn(false);
-        $argument3->isVariadic()->willReturn(true);
-
-        $argument4->getName()->willReturn('args');
-        $argument4->getTypeHint()->willReturn('\ReflectionClass');
-        $argument4->isOptional()->willReturn(false);
-        $argument4->isPassedByReference()->willReturn(true);
-        $argument4->isVariadic()->willReturn(true);
-
-        $code = $this->generate('CustomClass', $class);
-        $expected = <<<'PHP'
-namespace  {
-class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
-
-public  function variadic( ...$args) {
-
-}
-public  function variadicByRef( &...$args) {
-
-}
-public  function variadicWithType(\\ReflectionClass ...$args) {
-
-}
-public  function variadicWithTypeByRef(\\ReflectionClass &...$args) {
-
-}
-
-}
-}
-PHP;
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-
-    function it_overrides_properly_methods_with_args_passed_by_reference(
-        ClassNode $class,
-        MethodNode $method,
-        ArgumentNode $argument
-    ) {
-        $class->getParentClass()->willReturn('RuntimeException');
-        $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
-        $class->getProperties()->willReturn(array());
-        $class->getMethods()->willReturn(array($method));
-
-        $method->getName()->willReturn('getName');
-        $method->getVisibility()->willReturn('public');
-        $method->isStatic()->willReturn(false);
-        $method->getArguments()->willReturn(array($argument));
-        $method->hasReturnType()->willReturn(false);
-        $method->returnsReference()->willReturn(false);
-        $method->getCode()->willReturn('return $this->name;');
-
-        $argument->getName()->willReturn('fullname');
-        $argument->getTypeHint()->willReturn('array');
-        $argument->isOptional()->willReturn(true);
-        $argument->getDefault()->willReturn(null);
-        $argument->isPassedByReference()->willReturn(true);
-        $argument->isVariadic()->willReturn(false);
-
-        $code = $this->generate('CustomClass', $class);
-        $expected =<<<'PHP'
-namespace  {
-class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface {
-
-public  function getName(array &$fullname = NULL) {
-return $this->name;
-}
-
-}
-}
-PHP;
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-
-    function it_generates_empty_class_for_empty_ClassNode(ClassNode $class)
-    {
-        $class->getParentClass()->willReturn('stdClass');
-        $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
-        $class->getProperties()->willReturn(array());
-        $class->getMethods()->willReturn(array());
-
-        $code = $this->generate('CustomClass', $class);
-        $expected =<<<'PHP'
-namespace  {
-class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
-
-
-}
-}
-PHP;
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-
-    function it_wraps_class_in_namespace_if_it_is_namespaced(ClassNode $class)
-    {
-        $class->getParentClass()->willReturn('stdClass');
-        $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
-        $class->getProperties()->willReturn(array());
-        $class->getMethods()->willReturn(array());
-
-        $code = $this->generate('My\Awesome\CustomClass', $class);
-        $expected =<<<'PHP'
-namespace My\Awesome {
-class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
-
-
-}
-}
-PHP;
-        $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
-        $code->shouldBe($expected);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php
deleted file mode 100644
index e7cae23b..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Generator\ClassCodeGenerator;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-
-class ClassCreatorSpec extends ObjectBehavior
-{
-    function let(ClassCodeGenerator $generator)
-    {
-        $this->beConstructedWith($generator);
-    }
-
-    function it_evaluates_code_generated_by_ClassCodeGenerator($generator, ClassNode $class)
-    {
-        $generator->generate('stdClass', $class)->shouldBeCalled()->willReturn(
-            'return 42;'
-        );
-
-        $this->create('stdClass', $class)->shouldReturn(42);
-    }
-
-    function it_throws_an_exception_if_class_does_not_exist_after_evaluation($generator, ClassNode $class)
-    {
-        $generator->generate('CustomClass', $class)->shouldBeCalled()->willReturn(
-            'return 42;'
-        );
-
-        $class->getParentClass()->willReturn('stdClass');
-        $class->getInterfaces()->willReturn(array('Interface1', 'Interface2'));
-
-        $this->shouldThrow('Prophecy\Exception\Doubler\ClassCreatorException')
-            ->duringCreate('CustomClass', $class);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
deleted file mode 100644
index 2c8d1886..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
+++ /dev/null
@@ -1,92 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator\Node;
-
-use PhpSpec\ObjectBehavior;
-
-class ArgumentNodeSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('name');
-    }
-
-    function it_is_not_be_passed_by_reference_by_default()
-    {
-        $this->shouldNotBePassedByReference();
-    }
-
-    function it_is_passed_by_reference_if_marked()
-    {
-        $this->setAsPassedByReference();
-        $this->shouldBePassedByReference();
-    }
-
-    function it_is_not_variadic_by_default()
-    {
-        $this->shouldNotBeVariadic();
-    }
-
-    function it_is_variadic_if_marked()
-    {
-        $this->setAsVariadic();
-        $this->shouldBeVariadic();
-    }
-
-    function it_does_not_have_default_by_default()
-    {
-        $this->shouldNotHaveDefault();
-    }
-
-    function it_does_not_have_default_if_variadic()
-    {
-        $this->setDefault(null);
-        $this->setAsVariadic();
-        $this->shouldNotHaveDefault();
-    }
-
-    function it_does_have_default_if_not_variadic()
-    {
-        $this->setDefault(null);
-        $this->setAsVariadic(false);
-        $this->hasDefault()->shouldReturn(true);
-    }
-
-    function it_has_name_with_which_it_was_been_constructed()
-    {
-        $this->getName()->shouldReturn('name');
-    }
-
-    function it_has_no_typehint_by_default()
-    {
-        $this->getTypeHint()->shouldReturn(null);
-    }
-
-    function its_typeHint_is_mutable()
-    {
-        $this->setTypeHint('array');
-        $this->getTypeHint()->shouldReturn('array');
-    }
-
-    function it_does_not_have_default_value_by_default()
-    {
-        $this->getDefault()->shouldReturn(null);
-    }
-
-    function it_is_not_optional_by_default()
-    {
-        $this->isOptional()->shouldReturn(false);
-    }
-
-    function its_default_is_mutable()
-    {
-        $this->setDefault(array());
-        $this->getDefault()->shouldReturn(array());
-    }
-
-    function it_is_marked_as_optional_when_default_is_set()
-    {
-        $this->setDefault(null);
-        $this->isOptional()->shouldReturn(true);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
deleted file mode 100644
index 16fc498b..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
+++ /dev/null
@@ -1,185 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator\Node;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Generator\Node\MethodNode;
-use Prophecy\Exception\Doubler\MethodNotExtendableException;
-
-class ClassNodeSpec extends ObjectBehavior
-{
-    function its_parentClass_is_a_stdClass_by_default()
-    {
-        $this->getParentClass()->shouldReturn('stdClass');
-    }
-
-    function its_parentClass_is_mutable()
-    {
-        $this->setParentClass('Exception');
-        $this->getParentClass()->shouldReturn('Exception');
-    }
-
-    function its_parentClass_is_set_to_stdClass_if_user_set_null()
-    {
-        $this->setParentClass(null);
-        $this->getParentClass()->shouldReturn('stdClass');
-    }
-
-    function it_does_not_implement_any_interface_by_default()
-    {
-        $this->getInterfaces()->shouldHaveCount(0);
-    }
-
-    function its_addInterface_adds_item_to_the_list_of_implemented_interfaces()
-    {
-        $this->addInterface('MyInterface');
-        $this->getInterfaces()->shouldHaveCount(1);
-    }
-
-    function its_hasInterface_returns_true_if_class_implements_interface()
-    {
-        $this->addInterface('MyInterface');
-        $this->hasInterface('MyInterface')->shouldReturn(true);
-    }
-
-    function its_hasInterface_returns_false_if_class_does_not_implements_interface()
-    {
-        $this->hasInterface('MyInterface')->shouldReturn(false);
-    }
-
-    function it_supports_implementation_of_multiple_interfaces()
-    {
-        $this->addInterface('MyInterface');
-        $this->addInterface('MySecondInterface');
-        $this->getInterfaces()->shouldHaveCount(2);
-    }
-
-    function it_ignores_same_interfaces_added_twice()
-    {
-        $this->addInterface('MyInterface');
-        $this->addInterface('MyInterface');
-
-        $this->getInterfaces()->shouldHaveCount(1);
-        $this->getInterfaces()->shouldReturn(array('MyInterface'));
-    }
-
-    function it_does_not_have_methods_by_default()
-    {
-        $this->getMethods()->shouldHaveCount(0);
-    }
-
-    function it_can_has_methods(MethodNode $method1, MethodNode $method2)
-    {
-        $method1->getName()->willReturn('__construct');
-        $method2->getName()->willReturn('getName');
-
-        $this->addMethod($method1);
-        $this->addMethod($method2);
-
-        $this->getMethods()->shouldReturn(array(
-            '__construct' => $method1,
-            'getName'     => $method2
-        ));
-    }
-
-    function its_hasMethod_returns_true_if_method_exists(MethodNode $method)
-    {
-        $method->getName()->willReturn('getName');
-
-        $this->addMethod($method);
-
-        $this->hasMethod('getName')->shouldReturn(true);
-    }
-
-    function its_getMethod_returns_method_by_name(MethodNode $method)
-    {
-        $method->getName()->willReturn('getName');
-
-        $this->addMethod($method);
-
-        $this->getMethod('getName')->shouldReturn($method);
-    }
-
-    function its_hasMethod_returns_false_if_method_does_not_exists()
-    {
-        $this->hasMethod('getName')->shouldReturn(false);
-    }
-
-    function its_hasMethod_returns_false_if_method_has_been_removed(MethodNode $method)
-    {
-        $method->getName()->willReturn('getName');
-        $this->addMethod($method);
-        $this->removeMethod('getName');
-
-        $this->hasMethod('getName')->shouldReturn(false);
-    }
-
-
-    function it_does_not_have_properties_by_default()
-    {
-        $this->getProperties()->shouldHaveCount(0);
-    }
-
-    function it_is_able_to_have_properties()
-    {
-        $this->addProperty('title');
-        $this->addProperty('text', 'private');
-        $this->getProperties()->shouldReturn(array(
-            'title' => 'public',
-            'text'  => 'private'
-        ));
-    }
-
-    function its_addProperty_does_not_accept_unsupported_visibility()
-    {
-        $this->shouldThrow('InvalidArgumentException')->duringAddProperty('title', 'town');
-    }
-
-    function its_addProperty_lowercases_visibility_before_setting()
-    {
-        $this->addProperty('text', 'PRIVATE');
-        $this->getProperties()->shouldReturn(array('text' => 'private'));
-    }
-
-    function its_has_no_unextendable_methods_by_default()
-    {
-        $this->getUnextendableMethods()->shouldHaveCount(0);
-    }
-
-    function its_addUnextendableMethods_adds_an_unextendable_method()
-    {
-        $this->addUnextendableMethod('testMethod');
-        $this->getUnextendableMethods()->shouldHaveCount(1);
-    }
-
-    function its_methods_are_extendable_by_default()
-    {
-        $this->isExtendable('testMethod')->shouldReturn(true);
-    }
-
-    function its_unextendable_methods_are_not_extendable()
-    {
-        $this->addUnextendableMethod('testMethod');
-        $this->isExtendable('testMethod')->shouldReturn(false);
-    }
-
-    function its_addUnextendableMethods_doesnt_create_duplicates()
-    {
-        $this->addUnextendableMethod('testMethod');
-        $this->addUnextendableMethod('testMethod');
-        $this->getUnextendableMethods()->shouldHaveCount(1);
-    }
-
-    function it_throws_an_exception_when_adding_a_method_that_isnt_extendable(MethodNode $method)
-    {
-        $this->addUnextendableMethod('testMethod');
-        $method->getName()->willReturn('testMethod');
-
-        $expectedException = new MethodNotExtendableException(
-            "Method `testMethod` is not extendable, so can not be added.",
-            "stdClass",
-            "testMethod"
-        );
-        $this->shouldThrow($expectedException)->duringAddMethod($method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
deleted file mode 100644
index 14cfe8de..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
+++ /dev/null
@@ -1,134 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler\Generator\Node;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Generator\Node\ArgumentNode;
-
-class MethodNodeSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('getTitle');
-    }
-
-    function it_has_a_name()
-    {
-        $this->getName()->shouldReturn('getTitle');
-    }
-
-    function it_has_public_visibility_by_default()
-    {
-        $this->getVisibility()->shouldReturn('public');
-    }
-
-    function its_visibility_is_mutable()
-    {
-        $this->setVisibility('private');
-        $this->getVisibility()->shouldReturn('private');
-    }
-
-    function it_is_not_static_by_default()
-    {
-        $this->shouldNotBeStatic();
-    }
-
-    function it_does_not_return_a_reference_by_default()
-    {
-        $this->returnsReference()->shouldReturn(false);
-    }
-
-    function it_should_be_settable_as_returning_a_reference_through_setter()
-    {
-        $this->setReturnsReference();
-        $this->returnsReference()->shouldReturn(true);
-    } 
-
-    function it_should_be_settable_as_static_through_setter()
-    {
-        $this->setStatic();
-        $this->shouldBeStatic();
-    }
-
-    function it_accepts_only_supported_visibilities()
-    {
-        $this->shouldThrow('InvalidArgumentException')->duringSetVisibility('stealth');
-    }
-
-    function it_lowercases_visibility_before_setting_it()
-    {
-        $this->setVisibility('Public');
-        $this->getVisibility()->shouldReturn('public');
-    }
-
-    function its_useParentCode_causes_method_to_call_parent(ArgumentNode $argument1, ArgumentNode $argument2)
-    {
-        $argument1->getName()->willReturn('objectName');
-        $argument2->getName()->willReturn('default');
-
-        $argument1->isVariadic()->willReturn(false);
-        $argument2->isVariadic()->willReturn(true);
-
-        $this->addArgument($argument1);
-        $this->addArgument($argument2);
-
-        $this->useParentCode();
-
-        $this->getCode()->shouldReturn(
-            'return parent::getTitle($objectName, ...$default);'
-        );
-    }
-
-    function its_code_is_mutable()
-    {
-        $this->setCode('echo "code";');
-        $this->getCode()->shouldReturn('echo "code";');
-    }
-
-    function its_reference_returning_methods_will_generate_exceptions()
-    {
-        $this->setCode('echo "code";');
-        $this->setReturnsReference();
-        $this->getCode()->shouldReturn("throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), 'getTitle');");
-    }
-
-    function its_setCode_provided_with_null_cleans_method_body()
-    {
-        $this->setCode(null);
-        $this->getCode()->shouldReturn('');
-    }
-
-    function it_is_constructable_with_code()
-    {
-        $this->beConstructedWith('getTitle', 'die();');
-        $this->getCode()->shouldReturn('die();');
-    }
-
-    function it_does_not_have_arguments_by_default()
-    {
-        $this->getArguments()->shouldHaveCount(0);
-    }
-
-    function it_supports_adding_arguments(ArgumentNode $argument1, ArgumentNode $argument2)
-    {
-        $this->addArgument($argument1);
-        $this->addArgument($argument2);
-
-        $this->getArguments()->shouldReturn(array($argument1, $argument2));
-    }
-
-    function it_does_not_have_return_type_by_default()
-    {
-        $this->hasReturnType()->shouldReturn(false);
-    }
-
-    function it_setReturnType_sets_return_type()
-    {
-        $returnType = 'string';
-
-        $this->setReturnType($returnType);
-
-        $this->hasReturnType()->shouldReturn(true);
-        $this->getReturnType()->shouldReturn($returnType);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php
deleted file mode 100644
index fdf1e962..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php
+++ /dev/null
@@ -1,79 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Doubler;
-use Prophecy\Prophecy\ProphecySubjectInterface;
-
-class LazyDoubleSpec extends ObjectBehavior
-{
-    function let(Doubler $doubler)
-    {
-        $this->beConstructedWith($doubler);
-    }
-
-    function it_returns_anonymous_double_instance_by_default($doubler, ProphecySubjectInterface $double)
-    {
-        $doubler->double(null, array())->willReturn($double);
-
-        $this->getInstance()->shouldReturn($double);
-    }
-
-    function it_returns_class_double_instance_if_set($doubler, ProphecySubjectInterface $double, \ReflectionClass $class)
-    {
-        $doubler->double($class, array())->willReturn($double);
-
-        $this->setParentClass($class);
-
-        $this->getInstance()->shouldReturn($double);
-    }
-
-    function it_returns_same_double_instance_if_called_2_times(
-        $doubler,
-        ProphecySubjectInterface $double1,
-        ProphecySubjectInterface $double2
-    ) {
-        $doubler->double(null, array())->willReturn($double1);
-        $doubler->double(null, array())->willReturn($double2);
-
-        $this->getInstance()->shouldReturn($double2);
-        $this->getInstance()->shouldReturn($double2);
-    }
-
-    function its_setParentClass_throws_ClassNotFoundException_if_class_not_found()
-    {
-        $this->shouldThrow('Prophecy\Exception\Doubler\ClassNotFoundException')
-            ->duringSetParentClass('SomeUnexistingClass');
-    }
-
-    function its_setParentClass_throws_exception_if_prophecy_is_already_created(
-        $doubler,
-        ProphecySubjectInterface $double
-    ) {
-        $doubler->double(null, array())->willReturn($double);
-
-        $this->getInstance();
-
-        $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException')
-            ->duringSetParentClass('stdClass');
-    }
-
-    function its_addInterface_throws_InterfaceNotFoundException_if_no_interface_found()
-    {
-        $this->shouldThrow('Prophecy\Exception\Doubler\InterfaceNotFoundException')
-            ->duringAddInterface('SomeUnexistingInterface');
-    }
-
-    function its_addInterface_throws_exception_if_prophecy_is_already_created(
-        $doubler,
-        ProphecySubjectInterface $double
-    ) {
-        $doubler->double(null, array())->willReturn($double);
-
-        $this->getInstance();
-
-        $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException')
-            ->duringAddInterface('ArrayAccess');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php
deleted file mode 100644
index 1e9b17fb..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Doubler;
-
-use PhpSpec\ObjectBehavior;
-
-class NameGeneratorSpec extends ObjectBehavior
-{
-    function its_name_generates_name_based_on_simple_class_reflection(\ReflectionClass $class)
-    {
-        $class->getName()->willReturn('stdClass');
-        $this->name($class, array())->shouldStartWith('Double\stdClass\\');
-    }
-
-    function its_name_generates_name_based_on_namespaced_class_reflection(\ReflectionClass $class)
-    {
-        $class->getName()->willReturn('Some\Custom\Class');
-        $this->name($class, array())->shouldStartWith('Double\Some\Custom\Class\P');
-    }
-
-    function its_name_generates_name_based_on_interface_shortnames(
-        \ReflectionClass $interface1,
-        \ReflectionClass $interface2
-    ) {
-        $interface1->getShortName()->willReturn('HandlerInterface');
-        $interface2->getShortName()->willReturn('LoaderInterface');
-
-        $this->name(null, array($interface1, $interface2))->shouldStartWith(
-            'Double\HandlerInterface\LoaderInterface\P'
-        );
-    }
-
-    function it_generates_proper_name_for_no_class_and_interfaces_list()
-    {
-        $this->name(null, array())->shouldStartWith('Double\stdClass\P');
-    }
-
-    function its_name_generates_name_based_only_on_class_if_its_available(
-        \ReflectionClass $class,
-        \ReflectionClass $interface1,
-        \ReflectionClass $interface2
-    ) {
-        $class->getName()->willReturn('Some\Custom\Class');
-        $interface1->getShortName()->willReturn('HandlerInterface');
-        $interface2->getShortName()->willReturn('LoaderInterface');
-
-        $this->name($class, array($interface1, $interface2))->shouldStartWith(
-            'Double\Some\Custom\Class\P'
-        );
-    }
-
-    public function getMatchers()
-    {
-        return array(
-            'startWith' => function ($subject, $string) {
-                return 0 === strpos($subject, $string);
-            },
-        );
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php
deleted file mode 100644
index 5e2c635b..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Call;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\ObjectProphecy;
-use spec\Prophecy\Exception\Prophecy\Prophecy;
-
-class UnexpectedCallExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy)
-    {
-        $this->beConstructedWith('msg', $objectProphecy, 'getName', array('arg1', 'arg2'));
-    }
-
-    function it_is_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException');
-    }
-
-    function it_exposes_method_name_through_getter()
-    {
-        $this->getMethodName()->shouldReturn('getName');
-    }
-
-    function it_exposes_arguments_through_getter()
-    {
-        $this->getArguments()->shouldReturn(array('arg1', 'arg2'));
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php
deleted file mode 100644
index da3aa580..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Doubler\Generator\Node\ClassNode;
-use spec\Prophecy\Exception\Prophecy;
-
-class ClassCreatorExceptionSpec extends ObjectBehavior
-{
-    function let(ClassNode $node)
-    {
-        $this->beConstructedWith('', $node);
-    }
-
-    function it_is_a_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
-    }
-
-    function it_contains_a_reflected_node($node)
-    {
-        $this->getClassNode()->shouldReturn($node);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php
deleted file mode 100644
index c4f547a7..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-
-class ClassMirrorExceptionSpec extends ObjectBehavior
-{
-    function let(\ReflectionClass $class)
-    {
-        $this->beConstructedWith('', $class);
-    }
-
-    function it_is_a_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
-    }
-
-    function it_contains_a_reflected_class_link($class)
-    {
-        $this->getReflectedClass()->shouldReturn($class);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php
deleted file mode 100644
index 251512b9..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use spec\Prophecy\Exception\Prophecy;
-
-class ClassNotFoundExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('msg', 'CustomClass');
-    }
-
-    function it_is_a_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoubleException');
-    }
-
-    function its_getClassname_returns_classname()
-    {
-        $this->getClassname()->shouldReturn('CustomClass');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
deleted file mode 100644
index 6fe5a19a..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
+++ /dev/null
@@ -1,14 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-
-class DoubleExceptionSpec extends ObjectBehavior
-{
-    function it_is_a_double_exception()
-    {
-        $this->shouldBeAnInstanceOf('RuntimeException');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php
deleted file mode 100644
index ad1a439e..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use spec\Prophecy\Exception\Prophecy;
-
-class InterfaceNotFoundExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('msg', 'CustomInterface');
-    }
-
-    function it_extends_ClassNotFoundException()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\ClassNotFoundException');
-    }
-
-    function its_getClassname_returns_classname()
-    {
-        $this->getClassname()->shouldReturn('CustomInterface');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php
deleted file mode 100644
index 5028b026..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use spec\Prophecy\Exception\Prophecy;
-
-class MethodNotExtendableExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('', 'User', 'getName');
-    }
-
-    function it_is_DoubleException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Doubler\DoubleException');
-    }
-
-    function it_has_MethodName()
-    {
-        $this->getMethodName()->shouldReturn('getName');
-    }
-
-    function it_has_classname()
-    {
-        $this->getClassName()->shouldReturn('User');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
deleted file mode 100644
index a889dd7e..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Doubler;
-
-use PhpSpec\ObjectBehavior;
-use spec\Prophecy\Exception\Prophecy;
-
-class MethodNotFoundExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('', 'User', 'getName', array(1, 2, 3));
-    }
-
-    function it_is_DoubleException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Doubler\DoubleException');
-    }
-
-    function it_has_MethodName()
-    {
-        $this->getMethodName()->shouldReturn('getName');
-    }
-
-    function it_has_classnamej()
-    {
-        $this->getClassname()->shouldReturn('User');
-    }
-
-    function it_has_an_arguments_list()
-    {
-        $this->getArguments()->shouldReturn(array(1, 2, 3));
-    }
-
-    function it_has_a_default_null_argument_list()
-    {
-        $this->beConstructedWith('', 'User', 'getName');
-        $this->getArguments()->shouldReturn(null);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php
deleted file mode 100644
index d78ea738..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Exception\Prediction\PredictionException;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class AggregateExceptionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(null);
-    }
-
-    function it_is_prediction_exception()
-    {
-        $this->shouldBeAnInstanceOf('RuntimeException');
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\PredictionException');
-    }
-
-    function it_can_store_objectProphecy_link(ObjectProphecy $object)
-    {
-        $this->setObjectProphecy($object);
-        $this->getObjectProphecy()->shouldReturn($object);
-    }
-
-    function it_should_not_have_exceptions_at_the_beginning()
-    {
-        $this->getExceptions()->shouldHaveCount(0);
-    }
-
-    function it_should_append_exception_through_append_method(PredictionException $exception)
-    {
-        $exception->getMessage()->willReturn('Exception #1');
-
-        $this->append($exception);
-
-        $this->getExceptions()->shouldReturn(array($exception));
-    }
-
-    function it_should_update_message_during_append(PredictionException $exception)
-    {
-        $exception->getMessage()->willReturn('Exception #1');
-
-        $this->append($exception);
-
-        $this->getMessage()->shouldReturn("  Exception #1");
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php
deleted file mode 100644
index c2aa31df..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class NoCallsExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy, MethodProphecy $methodProphecy)
-    {
-        $methodProphecy->getObjectProphecy()->willReturn($objectProphecy);
-
-        $this->beConstructedWith('message', $methodProphecy);
-    }
-
-    function it_is_PredictionException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException');
-    }
-
-    function it_extends_MethodProphecyException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php
deleted file mode 100644
index e18932ed..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class UnexpectedCallsCountExceptionSpec extends ObjectBehavior
-{
-    function let( ObjectProphecy $objectProphecy, MethodProphecy $methodProphecy, Call $call1, Call $call2) {
-        $methodProphecy->getObjectProphecy()->willReturn($objectProphecy);
-
-        $this->beConstructedWith('message', $methodProphecy, 5, array($call1, $call2));
-    }
-
-    function it_extends_UnexpectedCallsException()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\UnexpectedCallsException');
-    }
-
-    function it_should_expose_expectedCount_through_getter()
-    {
-        $this->getExpectedCount()->shouldReturn(5);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php
deleted file mode 100644
index 49d12d59..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class UnexpectedCallsExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy, MethodProphecy $methodProphecy, Call $call1, Call $call2)
-    {
-        $methodProphecy->getObjectProphecy()->willReturn($objectProphecy);
-
-        $this->beConstructedWith('message', $methodProphecy, array($call1, $call2));
-    }
-
-    function it_is_PredictionException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException');
-    }
-
-    function it_extends_MethodProphecyException()
-    {
-        $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException');
-    }
-
-    function it_should_expose_calls_list_through_getter($call1, $call2)
-    {
-        $this->getCalls()->shouldReturn(array($call1, $call2));
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php
deleted file mode 100644
index d05c66a5..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php
+++ /dev/null
@@ -1,28 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-use spec\Prophecy\Exception\Prophecy;
-
-class MethodProphecyExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy, MethodProphecy $methodProphecy)
-    {
-        $methodProphecy->getObjectProphecy()->willReturn($objectProphecy);
-
-        $this->beConstructedWith('message', $methodProphecy);
-    }
-
-    function it_extends_DoubleException()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException');
-    }
-
-    function it_holds_a_stub_reference($methodProphecy)
-    {
-        $this->getMethodProphecy()->shouldReturn($methodProphecy);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php
deleted file mode 100644
index 91ffd5b9..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Exception\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ObjectProphecyExceptionSpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy)
-    {
-        $this->beConstructedWith('message', $objectProphecy);
-    }
-
-    function it_should_be_a_prophecy_exception()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ProphecyException');
-    }
-
-    function it_holds_double_reference($objectProphecy)
-    {
-        $this->getObjectProphecy()->shouldReturn($objectProphecy);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php
deleted file mode 100644
index 4f03db2f..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class CallPredictionSpec extends ObjectBehavior
-{
-    function it_is_prediction()
-    {
-        $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
-    }
-
-    function it_does_nothing_if_there_is_more_than_one_call_been_made(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        Call $call
-    ) {
-        $this->check(array($call), $object, $method)->shouldReturn(null);
-    }
-
-    function it_throws_NoCallsException_if_no_calls_found(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->getObjectProphecy()->willReturn($object);
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $arguments->__toString()->willReturn('123');
-        $object->reveal()->willReturn(new \stdClass());
-        $object->findProphecyMethodCalls('getName', Argument::any())->willReturn(array());
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\NoCallsException')
-            ->duringCheck(array(), $object, $method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php
deleted file mode 100644
index 52ce31cf..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php
+++ /dev/null
@@ -1,50 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class CallTimesPredictionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(2);
-    }
-
-    function it_is_prediction()
-    {
-        $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
-    }
-
-    function it_does_nothing_if_there_were_exact_amount_of_calls_being_made(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        Call $call1,
-        Call $call2
-    ) {
-        $this->check(array($call1, $call2), $object, $method)->shouldReturn(null);
-    }
-
-    function it_throws_UnexpectedCallsCountException_if_calls_found(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        Call $call,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->getObjectProphecy()->willReturn($object);
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $arguments->__toString()->willReturn('123');
-
-        $call->getMethodName()->willReturn('getName');
-        $call->getArguments()->willReturn(array(5, 4, 'three'));
-        $call->getCallPlace()->willReturn('unknown');
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsCountException')
-            ->duringCheck(array($call), $object, $method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php
deleted file mode 100644
index 6da95f06..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prediction;
-
-use PhpSpec\ObjectBehavior;
-
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-use RuntimeException;
-
-class CallbackPredictionSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('get_class');
-    }
-
-    function it_is_prediction()
-    {
-        $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
-    }
-
-    function it_proxies_call_to_callback(ObjectProphecy $object, MethodProphecy $method, Call $call)
-    {
-        $returnFirstCallCallback = function ($calls, $object, $method) {
-            throw new RuntimeException;
-        };
-
-        $this->beConstructedWith($returnFirstCallCallback);
-
-        $this->shouldThrow('RuntimeException')->duringCheck(array($call), $object, $method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php
deleted file mode 100644
index b5fa28a9..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prediction;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class NoCallsPredictionSpec extends ObjectBehavior
-{
-    function it_is_prediction()
-    {
-        $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
-    }
-
-    function it_does_nothing_if_there_is_no_calls_made(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->check(array(), $object, $method)->shouldReturn(null);
-    }
-
-    function it_throws_UnexpectedCallsException_if_calls_found(
-        ObjectProphecy $object,
-        MethodProphecy $method,
-        Call $call,
-        ArgumentsWildcard $arguments
-    ) {
-        $method->getObjectProphecy()->willReturn($object);
-        $method->getMethodName()->willReturn('getName');
-        $method->getArgumentsWildcard()->willReturn($arguments);
-        $arguments->__toString()->willReturn('123');
-
-        $call->getMethodName()->willReturn('getName');
-        $call->getArguments()->willReturn(array(5, 4, 'three'));
-        $call->getCallPlace()->willReturn('unknown');
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsException')
-            ->duringCheck(array($call), $object, $method);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php
deleted file mode 100644
index fb1dc62e..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php
+++ /dev/null
@@ -1,96 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Promise;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class CallbackPromiseSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('get_class');
-    }
-
-    function it_is_promise()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
-    }
-
-    function it_should_execute_closure_callback(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $firstArgumentCallback = function ($args) {
-            return $args[0];
-        };
-
-        $this->beConstructedWith($firstArgumentCallback);
-
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-    function it_should_execute_static_array_callback(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $firstArgumentCallback = array('spec\Prophecy\Promise\ClassCallback', 'staticCallbackMethod');
-
-        $this->beConstructedWith($firstArgumentCallback);
-
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-    function it_should_execute_instance_array_callback(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $class = new ClassCallback();
-        $firstArgumentCallback = array($class, 'callbackMethod');
-
-        $this->beConstructedWith($firstArgumentCallback);
-
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-    function it_should_execute_string_function_callback(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $firstArgumentCallback = 'spec\Prophecy\Promise\functionCallbackFirstArgument';
-
-        $this->beConstructedWith($firstArgumentCallback);
-
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-}
-
-/**
- * Class used to test callbackpromise
- *
- * @param array
- * @return string
- */
-class ClassCallback
-{
-    /**
-     * @param array $args
-     */
-    function callbackMethod($args)
-    {
-        return $args[0];
-    }
-
-    /**
-     * @param array $args
-     */
-    static function staticCallbackMethod($args)
-    {
-        return $args[0];
-    }
-}
-
-/**
- * Callback function used to test callbackpromise
- *
- * @param array
- * @return string
- */
-function functionCallbackFirstArgument($args)
-{
-    return $args[0];
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
deleted file mode 100644
index 1cef3aa6..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Promise;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ReturnArgumentPromiseSpec extends ObjectBehavior
-{
-    function it_is_promise()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
-    }
-
-    function it_should_return_first_argument_if_provided(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
-    }
-
-    function it_should_return_null_if_no_arguments_provided(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->execute(array(), $object, $method)->shouldReturn(null);
-    }
-
-    function it_should_return_nth_argument_if_provided(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith(1);
-        $this->execute(array('one', 'two'), $object, $method)->shouldReturn('two');
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php
deleted file mode 100644
index bc6a9918..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php
+++ /dev/null
@@ -1,49 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Promise;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ReturnPromiseSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith(array(42));
-    }
-
-    function it_is_promise()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
-    }
-
-    function it_returns_value_it_was_constructed_with(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->execute(array(), $object, $method)->shouldReturn(42);
-    }
-
-    function it_always_returns_last_value_left_in_the_return_values(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->execute(array(), $object, $method)->shouldReturn(42);
-        $this->execute(array(), $object, $method)->shouldReturn(42);
-    }
-
-    function it_consequently_returns_multiple_values_it_was_constructed_with(
-        ObjectProphecy $object,
-        MethodProphecy $method
-    ) {
-        $this->beConstructedWith(array(42, 24, 12));
-
-        $this->execute(array(), $object, $method)->shouldReturn(42);
-        $this->execute(array(), $object, $method)->shouldReturn(24);
-        $this->execute(array(), $object, $method)->shouldReturn(12);
-    }
-
-    function it_returns_null_if_constructed_with_empty_array(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith(array());
-
-        $this->execute(array(), $object, $method)->shouldReturn(null);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php
deleted file mode 100644
index c7a5ec85..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Promise;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ThrowPromiseSpec extends ObjectBehavior
-{
-    function let()
-    {
-        $this->beConstructedWith('RuntimeException');
-    }
-
-    function it_is_promise()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
-    }
-
-    function it_instantiates_and_throws_exception_from_provided_classname(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith('InvalidArgumentException');
-
-        $this->shouldThrow('InvalidArgumentException')
-            ->duringExecute(array(), $object, $method);
-    }
-
-    function it_instantiates_exceptions_with_required_arguments(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith('spec\Prophecy\Promise\RequiredArgumentException');
-
-        $this->shouldThrow('spec\Prophecy\Promise\RequiredArgumentException')
-            ->duringExecute(array(), $object, $method);
-    }
-
-    function it_throws_provided_exception(ObjectProphecy $object, MethodProphecy $method)
-    {
-        $this->beConstructedWith($exc = new \RuntimeException('Some exception'));
-
-        $this->shouldThrow($exc)->duringExecute(array(), $object, $method);
-    }
-}
-
-class RequiredArgumentException extends \Exception
-{
-    final public function __construct($message, $code) {}
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
deleted file mode 100644
index 969e644a..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
+++ /dev/null
@@ -1,342 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Prediction\PredictionInterface;
-use Prophecy\Promise\PromiseInterface;
-use Prophecy\Prophecy\ObjectProphecy;
-
-class ClassWithFinalMethod
-{
-    final public function finalMethod() {}
-}
-
-class MethodProphecySpec extends ObjectBehavior
-{
-    function let(ObjectProphecy $objectProphecy, \ReflectionClass $reflection)
-    {
-        $objectProphecy->reveal()->willReturn($reflection);
-
-        $this->beConstructedWith($objectProphecy, 'getName', null);
-    }
-
-    function it_is_initializable()
-    {
-        $this->shouldHaveType('Prophecy\Prophecy\MethodProphecy');
-    }
-
-    function its_constructor_throws_MethodNotFoundException_for_unexisting_method($objectProphecy)
-    {
-        $this->shouldThrow('Prophecy\Exception\Doubler\MethodNotFoundException')->during(
-            '__construct', array($objectProphecy, 'getUnexisting', null)
-        );
-    }
-
-    function its_constructor_throws_MethodProphecyException_for_final_methods($objectProphecy, ClassWithFinalMethod $subject)
-    {
-        $objectProphecy->reveal()->willReturn($subject);
-
-        $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->during(
-            '__construct', array($objectProphecy, 'finalMethod', null)
-        );
-    }
-
-    function its_constructor_transforms_array_passed_as_3rd_argument_to_ArgumentsWildcard(
-        $objectProphecy
-    )
-    {
-        $this->beConstructedWith($objectProphecy, 'getName', array(42, 33));
-
-        $wildcard = $this->getArgumentsWildcard();
-        $wildcard->shouldNotBe(null);
-        $wildcard->__toString()->shouldReturn('exact(42), exact(33)');
-    }
-
-    function its_constructor_does_not_touch_third_argument_if_it_is_null($objectProphecy)
-    {
-        $this->beConstructedWith($objectProphecy, 'getName', null);
-
-        $wildcard = $this->getArgumentsWildcard();
-        $wildcard->shouldBe(null);
-    }
-
-    function it_records_promise_through_will_method(PromiseInterface $promise, $objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->will($promise);
-        $this->getPromise()->shouldReturn($promise);
-    }
-
-    function it_adds_itself_to_ObjectProphecy_during_call_to_will(PromiseInterface $objectProphecy, $promise)
-    {
-        $objectProphecy->addMethodProphecy($this)->shouldBeCalled();
-
-        $this->will($promise);
-    }
-
-    function it_adds_ReturnPromise_during_willReturn_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->willReturn(42);
-        $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnPromise');
-    }
-
-    function it_adds_ThrowPromise_during_willThrow_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->willThrow('RuntimeException');
-        $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ThrowPromise');
-    }
-
-    function it_adds_ReturnArgumentPromise_during_willReturnArgument_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->willReturnArgument();
-        $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise');
-    }
-
-    function it_adds_ReturnArgumentPromise_during_willReturnArgument_call_with_index_argument($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->willReturnArgument(1);
-        $promise = $this->getPromise();
-        $promise->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise');
-        $promise->execute(array('one', 'two'), $objectProphecy, $this)->shouldReturn('two');
-    }
-
-    function it_adds_CallbackPromise_during_will_call_with_callback_argument($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $callback = function () {};
-
-        $this->will($callback);
-        $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\CallbackPromise');
-    }
-
-    function it_records_prediction_through_should_method(PredictionInterface $prediction, $objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->callOnWrappedObject('should', array($prediction));
-        $this->getPrediction()->shouldReturn($prediction);
-    }
-
-    function it_adds_CallbackPrediction_during_should_call_with_callback_argument($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $callback = function () {};
-
-        $this->callOnWrappedObject('should', array($callback));
-        $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallbackPrediction');
-    }
-
-    function it_adds_itself_to_ObjectProphecy_during_call_to_should($objectProphecy, PredictionInterface $prediction)
-    {
-        $objectProphecy->addMethodProphecy($this)->shouldBeCalled();
-
-        $this->callOnWrappedObject('should', array($prediction));
-    }
-
-    function it_adds_CallPrediction_during_shouldBeCalled_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->callOnWrappedObject('shouldBeCalled', array());
-        $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallPrediction');
-    }
-
-    function it_adds_NoCallsPrediction_during_shouldNotBeCalled_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->callOnWrappedObject('shouldNotBeCalled', array());
-        $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\NoCallsPrediction');
-    }
-
-    function it_adds_CallTimesPrediction_during_shouldBeCalledTimes_call($objectProphecy)
-    {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->callOnWrappedObject('shouldBeCalledTimes', array(5));
-        $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallTimesPrediction');
-    }
-
-    function it_checks_prediction_via_shouldHave_method_call(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('shouldHave', array($prediction));
-    }
-
-    function it_sets_return_promise_during_shouldHave_call_if_none_was_set_before(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('shouldHave', array($prediction));
-
-        $this->getPromise()->shouldReturnAnInstanceOf('Prophecy\Promise\ReturnPromise');
-    }
-
-    function it_does_not_set_return_promise_during_shouldHave_call_if_it_was_set_before(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2,
-        PromiseInterface $promise
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->will($promise);
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('shouldHave', array($prediction));
-
-        $this->getPromise()->shouldReturn($promise);
-    }
-
-    function it_records_checked_predictions(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction1,
-        PredictionInterface $prediction2,
-        Call $call1,
-        Call $call2,
-        PromiseInterface $promise
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction1->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn();
-        $prediction2->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->will($promise);
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('shouldHave', array($prediction1));
-        $this->callOnWrappedObject('shouldHave', array($prediction2));
-
-        $this->getCheckedPredictions()->shouldReturn(array($prediction1, $prediction2));
-    }
-
-    function it_records_even_failed_checked_predictions(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2,
-        PromiseInterface $promise
-    ) {
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willThrow(new \RuntimeException());
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->will($promise);
-        $this->withArguments($arguments);
-
-        try {
-          $this->callOnWrappedObject('shouldHave', array($prediction));
-        } catch (\Exception $e) {}
-
-        $this->getCheckedPredictions()->shouldReturn(array($prediction));
-    }
-
-    function it_checks_prediction_via_shouldHave_method_call_with_callback(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        Call $call1,
-        Call $call2
-    ) {
-        $callback = function ($calls, $object, $method) {
-            throw new \RuntimeException;
-        };
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-
-        $this->withArguments($arguments);
-        $this->shouldThrow('RuntimeException')->duringShouldHave($callback);
-    }
-
-    function it_does_nothing_during_checkPrediction_if_no_prediction_set()
-    {
-        $this->checkPrediction()->shouldReturn(null);
-    }
-
-    function it_checks_set_prediction_during_checkPrediction(
-        $objectProphecy,
-        ArgumentsWildcard $arguments,
-        PredictionInterface $prediction,
-        Call $call1,
-        Call $call2
-    ) {
-        $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
-        $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
-        $objectProphecy->addMethodProphecy($this)->willReturn(null);
-
-        $this->withArguments($arguments);
-        $this->callOnWrappedObject('should', array($prediction));
-        $this->checkPrediction();
-    }
-
-    function it_links_back_to_ObjectProphecy_through_getter($objectProphecy)
-    {
-        $this->getObjectProphecy()->shouldReturn($objectProphecy);
-    }
-
-    function it_has_MethodName()
-    {
-        $this->getMethodName()->shouldReturn('getName');
-    }
-
-    function it_contains_ArgumentsWildcard_it_was_constructed_with($objectProphecy, ArgumentsWildcard $wildcard)
-    {
-        $this->beConstructedWith($objectProphecy, 'getName', $wildcard);
-
-        $this->getArgumentsWildcard()->shouldReturn($wildcard);
-    }
-
-    function its_ArgumentWildcard_is_mutable_through_setter(ArgumentsWildcard $wildcard)
-    {
-        $this->withArguments($wildcard);
-
-        $this->getArgumentsWildcard()->shouldReturn($wildcard);
-    }
-
-    function its_withArguments_transforms_passed_array_into_ArgumentsWildcard()
-    {
-        $this->withArguments(array(42, 33));
-
-        $wildcard = $this->getArgumentsWildcard();
-        $wildcard->shouldNotBe(null);
-        $wildcard->__toString()->shouldReturn('exact(42), exact(33)');
-    }
-
-    function its_withArguments_throws_exception_if_wrong_arguments_provided()
-    {
-        $this->shouldThrow('Prophecy\Exception\InvalidArgumentException')->duringWithArguments(42);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
deleted file mode 100644
index c6afb3ef..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
+++ /dev/null
@@ -1,283 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prophecy;
-
-use phpDocumentor\Reflection\DocBlock\Tags\Method;
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Call\Call;
-use Prophecy\Call\CallCenter;
-use Prophecy\Doubler\Doubler;
-use Prophecy\Doubler\LazyDouble;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ProphecySubjectInterface;
-use Prophecy\Prophecy\RevealerInterface;
-
-class ObjectProphecySpec extends ObjectBehavior
-{
-    function let(LazyDouble $lazyDouble, ProphecySubjectInterface $double)
-    {
-        $this->beConstructedWith($lazyDouble);
-
-        $lazyDouble->getInstance()->willReturn($double);
-    }
-
-    function it_implements_ProphecyInterface()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Prophecy\ProphecyInterface');
-    }
-
-    function it_sets_parentClass_during_willExtend_call($lazyDouble)
-    {
-        $lazyDouble->setParentClass('123')->shouldBeCalled();
-
-        $this->willExtend('123');
-    }
-
-    function it_adds_interface_during_willImplement_call($lazyDouble)
-    {
-        $lazyDouble->addInterface('222')->shouldBeCalled();
-
-        $this->willImplement('222');
-    }
-
-    function it_sets_constructor_arguments_during_willBeConstructedWith_call($lazyDouble)
-    {
-        $lazyDouble->setArguments(array(1, 2, 5))->shouldBeCalled();
-
-        $this->willBeConstructedWith(array(1, 2, 5));
-    }
-
-    function it_does_not_have_method_prophecies_by_default()
-    {
-        $this->getMethodProphecies()->shouldHaveCount(0);
-    }
-
-    function it_should_get_method_prophecies_by_method_name(
-        MethodProphecy $method1,
-        MethodProphecy $method2,
-        ArgumentsWildcard $arguments
-    ) {
-        $method1->getMethodName()->willReturn('getName');
-        $method1->getArgumentsWildcard()->willReturn($arguments);
-        $method2->getMethodName()->willReturn('setName');
-        $method2->getArgumentsWildcard()->willReturn($arguments);
-
-        $this->addMethodProphecy($method1);
-        $this->addMethodProphecy($method2);
-
-        $methods = $this->getMethodProphecies('setName');
-        $methods->shouldHaveCount(1);
-        $methods[0]->getMethodName()->shouldReturn('setName');
-    }
-
-    function it_should_return_empty_array_if_no_method_prophecies_found()
-    {
-        $methods = $this->getMethodProphecies('setName');
-        $methods->shouldHaveCount(0);
-    }
-
-    function it_should_proxy_makeProphecyMethodCall_to_CallCenter($lazyDouble, CallCenter $callCenter)
-    {
-        $this->beConstructedWith($lazyDouble, $callCenter);
-
-        $callCenter->makeCall($this->getWrappedObject(), 'setName', array('everzet'))->willReturn(42);
-
-        $this->makeProphecyMethodCall('setName', array('everzet'))->shouldReturn(42);
-    }
-
-    function it_should_reveal_arguments_and_return_values_from_callCenter(
-        $lazyDouble,
-        CallCenter $callCenter,
-        RevealerInterface $revealer
-    ) {
-        $this->beConstructedWith($lazyDouble, $callCenter, $revealer);
-
-        $revealer->reveal(array('question'))->willReturn(array('life'));
-        $revealer->reveal('answer')->willReturn(42);
-
-        $callCenter->makeCall($this->getWrappedObject(), 'setName', array('life'))->willReturn('answer');
-
-        $this->makeProphecyMethodCall('setName', array('question'))->shouldReturn(42);
-    }
-
-    function it_should_proxy_getProphecyMethodCalls_to_CallCenter(
-        $lazyDouble,
-        CallCenter $callCenter,
-        ArgumentsWildcard $wildcard,
-        Call $call
-    ) {
-        $this->beConstructedWith($lazyDouble, $callCenter);
-
-        $callCenter->findCalls('setName', $wildcard)->willReturn(array($call));
-
-        $this->findProphecyMethodCalls('setName', $wildcard)->shouldReturn(array($call));
-    }
-
-    function its_addMethodProphecy_adds_method_prophecy(
-        MethodProphecy $methodProphecy,
-        ArgumentsWildcard $argumentsWildcard
-    ) {
-        $methodProphecy->getArgumentsWildcard()->willReturn($argumentsWildcard);
-        $methodProphecy->getMethodName()->willReturn('getUsername');
-
-        $this->addMethodProphecy($methodProphecy);
-
-        $this->getMethodProphecies()->shouldReturn(array(
-            'getUsername' => array($methodProphecy)
-        ));
-    }
-
-    function its_addMethodProphecy_handles_prophecies_with_different_arguments(
-        MethodProphecy $methodProphecy1,
-        MethodProphecy $methodProphecy2,
-        ArgumentsWildcard $argumentsWildcard1,
-        ArgumentsWildcard $argumentsWildcard2
-    ) {
-        $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
-        $methodProphecy1->getMethodName()->willReturn('getUsername');
-
-        $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
-        $methodProphecy2->getMethodName()->willReturn('getUsername');
-
-        $this->addMethodProphecy($methodProphecy1);
-        $this->addMethodProphecy($methodProphecy2);
-
-        $this->getMethodProphecies()->shouldReturn(array(
-            'getUsername' => array(
-                $methodProphecy1,
-                $methodProphecy2,
-            )
-        ));
-    }
-
-    function its_addMethodProphecy_handles_prophecies_for_different_methods(
-        MethodProphecy $methodProphecy1,
-        MethodProphecy $methodProphecy2,
-        ArgumentsWildcard $argumentsWildcard1,
-        ArgumentsWildcard $argumentsWildcard2
-    ) {
-        $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
-        $methodProphecy1->getMethodName()->willReturn('getUsername');
-
-        $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
-        $methodProphecy2->getMethodName()->willReturn('isUsername');
-
-        $this->addMethodProphecy($methodProphecy1);
-        $this->addMethodProphecy($methodProphecy2);
-
-        $this->getMethodProphecies()->shouldReturn(array(
-            'getUsername' => array(
-                $methodProphecy1
-            ),
-            'isUsername' => array(
-                $methodProphecy2
-            )
-        ));
-    }
-
-    function its_addMethodProphecy_throws_exception_when_method_has_no_ArgumentsWildcard(MethodProphecy $methodProphecy)
-    {
-        $methodProphecy->getArgumentsWildcard()->willReturn(null);
-        $methodProphecy->getObjectProphecy()->willReturn($this);
-        $methodProphecy->getMethodName()->willReturn('getTitle');
-
-        $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->duringAddMethodProphecy(
-            $methodProphecy
-        );
-    }
-
-    function it_returns_null_after_checkPredictions_call_if_there_is_no_method_prophecies()
-    {
-        $this->checkProphecyMethodsPredictions()->shouldReturn(null);
-    }
-
-    function it_throws_AggregateException_during_checkPredictions_if_predictions_fail(
-        MethodProphecy $methodProphecy1, MethodProphecy $methodProphecy2,
-        ArgumentsWildcard $argumentsWildcard1,
-        ArgumentsWildcard $argumentsWildcard2
-    ) {
-        $methodProphecy1->getMethodName()->willReturn('getName');
-        $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
-        $methodProphecy1->checkPrediction()
-            ->willThrow('Prophecy\Exception\Prediction\AggregateException');
-
-        $methodProphecy2->getMethodName()->willReturn('setName');
-        $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
-        $methodProphecy2->checkPrediction()
-            ->willThrow('Prophecy\Exception\Prediction\AggregateException');
-
-        $this->addMethodProphecy($methodProphecy1);
-        $this->addMethodProphecy($methodProphecy2);
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException')
-            ->duringCheckProphecyMethodsPredictions();
-    }
-
-    function it_returns_new_MethodProphecy_instance_for_arbitrary_call(
-        Doubler $doubler,
-        ProphecySubjectInterface $reflection
-    ) {
-        $doubler->double(Argument::any())->willReturn($reflection);
-
-        $return = $this->getProphecy();
-        $return->shouldBeAnInstanceOf('Prophecy\Prophecy\MethodProphecy');
-        $return->getMethodName()->shouldReturn('getProphecy');
-    }
-
-    function it_returns_same_MethodProphecy_for_same_registered_signature(
-        Doubler $doubler,
-        ProphecySubjectInterface $reflection
-    ) {
-        $doubler->double(Argument::any())->willReturn($reflection);
-
-        $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3));
-        $methodProphecy2 = $this->getProphecy(1, 2, 3);
-
-        $methodProphecy2->shouldBe($methodProphecy1);
-    }
-
-    function it_returns_new_MethodProphecy_for_different_signatures(
-        Doubler $doubler,
-        ProphecySubjectInterface $reflection
-    ) {
-        $doubler->double(Argument::any())->willReturn($reflection);
-
-        $value = new ObjectProphecySpecFixtureB('ABC');
-        $value2 = new ObjectProphecySpecFixtureB('CBA');
-
-        $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3, $value));
-        $methodProphecy2 = $this->getProphecy(1, 2, 3, $value2);
-
-        $methodProphecy2->shouldNotBe($methodProphecy1);
-    }
-
-    function it_returns_new_MethodProphecy_for_all_callback_signatures(
-        Doubler $doubler,
-        ProphecySubjectInterface $reflection
-    ) {
-        $doubler->double(Argument::any())->willReturn($reflection);
-
-        $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(function(){}));
-        $methodProphecy2 = $this->getProphecy(function(){});
-
-        $methodProphecy2->shouldNotBe($methodProphecy1);
-    }
-}
-
-class ObjectProphecySpecFixtureA
-{
-	public $errors;
-}
-
-class ObjectProphecySpecFixtureB extends ObjectProphecySpecFixtureA
-{
-    public $errors;
-    public $value = null;
-
-    public function __construct($value)
-    {
-        $this->value = $value;
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php
deleted file mode 100644
index fcaa7ca3..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Prophecy\ProphecyInterface;
-
-class RevealerSpec extends ObjectBehavior
-{
-    function it_is_revealer()
-    {
-        $this->shouldBeAnInstanceOf('Prophecy\Prophecy\RevealerInterface');
-    }
-
-    function it_reveals_single_instance_of_ProphecyInterface(ProphecyInterface $prophecy, \stdClass $object)
-    {
-        $prophecy->reveal()->willReturn($object);
-
-        $this->reveal($prophecy)->shouldReturn($object);
-    }
-
-    function it_reveals_instances_of_ProphecyInterface_inside_array(
-        ProphecyInterface $prophecy1,
-        ProphecyInterface $prophecy2,
-        \stdClass $object1,
-        \stdClass $object2
-    ) {
-        $prophecy1->reveal()->willReturn($object1);
-        $prophecy2->reveal()->willReturn($object2);
-
-        $this->reveal(array(
-            array('item' => $prophecy2),
-            $prophecy1
-        ))->shouldReturn(array(
-            array('item' => $object2),
-            $object1
-        ));
-    }
-
-    function it_does_not_touch_non_prophecy_interface()
-    {
-        $this->reveal(42)->shouldReturn(42);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php
deleted file mode 100644
index 67f02752..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php
+++ /dev/null
@@ -1,81 +0,0 @@
-<?php
-
-namespace spec\Prophecy;
-
-use PhpSpec\ObjectBehavior;
-use Prophecy\Argument;
-use Prophecy\Argument\ArgumentsWildcard;
-use Prophecy\Doubler\Doubler;
-use Prophecy\Prophecy\MethodProphecy;
-use Prophecy\Prophecy\ProphecySubjectInterface;
-
-class ProphetSpec extends ObjectBehavior
-{
-    function let(Doubler $doubler, ProphecySubjectInterface $double)
-    {
-        $doubler->double(null, array())->willReturn($double);
-
-        $this->beConstructedWith($doubler);
-    }
-
-    function it_constructs_new_prophecy_on_prophesize_call()
-    {
-        $prophecy = $this->prophesize();
-        $prophecy->shouldBeAnInstanceOf('Prophecy\Prophecy\ObjectProphecy');
-    }
-
-    function it_constructs_new_prophecy_with_parent_class_if_specified($doubler, ProphecySubjectInterface $newDouble)
-    {
-        $doubler->double(Argument::any(), array())->willReturn($newDouble);
-
-        $this->prophesize('Prophecy\Prophet')->reveal()->shouldReturn($newDouble);
-    }
-
-    function it_constructs_new_prophecy_with_interface_if_specified($doubler, ProphecySubjectInterface $newDouble)
-    {
-        $doubler->double(null, Argument::any())->willReturn($newDouble);
-
-        $this->prophesize('ArrayAccess')->reveal()->shouldReturn($newDouble);
-    }
-
-    function it_exposes_all_created_prophecies_through_getter()
-    {
-        $prophecy1 = $this->prophesize();
-        $prophecy2 = $this->prophesize();
-
-        $this->getProphecies()->shouldReturn(array($prophecy1, $prophecy2));
-    }
-
-    function it_does_nothing_during_checkPredictions_call_if_no_predictions_defined()
-    {
-        $this->checkPredictions()->shouldReturn(null);
-    }
-
-    function it_throws_AggregateException_if_defined_predictions_fail(
-        MethodProphecy $method1,
-        MethodProphecy $method2,
-        ArgumentsWildcard $arguments1,
-        ArgumentsWildcard $arguments2
-    ) {
-        $method1->getMethodName()->willReturn('getName');
-        $method1->getArgumentsWildcard()->willReturn($arguments1);
-        $method1->checkPrediction()->willReturn(null);
-
-        $method2->getMethodName()->willReturn('isSet');
-        $method2->getArgumentsWildcard()->willReturn($arguments2);
-        $method2->checkPrediction()->willThrow(
-            'Prophecy\Exception\Prediction\AggregateException'
-        );
-
-        $this->prophesize()->addMethodProphecy($method1);
-        $this->prophesize()->addMethodProphecy($method2);
-
-        $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException')
-            ->duringCheckPredictions();
-    }
-
-    function it_exposes_doubler_through_getter($doubler)
-    {
-        $this->getDoubler()->shouldReturn($doubler);
-    }
-}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
deleted file mode 100644
index 80573cff..00000000
--- a/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-
-namespace spec\Prophecy\Util;
-
-use PhpSpec\ObjectBehavior;
-
-class StringUtilSpec extends ObjectBehavior
-{
-    function it_generates_proper_string_representation_for_integer()
-    {
-        $this->stringify(42)->shouldReturn('42');
-    }
-
-    function it_generates_proper_string_representation_for_string()
-    {
-        $this->stringify('some string')->shouldReturn('"some string"');
-    }
-
-    function it_generates_single_line_representation_for_multiline_string()
-    {
-        $this->stringify("some\nstring")->shouldReturn('"some\\nstring"');
-    }
-
-    function it_generates_proper_string_representation_for_double()
-    {
-        $this->stringify(42.3)->shouldReturn('42.3');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_true()
-    {
-        $this->stringify(true)->shouldReturn('true');
-    }
-
-    function it_generates_proper_string_representation_for_boolean_false()
-    {
-        $this->stringify(false)->shouldReturn('false');
-    }
-
-    function it_generates_proper_string_representation_for_null()
-    {
-        $this->stringify(null)->shouldReturn('null');
-    }
-
-    function it_generates_proper_string_representation_for_empty_array()
-    {
-        $this->stringify(array())->shouldReturn('[]');
-    }
-
-    function it_generates_proper_string_representation_for_array()
-    {
-        $this->stringify(array('zet', 42))->shouldReturn('["zet", 42]');
-    }
-
-    function it_generates_proper_string_representation_for_hash_containing_one_value()
-    {
-        $this->stringify(array('ever' => 'zet'))->shouldReturn('["ever" => "zet"]');
-    }
-
-    function it_generates_proper_string_representation_for_hash()
-    {
-        $this->stringify(array('ever' => 'zet', 52 => 'hey', 'num' => 42))->shouldReturn(
-            '["ever" => "zet", 52 => "hey", "num" => 42]'
-        );
-    }
-
-    function it_generates_proper_string_representation_for_resource()
-    {
-        $resource = fopen(__FILE__, 'r');
-        $this->stringify($resource)->shouldReturn('stream:'.$resource);
-    }
-
-    function it_generates_proper_string_representation_for_object(\stdClass $object)
-    {
-        $objHash = sprintf('%s:%s',
-            get_class($object->getWrappedObject()),
-            spl_object_hash($object->getWrappedObject())
-        ) . " Object (\n    'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n)";
-
-        $this->stringify($object)->shouldReturn("$objHash");
-    }
-
-    function it_generates_proper_string_representation_for_object_without_exporting(\stdClass $object)
-    {
-        $objHash = sprintf('%s:%s',
-            get_class($object->getWrappedObject()),
-            spl_object_hash($object->getWrappedObject())
-        );
-
-        $this->stringify($object, false)->shouldReturn("$objHash");
-    }
-}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
index 24ff8c2e..bd8d423f 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
@@ -32,7 +32,7 @@ class StringContainsToken implements TokenInterface
 
     public function scoreArgument($argument)
     {
-        return strpos($argument, $this->value) !== false ? 6 : false;
+        return is_string($argument) && strpos($argument, $this->value) !== false ? 6 : false;
     }
 
     /**
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php b/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
index 2f3fbadb..26522354 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
@@ -12,6 +12,7 @@
 namespace Prophecy\Call;
 
 use Exception;
+use Prophecy\Argument\ArgumentsWildcard;
 
 /**
  * Call object.
@@ -26,6 +27,7 @@ class Call
     private $exception;
     private $file;
     private $line;
+    private $scores;
 
     /**
      * Initializes call.
@@ -44,6 +46,7 @@ class Call
         $this->arguments   = $arguments;
         $this->returnValue = $returnValue;
         $this->exception   = $exception;
+        $this->scores      = new \SplObjectStorage();
 
         if ($file) {
             $this->file = $file;
@@ -124,4 +127,36 @@ class Call
 
         return sprintf('%s:%d', $this->file, $this->line);
     }
+
+    /**
+     * Adds the wildcard match score for the provided wildcard.
+     *
+     * @param ArgumentsWildcard $wildcard
+     * @param false|int $score
+     *
+     * @return $this
+     */
+    public function addScore(ArgumentsWildcard $wildcard, $score)
+    {
+        $this->scores[$wildcard] = $score;
+
+        return $this;
+    }
+
+    /**
+     * Returns wildcard match score for the provided wildcard. The score is
+     * calculated if not already done.
+     *
+     * @param ArgumentsWildcard $wildcard
+     *
+     * @return false|int False OR integer score (higher - better)
+     */
+    public function getScore(ArgumentsWildcard $wildcard)
+    {
+        if (isset($this->scores[$wildcard])) {
+            return $this->scores[$wildcard];
+        }
+
+        return $this->scores[$wildcard] = $wildcard->scoreArguments($this->getArguments());
+    }
 }
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php b/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
index 53b80f05..bc936c8f 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
@@ -96,6 +96,7 @@ class CallCenter
         // Sort matches by their score value
         @usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; });
 
+        $score = $matches[0][0];
         // If Highest rated method prophecy has a promise - execute it or return null instead
         $methodProphecy = $matches[0][1];
         $returnValue = null;
@@ -115,9 +116,10 @@ class CallCenter
             );
         }
 
-        $this->recordedCalls[] = new Call(
+        $this->recordedCalls[] = $call = new Call(
             $methodName, $arguments, $returnValue, $exception, $file, $line
         );
+        $call->addScore($methodProphecy->getArgumentsWildcard(), $score);
 
         if (null !== $exception) {
             throw $exception;
@@ -139,7 +141,7 @@ class CallCenter
         return array_values(
             array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) {
                 return $methodName === $call->getMethodName()
-                    && 0 < $wildcard->scoreArguments($call->getArguments())
+                    && 0 < $call->getScore($wildcard)
                 ;
             })
         );
@@ -149,23 +151,79 @@ class CallCenter
                                                    array $arguments)
     {
         $classname = get_class($prophecy->reveal());
-        $argstring = implode(', ', array_map(array($this->util, 'stringify'), $arguments));
-        $expected  = implode("\n", array_map(function (MethodProphecy $methodProphecy) {
-            return sprintf('  - %s(%s)',
+        $indentationLength = 8; // looks good
+        $argstring = implode(
+            ",\n",
+            $this->indentArguments(
+                array_map(array($this->util, 'stringify'), $arguments),
+                $indentationLength
+            )
+        );
+
+        $expected = array();
+
+        foreach (call_user_func_array('array_merge', $prophecy->getMethodProphecies()) as $methodProphecy) {
+            $expected[] = sprintf(
+                "  - %s(\n" .
+                "%s\n" .
+                "    )",
                 $methodProphecy->getMethodName(),
-                $methodProphecy->getArgumentsWildcard()
+                implode(
+                    ",\n",
+                    $this->indentArguments(
+                        array_map('strval', $methodProphecy->getArgumentsWildcard()->getTokens()),
+                        $indentationLength
+                    )
+                )
             );
-        }, call_user_func_array('array_merge', $prophecy->getMethodProphecies())));
+        }
 
         return new UnexpectedCallException(
             sprintf(
-                "Method call:\n".
-                "  - %s(%s)\n".
-                "on %s was not expected, expected calls were:\n%s",
-
-                $methodName, $argstring, $classname, $expected
+                "Unexpected method call on %s:\n".
+                "  - %s(\n".
+                "%s\n".
+                "    )\n".
+                "expected calls were:\n".
+                "%s",
+
+                $classname, $methodName, $argstring, implode("\n", $expected)
             ),
             $prophecy, $methodName, $arguments
+
+        );
+    }
+
+    private function formatExceptionMessage(MethodProphecy $methodProphecy)
+    {
+        return sprintf(
+            "  - %s(\n".
+            "%s\n".
+            "    )",
+            $methodProphecy->getMethodName(),
+            implode(
+                ",\n",
+                $this->indentArguments(
+                    array_map(
+                        function ($token) {
+                            return (string) $token;
+                        },
+                        $methodProphecy->getArgumentsWildcard()->getTokens()
+                    ),
+                    $indentationLength
+                )
+            )
+        );
+    }
+
+    private function indentArguments(array $arguments, $indentationLength)
+    {
+        return preg_replace_callback(
+            '/^/m',
+            function () use ($indentationLength) {
+                return str_repeat(' ', $indentationLength);
+            },
+            $arguments
         );
     }
 }
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
index 61998fc4..9d843099 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
@@ -41,6 +41,10 @@ class DisableConstructorPatch implements ClassPatchInterface
      */
     public function apply(ClassNode $node)
     {
+        if (!$node->isExtendable('__construct')) {
+            return;
+        }
+
         if (!$node->hasMethod('__construct')) {
             $node->addMethod(new MethodNode('__construct', ''));
 
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
index 5f2c6077..9ff49cd7 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
@@ -58,20 +58,25 @@ class MagicCallPatch implements ClassPatchInterface
 
         foreach ($types as $type) {
             $reflectionClass = new \ReflectionClass($type);
-            $tagList = $this->tagRetriever->getTagList($reflectionClass);
 
-            foreach($tagList as $tag) {
-                $methodName = $tag->getMethodName();
+            while ($reflectionClass) {
+                $tagList = $this->tagRetriever->getTagList($reflectionClass);
 
-                if (empty($methodName)) {
-                    continue;
-                }
+                foreach ($tagList as $tag) {
+                    $methodName = $tag->getMethodName();
+
+                    if (empty($methodName)) {
+                        continue;
+                    }
 
-                if (!$reflectionClass->hasMethod($methodName)) {
-                    $methodNode = new MethodNode($methodName);
-                    $methodNode->setStatic($tag->isStatic());
-                    $node->addMethod($methodNode);
+                    if (!$reflectionClass->hasMethod($methodName)) {
+                        $methodNode = new MethodNode($methodName);
+                        $methodNode->setStatic($tag->isStatic());
+                        $node->addMethod($methodNode);
+                    }
                 }
+
+                $reflectionClass = $reflectionClass->getParentClass();
             }
         }
     }
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
index fc2cc4de..081dea82 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
@@ -77,7 +77,7 @@ class ProphecySubjectPatch implements ClassPatchInterface
             $__call->addArgument(new ArgumentNode('name'));
             $__call->addArgument(new ArgumentNode('arguments'));
 
-            $node->addMethod($__call);
+            $node->addMethod($__call, true);
         }
 
         $__call->setCode(<<<PHP
@@ -88,8 +88,8 @@ throw new \Prophecy\Exception\Doubler\MethodNotFoundException(
 PHP
         );
 
-        $node->addMethod($prophecySetter);
-        $node->addMethod($prophecyGetter);
+        $node->addMethod($prophecySetter, true);
+        $node->addMethod($prophecyGetter, true);
     }
 
     /**
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
index 3d8e44f3..ceee94a2 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
@@ -34,7 +34,6 @@ class SplFileInfoPatch implements ClassPatchInterface
         if (null === $node->getParentClass()) {
             return false;
         }
-
         return 'SplFileInfo' === $node->getParentClass()
             || is_subclass_of($node->getParentClass(), 'SplFileInfo')
         ;
@@ -67,6 +66,13 @@ class SplFileInfoPatch implements ClassPatchInterface
             return;
         }
 
+        if ($this->nodeIsSymfonySplFileInfo($node)) {
+            $filePath = str_replace('\\','\\\\',__FILE__);
+            $constructor->setCode('return parent::__construct("' . $filePath .'", "", "");');
+
+            return;
+        }
+
         $constructor->useParentCode();
     }
 
@@ -103,4 +109,15 @@ class SplFileInfoPatch implements ClassPatchInterface
         return 'SplFileObject' === $parent
             || is_subclass_of($parent, 'SplFileObject');
     }
+
+    /**
+     * @param ClassNode $node
+     * @return boolean
+     */
+    private function nodeIsSymfonySplFileInfo(ClassNode $node)
+    {
+        $parent = $node->getParentClass();
+
+        return 'Symfony\\Component\\Finder\\SplFileInfo' === $parent;
+    }
 }
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php
new file mode 100644
index 00000000..b98e9432
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ThrowablePatch.php
@@ -0,0 +1,95 @@
+<?php
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+use Prophecy\Exception\Doubler\ClassCreatorException;
+
+class ThrowablePatch implements ClassPatchInterface
+{
+    /**
+     * Checks if patch supports specific class node.
+     *
+     * @param ClassNode $node
+     * @return bool
+     */
+    public function supports(ClassNode $node)
+    {
+        return $this->implementsAThrowableInterface($node) && $this->doesNotExtendAThrowableClass($node);
+    }
+
+    /**
+     * @param ClassNode $node
+     * @return bool
+     */
+    private function implementsAThrowableInterface(ClassNode $node)
+    {
+        foreach ($node->getInterfaces() as $type) {
+            if (is_a($type, 'Throwable', true)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * @param ClassNode $node
+     * @return bool
+     */
+    private function doesNotExtendAThrowableClass(ClassNode $node)
+    {
+        return !is_a($node->getParentClass(), 'Throwable', true);
+    }
+
+    /**
+     * Applies patch to the specific class node.
+     *
+     * @param ClassNode $node
+     *
+     * @return void
+     */
+    public function apply(ClassNode $node)
+    {
+        $this->checkItCanBeDoubled($node);
+        $this->setParentClassToException($node);
+    }
+
+    private function checkItCanBeDoubled(ClassNode $node)
+    {
+        $className = $node->getParentClass();
+        if ($className !== 'stdClass') {
+            throw new ClassCreatorException(
+                sprintf(
+                    'Cannot double concrete class %s as well as implement Traversable',
+                    $className
+                ),
+                $node
+            );
+        }
+    }
+
+    private function setParentClassToException(ClassNode $node)
+    {
+        $node->setParentClass('Exception');
+
+        $node->removeMethod('getMessage');
+        $node->removeMethod('getCode');
+        $node->removeMethod('getFile');
+        $node->removeMethod('getLine');
+        $node->removeMethod('getTrace');
+        $node->removeMethod('getPrevious');
+        $node->removeMethod('getNext');
+        $node->removeMethod('getTraceAsString');
+    }
+
+    /**
+     * Returns patch priority, which determines when patch will be applied.
+     *
+     * @return int Priority number (higher - earlier)
+     */
+    public function getPriority()
+    {
+        return 100;
+    }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php
index fc1079c5..891faa8f 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php
@@ -20,6 +20,16 @@ namespace Prophecy\Doubler\Generator;
 class ClassCodeGenerator
 {
     /**
+     * @var TypeHintReference
+     */
+    private $typeHintReference;
+
+    public function __construct(TypeHintReference $typeHintReference = null)
+    {
+        $this->typeHintReference = $typeHintReference ?: new TypeHintReference();
+    }
+
+    /**
      * Generates PHP code for class node.
      *
      * @param string         $classname
@@ -91,7 +101,8 @@ class ClassCodeGenerator
 
     private function generateArguments(array $arguments)
     {
-        return array_map(function (Node\ArgumentNode $argument) {
+        $typeHintReference = $this->typeHintReference;
+        return array_map(function (Node\ArgumentNode $argument) use ($typeHintReference) {
             $php = '';
 
             if (version_compare(PHP_VERSION, '7.1', '>=')) {
@@ -99,34 +110,7 @@ class ClassCodeGenerator
             }
 
             if ($hint = $argument->getTypeHint()) {
-                switch ($hint) {
-                    case 'array':
-                    case 'callable':
-                        $php .= $hint;
-                        break;
-
-                    case 'iterable':
-                        if (version_compare(PHP_VERSION, '7.1', '>=')) {
-                            $php .= $hint;
-                            break;
-                        }
-
-                        $php .= '\\'.$hint;
-                        break;
-
-                    case 'string':
-                    case 'int':
-                    case 'float':
-                    case 'bool':
-                        if (version_compare(PHP_VERSION, '7.0', '>=')) {
-                            $php .= $hint;
-                            break;
-                        }
-                        // Fall-through to default case for PHP 5.x
-
-                    default:
-                        $php .= '\\'.$hint;
-                }
+                $php .= $typeHintReference->isBuiltInParamTypeHint($hint) ? $hint : '\\'.$hint;
             }
 
             $php .= ' '.($argument->isPassedByReference() ? '&' : '');
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php
index 9f99239f..c5f9a5c7 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php
@@ -189,6 +189,8 @@ class ClassMirror
             $node->setAsPassedByReference();
         }
 
+        $node->setAsNullable($this->isNullable($parameter));
+
         $methodNode->addArgument($node);
     }
 
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
index 1499a1d3..f7bd2857 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
@@ -100,7 +100,7 @@ class ClassNode
         return $this->methods;
     }
 
-    public function addMethod(MethodNode $method)
+    public function addMethod(MethodNode $method, $force = false)
     {
         if (!$this->isExtendable($method->getName())){
             $message = sprintf(
@@ -108,7 +108,10 @@ class ClassNode
             );
             throw new MethodNotExtendableException($message, $this->getParentClass(), $method->getName());
         }
-        $this->methods[$method->getName()] = $method;
+
+        if ($force || !isset($this->methods[$method->getName()])) {
+            $this->methods[$method->getName()] = $method;
+        }
     }
 
     public function removeMethod($name)
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
index ee363ab3..c74b4831 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
@@ -11,6 +11,7 @@
 
 namespace Prophecy\Doubler\Generator\Node;
 
+use Prophecy\Doubler\Generator\TypeHintReference;
 use Prophecy\Exception\InvalidArgumentException;
 
 /**
@@ -34,13 +35,19 @@ class MethodNode
     private $arguments = array();
 
     /**
+     * @var TypeHintReference
+     */
+    private $typeHintReference;
+
+    /**
      * @param string $name
      * @param string $code
      */
-    public function __construct($name, $code = null)
+    public function __construct($name, $code = null, TypeHintReference $typeHintReference = null)
     {
         $this->name = $name;
         $this->code = $code;
+        $this->typeHintReference = $typeHintReference ?: new TypeHintReference();
     }
 
     public function getVisibility()
@@ -112,38 +119,22 @@ class MethodNode
      */
     public function setReturnType($type = null)
     {
-        switch ($type) {
-            case '':
-                $this->returnType = null;
-                break;
-
-            case 'string':
-            case 'float':
-            case 'int':
-            case 'bool':
-            case 'array':
-            case 'callable':
-            case 'iterable':
-            case 'void':
-                $this->returnType = $type;
-                break;
-
-            case 'double':
-            case 'real':
-                $this->returnType = 'float';
-                break;
-
-            case 'boolean':
-                $this->returnType = 'bool';
-                break;
-
-            case 'integer':
-                $this->returnType = 'int';
-                break;
-
-            default:
-                $this->returnType = '\\' . ltrim($type, '\\');
+        if ($type === '' || $type === null) {
+            $this->returnType = null;
+            return;
+        }
+        $typeMap = array(
+            'double' => 'float',
+            'real' => 'float',
+            'boolean' => 'bool',
+            'integer' => 'int',
+        );
+        if (isset($typeMap[$type])) {
+            $type = $typeMap[$type];
         }
+        $this->returnType = $this->typeHintReference->isBuiltInReturnTypeHint($type) ?
+            $type :
+            '\\' . ltrim($type, '\\');
     }
 
     public function getReturnType()
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php
new file mode 100644
index 00000000..ce952029
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/TypeHintReference.php
@@ -0,0 +1,46 @@
+<?php
+
+namespace Prophecy\Doubler\Generator;
+
+/**
+ * Tells whether a keyword refers to a class or to a built-in type for the
+ * current version of php
+ */
+final class TypeHintReference
+{
+    public function isBuiltInParamTypeHint($type)
+    {
+        switch ($type) {
+            case 'self':
+            case 'array':
+                return true;
+
+            case 'callable':
+                return PHP_VERSION_ID >= 50400;
+
+            case 'bool':
+            case 'float':
+            case 'int':
+            case 'string':
+                return PHP_VERSION_ID >= 70000;
+
+            case 'iterable':
+                return PHP_VERSION_ID >= 70100;
+
+            case 'object':
+                return PHP_VERSION_ID >= 70200;
+
+            default:
+                return false;
+        }
+    }
+
+    public function isBuiltInReturnTypeHint($type)
+    {
+        if ($type === 'void') {
+            return PHP_VERSION_ID >= 70100;
+        }
+
+        return $this->isBuiltInParamTypeHint($type);
+    }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php
index b113941f..a5383494 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php
@@ -14,7 +14,7 @@ namespace Prophecy\Exception\Doubler;
 class MethodNotFoundException extends DoubleException
 {
     /**
-     * @var string
+     * @var string|object
      */
     private $classname;
 
@@ -30,7 +30,7 @@ class MethodNotFoundException extends DoubleException
 
     /**
      * @param string $message
-     * @param string $classname
+     * @param string|object $classname
      * @param string $methodName
      * @param null|Argument\ArgumentsWildcard|array $arguments
      */
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php
index 44b598a4..a00dfb03 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php
@@ -21,7 +21,8 @@ class AggregateException extends \RuntimeException implements PredictionExceptio
     public function append(PredictionException $exception)
     {
         $message = $exception->getMessage();
-        $message = '  '.strtr($message, array("\n" => "\n  "))."\n";
+        $message = strtr($message, array("\n" => "\n  "))."\n";
+        $message = empty($this->exceptions) ? $message : "\n" . $message;
 
         $this->message      = rtrim($this->message.$message);
         $this->exceptions[] = $exception;
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
index 90df1efc..7084ed6f 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
@@ -75,11 +75,11 @@ class MethodProphecy
 
             if ('void' === $type) {
                 $this->voidReturnType = true;
-                return;
             }
 
             $this->will(function () use ($type) {
                 switch ($type) {
+                    case 'void': return;
                     case 'string': return '';
                     case 'float':  return 0.0;
                     case 'int':    return 0;
@@ -279,6 +279,18 @@ class MethodProphecy
     }
 
     /**
+     * Sets call times prediction to the prophecy.
+     *
+     * @see \Prophecy\Prediction\CallTimesPrediction
+     *
+     * @return $this
+     */
+    public function shouldBeCalledOnce()
+    {
+        return $this->shouldBeCalledTimes(1);
+    }
+
+    /**
      * Checks provided prediction immediately.
      *
      * @param callable|Prediction\PredictionInterface $prediction
@@ -373,6 +385,18 @@ class MethodProphecy
     }
 
     /**
+     * Checks call times prediction.
+     *
+     * @see \Prophecy\Prediction\CallTimesPrediction
+     *
+     * @return $this
+     */
+    public function shouldHaveBeenCalledOnce()
+    {
+        return $this->shouldHaveBeenCalledTimes(1);
+    }
+
+    /**
      * Checks currently registered [with should(...)] prediction.
      */
     public function checkPrediction()
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophet.php b/vendor/phpspec/prophecy/src/Prophecy/Prophet.php
index ac649234..a4fe4b0d 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Prophet.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophet.php
@@ -52,6 +52,7 @@ class Prophet
             $doubler = new Doubler;
             $doubler->registerClassPatch(new ClassPatch\SplFileInfoPatch);
             $doubler->registerClassPatch(new ClassPatch\TraversablePatch);
+            $doubler->registerClassPatch(new ClassPatch\ThrowablePatch);
             $doubler->registerClassPatch(new ClassPatch\DisableConstructorPatch);
             $doubler->registerClassPatch(new ClassPatch\ProphecySubjectPatch);
             $doubler->registerClassPatch(new ClassPatch\ReflectionClassNewInstancePatch);
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php b/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php
index bb90156a..ba4faff5 100644
--- a/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php
+++ b/vendor/phpspec/prophecy/src/Prophecy/Util/StringUtil.php
@@ -20,6 +20,16 @@ use Prophecy\Call\Call;
  */
 class StringUtil
 {
+    private $verbose;
+
+    /**
+     * @param bool $verbose
+     */
+    public function __construct($verbose = true)
+    {
+        $this->verbose = $verbose;
+    }
+
     /**
      * Stringifies any provided value.
      *
@@ -54,7 +64,7 @@ class StringUtil
         if (is_string($value)) {
             $str = sprintf('"%s"', str_replace("\n", '\\n', $value));
 
-            if (50 <= strlen($str)) {
+            if (!$this->verbose && 50 <= strlen($str)) {
                 return substr($str, 0, 50).'"...';
             }
 
diff --git a/vendor/phpspec/prophecy/tests/Doubler/Generator/ClassMirrorTest.php b/vendor/phpspec/prophecy/tests/Doubler/Generator/ClassMirrorTest.php
deleted file mode 100644
index 77f3ad8f..00000000
--- a/vendor/phpspec/prophecy/tests/Doubler/Generator/ClassMirrorTest.php
+++ /dev/null
@@ -1,469 +0,0 @@
-<?php
-
-namespace Tests\Prophecy\Doubler\Generator;
-
-use Prophecy\Doubler\Generator\ClassMirror;
-
-class ClassMirrorTest extends \PHPUnit_Framework_TestCase
-{
-    /**
-     * @test
-     */
-    public function it_reflects_allowed_magic_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\SpecialMethods');
-
-        $mirror = new ClassMirror();
-
-        $node = $mirror->reflect($class, array());
-
-        $this->assertCount(7, $node->getMethods());
-    }
-
-    /**
-     * @test
-     */
-    public function it_reflects_protected_abstract_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithProtectedAbstractMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertEquals('Fixtures\Prophecy\WithProtectedAbstractMethod', $classNode->getParentClass());
-
-        $methodNodes = $classNode->getMethods();
-        $this->assertCount(1, $methodNodes);
-
-        $this->assertEquals('protected', $methodNodes['innerDetail']->getVisibility());
-    }
-
-    /**
-     * @test
-     */
-    public function it_reflects_public_static_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithStaticMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertEquals('Fixtures\Prophecy\WithStaticMethod', $classNode->getParentClass());
-
-        $methodNodes = $classNode->getMethods();
-        $this->assertCount(1, $methodNodes);
-
-        $this->assertTrue($methodNodes['innerDetail']->isStatic());
-    }
-
-    /**
-     * @test
-     */
-    public function it_marks_required_args_without_types_as_not_optional()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithArguments');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithoutTypeHints');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(1, $argNodes);
-
-        $this->assertEquals('arg', $argNodes[0]->getName());
-        $this->assertNull($argNodes[0]->getTypeHint());
-        $this->assertFalse($argNodes[0]->isOptional());
-        $this->assertNull($argNodes[0]->getDefault());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertFalse($argNodes[0]->isVariadic());
-    }
-
-    /**
-     * @test
-     */
-    public function it_properly_reads_methods_arguments_with_types()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithArguments');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithArgs');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(3, $argNodes);
-
-        $this->assertEquals('arg_1', $argNodes[0]->getName());
-        $this->assertEquals('array', $argNodes[0]->getTypeHint());
-        $this->assertTrue($argNodes[0]->isOptional());
-        $this->assertEquals(array(), $argNodes[0]->getDefault());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertFalse($argNodes[0]->isVariadic());
-
-        $this->assertEquals('arg_2', $argNodes[1]->getName());
-        $this->assertEquals('ArrayAccess', $argNodes[1]->getTypeHint());
-        $this->assertFalse($argNodes[1]->isOptional());
-
-        $this->assertEquals('arg_3', $argNodes[2]->getName());
-        $this->assertEquals('ArrayAccess', $argNodes[2]->getTypeHint());
-        $this->assertTrue($argNodes[2]->isOptional());
-        $this->assertNull($argNodes[2]->getDefault());
-        $this->assertFalse($argNodes[2]->isPassedByReference());
-        $this->assertFalse($argNodes[2]->isVariadic());
-    }
-
-    /**
-     * @test
-     * @requires PHP 5.4
-     */
-    public function it_properly_reads_methods_arguments_with_callable_types()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithCallableArgument');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithArgs');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(2, $argNodes);
-
-        $this->assertEquals('arg_1', $argNodes[0]->getName());
-        $this->assertEquals('callable', $argNodes[0]->getTypeHint());
-        $this->assertFalse($argNodes[0]->isOptional());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertFalse($argNodes[0]->isVariadic());
-
-        $this->assertEquals('arg_2', $argNodes[1]->getName());
-        $this->assertEquals('callable', $argNodes[1]->getTypeHint());
-        $this->assertTrue($argNodes[1]->isOptional());
-        $this->assertNull($argNodes[1]->getDefault());
-        $this->assertFalse($argNodes[1]->isPassedByReference());
-        $this->assertFalse($argNodes[1]->isVariadic());
-    }
-
-    /**
-     * @test
-     * @requires PHP 5.6
-     */
-    public function it_properly_reads_methods_variadic_arguments()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithVariadicArgument');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithArgs');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(1, $argNodes);
-
-        $this->assertEquals('args', $argNodes[0]->getName());
-        $this->assertNull($argNodes[0]->getTypeHint());
-        $this->assertFalse($argNodes[0]->isOptional());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertTrue($argNodes[0]->isVariadic());
-    }
-
-    /**
-     * @test
-     * @requires PHP 5.6
-     */
-    public function it_properly_reads_methods_typehinted_variadic_arguments()
-    {
-        if (defined('HHVM_VERSION_ID')) {
-            $this->markTestSkipped('HHVM does not support typehints on variadic arguments.');
-        }
-
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithTypehintedVariadicArgument');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-        $methodNode = $classNode->getMethod('methodWithTypeHintedArgs');
-        $argNodes = $methodNode->getArguments();
-
-        $this->assertCount(1, $argNodes);
-
-        $this->assertEquals('args', $argNodes[0]->getName());
-        $this->assertEquals('array', $argNodes[0]->getTypeHint());
-        $this->assertFalse($argNodes[0]->isOptional());
-        $this->assertFalse($argNodes[0]->isPassedByReference());
-        $this->assertTrue($argNodes[0]->isVariadic());
-    }
-
-    /**
-     * @test
-     */
-    public function it_marks_passed_by_reference_args_as_passed_by_reference()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithReferences');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertTrue($classNode->hasMethod('methodWithReferenceArgument'));
-
-        $argNodes = $classNode->getMethod('methodWithReferenceArgument')->getArguments();
-
-        $this->assertCount(2, $argNodes);
-
-        $this->assertTrue($argNodes[0]->isPassedByReference());
-        $this->assertTrue($argNodes[1]->isPassedByReference());
-    }
-
-    /**
-     * @test
-     */
-    public function it_throws_an_exception_if_class_is_final()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\FinalClass');
-
-        $mirror = new ClassMirror();
-
-        $this->setExpectedException('Prophecy\Exception\Doubler\ClassMirrorException');
-
-        $mirror->reflect($class, array());
-    }
-
-    /**
-     * @test
-     */
-    public function it_ignores_final_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithFinalMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(0, $classNode->getMethods());
-    }
-
-    /**
-     * @test
-     */
-    public function it_marks_final_methods_as_unextendable()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithFinalMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(1, $classNode->getUnextendableMethods());
-        $this->assertFalse($classNode->isExtendable('finalImplementation'));
-    }
-
-    /**
-     * @test
-     */
-    public function it_throws_an_exception_if_interface_provided_instead_of_class()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\EmptyInterface');
-
-        $mirror = new ClassMirror();
-
-        $this->setExpectedException('Prophecy\Exception\InvalidArgumentException');
-
-        $mirror->reflect($class, array());
-    }
-
-    /**
-     * @test
-     */
-    public function it_reflects_all_interfaces_methods()
-    {
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect(null, array(
-            new \ReflectionClass('Fixtures\Prophecy\Named'),
-            new \ReflectionClass('Fixtures\Prophecy\ModifierInterface'),
-        ));
-
-        $this->assertEquals('stdClass', $classNode->getParentClass());
-        $this->assertEquals(array(
-            'Prophecy\Doubler\Generator\ReflectionInterface',
-            'Fixtures\Prophecy\ModifierInterface',
-            'Fixtures\Prophecy\Named',
-        ), $classNode->getInterfaces());
-
-        $this->assertCount(3, $classNode->getMethods());
-        $this->assertTrue($classNode->hasMethod('getName'));
-        $this->assertTrue($classNode->hasMethod('isAbstract'));
-        $this->assertTrue($classNode->hasMethod('getVisibility'));
-    }
-
-    /**
-     * @test
-     */
-    public function it_ignores_virtually_private_methods()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithVirtuallyPrivateMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(2, $classNode->getMethods());
-        $this->assertTrue($classNode->hasMethod('isAbstract'));
-        $this->assertTrue($classNode->hasMethod('__toString'));
-        $this->assertFalse($classNode->hasMethod('_getName'));
-    }
-
-    /**
-     * @test
-     */
-    public function it_does_not_throw_exception_for_virtually_private_finals()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithFinalVirtuallyPrivateMethod');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(0, $classNode->getMethods());
-    }
-
-    /**
-     * @test
-     * @requires PHP 7
-     */
-    public function it_reflects_return_typehints()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\WithReturnTypehints');
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class, array());
-
-        $this->assertCount(3, $classNode->getMethods());
-        $this->assertTrue($classNode->hasMethod('getName'));
-        $this->assertTrue($classNode->hasMethod('getSelf'));
-        $this->assertTrue($classNode->hasMethod('getParent'));
-
-        $this->assertEquals('string', $classNode->getMethod('getName')->getReturnType());
-        $this->assertEquals('\Fixtures\Prophecy\WithReturnTypehints', $classNode->getMethod('getSelf')->getReturnType());
-        $this->assertEquals('\Fixtures\Prophecy\EmptyClass', $classNode->getMethod('getParent')->getReturnType());
-    }
-
-    /**
-     * @test
-     */
-    public function it_throws_an_exception_if_class_provided_in_interfaces_list()
-    {
-        $class = new \ReflectionClass('Fixtures\Prophecy\EmptyClass');
-
-        $mirror = new ClassMirror();
-
-        $this->setExpectedException('InvalidArgumentException');
-
-        $mirror->reflect(null, array($class));
-    }
-
-    /**
-     * @test
-     */
-    public function it_throws_an_exception_if_not_reflection_provided_as_interface()
-    {
-        $mirror = new ClassMirror();
-
-        $this->setExpectedException('InvalidArgumentException');
-
-        $mirror->reflect(null, array(null));
-    }
-
-    /**
-     * @test
-     */
-    public function it_doesnt_use_scalar_typehints()
-    {
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect(new \ReflectionClass('ReflectionMethod'), array());
-        $method = $classNode->getMethod('export');
-        $arguments = $method->getArguments();
-
-        $this->assertNull($arguments[0]->getTypeHint());
-        $this->assertNull($arguments[1]->getTypeHint());
-        $this->assertNull($arguments[2]->getTypeHint());
-    }
-
-    /**
-     * @test
-     */
-    public function it_doesnt_fail_to_typehint_nonexistent_FQCN()
-    {
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect(new \ReflectionClass('Fixtures\Prophecy\OptionalDepsClass'), array());
-        $method = $classNode->getMethod('iHaveAStrangeTypeHintedArg');
-        $arguments = $method->getArguments();
-        $this->assertEquals('I\Simply\Am\Nonexistent', $arguments[0]->getTypeHint());
-    }
-
-    /**
-     * @test
-     */
-    public function it_doesnt_fail_to_typehint_nonexistent_RQCN()
-    {
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect(new \ReflectionClass('Fixtures\Prophecy\OptionalDepsClass'), array());
-        $method = $classNode->getMethod('iHaveAnEvenStrangerTypeHintedArg');
-        $arguments = $method->getArguments();
-        $this->assertEquals('I\Simply\Am\Not', $arguments[0]->getTypeHint());
-    }
-
-    /**
-     * @test
-     */
-    function it_changes_argument_names_if_they_are_varying()
-    {
-        // Use test doubles in this test, as arguments named ... in the Reflection API can only happen for internal classes
-        $class = $this->prophesize('ReflectionClass');
-        $method = $this->prophesize('ReflectionMethod');
-        $parameter = $this->prophesize('ReflectionParameter');
-
-        $class->getName()->willReturn('Custom\ClassName');
-        $class->isInterface()->willReturn(false);
-        $class->isFinal()->willReturn(false);
-        $class->getMethods(\ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
-        $class->getMethods(\ReflectionMethod::IS_ABSTRACT)->willReturn(array());
-
-        $method->getParameters()->willReturn(array($parameter));
-        $method->getName()->willReturn('methodName');
-        $method->isFinal()->willReturn(false);
-        $method->isProtected()->willReturn(false);
-        $method->isStatic()->willReturn(false);
-        $method->returnsReference()->willReturn(false);
-
-        if (version_compare(PHP_VERSION, '7.0', '>=')) {
-            $method->hasReturnType()->willReturn(false);
-        }
-
-        $parameter->getName()->willReturn('...');
-        $parameter->isDefaultValueAvailable()->willReturn(true);
-        $parameter->getDefaultValue()->willReturn(null);
-        $parameter->isPassedByReference()->willReturn(false);
-        $parameter->getClass()->willReturn($class);
-        if (version_compare(PHP_VERSION, '5.6', '>=')) {
-            $parameter->isVariadic()->willReturn(false);
-        }
-
-        $mirror = new ClassMirror();
-
-        $classNode = $mirror->reflect($class->reveal(), array());
-
-        $methodNodes = $classNode->getMethods();
-
-        $argumentNodes = $methodNodes['methodName']->getArguments();
-        $argumentNode = $argumentNodes[0];
-
-        $this->assertEquals('__dot_dot_dot__', $argumentNode->getName());
-    }
-}
diff --git a/vendor/phpunit/php-file-iterator/ChangeLog.md b/vendor/phpunit/php-file-iterator/ChangeLog.md
index fa77cedb..5c842c6f 100644
--- a/vendor/phpunit/php-file-iterator/ChangeLog.md
+++ b/vendor/phpunit/php-file-iterator/ChangeLog.md
@@ -2,9 +2,40 @@
 
 All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/).
 
-## [1.4.0] - 2015-04-02
+## [1.4.5] - 2017-11-27
+
+### Fixed
+
+* Fixed [#37](https://github.com/sebastianbergmann/php-file-iterator/issues/37): Regression caused by fix for [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30)
+
+## [1.4.4] - 2017-11-27
+
+### Fixed
+
+* Fixed [#30](https://github.com/sebastianbergmann/php-file-iterator/issues/30): Exclude is not considered if it is a parent of the base path
+
+## [1.4.3] - 2017-11-25
+
+### Fixed
+
+* Fixed [#34](https://github.com/sebastianbergmann/php-file-iterator/issues/34): Factory should use canonical directory names
+
+## [1.4.2] - 2016-11-26
+
+No changes
+
+## [1.4.1] - 2015-07-26
+
+No changes
+
+## 1.4.0 - 2015-04-02
 
 ### Added
 
 * [Added support for wildcards (glob) in exclude](https://github.com/sebastianbergmann/php-file-iterator/pull/23)
 
+[1.4.5]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.4...1.4.5
+[1.4.4]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.3...1.4.4
+[1.4.3]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.2...1.4.3
+[1.4.2]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.1...1.4.2
+[1.4.1]: https://github.com/sebastianbergmann/php-file-iterator/compare/1.4.0...1.4.1
diff --git a/vendor/phpunit/php-file-iterator/src/Factory.php b/vendor/phpunit/php-file-iterator/src/Factory.php
index 19c93ad4..9cc3fb7b 100644
--- a/vendor/phpunit/php-file-iterator/src/Factory.php
+++ b/vendor/phpunit/php-file-iterator/src/Factory.php
@@ -80,9 +80,9 @@ class File_Iterator_Factory
 
         foreach ($paths as $path) {
             if ($locals = glob($path, GLOB_ONLYDIR)) {
-                $_paths = array_merge($_paths, $locals);
+                $_paths = array_merge($_paths, array_map('realpath', $locals));
             } else {
-                $_paths[] = $path;
+                $_paths[] = realpath($path);
             }
         }
 
diff --git a/vendor/phpunit/php-file-iterator/src/Iterator.php b/vendor/phpunit/php-file-iterator/src/Iterator.php
index 1607c066..c8f20a79 100644
--- a/vendor/phpunit/php-file-iterator/src/Iterator.php
+++ b/vendor/phpunit/php-file-iterator/src/Iterator.php
@@ -131,7 +131,7 @@ class File_Iterator extends FilterIterator
 
     /**
      * @param  string $filename
-     * @param  array  $subString
+     * @param  array  $subStrings
      * @param  int    $type
      * @return bool
      * @since  Method available since Release 1.1.0
diff --git a/vendor/phpunit/php-token-stream/.gitignore b/vendor/phpunit/php-token-stream/.gitignore
index 103eecf8..77aae3df 100644
--- a/vendor/phpunit/php-token-stream/.gitignore
+++ b/vendor/phpunit/php-token-stream/.gitignore
@@ -1,4 +1,3 @@
 /.idea
 /composer.lock
-/composer.phar
 /vendor
diff --git a/vendor/phpunit/php-token-stream/.travis.yml b/vendor/phpunit/php-token-stream/.travis.yml
index 3f31d02f..e8f407db 100644
--- a/vendor/phpunit/php-token-stream/.travis.yml
+++ b/vendor/phpunit/php-token-stream/.travis.yml
@@ -1,14 +1,9 @@
 language: php
 
 php:
-  - 5.3
-  - 5.4
-  - 5.5
-  - 5.6
   - 7.0
-  - 7.0snapshot
   - 7.1
-  - 7.1snapshot
+  - 7.2
   - master
 
 sudo: false
@@ -18,10 +13,13 @@ before_install:
   - composer clear-cache
 
 install:
-  - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest --optimize-autoloader --prefer-stable
+  - travis_retry composer update --no-interaction --no-ansi --no-progress --no-suggest
 
 script:
-  - ./vendor/bin/phpunit --configuration ./build/phpunit.xml
+  - ./vendor/bin/phpunit --coverage-clover=coverage.xml
+
+after_success:
+  - bash <(curl -s https://codecov.io/bash)
 
 notifications:
   email: false
diff --git a/vendor/phpunit/php-token-stream/ChangeLog.md b/vendor/phpunit/php-token-stream/ChangeLog.md
new file mode 100644
index 00000000..efeec720
--- /dev/null
+++ b/vendor/phpunit/php-token-stream/ChangeLog.md
@@ -0,0 +1,19 @@
+# Change Log
+
+All notable changes to `sebastianbergmann/php-token-stream` are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
+
+## [2.0.2] - 2017-11-27
+
+* Fixed [#69](https://github.com/sebastianbergmann/php-token-stream/issues/69): `PHP_Token_USE_FUNCTION` does not serialize correctly
+
+## [2.0.1] - 2017-08-20
+
+### Fixed
+
+* Fixed [#68](https://github.com/sebastianbergmann/php-token-stream/issues/68): Method with name `empty` wrongly recognized as anonymous function
+
+## [2.0.0] - 2017-08-03
+
+[2.0.2]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0.1...2.0.2
+[2.0.1]: https://github.com/sebastianbergmann/php-token-stream/compare/2.0.0...2.0.1
+[2.0.0]: https://github.com/sebastianbergmann/php-token-stream/compare/1.4.11...2.0.0
diff --git a/vendor/phpunit/php-token-stream/LICENSE b/vendor/phpunit/php-token-stream/LICENSE
index 6a176fa0..cdd1374f 100644
--- a/vendor/phpunit/php-token-stream/LICENSE
+++ b/vendor/phpunit/php-token-stream/LICENSE
@@ -1,6 +1,6 @@
 PHP_TokenStream
 
-Copyright (c) 2009-2015, Sebastian Bergmann <sebastian@xxxxxxxxxx>.
+Copyright (c) 2009-2017, Sebastian Bergmann <sebastian@xxxxxxxxxx>.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/vendor/phpunit/php-token-stream/README.md b/vendor/phpunit/php-token-stream/README.md
index 1cee0487..149b7e2d 100644
--- a/vendor/phpunit/php-token-stream/README.md
+++ b/vendor/phpunit/php-token-stream/README.md
@@ -1,6 +1,6 @@
 [![Build Status](https://travis-ci.org/sebastianbergmann/php-token-stream.svg?branch=master)](https://travis-ci.org/sebastianbergmann/php-token-stream)
 
-# PHP_TokenStream
+# php-token-stream
 
 ## Installation
 
diff --git a/vendor/phpunit/php-token-stream/build.xml b/vendor/phpunit/php-token-stream/build.xml
index f02f4b5c..0da8056e 100644
--- a/vendor/phpunit/php-token-stream/build.xml
+++ b/vendor/phpunit/php-token-stream/build.xml
@@ -1,33 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<project name="php-token-stream">
- <target name="clean" description="Cleanup build artifacts">
-  <delete dir="${basedir}/vendor"/>
-  <delete file="${basedir}/composer.lock"/>
- </target>
+<project name="php-token-stream" default="setup">
+    <target name="setup" depends="clean,composer"/>
 
- <target name="composer" depends="clean" description="Install dependencies with Composer">
-  <tstamp>
-   <format property="thirty.days.ago" pattern="MM/dd/yyyy hh:mm aa" offset="-30" unit="day"/>
-  </tstamp>
-  <delete>
-   <fileset dir="${basedir}">
-    <include name="composer.phar" />
-    <date datetime="${thirty.days.ago}" when="before"/>
-   </fileset>
-  </delete>
+    <target name="clean" description="Cleanup build artifacts">
+        <delete dir="${basedir}/vendor"/>
+        <delete file="${basedir}/composer.lock"/>
+    </target>
 
-  <get src="https://getcomposer.org/composer.phar"; dest="${basedir}/composer.phar" skipexisting="true"/>
-
-  <exec executable="php">
-   <arg value="composer.phar"/>
-   <arg value="install"/>
-  </exec>
- </target>
-
- <target name="phpunit" description="Run unit tests with PHPUnit">
-  <exec executable="${basedir}/vendor/bin/phpunit" failonerror="true">
-   <arg value="--configuration"/>
-   <arg path="${basedir}/build/phpunit.xml"/>
-  </exec>
- </target>
+    <target name="composer" depends="clean" description="Install dependencies with Composer">
+        <exec executable="composer" taskname="composer">
+            <env key="COMPOSER_DISABLE_XDEBUG_WARN" value="1"/>
+            <arg value="update"/>
+            <arg value="--no-interaction"/>
+            <arg value="--no-progress"/>
+            <arg value="--no-ansi"/>
+            <arg value="--no-suggest"/>
+        </exec>
+    </target>
 </project>
+
diff --git a/vendor/phpunit/php-token-stream/build/phpunit.xml b/vendor/phpunit/php-token-stream/build/phpunit.xml
deleted file mode 100644
index 139586d2..00000000
--- a/vendor/phpunit/php-token-stream/build/phpunit.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<phpunit backupGlobals="false"
-         backupStaticAttributes="false"
-         bootstrap="../tests/bootstrap.php"
-         verbode="true">
-  <testsuites>
-    <testsuite name="php-token-stream">
-      <directory suffix="Test.php">../tests</directory>
-    </testsuite>
-  </testsuites>
-
-  <filter>
-    <whitelist addUncoveredFilesFromWhitelist="true">
-      <directory suffix=".php">../src</directory>
-    </whitelist>
-  </filter>
-</phpunit>
diff --git a/vendor/phpunit/php-token-stream/composer.json b/vendor/phpunit/php-token-stream/composer.json
index dfde7299..4bf07e70 100644
--- a/vendor/phpunit/php-token-stream/composer.json
+++ b/vendor/phpunit/php-token-stream/composer.json
@@ -15,11 +15,15 @@
         "issues": "https://github.com/sebastianbergmann/php-token-stream/issues";
     },
     "require": {
-        "php": ">=5.3.3",
+        "php": "^7.0",
         "ext-tokenizer": "*"
     },
     "require-dev": {
-        "phpunit/phpunit": "~4.2"
+        "phpunit/phpunit": "^6.2.4"
+    },
+    "config": {
+        "optimize-autoloader": true,
+        "sort-packages": true
     },
     "autoload": {
         "classmap": [
@@ -28,7 +32,7 @@
     },
     "extra": {
         "branch-alias": {
-            "dev-master": "1.4-dev"
+            "dev-master": "2.0-dev"
         }
     }
 }
diff --git a/vendor/phpunit/php-token-stream/phpunit.xml b/vendor/phpunit/php-token-stream/phpunit.xml
new file mode 100644
index 00000000..1f789ba2
--- /dev/null
+++ b/vendor/phpunit/php-token-stream/phpunit.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/6.0/phpunit.xsd";
+         bootstrap="tests/bootstrap.php"
+         beStrictAboutOutputDuringTests="true"
+         beStrictAboutTodoAnnotatedTests="true"
+         verbose="true">
+    <testsuite>
+        <directory suffix="Test.php">tests</directory>
+    </testsuite>
+
+    <filter>
+        <whitelist processUncoveredFilesFromWhitelist="true">
+            <directory suffix=".php">src</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/vendor/phpunit/php-token-stream/src/Token.php b/vendor/phpunit/php-token-stream/src/Token.php
index 2452e1c1..f4db9a78 100644
--- a/vendor/phpunit/php-token-stream/src/Token.php
+++ b/vendor/phpunit/php-token-stream/src/Token.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -10,12 +10,6 @@
 
 /**
  * A PHP token.
- *
- * @author    Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @copyright Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @link      http://github.com/sebastianbergmann/php-token-stream/tree
- * @since     Class available since Release 1.0.0
  */
 abstract class PHP_Token
 {
@@ -25,7 +19,7 @@ abstract class PHP_Token
     protected $text;
 
     /**
-     * @var integer
+     * @var int
      */
     protected $line;
 
@@ -35,17 +29,15 @@ abstract class PHP_Token
     protected $tokenStream;
 
     /**
-     * @var integer
+     * @var int
      */
     protected $id;
 
     /**
-     * Constructor.
-     *
      * @param string           $text
-     * @param integer          $line
+     * @param int              $line
      * @param PHP_Token_Stream $tokenStream
-     * @param integer          $id
+     * @param int              $id
      */
     public function __construct($text, $line, PHP_Token_Stream $tokenStream, $id)
     {
@@ -64,18 +56,26 @@ abstract class PHP_Token
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function getLine()
     {
         return $this->line;
     }
+
+    /**
+     * @return int
+     */
+    public function getId()
+    {
+        return $this->id;
+    }
 }
 
 abstract class PHP_TokenWithScope extends PHP_Token
 {
     /**
-     * @var integer
+     * @var int
      */
     protected $endTokenId;
 
@@ -120,12 +120,12 @@ abstract class PHP_TokenWithScope extends PHP_Token
                 break;
             }
 
-            return (string)$tokens[$i];
+            return (string) $tokens[$i];
         }
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function getEndTokenId()
     {
@@ -162,7 +162,7 @@ abstract class PHP_TokenWithScope extends PHP_Token
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function getEndLine()
     {
@@ -203,7 +203,7 @@ abstract class PHP_TokenWithScopeAndVisibility extends PHP_TokenWithScope
      */
     public function getKeywords()
     {
-        $keywords = array();
+        $keywords = [];
         $tokens   = $this->tokenStream->tokens();
 
         for ($i = $this->id - 2; $i > $this->id - 7; $i -= 2) {
@@ -268,8 +268,8 @@ abstract class PHP_Token_Includes extends PHP_Token
     {
         $tokens = $this->tokenStream->tokens();
 
-        if ($tokens[$this->id+2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) {
-            $this->name = trim($tokens[$this->id+2], "'\"");
+        if ($tokens[$this->id + 2] instanceof PHP_Token_CONSTANT_ENCAPSED_STRING) {
+            $this->name = trim($tokens[$this->id + 2], "'\"");
             $this->type = strtolower(
                 str_replace('PHP_Token_', '', get_class($tokens[$this->id]))
             );
@@ -277,7 +277,6 @@ abstract class PHP_Token_Includes extends PHP_Token
     }
 }
 
-
 class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
 {
     /**
@@ -286,7 +285,7 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
     protected $arguments;
 
     /**
-     * @var integer
+     * @var int
      */
     protected $ccn;
 
@@ -301,6 +300,11 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
     protected $signature;
 
     /**
+     * @var bool
+     */
+    private $anonymous = false;
+
+    /**
      * @return array
      */
     public function getArguments()
@@ -309,23 +313,23 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
             return $this->arguments;
         }
 
-        $this->arguments = array();
+        $this->arguments = [];
         $tokens          = $this->tokenStream->tokens();
         $typeDeclaration = null;
 
         // Search for first token inside brackets
         $i = $this->id + 2;
 
-        while (!$tokens[$i-1] instanceof PHP_Token_OPEN_BRACKET) {
+        while (!$tokens[$i - 1] instanceof PHP_Token_OPEN_BRACKET) {
             $i++;
         }
 
         while (!$tokens[$i] instanceof PHP_Token_CLOSE_BRACKET) {
             if ($tokens[$i] instanceof PHP_Token_STRING) {
-                $typeDeclaration = (string)$tokens[$i];
+                $typeDeclaration = (string) $tokens[$i];
             } elseif ($tokens[$i] instanceof PHP_Token_VARIABLE) {
-                $this->arguments[(string)$tokens[$i]] = $typeDeclaration;
-                $typeDeclaration                      = null;
+                $this->arguments[(string) $tokens[$i]] = $typeDeclaration;
+                $typeDeclaration                       = null;
             }
 
             $i++;
@@ -345,24 +349,35 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
 
         $tokens = $this->tokenStream->tokens();
 
-        for ($i = $this->id + 1; $i < count($tokens); $i++) {
-            if ($tokens[$i] instanceof PHP_Token_STRING) {
-                $this->name = (string)$tokens[$i];
-                break;
-            } elseif ($tokens[$i] instanceof PHP_Token_AMPERSAND &&
-                     $tokens[$i+1] instanceof PHP_Token_STRING) {
-                $this->name = (string)$tokens[$i+1];
-                break;
-            } elseif ($tokens[$i] instanceof PHP_Token_OPEN_BRACKET) {
-                $this->name = 'anonymous function';
-                break;
-            }
+        $i = $this->id + 1;
+
+        if ($tokens[$i] instanceof PHP_Token_WHITESPACE) {
+            $i++;
+        }
+
+        if ($tokens[$i] instanceof PHP_Token_AMPERSAND) {
+            $i++;
+        }
+
+        if ($tokens[$i + 1] instanceof PHP_Token_OPEN_BRACKET) {
+            $this->name = (string) $tokens[$i];
+        } elseif ($tokens[$i + 1] instanceof PHP_Token_WHITESPACE && $tokens[$i + 2] instanceof PHP_Token_OPEN_BRACKET) {
+            $this->name = (string) $tokens[$i];
+        } else {
+            $this->anonymous = true;
+
+            $this->name = sprintf(
+                'anonymousFunction:%s#%s',
+                $this->getLine(),
+                $this->getId()
+            );
         }
 
-        if ($this->name != 'anonymous function') {
+        if (!$this->isAnonymous()) {
             for ($i = $this->id; $i; --$i) {
                 if ($tokens[$i] instanceof PHP_Token_NAMESPACE) {
                     $this->name = $tokens[$i]->getName() . '\\' . $this->name;
+
                     break;
                 }
 
@@ -376,7 +391,7 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function getCCN()
     {
@@ -419,8 +434,8 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
             return $this->signature;
         }
 
-        if ($this->getName() == 'anonymous function') {
-            $this->signature = 'anonymous function';
+        if ($this->isAnonymous()) {
+            $this->signature = 'anonymousFunction';
             $i               = $this->id + 1;
         } else {
             $this->signature = '';
@@ -439,6 +454,14 @@ class PHP_Token_FUNCTION extends PHP_TokenWithScopeAndVisibility
 
         return $this->signature;
     }
+
+    /**
+     * @return bool
+     */
+    public function isAnonymous()
+    {
+        return $this->anonymous;
+    }
 }
 
 class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
@@ -453,11 +476,11 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
      */
     public function getName()
     {
-        return (string)$this->tokenStream[$this->id + 2];
+        return (string) $this->tokenStream[$this->id + 2];
     }
 
     /**
-     * @return boolean
+     * @return bool
      */
     public function hasParent()
     {
@@ -472,13 +495,13 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
         $className  = $this->getName();
         $docComment = $this->getDocblock();
 
-        $result = array(
+        $result = [
             'namespace'   => '',
             'fullPackage' => '',
             'category'    => '',
             'package'     => '',
             'subpackage'  => ''
-        );
+        ];
 
         for ($i = $this->id; $i; --$i) {
             if ($this->tokenStream[$i] instanceof PHP_Token_NAMESPACE) {
@@ -512,8 +535,9 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
     }
 
     /**
-     * @param  array  $parts
-     * @param  string $join
+     * @param array  $parts
+     * @param string $join
+     *
      * @return string
      */
     protected function arrayToName(array $parts, $join = '\\')
@@ -523,14 +547,14 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
         if (count($parts) > 1) {
             array_pop($parts);
 
-            $result = join($join, $parts);
+            $result = implode($join, $parts);
         }
 
         return $result;
     }
 
     /**
-     * @return boolean|string
+     * @return bool|string
      */
     public function getParent()
     {
@@ -540,18 +564,18 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
 
         $i         = $this->id + 6;
         $tokens    = $this->tokenStream->tokens();
-        $className = (string)$tokens[$i];
+        $className = (string) $tokens[$i];
 
-        while (isset($tokens[$i+1]) &&
-               !$tokens[$i+1] instanceof PHP_Token_WHITESPACE) {
-            $className .= (string)$tokens[++$i];
+        while (isset($tokens[$i + 1]) &&
+               !$tokens[$i + 1] instanceof PHP_Token_WHITESPACE) {
+            $className .= (string) $tokens[++$i];
         }
 
         return $className;
     }
 
     /**
-     * @return boolean
+     * @return bool
      */
     public function hasInterfaces()
     {
@@ -562,7 +586,7 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
     }
 
     /**
-     * @return array|boolean
+     * @return array|bool
      */
     public function getInterfaces()
     {
@@ -582,11 +606,11 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
 
         $tokens = $this->tokenStream->tokens();
 
-        while (!$tokens[$i+1] instanceof PHP_Token_OPEN_CURLY) {
+        while (!$tokens[$i + 1] instanceof PHP_Token_OPEN_CURLY) {
             $i++;
 
             if ($tokens[$i] instanceof PHP_Token_STRING) {
-                $this->interfaces[] = (string)$tokens[$i];
+                $this->interfaces[] = (string) $tokens[$i];
             }
         }
 
@@ -594,31 +618,95 @@ class PHP_Token_INTERFACE extends PHP_TokenWithScopeAndVisibility
     }
 }
 
-class PHP_Token_ABSTRACT extends PHP_Token {}
-class PHP_Token_AMPERSAND extends PHP_Token {}
-class PHP_Token_AND_EQUAL extends PHP_Token {}
-class PHP_Token_ARRAY extends PHP_Token {}
-class PHP_Token_ARRAY_CAST extends PHP_Token {}
-class PHP_Token_AS extends PHP_Token {}
-class PHP_Token_AT extends PHP_Token {}
-class PHP_Token_BACKTICK extends PHP_Token {}
-class PHP_Token_BAD_CHARACTER extends PHP_Token {}
-class PHP_Token_BOOLEAN_AND extends PHP_Token {}
-class PHP_Token_BOOLEAN_OR extends PHP_Token {}
-class PHP_Token_BOOL_CAST extends PHP_Token {}
-class PHP_Token_BREAK extends PHP_Token {}
-class PHP_Token_CARET extends PHP_Token {}
-class PHP_Token_CASE extends PHP_Token {}
-class PHP_Token_CATCH extends PHP_Token {}
-class PHP_Token_CHARACTER extends PHP_Token {}
+class PHP_Token_ABSTRACT extends PHP_Token
+{
+}
+
+class PHP_Token_AMPERSAND extends PHP_Token
+{
+}
+
+class PHP_Token_AND_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_ARRAY extends PHP_Token
+{
+}
+
+class PHP_Token_ARRAY_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_AS extends PHP_Token
+{
+}
+
+class PHP_Token_AT extends PHP_Token
+{
+}
+
+class PHP_Token_BACKTICK extends PHP_Token
+{
+}
+
+class PHP_Token_BAD_CHARACTER extends PHP_Token
+{
+}
+
+class PHP_Token_BOOLEAN_AND extends PHP_Token
+{
+}
+
+class PHP_Token_BOOLEAN_OR extends PHP_Token
+{
+}
+
+class PHP_Token_BOOL_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_BREAK extends PHP_Token
+{
+}
+
+class PHP_Token_CARET extends PHP_Token
+{
+}
+
+class PHP_Token_CASE extends PHP_Token
+{
+}
+
+class PHP_Token_CATCH extends PHP_Token
+{
+}
+
+class PHP_Token_CHARACTER extends PHP_Token
+{
+}
 
 class PHP_Token_CLASS extends PHP_Token_INTERFACE
 {
     /**
+     * @var bool
+     */
+    private $anonymous = false;
+
+    /**
+     * @var string
+     */
+    private $name;
+
+    /**
      * @return string
      */
     public function getName()
     {
+        if ($this->name !== null) {
+            return $this->name;
+        }
+
         $next = $this->tokenStream[$this->id + 1];
 
         if ($next instanceof PHP_Token_WHITESPACE) {
@@ -626,224 +714,747 @@ class PHP_Token_CLASS extends PHP_Token_INTERFACE
         }
 
         if ($next instanceof PHP_Token_STRING) {
-            return (string) $next;
+            $this->name =(string) $next;
+
+            return $this->name;
         }
 
         if ($next instanceof PHP_Token_OPEN_CURLY ||
             $next instanceof PHP_Token_EXTENDS ||
             $next instanceof PHP_Token_IMPLEMENTS) {
-            return 'anonymous class';
+
+            $this->name = sprintf(
+                'AnonymousClass:%s#%s',
+                $this->getLine(),
+                $this->getId()
+            );
+
+            $this->anonymous = true;
+
+            return $this->name;
         }
     }
+
+    public function isAnonymous()
+    {
+        return $this->anonymous;
+    }
 }
 
-class PHP_Token_CLASS_C extends PHP_Token {}
-class PHP_Token_CLASS_NAME_CONSTANT extends PHP_Token {}
-class PHP_Token_CLONE extends PHP_Token {}
-class PHP_Token_CLOSE_BRACKET extends PHP_Token {}
-class PHP_Token_CLOSE_CURLY extends PHP_Token {}
-class PHP_Token_CLOSE_SQUARE extends PHP_Token {}
-class PHP_Token_CLOSE_TAG extends PHP_Token {}
-class PHP_Token_COLON extends PHP_Token {}
-class PHP_Token_COMMA extends PHP_Token {}
-class PHP_Token_COMMENT extends PHP_Token {}
-class PHP_Token_CONCAT_EQUAL extends PHP_Token {}
-class PHP_Token_CONST extends PHP_Token {}
-class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token {}
-class PHP_Token_CONTINUE extends PHP_Token {}
-class PHP_Token_CURLY_OPEN extends PHP_Token {}
-class PHP_Token_DEC extends PHP_Token {}
-class PHP_Token_DECLARE extends PHP_Token {}
-class PHP_Token_DEFAULT extends PHP_Token {}
-class PHP_Token_DIV extends PHP_Token {}
-class PHP_Token_DIV_EQUAL extends PHP_Token {}
-class PHP_Token_DNUMBER extends PHP_Token {}
-class PHP_Token_DO extends PHP_Token {}
-class PHP_Token_DOC_COMMENT extends PHP_Token {}
-class PHP_Token_DOLLAR extends PHP_Token {}
-class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token {}
-class PHP_Token_DOT extends PHP_Token {}
-class PHP_Token_DOUBLE_ARROW extends PHP_Token {}
-class PHP_Token_DOUBLE_CAST extends PHP_Token {}
-class PHP_Token_DOUBLE_COLON extends PHP_Token {}
-class PHP_Token_DOUBLE_QUOTES extends PHP_Token {}
-class PHP_Token_ECHO extends PHP_Token {}
-class PHP_Token_ELSE extends PHP_Token {}
-class PHP_Token_ELSEIF extends PHP_Token {}
-class PHP_Token_EMPTY extends PHP_Token {}
-class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token {}
-class PHP_Token_ENDDECLARE extends PHP_Token {}
-class PHP_Token_ENDFOR extends PHP_Token {}
-class PHP_Token_ENDFOREACH extends PHP_Token {}
-class PHP_Token_ENDIF extends PHP_Token {}
-class PHP_Token_ENDSWITCH extends PHP_Token {}
-class PHP_Token_ENDWHILE extends PHP_Token {}
-class PHP_Token_END_HEREDOC extends PHP_Token {}
-class PHP_Token_EQUAL extends PHP_Token {}
-class PHP_Token_EVAL extends PHP_Token {}
-class PHP_Token_EXCLAMATION_MARK extends PHP_Token {}
-class PHP_Token_EXIT extends PHP_Token {}
-class PHP_Token_EXTENDS extends PHP_Token {}
-class PHP_Token_FILE extends PHP_Token {}
-class PHP_Token_FINAL extends PHP_Token {}
-class PHP_Token_FOR extends PHP_Token {}
-class PHP_Token_FOREACH extends PHP_Token {}
-class PHP_Token_FUNC_C extends PHP_Token {}
-class PHP_Token_GLOBAL extends PHP_Token {}
-class PHP_Token_GT extends PHP_Token {}
-class PHP_Token_IF extends PHP_Token {}
-class PHP_Token_IMPLEMENTS extends PHP_Token {}
-class PHP_Token_INC extends PHP_Token {}
-class PHP_Token_INCLUDE extends PHP_Token_Includes {}
-class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes {}
-class PHP_Token_INLINE_HTML extends PHP_Token {}
-class PHP_Token_INSTANCEOF extends PHP_Token {}
-class PHP_Token_INT_CAST extends PHP_Token {}
-class PHP_Token_ISSET extends PHP_Token {}
-class PHP_Token_IS_EQUAL extends PHP_Token {}
-class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token {}
-class PHP_Token_IS_IDENTICAL extends PHP_Token {}
-class PHP_Token_IS_NOT_EQUAL extends PHP_Token {}
-class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token {}
-class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token {}
-class PHP_Token_LINE extends PHP_Token {}
-class PHP_Token_LIST extends PHP_Token {}
-class PHP_Token_LNUMBER extends PHP_Token {}
-class PHP_Token_LOGICAL_AND extends PHP_Token {}
-class PHP_Token_LOGICAL_OR extends PHP_Token {}
-class PHP_Token_LOGICAL_XOR extends PHP_Token {}
-class PHP_Token_LT extends PHP_Token {}
-class PHP_Token_METHOD_C extends PHP_Token {}
-class PHP_Token_MINUS extends PHP_Token {}
-class PHP_Token_MINUS_EQUAL extends PHP_Token {}
-class PHP_Token_MOD_EQUAL extends PHP_Token {}
-class PHP_Token_MULT extends PHP_Token {}
-class PHP_Token_MUL_EQUAL extends PHP_Token {}
-class PHP_Token_NEW extends PHP_Token {}
-class PHP_Token_NUM_STRING extends PHP_Token {}
-class PHP_Token_OBJECT_CAST extends PHP_Token {}
-class PHP_Token_OBJECT_OPERATOR extends PHP_Token {}
-class PHP_Token_OPEN_BRACKET extends PHP_Token {}
-class PHP_Token_OPEN_CURLY extends PHP_Token {}
-class PHP_Token_OPEN_SQUARE extends PHP_Token {}
-class PHP_Token_OPEN_TAG extends PHP_Token {}
-class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token {}
-class PHP_Token_OR_EQUAL extends PHP_Token {}
-class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token {}
-class PHP_Token_PERCENT extends PHP_Token {}
-class PHP_Token_PIPE extends PHP_Token {}
-class PHP_Token_PLUS extends PHP_Token {}
-class PHP_Token_PLUS_EQUAL extends PHP_Token {}
-class PHP_Token_PRINT extends PHP_Token {}
-class PHP_Token_PRIVATE extends PHP_Token {}
-class PHP_Token_PROTECTED extends PHP_Token {}
-class PHP_Token_PUBLIC extends PHP_Token {}
-class PHP_Token_QUESTION_MARK extends PHP_Token {}
-class PHP_Token_REQUIRE extends PHP_Token_Includes {}
-class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes {}
-class PHP_Token_RETURN extends PHP_Token {}
-class PHP_Token_SEMICOLON extends PHP_Token {}
-class PHP_Token_SL extends PHP_Token {}
-class PHP_Token_SL_EQUAL extends PHP_Token {}
-class PHP_Token_SR extends PHP_Token {}
-class PHP_Token_SR_EQUAL extends PHP_Token {}
-class PHP_Token_START_HEREDOC extends PHP_Token {}
-class PHP_Token_STATIC extends PHP_Token {}
-class PHP_Token_STRING extends PHP_Token {}
-class PHP_Token_STRING_CAST extends PHP_Token {}
-class PHP_Token_STRING_VARNAME extends PHP_Token {}
-class PHP_Token_SWITCH extends PHP_Token {}
-class PHP_Token_THROW extends PHP_Token {}
-class PHP_Token_TILDE extends PHP_Token {}
-class PHP_Token_TRY extends PHP_Token {}
-class PHP_Token_UNSET extends PHP_Token {}
-class PHP_Token_UNSET_CAST extends PHP_Token {}
-class PHP_Token_USE extends PHP_Token {}
-class PHP_Token_USE_FUNCTION extends PHP_Token {}
-class PHP_Token_VAR extends PHP_Token {}
-class PHP_Token_VARIABLE extends PHP_Token {}
-class PHP_Token_WHILE extends PHP_Token {}
-class PHP_Token_WHITESPACE extends PHP_Token {}
-class PHP_Token_XOR_EQUAL extends PHP_Token {}
+class PHP_Token_CLASS_C extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.1
-class PHP_Token_HALT_COMPILER extends PHP_Token {}
+class PHP_Token_CLASS_NAME_CONSTANT extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.3
-class PHP_Token_DIR extends PHP_Token {}
-class PHP_Token_GOTO extends PHP_Token {}
+class PHP_Token_CLONE extends PHP_Token
+{
+}
 
-class PHP_Token_NAMESPACE extends PHP_TokenWithScope
+class PHP_Token_CLOSE_BRACKET extends PHP_Token
 {
-    /**
-     * @return string
-     */
-    public function getName()
-    {
-        $tokens    = $this->tokenStream->tokens();
-        $namespace = (string)$tokens[$this->id+2];
+}
 
-        for ($i = $this->id + 3;; $i += 2) {
-            if (isset($tokens[$i]) &&
-                $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) {
-                $namespace .= '\\' . $tokens[$i+1];
-            } else {
-                break;
-            }
-        }
+class PHP_Token_CLOSE_CURLY extends PHP_Token
+{
+}
 
-        return $namespace;
-    }
+class PHP_Token_CLOSE_SQUARE extends PHP_Token
+{
 }
 
-class PHP_Token_NS_C extends PHP_Token {}
-class PHP_Token_NS_SEPARATOR extends PHP_Token {}
+class PHP_Token_CLOSE_TAG extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.4
-class PHP_Token_CALLABLE extends PHP_Token {}
-class PHP_Token_INSTEADOF extends PHP_Token {}
-class PHP_Token_TRAIT extends PHP_Token_INTERFACE {}
-class PHP_Token_TRAIT_C extends PHP_Token {}
+class PHP_Token_COLON extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.5
-class PHP_Token_FINALLY extends PHP_Token {}
-class PHP_Token_YIELD extends PHP_Token {}
+class PHP_Token_COMMA extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 5.6
-class PHP_Token_ELLIPSIS extends PHP_Token {}
-class PHP_Token_POW extends PHP_Token {}
-class PHP_Token_POW_EQUAL extends PHP_Token {}
+class PHP_Token_COMMENT extends PHP_Token
+{
+}
 
-// Tokens introduced in PHP 7.0
-class PHP_Token_COALESCE extends PHP_Token {}
-class PHP_Token_SPACESHIP extends PHP_Token {}
-class PHP_Token_YIELD_FROM extends PHP_Token {}
+class PHP_Token_CONCAT_EQUAL extends PHP_Token
+{
+}
 
-// Tokens introduced in HackLang / HHVM
-class PHP_Token_ASYNC extends PHP_Token {}
-class PHP_Token_AWAIT extends PHP_Token {}
-class PHP_Token_COMPILER_HALT_OFFSET extends PHP_Token {}
-class PHP_Token_ENUM extends PHP_Token {}
-class PHP_Token_EQUALS extends PHP_Token {}
-class PHP_Token_IN extends PHP_Token {}
-class PHP_Token_JOIN extends PHP_Token {}
-class PHP_Token_LAMBDA_ARROW extends PHP_Token {}
-class PHP_Token_LAMBDA_CP extends PHP_Token {}
-class PHP_Token_LAMBDA_OP extends PHP_Token {}
-class PHP_Token_ONUMBER extends PHP_Token {}
-class PHP_Token_NULLSAFE_OBJECT_OPERATOR extends PHP_Token {}
-class PHP_Token_SHAPE extends PHP_Token {}
-class PHP_Token_SUPER extends PHP_Token {}
-class PHP_Token_TYPE extends PHP_Token {}
-class PHP_Token_TYPELIST_GT extends PHP_Token {}
-class PHP_Token_TYPELIST_LT extends PHP_Token {}
-class PHP_Token_WHERE extends PHP_Token {}
-class PHP_Token_XHP_ATTRIBUTE extends PHP_Token {}
-class PHP_Token_XHP_CATEGORY extends PHP_Token {}
-class PHP_Token_XHP_CATEGORY_LABEL extends PHP_Token {}
-class PHP_Token_XHP_CHILDREN extends PHP_Token {}
-class PHP_Token_XHP_LABEL extends PHP_Token {}
-class PHP_Token_XHP_REQUIRED extends PHP_Token {}
-class PHP_Token_XHP_TAG_GT extends PHP_Token {}
-class PHP_Token_XHP_TAG_LT extends PHP_Token {}
-class PHP_Token_XHP_TEXT extends PHP_Token {}
+class PHP_Token_CONST extends PHP_Token
+{
+}
+
+class PHP_Token_CONSTANT_ENCAPSED_STRING extends PHP_Token
+{
+}
+
+class PHP_Token_CONTINUE extends PHP_Token
+{
+}
+
+class PHP_Token_CURLY_OPEN extends PHP_Token
+{
+}
+
+class PHP_Token_DEC extends PHP_Token
+{
+}
+
+class PHP_Token_DECLARE extends PHP_Token
+{
+}
+
+class PHP_Token_DEFAULT extends PHP_Token
+{
+}
+
+class PHP_Token_DIV extends PHP_Token
+{
+}
+
+class PHP_Token_DIV_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_DNUMBER extends PHP_Token
+{
+}
+
+class PHP_Token_DO extends PHP_Token
+{
+}
+
+class PHP_Token_DOC_COMMENT extends PHP_Token
+{
+}
+
+class PHP_Token_DOLLAR extends PHP_Token
+{
+}
+
+class PHP_Token_DOLLAR_OPEN_CURLY_BRACES extends PHP_Token
+{
+}
+
+class PHP_Token_DOT extends PHP_Token
+{
+}
+
+class PHP_Token_DOUBLE_ARROW extends PHP_Token
+{
+}
+
+class PHP_Token_DOUBLE_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_DOUBLE_COLON extends PHP_Token
+{
+}
+
+class PHP_Token_DOUBLE_QUOTES extends PHP_Token
+{
+}
+
+class PHP_Token_ECHO extends PHP_Token
+{
+}
+
+class PHP_Token_ELSE extends PHP_Token
+{
+}
+
+class PHP_Token_ELSEIF extends PHP_Token
+{
+}
+
+class PHP_Token_EMPTY extends PHP_Token
+{
+}
+
+class PHP_Token_ENCAPSED_AND_WHITESPACE extends PHP_Token
+{
+}
+
+class PHP_Token_ENDDECLARE extends PHP_Token
+{
+}
+
+class PHP_Token_ENDFOR extends PHP_Token
+{
+}
+
+class PHP_Token_ENDFOREACH extends PHP_Token
+{
+}
+
+class PHP_Token_ENDIF extends PHP_Token
+{
+}
+
+class PHP_Token_ENDSWITCH extends PHP_Token
+{
+}
+
+class PHP_Token_ENDWHILE extends PHP_Token
+{
+}
+
+class PHP_Token_END_HEREDOC extends PHP_Token
+{
+}
+
+class PHP_Token_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_EVAL extends PHP_Token
+{
+}
+
+class PHP_Token_EXCLAMATION_MARK extends PHP_Token
+{
+}
+
+class PHP_Token_EXIT extends PHP_Token
+{
+}
+
+class PHP_Token_EXTENDS extends PHP_Token
+{
+}
+
+class PHP_Token_FILE extends PHP_Token
+{
+}
+
+class PHP_Token_FINAL extends PHP_Token
+{
+}
+
+class PHP_Token_FOR extends PHP_Token
+{
+}
+
+class PHP_Token_FOREACH extends PHP_Token
+{
+}
+
+class PHP_Token_FUNC_C extends PHP_Token
+{
+}
+
+class PHP_Token_GLOBAL extends PHP_Token
+{
+}
+
+class PHP_Token_GT extends PHP_Token
+{
+}
+
+class PHP_Token_IF extends PHP_Token
+{
+}
+
+class PHP_Token_IMPLEMENTS extends PHP_Token
+{
+}
+
+class PHP_Token_INC extends PHP_Token
+{
+}
+
+class PHP_Token_INCLUDE extends PHP_Token_Includes
+{
+}
+
+class PHP_Token_INCLUDE_ONCE extends PHP_Token_Includes
+{
+}
+
+class PHP_Token_INLINE_HTML extends PHP_Token
+{
+}
+
+class PHP_Token_INSTANCEOF extends PHP_Token
+{
+}
+
+class PHP_Token_INT_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_ISSET extends PHP_Token
+{
+}
+
+class PHP_Token_IS_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_GREATER_OR_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_IDENTICAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_NOT_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_NOT_IDENTICAL extends PHP_Token
+{
+}
+
+class PHP_Token_IS_SMALLER_OR_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_LINE extends PHP_Token
+{
+}
+
+class PHP_Token_LIST extends PHP_Token
+{
+}
+
+class PHP_Token_LNUMBER extends PHP_Token
+{
+}
+
+class PHP_Token_LOGICAL_AND extends PHP_Token
+{
+}
+
+class PHP_Token_LOGICAL_OR extends PHP_Token
+{
+}
+
+class PHP_Token_LOGICAL_XOR extends PHP_Token
+{
+}
+
+class PHP_Token_LT extends PHP_Token
+{
+}
+
+class PHP_Token_METHOD_C extends PHP_Token
+{
+}
+
+class PHP_Token_MINUS extends PHP_Token
+{
+}
+
+class PHP_Token_MINUS_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_MOD_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_MULT extends PHP_Token
+{
+}
+
+class PHP_Token_MUL_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_NEW extends PHP_Token
+{
+}
+
+class PHP_Token_NUM_STRING extends PHP_Token
+{
+}
+
+class PHP_Token_OBJECT_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_OBJECT_OPERATOR extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_BRACKET extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_CURLY extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_SQUARE extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_TAG extends PHP_Token
+{
+}
+
+class PHP_Token_OPEN_TAG_WITH_ECHO extends PHP_Token
+{
+}
+
+class PHP_Token_OR_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_PAAMAYIM_NEKUDOTAYIM extends PHP_Token
+{
+}
+
+class PHP_Token_PERCENT extends PHP_Token
+{
+}
+
+class PHP_Token_PIPE extends PHP_Token
+{
+}
+
+class PHP_Token_PLUS extends PHP_Token
+{
+}
+
+class PHP_Token_PLUS_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_PRINT extends PHP_Token
+{
+}
+
+class PHP_Token_PRIVATE extends PHP_Token
+{
+}
+
+class PHP_Token_PROTECTED extends PHP_Token
+{
+}
+
+class PHP_Token_PUBLIC extends PHP_Token
+{
+}
+
+class PHP_Token_QUESTION_MARK extends PHP_Token
+{
+}
+
+class PHP_Token_REQUIRE extends PHP_Token_Includes
+{
+}
+
+class PHP_Token_REQUIRE_ONCE extends PHP_Token_Includes
+{
+}
+
+class PHP_Token_RETURN extends PHP_Token
+{
+}
+
+class PHP_Token_SEMICOLON extends PHP_Token
+{
+}
+
+class PHP_Token_SL extends PHP_Token
+{
+}
+
+class PHP_Token_SL_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_SR extends PHP_Token
+{
+}
+
+class PHP_Token_SR_EQUAL extends PHP_Token
+{
+}
+
+class PHP_Token_START_HEREDOC extends PHP_Token
+{
+}
+
+class PHP_Token_STATIC extends PHP_Token
+{
+}
+
+class PHP_Token_STRING extends PHP_Token
+{
+}
+
+class PHP_Token_STRING_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_STRING_VARNAME extends PHP_Token
+{
+}
+
+class PHP_Token_SWITCH extends PHP_Token
+{
+}
+
+class PHP_Token_THROW extends PHP_Token
+{
+}
+
+class PHP_Token_TILDE extends PHP_Token
+{
+}
+
+class PHP_Token_TRY extends PHP_Token
+{
+}
+
+class PHP_Token_UNSET extends PHP_Token
+{
+}
+
+class PHP_Token_UNSET_CAST extends PHP_Token
+{
+}
+
+class PHP_Token_USE extends PHP_Token
+{
+}
+
+class PHP_Token_USE_FUNCTION extends PHP_Token
+{
+}
+
+class PHP_Token_VAR extends PHP_Token
+{
+}
+
+class PHP_Token_VARIABLE extends PHP_Token
+{
+}
+
+class PHP_Token_WHILE extends PHP_Token
+{
+}
+
+class PHP_Token_WHITESPACE extends PHP_Token
+{
+}
+
+class PHP_Token_XOR_EQUAL extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.1
+class PHP_Token_HALT_COMPILER extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.3
+class PHP_Token_DIR extends PHP_Token
+{
+}
+
+class PHP_Token_GOTO extends PHP_Token
+{
+}
+
+class PHP_Token_NAMESPACE extends PHP_TokenWithScope
+{
+    /**
+     * @return string
+     */
+    public function getName()
+    {
+        $tokens    = $this->tokenStream->tokens();
+        $namespace = (string) $tokens[$this->id + 2];
+
+        for ($i = $this->id + 3;; $i += 2) {
+            if (isset($tokens[$i]) &&
+                $tokens[$i] instanceof PHP_Token_NS_SEPARATOR) {
+                $namespace .= '\\' . $tokens[$i + 1];
+            } else {
+                break;
+            }
+        }
+
+        return $namespace;
+    }
+}
+
+class PHP_Token_NS_C extends PHP_Token
+{
+}
+
+class PHP_Token_NS_SEPARATOR extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.4
+class PHP_Token_CALLABLE extends PHP_Token
+{
+}
+
+class PHP_Token_INSTEADOF extends PHP_Token
+{
+}
+
+class PHP_Token_TRAIT extends PHP_Token_INTERFACE
+{
+}
+
+class PHP_Token_TRAIT_C extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.5
+class PHP_Token_FINALLY extends PHP_Token
+{
+}
+
+class PHP_Token_YIELD extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 5.6
+class PHP_Token_ELLIPSIS extends PHP_Token
+{
+}
+
+class PHP_Token_POW extends PHP_Token
+{
+}
+
+class PHP_Token_POW_EQUAL extends PHP_Token
+{
+}
+
+// Tokens introduced in PHP 7.0
+class PHP_Token_COALESCE extends PHP_Token
+{
+}
+
+class PHP_Token_SPACESHIP extends PHP_Token
+{
+}
+
+class PHP_Token_YIELD_FROM extends PHP_Token
+{
+}
+
+// Tokens introduced in HackLang / HHVM
+class PHP_Token_ASYNC extends PHP_Token
+{
+}
+
+class PHP_Token_AWAIT extends PHP_Token
+{
+}
+
+class PHP_Token_COMPILER_HALT_OFFSET extends PHP_Token
+{
+}
+
+class PHP_Token_ENUM extends PHP_Token
+{
+}
+
+class PHP_Token_EQUALS extends PHP_Token
+{
+}
+
+class PHP_Token_IN extends PHP_Token
+{
+}
+
+class PHP_Token_JOIN extends PHP_Token
+{
+}
+
+class PHP_Token_LAMBDA_ARROW extends PHP_Token
+{
+}
+
+class PHP_Token_LAMBDA_CP extends PHP_Token
+{
+}
+
+class PHP_Token_LAMBDA_OP extends PHP_Token
+{
+}
+
+class PHP_Token_ONUMBER extends PHP_Token
+{
+}
+
+class PHP_Token_NULLSAFE_OBJECT_OPERATOR extends PHP_Token
+{
+}
+
+class PHP_Token_SHAPE extends PHP_Token
+{
+}
+
+class PHP_Token_SUPER extends PHP_Token
+{
+}
+
+class PHP_Token_TYPE extends PHP_Token
+{
+}
+
+class PHP_Token_TYPELIST_GT extends PHP_Token
+{
+}
+
+class PHP_Token_TYPELIST_LT extends PHP_Token
+{
+}
+
+class PHP_Token_WHERE extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_ATTRIBUTE extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_CATEGORY extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_CATEGORY_LABEL extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_CHILDREN extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_LABEL extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_REQUIRED extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_TAG_GT extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_TAG_LT extends PHP_Token
+{
+}
+
+class PHP_Token_XHP_TEXT extends PHP_Token
+{
+}
diff --git a/vendor/phpunit/php-token-stream/src/Token/Stream.php b/vendor/phpunit/php-token-stream/src/Token/Stream.php
index aff7e3d4..fc3e3c37 100644
--- a/vendor/phpunit/php-token-stream/src/Token/Stream.php
+++ b/vendor/phpunit/php-token-stream/src/Token/Stream.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -10,19 +10,13 @@
 
 /**
  * A stream of PHP tokens.
- *
- * @author    Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @copyright Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @link      http://github.com/sebastianbergmann/php-token-stream/tree
- * @since     Class available since Release 1.0.0
  */
 class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 {
     /**
      * @var array
      */
-    protected static $customTokens = array(
+    protected static $customTokens = [
         '(' => 'PHP_Token_OPEN_BRACKET',
         ')' => 'PHP_Token_CLOSE_BRACKET',
         '[' => 'PHP_Token_OPEN_SQUARE',
@@ -51,7 +45,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
         '^' => 'PHP_Token_CARET',
         '~' => 'PHP_Token_TILDE',
         '`' => 'PHP_Token_BACKTICK'
-    );
+    ];
 
     /**
      * @var string
@@ -61,17 +55,17 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     /**
      * @var array
      */
-    protected $tokens = array();
+    protected $tokens = [];
 
     /**
-     * @var integer
+     * @var int
      */
     protected $position = 0;
 
     /**
      * @var array
      */
-    protected $linesOfCode = array('loc' => 0, 'cloc' => 0, 'ncloc' => 0);
+    protected $linesOfCode = ['loc' => 0, 'cloc' => 0, 'ncloc' => 0];
 
     /**
      * @var array
@@ -101,7 +95,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     /**
      * @var array
      */
-    protected $lineToFunctionMap = array();
+    protected $lineToFunctionMap = [];
 
     /**
      * Constructor.
@@ -123,7 +117,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
      */
     public function __destruct()
     {
-        $this->tokens = array();
+        $this->tokens = [];
     }
 
     /**
@@ -142,7 +136,6 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
     /**
      * @return string
-     * @since  Method available since Release 1.1.0
      */
     public function getFilename()
     {
@@ -174,8 +167,9 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
                 if ($lastNonWhitespaceTokenWasDoubleColon && $name == 'CLASS') {
                     $name = 'CLASS_NAME_CONSTANT';
-                } elseif ($name == 'USE' && isset($tokens[$i+2][0]) && $tokens[$i+2][0] == T_FUNCTION) {
+                } elseif ($name == 'USE' && isset($tokens[$i + 2][0]) && $tokens[$i + 2][0] == T_FUNCTION) {
                     $name = 'USE_FUNCTION';
+                    $text .= $tokens[$i + 1][1] . $tokens[$i + 2][1];
                     $skip = 2;
                 }
 
@@ -187,7 +181,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
             $this->tokens[] = new $tokenClass($text, $line, $this, $id++);
             $lines          = substr_count($text, "\n");
-            $line          += $lines;
+            $line += $lines;
 
             if ($tokenClass == 'PHP_Token_HALT_COMPILER') {
                 break;
@@ -211,7 +205,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function count()
     {
@@ -270,7 +264,6 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
     /**
      * @return array
-     * @since  Method available since Release 1.1.0
      */
     public function getTraits()
     {
@@ -295,19 +288,19 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
      *
      * @param bool   $categorize OPTIONAL
      * @param string $category   OPTIONAL Either 'require_once', 'require',
-     *                                           'include_once', 'include'.
+     *                           'include_once', 'include'.
+     *
      * @return array
-     * @since  Method available since Release 1.1.0
      */
     public function getIncludes($categorize = false, $category = null)
     {
         if ($this->includes === null) {
-            $this->includes = array(
-              'require_once' => array(),
-              'require'      => array(),
-              'include_once' => array(),
-              'include'      => array()
-            );
+            $this->includes = [
+              'require_once' => [],
+              'require'      => [],
+              'include_once' => [],
+              'include'      => []
+            ];
 
             foreach ($this->tokens as $token) {
                 switch (get_class($token)) {
@@ -341,7 +334,6 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
      * Returns the name of the function or method a line belongs to.
      *
      * @return string or null if the line is not in a function or method
-     * @since  Method available since Release 1.2.0
      */
     public function getFunctionForLine($line)
     {
@@ -354,12 +346,12 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
     protected function parse()
     {
-        $this->interfaces = array();
-        $this->classes    = array();
-        $this->traits     = array();
-        $this->functions  = array();
-        $class            = array();
-        $classEndLine     = array();
+        $this->interfaces = [];
+        $this->classes    = [];
+        $this->traits     = [];
+        $this->functions  = [];
+        $class            = [];
+        $classEndLine     = [];
         $trait            = false;
         $traitEndLine     = false;
         $interface        = false;
@@ -374,8 +366,8 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                     $interface        = $token->getName();
                     $interfaceEndLine = $token->getEndLine();
 
-                    $this->interfaces[$interface] = array(
-                      'methods'   => array(),
+                    $this->interfaces[$interface] = [
+                      'methods'   => [],
                       'parent'    => $token->getParent(),
                       'keywords'  => $token->getKeywords(),
                       'docblock'  => $token->getDocblock(),
@@ -383,13 +375,13 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                       'endLine'   => $interfaceEndLine,
                       'package'   => $token->getPackage(),
                       'file'      => $this->filename
-                    );
+                    ];
                     break;
 
                 case 'PHP_Token_CLASS':
                 case 'PHP_Token_TRAIT':
-                    $tmp = array(
-                      'methods'   => array(),
+                    $tmp = [
+                      'methods'   => [],
                       'parent'    => $token->getParent(),
                       'interfaces'=> $token->getInterfaces(),
                       'keywords'  => $token->getKeywords(),
@@ -398,15 +390,13 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                       'endLine'   => $token->getEndLine(),
                       'package'   => $token->getPackage(),
                       'file'      => $this->filename
-                    );
+                    ];
 
                     if ($token instanceof PHP_Token_CLASS) {
                         $class[]        = $token->getName();
                         $classEndLine[] = $token->getEndLine();
 
-                        if ($class[count($class)-1] != 'anonymous class') {
-                            $this->classes[$class[count($class)-1]] = $tmp;
-                        }
+                        $this->classes[$class[count($class) - 1]] = $tmp;
                     } else {
                         $trait                = $token->getName();
                         $traitEndLine         = $token->getEndLine();
@@ -416,7 +406,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
                 case 'PHP_Token_FUNCTION':
                     $name = $token->getName();
-                    $tmp  = array(
+                    $tmp  = [
                       'docblock'  => $token->getDocblock(),
                       'keywords'  => $token->getKeywords(),
                       'visibility'=> $token->getVisibility(),
@@ -425,7 +415,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                       'endLine'   => $token->getEndLine(),
                       'ccn'       => $token->getCCN(),
                       'file'      => $this->filename
-                    );
+                    ];
 
                     if (empty($class) &&
                         $trait === false &&
@@ -437,11 +427,11 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
                             $tmp['startLine'],
                             $tmp['endLine']
                         );
-                    } elseif (!empty($class) && $class[count($class)-1] != 'anonymous class') {
-                        $this->classes[$class[count($class)-1]]['methods'][$name] = $tmp;
+                    } elseif (!empty($class)) {
+                        $this->classes[$class[count($class) - 1]]['methods'][$name] = $tmp;
 
                         $this->addFunctionToMap(
-                            $class[count($class)-1] . '::' . $name,
+                            $class[count($class) - 1] . '::' . $name,
                             $tmp['startLine'],
                             $tmp['endLine']
                         );
@@ -460,7 +450,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
 
                 case 'PHP_Token_CLOSE_CURLY':
                     if (!empty($classEndLine) &&
-                        $classEndLine[count($classEndLine)-1] == $token->getLine()) {
+                        $classEndLine[count($classEndLine) - 1] == $token->getLine()) {
                         array_pop($classEndLine);
                         array_pop($class);
                     } elseif ($traitEndLine !== false &&
@@ -493,7 +483,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @return boolean
+     * @return bool
      */
     public function valid()
     {
@@ -501,7 +491,7 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @return integer
+     * @return int
      */
     public function key()
     {
@@ -524,8 +514,9 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param  integer $offset
-     * @return boolean
+     * @param int $offset
+     *
+     * @return bool
      */
     public function offsetExists($offset)
     {
@@ -533,8 +524,10 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param  integer $offset
+     * @param int $offset
+     *
      * @return mixed
+     *
      * @throws OutOfBoundsException
      */
     public function offsetGet($offset)
@@ -552,8 +545,8 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param integer $offset
-     * @param mixed   $value
+     * @param int   $offset
+     * @param mixed $value
      */
     public function offsetSet($offset, $value)
     {
@@ -561,7 +554,8 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param  integer $offset
+     * @param int $offset
+     *
      * @throws OutOfBoundsException
      */
     public function offsetUnset($offset)
@@ -581,7 +575,8 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     /**
      * Seek to an absolute position.
      *
-     * @param  integer $position
+     * @param int $position
+     *
      * @throws OutOfBoundsException
      */
     public function seek($position)
@@ -599,9 +594,9 @@ class PHP_Token_Stream implements ArrayAccess, Countable, SeekableIterator
     }
 
     /**
-     * @param string  $name
-     * @param integer $startLine
-     * @param integer $endLine
+     * @param string $name
+     * @param int    $startLine
+     * @param int    $endLine
      */
     private function addFunctionToMap($name, $startLine, $endLine)
     {
diff --git a/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php b/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php
index b41b25f6..9d693938 100644
--- a/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php
+++ b/vendor/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -10,22 +10,17 @@
 
 /**
  * A caching factory for token stream objects.
- *
- * @author    Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @copyright Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license   http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @link      http://github.com/sebastianbergmann/php-token-stream/tree
- * @since     Class available since Release 1.0.0
  */
 class PHP_Token_Stream_CachingFactory
 {
     /**
      * @var array
      */
-    protected static $cache = array();
+    protected static $cache = [];
 
     /**
-     * @param  string $filename
+     * @param string $filename
+     *
      * @return PHP_Token_Stream
      */
     public static function get($filename)
@@ -45,7 +40,7 @@ class PHP_Token_Stream_CachingFactory
         if (is_string($filename)) {
             unset(self::$cache[$filename]);
         } else {
-            self::$cache = array();
+            self::$cache = [];
         }
     }
 }
diff --git a/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php b/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php
index d1b25d83..265a6569 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/ClassTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -8,22 +8,19 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_CLASS class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Laurent Laville <pear@xxxxxxxxxxxxxxxxxxx>
- * @copyright  Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.2
- */
-class PHP_Token_ClassTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_ClassTest extends TestCase
 {
-    protected $class;
-    protected $function;
+    /**
+     * @var PHP_Token_CLASS
+     */
+    private $class;
+
+    /**
+     * @var PHP_Token_FUNCTION
+     */
+    private $function;
 
     protected function setUp()
     {
@@ -82,21 +79,27 @@ class PHP_Token_ClassTest extends PHPUnit_Framework_TestCase
         $this->assertCount(1, $ts->getClasses());
     }
 
-    /**
-     * @requires PHP 7
-     */
     public function testAnonymousClassesAreHandledCorrectly()
     {
         $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_method_that_declares_anonymous_class.php');
 
         $classes = $ts->getClasses();
 
-        $this->assertEquals(array('class_with_method_that_declares_anonymous_class'), array_keys($classes));
+        $this->assertEquals(
+            [
+                'class_with_method_that_declares_anonymous_class',
+                'AnonymousClass:9#31',
+                'AnonymousClass:10#55',
+                'AnonymousClass:11#75',
+                'AnonymousClass:12#91',
+                'AnonymousClass:13#107'
+            ],
+            array_keys($classes)
+        );
     }
 
     /**
-     * @requires PHP 7
-     * @ticket   https://github.com/sebastianbergmann/php-token-stream/issues/52
+     * @ticket https://github.com/sebastianbergmann/php-token-stream/issues/52
      */
     public function testAnonymousClassesAreHandledCorrectly2()
     {
@@ -104,15 +107,12 @@ class PHP_Token_ClassTest extends PHPUnit_Framework_TestCase
 
         $classes = $ts->getClasses();
 
-        $this->assertEquals(array('Test'), array_keys($classes));
-        $this->assertEquals(array('methodOne', 'methodTwo'), array_keys($classes['Test']['methods']));
+        $this->assertEquals(['Test', 'AnonymousClass:4#23'], array_keys($classes));
+        $this->assertEquals(['methodOne', 'methodTwo'], array_keys($classes['Test']['methods']));
 
         $this->assertEmpty($ts->getFunctions());
     }
 
-    /**
-     * @requires PHP 5.6
-     */
     public function testImportedFunctionsAreHandledCorrectly()
     {
         $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'classUsesNamespacedFunction.php');
@@ -120,4 +120,50 @@ class PHP_Token_ClassTest extends PHPUnit_Framework_TestCase
         $this->assertEmpty($ts->getFunctions());
         $this->assertCount(1, $ts->getClasses());
     }
+
+    /**
+     * @ticket https://github.com/sebastianbergmann/php-code-coverage/issues/543
+     */
+    public function testClassWithMultipleAnonymousClassesAndFunctionsIsHandledCorrectly()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_multiple_anonymous_classes_and_functions.php');
+
+        $classes = $ts->getClasses();
+
+        $this->assertArrayHasKey('class_with_multiple_anonymous_classes_and_functions', $classes);
+        $this->assertArrayHasKey('AnonymousClass:6#23', $classes);
+        $this->assertArrayHasKey('AnonymousClass:12#53', $classes);
+        $this->assertArrayHasKey('m', $classes['class_with_multiple_anonymous_classes_and_functions']['methods']);
+        $this->assertArrayHasKey('anonymousFunction:18#81', $classes['class_with_multiple_anonymous_classes_and_functions']['methods']);
+        $this->assertArrayHasKey('anonymousFunction:22#108', $classes['class_with_multiple_anonymous_classes_and_functions']['methods']);
+    }
+
+    /**
+     * @ticket https://github.com/sebastianbergmann/php-token-stream/issues/68
+     */
+    public function testClassWithMethodNamedEmptyIsHandledCorrectly()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'class_with_method_named_empty.php');
+
+        $classes = $ts->getClasses();
+
+        $this->assertArrayHasKey('class_with_method_named_empty', $classes);
+        $this->assertArrayHasKey('empty', $classes['class_with_method_named_empty']['methods']);
+    }
+
+    /**
+     * @ticket https://github.com/sebastianbergmann/php-code-coverage/issues/424
+     */
+    public function testSomething()
+    {
+        $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'php-code-coverage-issue-424.php');
+
+        $classes = $ts->getClasses();
+
+        $this->assertSame(5, $classes['Example']['methods']['even']['startLine']);
+        $this->assertSame(12, $classes['Example']['methods']['even']['endLine']);
+
+        $this->assertSame(7, $classes['Example']['methods']['anonymousFunction:7#28']['startLine']);
+        $this->assertSame(9, $classes['Example']['methods']['anonymousFunction:7#28']['endLine']);
+    }
 }
diff --git a/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php b/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php
index f1e508cf..b4a67356 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/ClosureTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -8,21 +8,14 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_FUNCTION class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @copyright  Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_Token_ClosureTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_ClosureTest extends TestCase
 {
-    protected $functions;
+    /**
+     * @var PHP_Token_FUNCTION[]
+     */
+    private $functions;
 
     protected function setUp()
     {
@@ -40,12 +33,12 @@ class PHP_Token_ClosureTest extends PHPUnit_Framework_TestCase
      */
     public function testGetArguments()
     {
-        $this->assertEquals(array('$foo' => null, '$bar' => null), $this->functions[0]->getArguments());
-        $this->assertEquals(array('$foo' => 'Foo', '$bar' => null), $this->functions[1]->getArguments());
-        $this->assertEquals(array('$foo' => null, '$bar' => null, '$baz' => null), $this->functions[2]->getArguments());
-        $this->assertEquals(array('$foo' => 'Foo', '$bar' => null, '$baz' => null), $this->functions[3]->getArguments());
-        $this->assertEquals(array(), $this->functions[4]->getArguments());
-        $this->assertEquals(array(), $this->functions[5]->getArguments());
+        $this->assertEquals(['$foo' => null, '$bar' => null], $this->functions[0]->getArguments());
+        $this->assertEquals(['$foo' => 'Foo', '$bar' => null], $this->functions[1]->getArguments());
+        $this->assertEquals(['$foo' => null, '$bar' => null, '$baz' => null], $this->functions[2]->getArguments());
+        $this->assertEquals(['$foo' => 'Foo', '$bar' => null, '$baz' => null], $this->functions[3]->getArguments());
+        $this->assertEquals([], $this->functions[4]->getArguments());
+        $this->assertEquals([], $this->functions[5]->getArguments());
     }
 
     /**
@@ -53,12 +46,12 @@ class PHP_Token_ClosureTest extends PHPUnit_Framework_TestCase
      */
     public function testGetName()
     {
-        $this->assertEquals('anonymous function', $this->functions[0]->getName());
-        $this->assertEquals('anonymous function', $this->functions[1]->getName());
-        $this->assertEquals('anonymous function', $this->functions[2]->getName());
-        $this->assertEquals('anonymous function', $this->functions[3]->getName());
-        $this->assertEquals('anonymous function', $this->functions[4]->getName());
-        $this->assertEquals('anonymous function', $this->functions[5]->getName());
+        $this->assertEquals('anonymousFunction:2#5', $this->functions[0]->getName());
+        $this->assertEquals('anonymousFunction:3#27', $this->functions[1]->getName());
+        $this->assertEquals('anonymousFunction:4#51', $this->functions[2]->getName());
+        $this->assertEquals('anonymousFunction:5#71', $this->functions[3]->getName());
+        $this->assertEquals('anonymousFunction:6#93', $this->functions[4]->getName());
+        $this->assertEquals('anonymousFunction:7#106', $this->functions[5]->getName());
     }
 
     /**
diff --git a/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php b/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php
index 4f23c39d..539f827c 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/FunctionTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -8,21 +8,14 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_FUNCTION class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @copyright  Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_Token_FunctionTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_FunctionTest extends TestCase
 {
-    protected $functions;
+    /**
+     * @var PHP_Token_FUNCTION[]
+     */
+    private $functions;
 
     protected function setUp()
     {
@@ -40,23 +33,23 @@ class PHP_Token_FunctionTest extends PHPUnit_Framework_TestCase
      */
     public function testGetArguments()
     {
-        $this->assertEquals(array(), $this->functions[0]->getArguments());
+        $this->assertEquals([], $this->functions[0]->getArguments());
 
         $this->assertEquals(
-          array('$baz' => 'Baz'), $this->functions[1]->getArguments()
+          ['$baz' => 'Baz'], $this->functions[1]->getArguments()
         );
 
         $this->assertEquals(
-          array('$foobar' => 'Foobar'), $this->functions[2]->getArguments()
+          ['$foobar' => 'Foobar'], $this->functions[2]->getArguments()
         );
 
         $this->assertEquals(
-          array('$barfoo' => 'Barfoo'), $this->functions[3]->getArguments()
+          ['$barfoo' => 'Barfoo'], $this->functions[3]->getArguments()
         );
 
-        $this->assertEquals(array(), $this->functions[4]->getArguments());
+        $this->assertEquals([], $this->functions[4]->getArguments());
 
-        $this->assertEquals(array('$x' => null, '$y' => null), $this->functions[5]->getArguments());
+        $this->assertEquals(['$x' => null, '$y' => null], $this->functions[5]->getArguments());
     }
 
     /**
diff --git a/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php b/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php
index 1e433512..2056d122 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/IncludeTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -8,22 +8,14 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_REQUIRE_ONCE, PHP_Token_REQUIRE
- * PHP_Token_INCLUDE_ONCE and PHP_Token_INCLUDE_ONCE classes.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Laurent Laville <pear@xxxxxxxxxxxxxxxxxxx>
- * @copyright  Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.2
- */
-class PHP_Token_IncludeTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_IncludeTest extends TestCase
 {
-    protected $ts;
+    /**
+     * @var PHP_Token_Stream
+     */
+    private $ts;
 
     protected function setUp()
     {
@@ -37,7 +29,7 @@ class PHP_Token_IncludeTest extends PHPUnit_Framework_TestCase
     public function testGetIncludes()
     {
         $this->assertSame(
-          array('test4.php', 'test3.php', 'test2.php', 'test1.php'),
+          ['test4.php', 'test3.php', 'test2.php', 'test1.php'],
           $this->ts->getIncludes()
         );
     }
@@ -49,13 +41,13 @@ class PHP_Token_IncludeTest extends PHPUnit_Framework_TestCase
     public function testGetIncludesCategorized()
     {
         $this->assertSame(
-          array(
-            'require_once' => array('test4.php'),
-            'require'      => array('test3.php'),
-            'include_once' => array('test2.php'),
-            'include'      => array('test1.php')
-          ),
-          $this->ts->getIncludes(TRUE)
+          [
+            'require_once' => ['test4.php'],
+            'require'      => ['test3.php'],
+            'include_once' => ['test2.php'],
+            'include'      => ['test1.php']
+          ],
+          $this->ts->getIncludes(true)
         );
     }
 
@@ -66,8 +58,8 @@ class PHP_Token_IncludeTest extends PHPUnit_Framework_TestCase
     public function testGetIncludesCategory()
     {
         $this->assertSame(
-          array('test4.php'),
-          $this->ts->getIncludes(TRUE, 'require_once')
+          ['test4.php'],
+          $this->ts->getIncludes(true, 'require_once')
         );
     }
 }
diff --git a/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php b/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php
index 56caede2..9e8cb248 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/InterfaceTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -8,33 +8,29 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_INTERFACE class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @author     Laurent Laville <pear@xxxxxxxxxxxxxxxxxxx>
- * @copyright  Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_InterfaceTest extends TestCase
 {
-    protected $class;
-    protected $interfaces;
+    /**
+     * @var PHP_Token_CLASS
+     */
+    private $class;
+
+    /**
+     * @var PHP_Token_INTERFACE[]
+     */
+    private $interfaces;
 
     protected function setUp()
     {
         $ts = new PHP_Token_Stream(TEST_FILES_PATH . 'source4.php');
         $i  = 0;
+
         foreach ($ts as $token) {
             if ($token instanceof PHP_Token_CLASS) {
                 $this->class = $token;
-            }
-            elseif ($token instanceof PHP_Token_INTERFACE) {
+            } elseif ($token instanceof PHP_Token_INTERFACE) {
                 $this->interfaces[$i] = $token;
                 $i++;
             }
@@ -97,7 +93,7 @@ class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
     public function testGetInterfacesExists()
     {
         $this->assertEquals(
-            array('b'),
+            ['b'],
             $this->class->getInterfaces()
         );
     }
@@ -111,13 +107,15 @@ class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
             $this->class->hasInterfaces()
         );
     }
+
     /**
      * @covers PHP_Token_INTERFACE::getPackage
      */
-    public function testGetPackageNamespace() {
+    public function testGetPackageNamespace()
+    {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_INTERFACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('Foo\\Bar', $package['namespace']);
             }
@@ -125,22 +123,24 @@ class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
     }
 
 
-    public function provideFilesWithClassesWithinMultipleNamespaces() {
-        return array(
-            array(TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingBraces.php'),
-            array(TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingNonBraceSyntax.php'),
-        );
+    public function provideFilesWithClassesWithinMultipleNamespaces()
+    {
+        return [
+            [TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingBraces.php'],
+            [TEST_FILES_PATH . 'multipleNamespacesWithOneClassUsingNonBraceSyntax.php'],
+        ];
     }
 
     /**
      * @dataProvider provideFilesWithClassesWithinMultipleNamespaces
      * @covers PHP_Token_INTERFACE::getPackage
      */
-    public function testGetPackageNamespaceForFileWithMultipleNamespaces($filepath) {
-        $tokenStream = new PHP_Token_Stream($filepath);
+    public function testGetPackageNamespaceForFileWithMultipleNamespaces($filepath)
+    {
+        $tokenStream     = new PHP_Token_Stream($filepath);
         $firstClassFound = false;
-        foreach($tokenStream as $token) {
-            if($firstClassFound === false && $token instanceOf PHP_Token_INTERFACE) {
+        foreach ($tokenStream as $token) {
+            if ($firstClassFound === false && $token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('TestClassInBar', $token->getName());
                 $this->assertSame('Foo\\Bar', $package['namespace']);
@@ -148,44 +148,48 @@ class PHP_Token_InterfaceTest extends PHPUnit_Framework_TestCase
                 continue;
             }
             // Secound class
-            if($token instanceOf PHP_Token_INTERFACE) {
+            if ($token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('TestClassInBaz', $token->getName());
                 $this->assertSame('Foo\\Baz', $package['namespace']);
+
                 return;
             }
         }
-        $this->fail("Seachring for 2 classes failed");
+        $this->fail('Seachring for 2 classes failed');
     }
 
-    public function testGetPackageNamespaceIsEmptyForInterfacesThatAreNotWithinNamespaces() {
-        foreach($this->interfaces as $token) {
+    public function testGetPackageNamespaceIsEmptyForInterfacesThatAreNotWithinNamespaces()
+    {
+        foreach ($this->interfaces as $token) {
             $package = $token->getPackage();
-            $this->assertSame("", $package['namespace']);
+            $this->assertSame('', $package['namespace']);
         }
     }
 
     /**
      * @covers PHP_Token_INTERFACE::getPackage
      */
-    public function testGetPackageNamespaceWhenExtentingFromNamespaceClass() {
-        $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classExtendsNamespacedClass.php');
+    public function testGetPackageNamespaceWhenExtentingFromNamespaceClass()
+    {
+        $tokenStream     = new PHP_Token_Stream(TEST_FILES_PATH . 'classExtendsNamespacedClass.php');
         $firstClassFound = false;
-        foreach($tokenStream as $token) {
-            if($firstClassFound === false && $token instanceOf PHP_Token_INTERFACE) {
+        foreach ($tokenStream as $token) {
+            if ($firstClassFound === false && $token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('Baz', $token->getName());
                 $this->assertSame('Foo\\Bar', $package['namespace']);
                 $firstClassFound = true;
                 continue;
             }
-            if($token instanceOf PHP_Token_INTERFACE) {
+            if ($token instanceof PHP_Token_INTERFACE) {
                 $package = $token->getPackage();
                 $this->assertSame('Extender', $token->getName());
                 $this->assertSame('Other\\Space', $package['namespace']);
+
                 return;
             }
         }
-        $this->fail("Searching for 2 classes failed");
+        $this->fail('Searching for 2 classes failed');
     }
 }
diff --git a/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php b/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php
index 469f7872..98360cfa 100644
--- a/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php
+++ b/vendor/phpunit/php-token-stream/tests/Token/NamespaceTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -8,19 +8,9 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token_NAMESPACE class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @copyright  Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_Token_NamespaceTest extends TestCase
 {
     /**
      * @covers PHP_Token_NAMESPACE::getName
@@ -41,8 +31,8 @@ class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
     public function testGetStartLineWithUnscopedNamespace()
     {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_NAMESPACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_NAMESPACE) {
                 $this->assertSame(2, $token->getLine());
             }
         }
@@ -51,8 +41,8 @@ class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
     public function testGetEndLineWithUnscopedNamespace()
     {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_NAMESPACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_NAMESPACE) {
                 $this->assertSame(2, $token->getEndLine());
             }
         }
@@ -60,8 +50,8 @@ class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
     public function testGetStartLineWithScopedNamespace()
     {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInScopedNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_NAMESPACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_NAMESPACE) {
                 $this->assertSame(2, $token->getLine());
             }
         }
@@ -70,11 +60,10 @@ class PHP_Token_NamespaceTest extends PHPUnit_Framework_TestCase
     public function testGetEndLineWithScopedNamespace()
     {
         $tokenStream = new PHP_Token_Stream(TEST_FILES_PATH . 'classInScopedNamespace.php');
-        foreach($tokenStream as $token) {
-            if($token instanceOf PHP_Token_NAMESPACE) {
+        foreach ($tokenStream as $token) {
+            if ($token instanceof PHP_Token_NAMESPACE) {
                 $this->assertSame(8, $token->getEndLine());
             }
         }
     }
-
 }
diff --git a/vendor/phpunit/php-token-stream/tests/TokenTest.php b/vendor/phpunit/php-token-stream/tests/TokenTest.php
index 67bf79a0..e4bbb801 100644
--- a/vendor/phpunit/php-token-stream/tests/TokenTest.php
+++ b/vendor/phpunit/php-token-stream/tests/TokenTest.php
@@ -1,6 +1,6 @@
 <?php
 /*
- * This file is part of the PHP_TokenStream package.
+ * This file is part of php-token-stream.
  *
  * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
  *
@@ -8,19 +8,9 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Tests for the PHP_Token class.
- *
- * @package    PHP_TokenStream
- * @subpackage Tests
- * @author     Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @copyright  Sebastian Bergmann <sebastian@xxxxxxxxxx>
- * @license    http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
- * @version    Release: @package_version@
- * @link       http://github.com/sebastianbergmann/php-token-stream/
- * @since      Class available since Release 1.0.0
- */
-class PHP_TokenTest extends PHPUnit_Framework_TestCase
+use PHPUnit\Framework\TestCase;
+
+class PHP_TokenTest extends TestCase
 {
     /**
      * @covers PHP_Token::__construct
diff --git a/vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_named_empty.php b/vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_named_empty.php
new file mode 100644
index 00000000..1dafc187
--- /dev/null
+++ b/vendor/phpunit/php-token-stream/tests/_fixture/class_with_method_named_empty.php
@@ -0,0 +1,7 @@
+<?php
+class class_with_method_named_empty
+{
+    public function empty(): void
+    {
+    }
+}
diff --git a/vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php b/vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php
new file mode 100644
index 00000000..3267ba56
--- /dev/null
+++ b/vendor/phpunit/php-token-stream/tests/_fixture/class_with_multiple_anonymous_classes_and_functions.php
@@ -0,0 +1,26 @@
+<?php
+class class_with_multiple_anonymous_classes_and_functions
+{
+    public function m()
+    {
+        $c = new class {
+            public function n() {
+                return true;
+            }
+        };
+
+        $d = new class {
+            public function o() {
+                return false;
+            }
+        };
+
+        $f = function ($a, $b) {
+            return $a + $b;
+        };
+
+        $g = function ($a, $b) {
+            return $a - $b;
+        };
+    }
+}
\ No newline at end of file
diff --git a/vendor/phpunit/php-token-stream/tests/_fixture/php-code-coverage-issue-424.php b/vendor/phpunit/php-token-stream/tests/_fixture/php-code-coverage-issue-424.php
new file mode 100644
index 00000000..457e0bb6
--- /dev/null
+++ b/vendor/phpunit/php-token-stream/tests/_fixture/php-code-coverage-issue-424.php
@@ -0,0 +1,13 @@
+<?php
+
+class Example
+{
+    public function even($numbers)
+    {
+        $numbers = array_filter($numbers, function($number) {
+            return $number % 2 === 0;
+        });
+
+        return array_merge($numbers);
+    }
+}
\ No newline at end of file
diff --git a/vendor/phpunit/php-token-stream/tests/bootstrap.php b/vendor/phpunit/php-token-stream/tests/bootstrap.php
index f92b7df0..bcd0f645 100644
--- a/vendor/phpunit/php-token-stream/tests/bootstrap.php
+++ b/vendor/phpunit/php-token-stream/tests/bootstrap.php
@@ -1,4 +1,12 @@
 <?php
+/*
+ * This file is part of php-token-stream.
+ *
+ * (c) Sebastian Bergmann <sebastian@xxxxxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 require __DIR__ . '/../vendor/autoload.php';
 
 define(
diff --git a/vendor/phpunit/phpunit/.github/CONTRIBUTING.md b/vendor/phpunit/phpunit/.github/CONTRIBUTING.md
index 93086d8a..9010bc4c 100644
--- a/vendor/phpunit/phpunit/.github/CONTRIBUTING.md
+++ b/vendor/phpunit/phpunit/.github/CONTRIBUTING.md
@@ -24,7 +24,7 @@ Due to time constraints, we are not always able to respond as quickly as we woul
 This project comes with a configuration file for [php-cs-fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) (`.php_cs`) that you can use to (re)format your sourcecode for compliance with this project's coding guidelines:
 
 ```bash
-$ wget http://get.sensiolabs.org/php-cs-fixer.phar
+$ wget http://cs.sensiolabs.org/download/php-cs-fixer-v2.phar -O php-cs-fixer.phar
 
 $ php php-cs-fixer.phar fix
 ```
diff --git a/vendor/phpunit/phpunit/.github/ISSUE_TEMPLATE.md b/vendor/phpunit/phpunit/.github/ISSUE_TEMPLATE.md
index 3b299d8d..ad1dc39a 100644
--- a/vendor/phpunit/phpunit/.github/ISSUE_TEMPLATE.md
+++ b/vendor/phpunit/phpunit/.github/ISSUE_TEMPLATE.md
@@ -7,8 +7,9 @@
 <!--
 - Please fill in this template according to your issue.
 - Please keep the table shown above at the top of your issue.
+- Please include the output of "composer info | sort" if you installed PHPUnit using Composer.
 - Please post code as text (using proper markup). Do not post screenshots of code.
-- For support request or how-tos, visit https://phpunit.de/support.html
+- Visit https://phpunit.de/support.html if you are looking for support.
 - Otherwise, replace this comment by the description of your issue.
 -->
 
diff --git a/vendor/phpunit/phpunit/.gitignore b/vendor/phpunit/phpunit/.gitignore
index 3a4e975b..bf333231 100644
--- a/vendor/phpunit/phpunit/.gitignore
+++ b/vendor/phpunit/phpunit/.gitignore
@@ -1,5 +1,7 @@
 /.ant_targets
 /.idea
+/.php_cs
+/.php_cs.cache
 /build/documentation
 /build/logfiles
 /build/phar
@@ -7,12 +9,12 @@
 /build/*.phar
 /build/*.phar.asc
 /build/binary-phar-autoload.php
+/cache.properties
+/composer.lock
 /tests/TextUI/*.diff
 /tests/TextUI/*.exp
 /tests/TextUI/*.log
 /tests/TextUI/*.out
 /tests/TextUI/*.php
-/cache.properties
-/composer.lock
 /vendor
-/.php_cs.cache
+
diff --git a/vendor/phpunit/phpunit/.php_cs b/vendor/phpunit/phpunit/.php_cs.dist
similarity index 100%
rename from vendor/phpunit/phpunit/.php_cs
rename to vendor/phpunit/phpunit/.php_cs.dist
diff --git a/vendor/phpunit/phpunit/.travis.yml b/vendor/phpunit/phpunit/.travis.yml
index 590dfbc9..29957e7a 100644
--- a/vendor/phpunit/phpunit/.travis.yml
+++ b/vendor/phpunit/phpunit/.travis.yml
@@ -2,16 +2,24 @@ language: php
 
 sudo: false
 
+addons:
+  apt:
+    packages:
+      - libxml2-utils
+
 php:
   - 5.6
   - 7.0
-  - 7.0snapshot
   - 7.1
-  - 7.1snapshot
   - 7.2
-  - 7.2snapshot
   - master
 
+matrix:
+  allow_failures:
+    - php: 7.2
+    - php: master
+  fast_finish: true
+
 env:
   matrix:
     - DEPENDENCIES="high"
diff --git a/vendor/phpunit/phpunit/CODE_OF_CONDUCT.md b/vendor/phpunit/phpunit/CODE_OF_CONDUCT.md
deleted file mode 100644
index d39d536c..00000000
--- a/vendor/phpunit/phpunit/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Contributor Code of Conduct
-
-As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
-
-We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality.
-
-Examples of unacceptable behavior by participants include:
-
-* The use of sexualized language or imagery
-* Personal attacks
-* Trolling or insulting/derogatory comments
-* Public or private harassment
-* Publishing other's private information, such as physical or electronic
-  addresses, without explicit permission
-* Other unethical or unprofessional conduct
-
-Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
-
-By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.
-
-This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project maintainer at sebastian@xxxxxxxxxx. All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident.
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.3.0, available at [http://contributor-covenant.org/version/1/3/0/][version]
-
-[homepage]: http://contributor-covenant.org
-[version]: http://contributor-covenant.org/version/1/3/0/
diff --git a/vendor/phpunit/phpunit/CONTRIBUTING.md b/vendor/phpunit/phpunit/CONTRIBUTING.md
deleted file mode 100644
index 6dcb6044..00000000
--- a/vendor/phpunit/phpunit/CONTRIBUTING.md
+++ /dev/null
@@ -1,64 +0,0 @@
-# Contributing to PHPUnit
-
-## Contributor Code of Conduct
-
-Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms.
-
-## Workflow
-
-* Fork the project.
-* Make your bug fix or feature addition.
-* Add tests for it. This is important so we don't break it in a future version unintentionally.
-* Send a pull request. Bonus points for topic branches.
-
-Please make sure that you have [set up your user name and email address](http://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup) for use with Git. Strings such as `silly nick name <root@localhost>` look really stupid in the commit history of a project.
-
-Pull requests for bug fixes must be based on the current stable branch whereas pull requests for new features must be based on the `master` branch.
-
-We are trying to keep backwards compatibility breaks in PHPUnit to an absolute minimum. Please take this into account when proposing changes.
-
-Due to time constraints, we are not always able to respond as quickly as we would like. Please do not take delays personal and feel free to remind us if you feel that we forgot to respond.
-
-## Coding Guidelines
-
-This project comes with a configuration file for [php-cs-fixer](https://github.com/FriendsOfPHP/PHP-CS-Fixer) (`.php_cs`) that you can use to (re)format your sourcecode for compliance with this project's coding guidelines:
-
-```bash
-$ wget http://get.sensiolabs.org/php-cs-fixer.phar
-
-$ php php-cs-fixer.phar fix
-```
-
-## Using PHPUnit from a Git checkout
-
-The following commands can be used to perform the initial checkout of PHPUnit:
-
-```bash
-$ git clone git://github.com/sebastianbergmann/phpunit.git
-
-$ cd phpunit
-```
-
-Retrieve PHPUnit's dependencies using [Composer](https://getcomposer.org/):
-
-```bash
-$ composer install
-```
-
-The `phpunit` script can be used to invoke the PHPUnit test runner:
-
-```bash
-$ ./phpunit --version
-```
-
-## Reporting issues
-
-Please use the most specific issue tracker to search for existing tickets and to open new tickets:
-
-* [General problems](https://github.com/sebastianbergmann/phpunit/issues)
-* [Code Coverage](https://github.com/sebastianbergmann/php-code-coverage/issues)
-* [Stub and Mock Objects](https://github.com/sebastianbergmann/phpunit-mock-objects/issues)
-* [DbUnit](https://github.com/sebastianbergmann/dbunit/issues)
-* [Documentation](https://github.com/sebastianbergmann/phpunit-documentation/issues)
-* [Website](https://github.com/sebastianbergmann/phpunit-website/issues)
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-4.0.md b/vendor/phpunit/phpunit/ChangeLog-4.0.md
deleted file mode 100644
index dc71b017..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-4.0.md
+++ /dev/null
@@ -1,176 +0,0 @@
-# Changes in PHPUnit 4.0
-
-All notable changes of the PHPUnit 4.0 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [4.0.20] - 2014-05-02
-
-### Fixed
-
-* Fixed [#1242](https://github.com/sebastianbergmann/phpunit/issues/1242): `--self-update` uses OpenSSL API that is deprecated in PHP 5.6
-
-## [4.0.19] - 2014-04-30
-
-### Fixed
-
-* Fixed [#1193](https://github.com/sebastianbergmann/phpunit/issues/1193): Process isolation does not work correctly when PHPUnit is used from PHAR
-* Fixed a BC break related to comparing `DOMNode` objects that was introduced in PHPUnit 4.0.18
-
-## [4.0.18] - 2014-04-29
-
-### Fixed
-
-* Fixed [#1218](https://github.com/sebastianbergmann/phpunit/issues/1218): `--self-update` destroys symlink
-
-## [4.0.17] - 2014-04-21
-
-### Changed
-
-* [Display a message that the PEAR installation method is no longer supported when PHPUnit was installed using the PEAR Installer](https://github.com/sebastianbergmann/phpunit/commit/70b02c6be0176ab8ad3d3c9ec97480556c5dd63b)
-
-## [4.0.16] - 2014-04-20
-
-### Fixed
-
-* [Fixed handling of the `--report-useless-tests`, `--strict-coverage`, `--disallow-test-output`, and `--enforce-time-limit` options](https://github.com/sebastianbergmann/phpunit/commit/38baa9670711adedfe44ef24a33b568f61f3f045)
-
-## [4.0.15] - 2014-04-16
-
-New release of PHPUnit as PHAR and PEAR package with updated dependencies
-
-## [4.0.14] - 2014-03-28
-
-New release of PHPUnit as PHAR and PEAR package with updated dependencies
-
-## [4.0.13] - 2014-03-26
-
-New release of PHPUnit as PHAR and PEAR package with updated dependencies
-
-## [4.0.12] - 2014-03-20
-
-### Changed
-
-* [Use blacklist from PHP_CodeCoverage](https://github.com/sebastianbergmann/phpunit/commit/16152ba4b8d0104ce34f60cb71b2b982ba84c898)
-
-## [4.0.11] - 2014-03-18
-
-### Fixed
-
-* [Fixed unintended autoloader invokation triggered by the `@beforeClass` and `@afterClass` annotations](https://github.com/sebastianbergmann/phpunit/commit/f12e10fddc3ccbddb652a04d9036aeb5a6d54bff)
-
-## [4.0.10] - 2014-03-18
-
-New release of PHPUnit as PHAR and PEAR package with updated dependencies (most notably a [fix](https://github.com/sebastianbergmann/phpunit-mock-objects/commit/c5e6274b8f2bf983cf883bb375cf44f99aff200e) in the mock object generator that caused a [performance regression](https://github.com/sebastianbergmann/phpunit/issues/1187))
-
-## [4.0.9] - 2014-03-17
-
-### Changed
-
-* Optimized the search for the `@before`, `@after`, `@beforeClass` and `@afterClass` annotations
-* Optimized the usage of `SebastianBergmann\Environment\Runtime::canCollectCodeCoverage()`
-
-### Fixed
-
-* The "No code coverage will be generated." message was displayed even when code coverage reporting was not requested
-
-## [4.0.8] - 2014-03-17
-
-### Fixed
-
-* Fixed [#1186](https://github.com/sebastianbergmann/phpunit/issues/1186): `@before` and `@after` methods are not called in `@dataProvider` methods
-
-## [4.0.7] - 2014-03-12
-
-### Fixed
-
-* Removed dependency on `phpunit/dbunit` in `composer.json` that was unintentionally added in PHPUnit 4.0.6
-
-## [4.0.6] - 2014-03-11
-
-New release of PHPUnit as PHAR and PEAR package with updated dependencies
-
-## [4.0.5] - 2014-03-10
-
-New release of PHPUnit as PHAR and PEAR package with updated dependencies
-
-## [4.0.4] - 2014-03-08
-
-### Fixed
-
-* Fixed stacktrace filtering when PHPUnit is used from a PHAR
-
-## [4.0.3] - 2014-03-07
-
-New release of PHPUnit as PHAR and PEAR package with updated dependencies
-
-## [4.0.2] - 2014-03-07
-
-### Fixed
-
-* Fixed an issue related to displaying PHPUnit's version number
-
-## [4.0.1] - 2014-03-07
-
-### Fixed
-
-* Fixed collection of code coverage data for tests that use a data provider
-
-## [4.0.0] - 2014-03-07
-
-### Added
-
-* Implemented #382: Added the `$options` parameter to `PHPUnit_Framework_TestCase::getMockFromWsdl()` for configuring the `SoapClient`
-* Implemented #628: Added `PHPUnit_Framework_Assert::countOf(), a shortcut to get a `PHPUnit_Framework_Constraint_Count` instance
-* Implemented #711: `coverage-text` now has an XML `showOnlySummary` option
-* Implemented #719: The `--stderr` switch now respects `--colors` and `--debug`
-* Implemented #746: Allow identity checking for non-object types in all asserts that depend on `TraversableContains`
-* Implemented #758: Show a proper stack trace when @expectedException fails due to a unexpected exception being thrown
-* Implemented #773: Recursive and repeated arrays are more gracefully when comparison differences are exported
-* Implemented #813: Added `@before`, `@after`, `@beforeClass` and `@afterClass` annotations
-* Implemented #834: Added the `@requires OS` annotation
-* Implemented #835: Printers that extend `PHPUnit_TextUI_ResultPrinter` should have similar construction
-* Implemented #838: Added a base test listener
-* Implemented #859: Added PHP label validation to attribute assertions
-* Implemented #869: Added support for the adjacent sibling selector (+) to `PHPUnit_Util_XML::findNodes()`
-* Implemented #871: Add Comparator for DateTime objects
-* Implemented #877: Added new HTML5 tags to `PHPUnit_Util_XML::findNodes()`
-* Added `--coverage-crap4j` switch to generate code coverage report in Crap4J XML format
-* `assertCount()`, `assertNotCount()`, `assertSameSize()`, and `assertNotSameSize()` now support all objects that implement the `Traversable` interface
-
-### Changed
-
-* A test will now fail in strict mode when it uses the `@covers` annotation and code that is not expected to be covered is executed
-* All relative paths in a configuration file are now resolved relative to that configuration file
-
-### Fixed
-
-* Fixed #240: XML strings are escaped by removing invalid characters
-* Fixed #261: `setUp()` and `setUpBeforeClass()` are run before filters are applied
-* Fixed #541: Excluded groups are counted towards total number of tests being executed
-* Fixed #789: PHP INI settings would not be passed to child processes
-* Fixed #806: Array references are now properly displayed in error output
-* Fixed #808: Resources are now reported as `resource(13) of type (stream)` instead of `NULL`
-* Fixed #873: PHPUnit suppresses exceptions thrown outside of test case function
-* Fixed: `phpt` test cases now use the correct php binary when executed through wrapper scripts
-
-[4.0.20]: https://github.com/sebastianbergmann/phpunit/compare/4.0.19...4.0.20
-[4.0.19]: https://github.com/sebastianbergmann/phpunit/compare/4.0.18...4.0.19
-[4.0.18]: https://github.com/sebastianbergmann/phpunit/compare/4.0.17...4.0.18
-[4.0.17]: https://github.com/sebastianbergmann/phpunit/compare/4.0.16...4.0.17
-[4.0.16]: https://github.com/sebastianbergmann/phpunit/compare/4.0.15...4.0.16
-[4.0.15]: https://github.com/sebastianbergmann/phpunit/compare/4.0.14...4.0.15
-[4.0.14]: https://github.com/sebastianbergmann/phpunit/compare/4.0.13...4.0.14
-[4.0.13]: https://github.com/sebastianbergmann/phpunit/compare/4.0.12...4.0.13
-[4.0.12]: https://github.com/sebastianbergmann/phpunit/compare/4.0.11...4.0.12
-[4.0.11]: https://github.com/sebastianbergmann/phpunit/compare/4.0.10...4.0.11
-[4.0.10]: https://github.com/sebastianbergmann/phpunit/compare/4.0.9...4.0.10
-[4.0.9]: https://github.com/sebastianbergmann/phpunit/compare/4.0.8...4.0.9
-[4.0.8]: https://github.com/sebastianbergmann/phpunit/compare/4.0.7...4.0.8
-[4.0.7]: https://github.com/sebastianbergmann/phpunit/compare/4.0.6...4.0.7
-[4.0.6]: https://github.com/sebastianbergmann/phpunit/compare/4.0.5...4.0.6
-[4.0.5]: https://github.com/sebastianbergmann/phpunit/compare/4.0.4...4.0.5
-[4.0.4]: https://github.com/sebastianbergmann/phpunit/compare/4.0.3...4.0.4
-[4.0.3]: https://github.com/sebastianbergmann/phpunit/compare/4.0.2...4.0.3
-[4.0.2]: https://github.com/sebastianbergmann/phpunit/compare/4.0.1...4.0.2
-[4.0.1]: https://github.com/sebastianbergmann/phpunit/compare/4.0.0...4.0.1
-[4.0.0]: https://github.com/sebastianbergmann/phpunit/compare/3.7...4.0.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-4.1.md b/vendor/phpunit/phpunit/ChangeLog-4.1.md
deleted file mode 100644
index d7f10a74..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-4.1.md
+++ /dev/null
@@ -1,73 +0,0 @@
-# Changes in PHPUnit 4.1
-
-All notable changes of the PHPUnit 4.1 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [4.1.6] - 2014-08-17
-
-### Fixed
-
-* Fixed [#1380](https://github.com/sebastianbergmann/phpunit/issues/1380): `assertMatch()` returns `Unexpected end tag : hr`
-* Fixed [#1390](https://github.com/sebastianbergmann/phpunit/issues/1390): Licensing issue with third-party components bundled in PHAR distribution
-
-## [4.1.5] - 2014-08-07
-
-### Changed
-
-* Implemented [#1330](https://github.com/sebastianbergmann/phpunit/issues/1330): Allow non-ambiguous shortened long options
-
-### Fixed
-
-* Fixed [#529](https://github.com/sebastianbergmann/phpunit/issues/529): Tests missed in execution when another test extends from it 
-* Fixed [#1149](https://github.com/sebastianbergmann/phpunit/issues/1149): Test swallows output buffer when run in a separate process
-* Fixed [#1336](https://github.com/sebastianbergmann/phpunit/issues/1336): Problem in process isolation with global variables that contain an object which contains a string which contains multiple backslashes
-* Fixed [#1337](https://github.com/sebastianbergmann/phpunit/issues/1337): Data Provider with `\` at the end of the name breaks with process isolation
-* Fixed [#1345](https://github.com/sebastianbergmann/phpunit/issues/1345): Process isolation blocks infinitely upon fatal error in child process
-* Fixed [#1354](https://github.com/sebastianbergmann/phpunit/issues/1354): PHPUnit test suite fails on Windows
-* Fixed [#1369](https://github.com/sebastianbergmann/phpunit/issues/1369): Performance of `TestSuite::addTestFile()` and missing documentation
-* Fixed [#1374](https://github.com/sebastianbergmann/phpunit/issues/1374): `tearDown()` is called despite unmet requirements
-
-## [4.1.4] - 2014-07-18
-
-### Fixed
-
-* Fixed [#1265](https://github.com/sebastianbergmann/phpunit/issues/1265): `PHPUnit_Runner_StandardTestSuiteLoader` could not be configured as loader
-* Fixed [#1311](https://github.com/sebastianbergmann/phpunit/issues/1311): Incomplete XML Schema for PHPUnit XML configuration file
-* Fixed [#1314](https://github.com/sebastianbergmann/phpunit/issues/1314): Bug in configuration parser
-
-## [4.1.3] - 2014-06-11
-
-New release of PHPUnit as PHP Archive (PHAR) with updated dependencies
-
-## [4.1.2] - 2014-06-07
-
-New release of PHPUnit as PHP Archive (PHAR) with updated dependencies
-
-## [4.1.1] - 2014-05-24
-
-### Added
-
-* Added `--selfupdate` alias for `--self-update`
-
-### Changed
-
-* Improved the fix for [#1133](https://github.com/sebastianbergmann/phpunit/issues/1133)
-
-### Fixed
-
-* Fixed the constructor argument for `SebastianBergmann\Version`
-
-## [4.1.0] - 2014-05-02
-
-### Changed
-
-* The code to compare PHP values for equality (in `assertEquals()`, for instance) has been factored out into a [separate component](https://github.com/sebastianbergmann/comparator)
-* [The mock object generator is now created lazily](https://github.com/sebastianbergmann/phpunit/pull/1165)
-
-[4.1.6]: https://github.com/sebastianbergmann/phpunit/compare/4.1.5...4.1.6
-[4.1.5]: https://github.com/sebastianbergmann/phpunit/compare/4.1.4...4.1.5
-[4.1.4]: https://github.com/sebastianbergmann/phpunit/compare/4.1.3...4.1.4
-[4.1.3]: https://github.com/sebastianbergmann/phpunit/compare/4.1.2...4.1.3
-[4.1.2]: https://github.com/sebastianbergmann/phpunit/compare/4.1.1...4.1.2
-[4.1.1]: https://github.com/sebastianbergmann/phpunit/compare/4.1.0...4.1.1
-[4.1.0]: https://github.com/sebastianbergmann/phpunit/compare/4.0...4.1.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-4.2.md b/vendor/phpunit/phpunit/ChangeLog-4.2.md
deleted file mode 100644
index 0d902b74..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-4.2.md
+++ /dev/null
@@ -1,56 +0,0 @@
-# Changes in PHPUnit 4.2
-
-All notable changes of the PHPUnit 4.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [4.2.5] - 2014-09-06
-
-New release of PHPUnit as PHP Archive (PHAR) with updated dependencies
-
-## [4.2.4] - 2014-08-31
-
-### Fixed
-
-* Fixed [#1413](https://github.com/sebastianbergmann/phpunit/issues/1413): `assertCount()` hangs in infinite loop on HHVM
-
-## [4.2.3] - 2014-08-28
-
-### Fixed
-
-* Fixed [#1403](https://github.com/sebastianbergmann/phpunit/issues/1403): `phpunit --self-update` does not work
-
-## [4.2.2] - 2014-08-18
-
-### Fixed
-
-* Fixed [#1399](https://github.com/sebastianbergmann/phpunit/issues/1399): `enforceTimeLimit` configuration option is not handled
-
-## [4.2.1] - 2014-08-17
-
-### Fixed
-
-* Fixed [#1380](https://github.com/sebastianbergmann/phpunit/issues/1380): `assertMatch()` returns `Unexpected end tag : hr`
-* Fixed [#1390](https://github.com/sebastianbergmann/phpunit/issues/1390): Licensing issue with third-party components bundled in PHAR distribution
-
-## [4.2.0] - 2014-08-08
-
-### Added
-
-* Tests annotated with `@todo` will now be reported as risky when the `--disallow-todo-tests` option is used or `beStrictAboutTodoAnnotatedTests=true` is set in the configuration file
-* The `atLeast()` and `atMost()` invocation count matchers were added
-
-### Changed
-
-* `trigger_error(__METHOD__ . ' is deprecated', E_USER_DEPRECATED);` is used now to indicate that a PHPUnit API method is deprecated; the old "system" for deprecating methods has been removed
-* The PHP Archive (PHAR) distribution of PHPUnit can now be used as a library; `include()`ing or `require()`ing it will not execute the CLI test runner
-
-### Deprecated
-
-* The `assertTag()` and `assertSelect*()` assertion methods have been deprecated in favor of the [phpunit-dom-assertions](https://github.com/phpunit/phpunit-dom-assertions) extension; these methods will be removed in PHPUnit 5.0
-
-[4.2.5]: https://github.com/sebastianbergmann/phpunit/compare/4.2.4...4.2.5
-[4.2.4]: https://github.com/sebastianbergmann/phpunit/compare/4.2.3...4.2.4
-[4.2.3]: https://github.com/sebastianbergmann/phpunit/compare/4.2.2...4.2.3
-[4.2.2]: https://github.com/sebastianbergmann/phpunit/compare/4.2.1...4.2.2
-[4.2.1]: https://github.com/sebastianbergmann/phpunit/compare/4.2.0...4.2.1
-[4.2.0]: https://github.com/sebastianbergmann/phpunit/compare/4.1...4.2.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-4.3.md b/vendor/phpunit/phpunit/ChangeLog-4.3.md
deleted file mode 100644
index 99c2826e..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-4.3.md
+++ /dev/null
@@ -1,54 +0,0 @@
-# Changes in PHPUnit 4.3
-
-All notable changes of the PHPUnit 4.3 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [4.3.5] - 2014-11-11
-
-### Changed
-
-* Merged [#1484](https://github.com/sebastianbergmann/phpunit/issues/1484): Removed `lazymap` from blacklist as it is not longer used
-* Merged [#1489](https://github.com/sebastianbergmann/phpunit/issues/1489): Do not send output from tests in process isolation when testing output
-
-## [4.3.4] - 2014-10-22
-
-### Fixed
-
-* Fixed [#1428](https://github.com/sebastianbergmann/phpunit/issues/1428): Issue with Composer dependencies
-* Fixed [#1447](https://github.com/sebastianbergmann/phpunit/issues/1447): PHPT tests treat line endings inconsistently
-
-## [4.3.3] - 2014-10-16
-
-### Fixed
-
-* Fixed [#1471](https://github.com/sebastianbergmann/phpunit/issues/1471): Output made while test is running is printed although `expectOutputString()` is used when an assertion fails
-
-## [4.3.2] - 2014-10-16
-
-### Fixed
-
-* Fixed [#1468](https://github.com/sebastianbergmann/phpunit/issues/1468): Incomplete and `@todo` annotated tests are counted twice
-
-## [4.3.1] - 2014-10-06
-
-New release of PHPUnit as PHP Archive (PHAR) with updated dependencies
-
-## [4.3.0] - 2014-10-03
-
-### Added
-
-* Merged [#1358](https://github.com/sebastianbergmann/phpunit/issues/1358): Implement `@expectedExceptionMessageRegExp` annotation
-* Merged [#1360](https://github.com/sebastianbergmann/phpunit/issues/1360): Allow a test to identify whether it runs in isolation
-
-### Fixed
-
-* Fixed [#1216](https://github.com/sebastianbergmann/phpunit/issues/1216): Bootstrap does not have global variables set when `--bootstrap` is specified on commandline
-* Fixed [#1351](https://github.com/sebastianbergmann/phpunit/issues/1351): `TestResult` object contains serialized test class upon test failure/exception in process isolation
-* Fixed [#1437](https://github.com/sebastianbergmann/phpunit/issues/1437): Risky test messages mask failures 
-
-[4.3.5]: https://github.com/sebastianbergmann/phpunit/compare/4.3.4...4.3.5
-[4.3.4]: https://github.com/sebastianbergmann/phpunit/compare/4.3.3...4.3.4
-[4.3.3]: https://github.com/sebastianbergmann/phpunit/compare/4.3.2...4.3.3
-[4.3.2]: https://github.com/sebastianbergmann/phpunit/compare/4.3.1...4.3.2
-[4.3.1]: https://github.com/sebastianbergmann/phpunit/compare/4.3.0...4.3.1
-[4.3.0]: https://github.com/sebastianbergmann/phpunit/compare/4.2...4.3.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-4.4.md b/vendor/phpunit/phpunit/ChangeLog-4.4.md
deleted file mode 100644
index 312af5ae..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-4.4.md
+++ /dev/null
@@ -1,57 +0,0 @@
-# Changes in PHPUnit 4.4
-
-All notable changes of the PHPUnit 4.4 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [4.4.5] - 2015-01-27
-
-### Fixed
-
-* Fixed [#1592](https://github.com/sebastianbergmann/phpunit/issues/1592): Incorrect dependency information
-
-## [4.4.4] - 2015-01-24
-
-### Fixed
-
-* Fixed [#1587](https://github.com/sebastianbergmann/phpunit/issues/1587): Class `SebastianBergmann\Exporter\Context` not found
-
-## [4.4.3] - 2015-01-24
-
-New PHAR release due to updated dependencies
-
-## [4.4.2] - 2015-01-17
-
-### Changed
-
-* Merged [#1573](https://github.com/sebastianbergmann/phpunit/issues/1573): Updates for the XSD for PHPUnit XML configuration
-
-### Fixed
-
-* Merged [#1567](https://github.com/sebastianbergmann/phpunit/issues/1567): `coverage-crap4j` missing in XSD for PHPUnit XML configuration
-* Fixed [#1570](https://github.com/sebastianbergmann/phpunit/issues/1570): Test that prints output is marked as failure and not as risky when `--disallow-test-output` is used
-* Fixed `--stderr` with `--tap` or `--testdox` options
-
-## [4.4.1] - 2014-12-28
-
-### Changed
-
-* Merged [#1528](https://github.com/sebastianbergmann/phpunit/issues/1528): Add `expectedCount()` to `toString()` return value
-
-## [4.4.0] - 2014-12-05
-
-### Added
-
-* Merged [#1371](https://github.com/sebastianbergmann/phpunit/issues/1371): Implement `assertArraySubset()` assertion
-* Merged [#1439](https://github.com/sebastianbergmann/phpunit/issues/1439): Add support for `double` to `assertInternalType()`
-
-### Changed
-
-* Merged [#1427](https://github.com/sebastianbergmann/phpunit/issues/1427): Improve failure output for tests when provided data is binary
-* Merged [#1458](https://github.com/sebastianbergmann/phpunit/issues/1458): Only enable colors when PHPUnit is run on a console (and output is not sent to a file)
-
-[4.4.5]: https://github.com/sebastianbergmann/phpunit/compare/4.4.4...4.4.5
-[4.4.4]: https://github.com/sebastianbergmann/phpunit/compare/4.4.3...4.4.4
-[4.4.3]: https://github.com/sebastianbergmann/phpunit/compare/4.4.2...4.4.3
-[4.4.2]: https://github.com/sebastianbergmann/phpunit/compare/4.4.1...4.4.2
-[4.4.1]: https://github.com/sebastianbergmann/phpunit/compare/4.4.0...4.4.1
-[4.4.0]: https://github.com/sebastianbergmann/phpunit/compare/4.3...4.4.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-4.5.md b/vendor/phpunit/phpunit/ChangeLog-4.5.md
deleted file mode 100644
index 2313de10..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-4.5.md
+++ /dev/null
@@ -1,28 +0,0 @@
-# Changes in PHPUnit 4.5
-
-All notable changes of the PHPUnit 4.5 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [4.5.1] - 2015-03-29
-
-## [4.5.0] - 2015-02-05
-
-### Added
-
-* Added out-of-the-box support for [Prophecy](https://github.com/phpspec/prophecy)
-* Implemented [#137](https://github.com/sebastianbergmann/phpunit/issues/137): Add support for variable number of tests shown per line in default result printer
-
-### Changed
-
-* Merged [#1478](https://github.com/sebastianbergmann/phpunit/issues/1478): Improve the performance of `PHPUnit_Framework_Constraint_IsEqual` (which is used by `assertEquals()`, for instance) for the most common case
-
-### Deprecated
-
-* [Deprecated](https://github.com/sebastianbergmann/phpunit/commit/7abe7796f77b13fdf3cfc506fb987d6c2ab477f5) the `--strict` commandline option and the XML configuration's `strict` attribute
-
-### Fixed
-
-* Fixed [#1474](https://github.com/sebastianbergmann/phpunit/issues/1474): Allow the registration of custom comparators for `assertEquals()` et al. (again)
-
-[4.5.1]: https://github.com/sebastianbergmann/phpunit/compare/4.5.0...4.5.1
-[4.5.0]: https://github.com/sebastianbergmann/phpunit/compare/4.4...4.5.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-4.6.md b/vendor/phpunit/phpunit/ChangeLog-4.6.md
deleted file mode 100644
index 3571634a..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-4.6.md
+++ /dev/null
@@ -1,95 +0,0 @@
-# Changes in PHPUnit 4.6
-
-All notable changes of the PHPUnit 4.6 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [4.6.10] - 2015-06-03
-
-### Changed
-
-* Merged [#1693](https://github.com/sebastianbergmann/phpunit/pull/1693): Improved API documentation
-* Merged [#1706](https://github.com/sebastianbergmann/phpunit/pull/1706): Avoid hard-coded URI to `phpunit.xsd`
-* Merged [#1725](https://github.com/sebastianbergmann/phpunit/pull/1725): Update phpDox XSD URI
-* Merged [#1735](https://github.com/sebastianbergmann/phpunit/pull/1735): Mute `chdir()` failures in XInclude handling of XML configuration file
-* Merged [#1736](https://github.com/sebastianbergmann/phpunit/pull/1736): Verify that phar file can be overwritten before attempting self update
-
-### Fixed
-
-* Fixed [#1737](https://github.com/sebastianbergmann/phpunit/issues/1737): Confusing output from `--testdox` for empty test class
-
-## [4.6.9] - 2015-05-29
-
-### Fixed
-
-* Fixed [#1731](https://github.com/sebastianbergmann/phpunit/issues/1731): `.` after failure count has no background color when `--colors` is used
-
-## [4.6.8] - 2015-05-28
-
-New PHAR release due to updated dependencies
-
-## [4.6.7] - 2015-05-25
-
-New PHAR release due to updated dependencies
-
-## [4.6.6] - 2015-04-29
-
-### Fixed
-
-* Fixed [#1684](https://github.com/sebastianbergmann/phpunit/issues/1684): PHAR does not work on HHVM
-
-## [4.6.5] - 2015-04-29
-
-* Fixed [#1677](https://github.com/sebastianbergmann/phpunit/issues/1677): Number of risky tests not printed when there are failing tests
-* Fixed [#1688](https://github.com/sebastianbergmann/phpunit/issues/1688): Self-Update operation does not work due to outdated SSL certificate
-
-## [4.6.4] - 2015-04-11
-
-### Changed
-
-* The default list of blacklisted classes is now always passed to PHP_CodeCoverage
-
-## [4.6.3] - 2015-04-11
-
-### Changed
-
-* Updated the default list of blacklisted classes
-
-## [4.6.2] - 2015-04-07
-
-### Fixed
-
-* Fixed [#1667](https://github.com/sebastianbergmann/phpunit/issues/1667): Loading `src/Framework/Assert/Functions.php` by default causes collisions
-
-## [4.6.1] - 2015-04-03
-
-### Fixed
-
-* Fixed [#1665](https://github.com/sebastianbergmann/phpunit/issues/1665): PHPUnit 4.6.0 PHAR does not work when renamed to `phpunit`
-
-## [4.6.0] - 2015-04-03
-
-### Added
-
-* Added the `--strict-global-state` command-line option and the `beStrictAboutChangesToGlobalState` configuration setting for enabling a check that global variabes, super-global variables, and static attributes in user-defined classes are not modified during a test
-* Merged [#1527](https://github.com/sebastianbergmann/phpunit/issues/1527) and [#1529](https://github.com/sebastianbergmann/phpunit/issues/1529): Allow to define options for displaying colors
-
-### Changed
-
-* Merged [#1528](https://github.com/sebastianbergmann/phpunit/issues/1528): Improve message when `PHPUnit_Framework_Constraint_Count` is used with logical operators
-
-### Fixed
-
-* Merged [#1537](https://github.com/sebastianbergmann/phpunit/issues/1537): Fix problem of `--stderr` with `--tap` and `--testdox`
-* Fixed [#1599](https://github.com/sebastianbergmann/phpunit/issues/1599): The PHAR build of PHPUnit no longer uses an autoloader to load PHPUnit's own classes and instead statically loads all classes on startup
-
-[4.6.10]: https://github.com/sebastianbergmann/phpunit/compare/4.6.9...4.6.10
-[4.6.9]: https://github.com/sebastianbergmann/phpunit/compare/4.6.8...4.6.9
-[4.6.8]: https://github.com/sebastianbergmann/phpunit/compare/4.6.7...4.6.8
-[4.6.7]: https://github.com/sebastianbergmann/phpunit/compare/4.6.6...4.6.7
-[4.6.6]: https://github.com/sebastianbergmann/phpunit/compare/4.6.5...4.6.6
-[4.6.5]: https://github.com/sebastianbergmann/phpunit/compare/4.6.4...4.6.5
-[4.6.4]: https://github.com/sebastianbergmann/phpunit/compare/4.6.3...4.6.4
-[4.6.3]: https://github.com/sebastianbergmann/phpunit/compare/4.6.2...4.6.3
-[4.6.2]: https://github.com/sebastianbergmann/phpunit/compare/4.6.1...4.6.2
-[4.6.1]: https://github.com/sebastianbergmann/phpunit/compare/4.6.0...4.6.1
-[4.6.0]: https://github.com/sebastianbergmann/phpunit/compare/4.5...4.6.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-4.7.md b/vendor/phpunit/phpunit/ChangeLog-4.7.md
deleted file mode 100644
index 948c1274..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-4.7.md
+++ /dev/null
@@ -1,71 +0,0 @@
-# Changes in PHPUnit 4.7
-
-All notable changes of the PHPUnit 4.7 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [4.7.7] - 2015-07-13
-
-New PHAR release due to updated dependencies
-
-## [4.7.6] - 2015-06-30
-
-### Fixed
-
-* Fixed [#1681](https://github.com/sebastianbergmann/phpunit/issues/1681): Code Coverage filter configuration is not passed to child processes
-* Fixed [#1692](https://github.com/sebastianbergmann/phpunit/issues/1692): Clean up `PHPUnit_Extensions_RepeatedTest` after refactoring
-* Fixed [#1763](https://github.com/sebastianbergmann/phpunit/issues/1763): `@before` and `@after` annotations do not work when inherited
-
-## [4.7.5] - 2015-06-21
-
-### Fixed
-
-* Fixed [#490](https://github.com/sebastianbergmann/phpunit/issues/490): Ensure that a test can only be one of `@small`, `@medium`, or `@large`.
-* Fixed [#1704](https://github.com/sebastianbergmann/phpunit/issues/1704): Output printed during test missing when using TAP
-
-## [4.7.4] - 2015-06-18
-
-### Changed
-
-* The `PHPUnit_Framework_Constraint_IsType` constraint now knows about the `real` type (which is an alias for `float`)
-* Various work on compatibility with PHP 7
-
-### Fixed
-
-* Fixed [#1749](https://github.com/sebastianbergmann/phpunit/issues/1749): `stopOnError` configuration setting does not work
-
-## [4.7.3] - 2015-06-11
-
-### Fixed
-
-* Fixed [#1317](https://github.com/sebastianbergmann/phpunit/issues/1317): JUnit XML logfiles does not contain warnings
-* Fixed an [issue](https://github.com/sebastianbergmann/php-code-coverage/issues/347) where the warning that no whitelist is used is displayed when it should not
-
-## [4.7.2] - 2015-06-06
-
-New PHAR release due to updated dependencies
-
-## [4.7.1] - 2015-06-05
-
-New PHAR release due to updated dependencies
-
-## [4.7.0] - 2015-06-05
-
-### Added
-
-* Merged [#1718](https://github.com/sebastianbergmann/phpunit/issues/1718): Support for `--INI--` section in PHPT tests
-
-### Changed
-
-* Tests not annotated with `@small`, `@medium`, or `@large` are no longer treated as being annotated with `@small`
-* In verbose mode, the test runner now prints information about the PHP runtime
-* To be consistent with the printing of PHP runtime information, the configuration file used is only printed in verbose mode
-* A warning is now printed when code coverage data is collected but no whitelist is configured
-
-[4.7.7]: https://github.com/sebastianbergmann/phpunit/compare/4.7.6...4.7.7
-[4.7.6]: https://github.com/sebastianbergmann/phpunit/compare/4.7.5...4.7.6
-[4.7.5]: https://github.com/sebastianbergmann/phpunit/compare/4.7.4...4.7.5
-[4.7.4]: https://github.com/sebastianbergmann/phpunit/compare/4.7.3...4.7.4
-[4.7.3]: https://github.com/sebastianbergmann/phpunit/compare/4.7.2...4.7.3
-[4.7.2]: https://github.com/sebastianbergmann/phpunit/compare/4.7.1...4.7.2
-[4.7.1]: https://github.com/sebastianbergmann/phpunit/compare/4.7.0...4.7.1
-[4.7.0]: https://github.com/sebastianbergmann/phpunit/compare/4.6...4.7.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-4.8.md b/vendor/phpunit/phpunit/ChangeLog-4.8.md
deleted file mode 100644
index fee9ed22..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-4.8.md
+++ /dev/null
@@ -1,293 +0,0 @@
-# Changes in PHPUnit 4.8
-
-All notable changes of the PHPUnit 4.8 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [4.8.36] - 2017-06-21
-
-### Added
-
-* Added `PHPUnit\Framework\AssertionFailedError`, `PHPUnit\Framework\Test`, and `PHPUnit\Framework\TestSuite` to the forward compatibility layer for PHPUnit 6
-
-## [4.8.35] - 2017-02-06
-
-### Added
-
-* Backported the forward compatibility layer for PHPUnit 6 from PHPUnit 5 so that `PHPUnit\Framework\TestCase` can be used instead of `PHPUnit_Framework_TestCase`
-
-## [4.8.34] - 2017-01-26
-
-* Fixed [#2447](https://github.com/sebastianbergmann/phpunit/issues/2447): Reverted backwards incompatible change to handling of boolean environment variable values specified in XML
-
-## [4.8.33] - 2017-01-25
-
-### Fixed
-
-* Fixed [#1983](https://github.com/sebastianbergmann/phpunit/pull/1983): Tests with `@expectedException` annotation cannot be skipped
-* Fixed [#2275](https://github.com/sebastianbergmann/phpunit/pull/2275): Invalid UTF-8 characters can lead to missing output
-* Fixed [#2331](https://github.com/sebastianbergmann/phpunit/issues/2331): Boolean environment variable values specified in XML get mangled
-* Fixed [#2392](https://github.com/sebastianbergmann/phpunit/issues/2392): Empty (but valid) data provider should skip the test
-* Fixed [#2431](https://github.com/sebastianbergmann/phpunit/issues/2431): `assertArraySubset()` does not support `ArrayAccess`
-
-## [4.8.32] - 2017-01-22
-
-### Fixed
-
-* Fixed [#2428](https://github.com/sebastianbergmann/phpunit/pull/2428): Nested arrays specificied in XML configuration file are not handled correctly
-
-## [4.8.31] - 2016-12-09
-
-### Fixed
-
-* Fixed [#2384](https://github.com/sebastianbergmann/phpunit/pull/2384): Handle `PHPUnit_Framework_Exception` correctly when expecting exceptions
-
-## [4.8.30] - 2016-12-02
-
-### Fixed
-
-* Fixed [#2367](https://github.com/sebastianbergmann/phpunit/pull/2367): Bug in `PHPUnit_Util_Test::parseAnnotationContent()`
-* Fixed [#2375](https://github.com/sebastianbergmann/phpunit/issues/2375): Invalid regular expression for `--filter` causes PHP warning
-
-## [4.8.29] - 2016-11-20
-
-### Changed
-
-* Bumped the required version of `sebastian/comparator`
-
-## [4.8.28] - 2016-11-14
-
-### Fixed
-
-* Improved the fix for [#1955](https://github.com/sebastianbergmann/phpunit/issues/1955): Process isolation fails when running tests with `phpdbg -qrr`
-
-## [4.8.27] - 2016-07-21
-
-### Fixed
-
-* Fixed [#1968](https://github.com/sebastianbergmann/phpunit/issues/1968): Invalid data sets are not handled correctly for `@testWith` annotation
-
-## [4.8.26] - 2016-05-17
-
-### Fixed
-
-* Fixed [phpunit-mock-objects/#301](https://github.com/sebastianbergmann/phpunit-mock-objects/issues/301): `PHPUnit_Framework_MockObject_MockBuilder::getMock()` calls `PHPUnit_Framework_TestCase::getMock()` with more arguments than accepted
-
-## [4.8.25] - 2016-05-10
-
-### Fixed
-
-* Fixed [#2112](https://github.com/sebastianbergmann/phpunit/issues/2112): Output is html entity encoded when ran through `phpdbg`
-* Fixed [#2158](https://github.com/sebastianbergmann/phpunit/issues/2158): Failure to run tests in separate processes if a file included into main process contains constant definition
-
-## [4.8.24] - 2016-03-14
-
-### Fixed
-
-* Fixed [#1959](https://github.com/sebastianbergmann/phpunit/issues/1959): Prophecy errors are not handled correctly
-* Fixed [#2039](https://github.com/sebastianbergmann/phpunit/issues/2039): TestDox does not handle snake_case test methods properly
-* Fixed [#2109](https://github.com/sebastianbergmann/phpunit/issues/2109): Process isolation leaks global variable
-
-## [4.8.23] - 2016-02-11
-
-### Fixed
-
-* Fixed [#2072](https://github.com/sebastianbergmann/phpunit/issues/2072): Paths in XML configuration file were not handled correctly when they have whitespace around them
-
-## [4.8.22] - 2016-02-02
-
-### Fixed
-
-* Fixed [#2050](https://github.com/sebastianbergmann/phpunit/issues/2050): `PHPUnit_Util_XML::load()` raises exception with empty message when XML string is empty
-* Fixed a bug in `PHPUnit_Runner_Version::series()`
-
-## [4.8.21] - 2015-12-12
-
-### Changed
-
-* Reverted the changes introduced in PHPUnit 4.8.20 as the only thing the new version constraint in `composer.json` achieved was locking PHP 7 users to PHPUnit 4.8.19
-
-## [4.8.20] - 2015-12-10
-
-### Changed
-
-* Changed PHP version constraint in `composer.json` to prevent installing PHPUnit 4.8 on PHP 7
-* `phpunit.phar` will now refuse to work on PHP 7
-
-## [4.8.19] - 2015-11-30
-
-### Fixed
-
-* Fixed [#1955](https://github.com/sebastianbergmann/phpunit/issues/1955): Process isolation fails when running tests with `phpdbg -qrr`
-
-## [4.8.18] - 2015-11-11
-
-### Changed
-
-* DbUnit 1.4 is bundled again in the PHAR distribution
-
-## [4.8.17] - 2015-11-10
-
-### Fixed
-
-* Fixed [#1935](https://github.com/sebastianbergmann/phpunit/issues/1935): `PHP_CodeCoverage_Exception` not handled properly
-* Fixed [#1948](https://github.com/sebastianbergmann/phpunit/issues/1948): Unable to use PHAR due to unsupported signature error
-
-### Changed
-
-* DbUnit >= 2.0.2 is now bundled in the PHAR distribution
-
-## [4.8.16] - 2015-10-23
-
-### Added
-
-* Implemented [#1925](https://github.com/sebastianbergmann/phpunit/issues/1925): Provide a library-only PHAR
-
-## [4.8.15] - 2015-10-22
-
-### Fixed
-
-* The backup of global state is now properly restored when changes to global state are disallowed
-* The `__PHPUNIT_PHAR__` constant is now properly set when the PHPUnit PHAR is used as a library
-
-## [4.8.14] - 2015-10-17
-
-### Fixed
-
-* Fixed [#1892](https://github.com/sebastianbergmann/phpunit/issues/1892): `--coverage-text` does not honor color settings
-
-## [4.8.13] - 2015-10-14
-
-### Added
-
-* Added the `--self-upgrade` commandline switch for upgrading a PHPUnit PHAR to the latest version
-
-### Changed
-
-* The `--self-update` commandline switch now updates a PHPUnit PHAR to the latest version within the same release series
-
-## [4.8.12] - 2015-10-12
-
-### Changed
-
-* Merged [#1893](https://github.com/sebastianbergmann/phpunit/issues/1893): Removed workaround for phpab bug
-
-## [4.8.11] - 2015-10-07
-
-### Fixed
-
-* Merged [#1885](https://github.com/sebastianbergmann/phpunit/issues/1885): Fixed handling of PHP configuration settings for process isolation
-* Fixed [#1857](https://github.com/sebastianbergmann/phpunit/issues/1857): `@covers` and `@uses` should only take a single word
-* Fixed [#1879](https://github.com/sebastianbergmann/phpunit/issues/1879): `assertEqualXMLStructure()` cannot compare nodes with an ID
-* Fixed [#1898](https://github.com/sebastianbergmann/phpunit/issues/1898): `@covers` and `@uses` cannot be used for namespaced functions
-* Fixed [#1901](https://github.com/sebastianbergmann/phpunit/issues/1901): `--self-update` updates to PHPUnit 5, even on PHP < 5.6
-
-## [4.8.10] - 2015-10-01
-
-### Fixed
-
-* Merged [#1884](https://github.com/sebastianbergmann/phpunit/issues/1884): Avoid passing `Error` to `onNotSuccessfulTest()` on PHP 7
-
-## [4.8.9] - 2015-09-20
-
-### Fixed
-
-* Fixed regression introduced in PHPUnit 4.8.8
-
-## [4.8.8] - 2015-09-19
-
-### Fixed
-
-* Fixed [#1860](https://github.com/sebastianbergmann/phpunit/issues/1860): Not well-formed XML strings are always considered equal by `PHPUnit_Framework_Assert::assertXmlStringEqualsXmlString()`
-
-## [4.8.7] - 2015-09-14
-
-New PHAR release due to updated dependencies
-
-## [4.8.6] - 2015-08-24
-
-### Fixed
-
-* Fixed [#1835](https://github.com/sebastianbergmann/phpunit/issues/1835): Skipped test reported as errored since PHPUnit 4.7.4
-
-## [4.8.5] - 2015-08-19
-
-### Fixed
-
-* Fixed [#1831](https://github.com/sebastianbergmann/phpunit/issues/1831): PHAR manifest is missing
-
-## [4.8.4] - 2015-08-15
-
-### Fixed
-
-* Fixed [#1823](https://github.com/sebastianbergmann/phpunit/issues/1823): Columns attribute in XML configuration file is ignored
-
-## [4.8.3] - 2015-08-10
-
-### Changed
-
-* PHPUnit now exits early during bootstrap when an unsupported version of PHP is used
-
-## [4.8.2] - 2015-08-07
-
-### Fixed
-
-* Fixed [#1816](https://github.com/sebastianbergmann/phpunit/issues/1816): PHPUnit 4.8.1 shows "4.8.0" as version number
-
-## [4.8.1] - 2015-08-07
-
-### Fixed
-
-* Fixed [#1815](https://github.com/sebastianbergmann/phpunit/issues/1815): `phpunit --self-update` does not work in PHPUnit 4.8.0
-
-## [4.8.0] - 2015-08-07
-
-### Added
-
-* Added `--check-version` commandline switch to check whether the current version of PHPUnit is used (PHAR only)
-* Added `--no-coverage` commandline switch to ignore code coverage configuration from the configuration file
-* Implemented [#1663](https://github.com/sebastianbergmann/phpunit/issues/1663): The Crap4J report's threshold is now configurable
-* Merged [#1728](https://github.com/sebastianbergmann/phpunit/issues/1728): Implemented the `@testWith` annotation as "syntactic sugar" for data providers
-* Merged [#1739](https://github.com/sebastianbergmann/phpunit/issues/1739): Added support to the commandline test runner for using options after arguments
-
-### Changed
-
-* Made the argument check of `assertContains()` and `assertNotContains()` more strict to prevent undefined behavior such as [#1808](https://github.com/sebastianbergmann/phpunit/issues/1808)
-* Changed the name of the default group from `__nogroup__` to `default`
-
-[4.8.36]: https://github.com/sebastianbergmann/phpunit/compare/4.8.35...4.8.36
-[4.8.35]: https://github.com/sebastianbergmann/phpunit/compare/4.8.34...4.8.35
-[4.8.34]: https://github.com/sebastianbergmann/phpunit/compare/4.8.33...4.8.34
-[4.8.33]: https://github.com/sebastianbergmann/phpunit/compare/4.8.32...4.8.33
-[4.8.32]: https://github.com/sebastianbergmann/phpunit/compare/4.8.31...4.8.32
-[4.8.31]: https://github.com/sebastianbergmann/phpunit/compare/4.8.30...4.8.31
-[4.8.30]: https://github.com/sebastianbergmann/phpunit/compare/4.8.29...4.8.30
-[4.8.29]: https://github.com/sebastianbergmann/phpunit/compare/4.8.28...4.8.29
-[4.8.28]: https://github.com/sebastianbergmann/phpunit/compare/4.8.27...4.8.28
-[4.8.27]: https://github.com/sebastianbergmann/phpunit/compare/4.8.26...4.8.27
-[4.8.26]: https://github.com/sebastianbergmann/phpunit/compare/4.8.25...4.8.26
-[4.8.25]: https://github.com/sebastianbergmann/phpunit/compare/4.8.24...4.8.25
-[4.8.24]: https://github.com/sebastianbergmann/phpunit/compare/4.8.23...4.8.24
-[4.8.23]: https://github.com/sebastianbergmann/phpunit/compare/4.8.22...4.8.23
-[4.8.22]: https://github.com/sebastianbergmann/phpunit/compare/4.8.21...4.8.22
-[4.8.21]: https://github.com/sebastianbergmann/phpunit/compare/4.8.20...4.8.21
-[4.8.20]: https://github.com/sebastianbergmann/phpunit/compare/4.8.19...4.8.20
-[4.8.19]: https://github.com/sebastianbergmann/phpunit/compare/4.8.18...4.8.19
-[4.8.18]: https://github.com/sebastianbergmann/phpunit/compare/4.8.17...4.8.18
-[4.8.17]: https://github.com/sebastianbergmann/phpunit/compare/4.8.16...4.8.17
-[4.8.16]: https://github.com/sebastianbergmann/phpunit/compare/4.8.15...4.8.16
-[4.8.15]: https://github.com/sebastianbergmann/phpunit/compare/4.8.14...4.8.15
-[4.8.14]: https://github.com/sebastianbergmann/phpunit/compare/4.8.13...4.8.14
-[4.8.13]: https://github.com/sebastianbergmann/phpunit/compare/4.8.12...4.8.13
-[4.8.12]: https://github.com/sebastianbergmann/phpunit/compare/4.8.11...4.8.12
-[4.8.11]: https://github.com/sebastianbergmann/phpunit/compare/4.8.10...4.8.11
-[4.8.10]: https://github.com/sebastianbergmann/phpunit/compare/4.8.9...4.8.10
-[4.8.9]: https://github.com/sebastianbergmann/phpunit/compare/4.8.8...4.8.9
-[4.8.8]: https://github.com/sebastianbergmann/phpunit/compare/4.8.7...4.8.8
-[4.8.7]: https://github.com/sebastianbergmann/phpunit/compare/4.8.6...4.8.7
-[4.8.6]: https://github.com/sebastianbergmann/phpunit/compare/4.8.5...4.8.6
-[4.8.5]: https://github.com/sebastianbergmann/phpunit/compare/4.8.4...4.8.5
-[4.8.4]: https://github.com/sebastianbergmann/phpunit/compare/4.8.3...4.8.4
-[4.8.3]: https://github.com/sebastianbergmann/phpunit/compare/4.8.2...4.8.3
-[4.8.2]: https://github.com/sebastianbergmann/phpunit/compare/4.8.1...4.8.2
-[4.8.1]: https://github.com/sebastianbergmann/phpunit/compare/4.8.0...4.8.1
-[4.8.0]: https://github.com/sebastianbergmann/phpunit/compare/4.7...4.8.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-5.0.md b/vendor/phpunit/phpunit/ChangeLog-5.0.md
deleted file mode 100644
index 129b4c6e..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-5.0.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# Changes in PHPUnit 5.0
-
-All notable changes of the PHPUnit 5.0 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [5.0.10] - 2015-11-30
-
-### Fixed
-
-* Fixed [#1953](https://github.com/sebastianbergmann/phpunit/issues/1953): `Error`s raised outside the scope of a test method are not handled properly
-* Fixed [#1955](https://github.com/sebastianbergmann/phpunit/issues/1955): Process isolation fails when running tests with `phpdbg -qrr`
-
-## [5.0.9] - 2015-11-10
-
-### Added
-
-* Merged [#1909](https://github.com/sebastianbergmann/phpunit/issues/1909): Added `flowId` parameter to each TeamCity message (for parallel tests)
-
-### Fixed
-
-* Fixed [#1935](https://github.com/sebastianbergmann/phpunit/issues/1935): `PHP_CodeCoverage_Exception` not handled properly
-* Fixed [#1944](https://github.com/sebastianbergmann/phpunit/issues/1944): Exceptions are not handled correctly on PHP 7 when an exception is expected
-* Fixed [#1948](https://github.com/sebastianbergmann/phpunit/issues/1948): Unable to use PHAR due to unsupported signature error
-
-### Removed
-
-* Removed leftover references to PHPUnit_Selenium
-
-## [5.0.8] - 2015-10-23
-
-### Added
-
-* Implemented [#1925](https://github.com/sebastianbergmann/phpunit/issues/1925): Provide a library-only PHAR
-
-## [5.0.7] - 2015-10-22
-
-### Fixed
-
-* The backup of global state is now properly restored when changes to global state are disallowed
-* The `__PHPUNIT_PHAR__` constant is now properly set when the PHPUnit PHAR is used as a library
-
-## [5.0.6] - 2015-10-14
-
-### Added
-
-* Added the `--self-upgrade` commandline switch for upgrading a PHPUnit PHAR to the latest version
-
-### Changed
-
-* The `--self-update` commandline switch now updates a PHPUnit PHAR to the latest version within the same release series
-
-### Fixed
-
-* Fixed [#1892](https://github.com/sebastianbergmann/phpunit/issues/1892): `--coverage-text` does not honor color settings
-
-## [5.0.5] - 2015-10-12
-
-### Changed
-
-* Merged [#1893](https://github.com/sebastianbergmann/phpunit/issues/1893): Removed workaround for phpab bug
-
-## [5.0.4] - 2015-10-07
-
-### Fixed
-
-* Fixed [#1857](https://github.com/sebastianbergmann/phpunit/issues/1857): `@covers` and `@uses` should only take a single word
-* Fixed [#1898](https://github.com/sebastianbergmann/phpunit/issues/1898): `@covers` and `@uses` cannot be used for namespaced functions
-
-## [5.0.3] - 2015-10-02
-
-* Fixed check for PHP version in PHAR distribution of PHPUnit
-
-## [5.0.2] - 2015-10-02
-
-### Fixed
-
-* Fixed [#1879](https://github.com/sebastianbergmann/phpunit/issues/1879): `assertEqualXMLStructure()` cannot compare nodes with an ID
-* Fixed [#1887](https://github.com/sebastianbergmann/phpunit/issues/1887): PHAR distribution of PHPUnit 5.0.1 does not work
-
-## [5.0.1] - 2015-10-02
-
-### Fixed
-
-* Merged [#1885](https://github.com/sebastianbergmann/phpunit/issues/1885): Fixed handling of PHP configuration settings for process isolation
-* An outdated version of DbUnit was bundled in the PHAR distribution of PHPUnit
-
-## [5.0.0] - 2015-10-02
-
-### Added
-
-* Implemented [#1604](https://github.com/sebastianbergmann/phpunit/issues/1604): A `@small` test should be marked as risky when it executes code that performs I/O operations
-* Implemented [#1656](https://github.com/sebastianbergmann/phpunit/issues/1656): Allow sorting test failures in reverse
-* Merged [#1753](https://github.com/sebastianbergmann/phpunit/issues/1753): Added the `assertFinite()`, `assertInfinite()` and `assertNan()` assertions
-* Merged [#1876](https://github.com/sebastianbergmann/phpunit/issues/1876): Added the `--atleast-version` commandline option
-* Implemented [#1780](https://github.com/sebastianbergmann/phpunit/issues/1780): Support for deep-cloning of results passed between tests using `@depends`
-* Implemented [#1821](https://github.com/sebastianbergmann/phpunit/issues/1821): Expectations on mock objects passed via `@depends` are now also evaluated for the depending test
-* Added `--whitelist` commandline option to configure a whitelist for code coverage analysis
-* Added convenience wrapper `getMockWithoutInvokingTheOriginalConstructor()` to create a test double without invoking the original class' constructor
-* Added TeamCity test result logger for more seamless integration of PHPUnit with PhpStorm
-
-### Changed
-
-* Merged [#1781](https://github.com/sebastianbergmann/phpunit/issues/1781): Empty string is not treated as a valid JSON string anymore
-* Merged [#1822](https://github.com/sebastianbergmann/phpunit/issues/1822): Always output progress totals on last line
-* It is now mandatory to configure a whitelist for code coverage analysis
-* Renamed the `beStrictAboutTestSize` configuration option to `enforceTimeLimit`
-* Printer-related CLI options now override printer-related configuration settings
-
-### Removed
-
-* The `assertSelectCount()`, `assertSelectRegExp()`, `assertSelectEquals()`, `assertTag()`, `assertNotTag()` assertions have been removed
-* The `--strict` commandline option and the XML configuration's `strict` attribute have been removed
-* The code coverage blacklist functionality has been removed
-* The PHPUnit_Selenium component is no longer bundled in the PHAR distribution
-* The PHPUnit_Selenium component can no longer be configured using the `<selenium/browser>` element of PHPUnit's configuration file
-* PHPUnit is no longer supported on PHP 5.3, PHP 5.4, and PHP 5.5
-
-[5.0.10]: https://github.com/sebastianbergmann/phpunit/compare/5.0.9...5.0.10
-[5.0.9]: https://github.com/sebastianbergmann/phpunit/compare/5.0.8...5.0.9
-[5.0.8]: https://github.com/sebastianbergmann/phpunit/compare/5.0.7...5.0.8
-[5.0.7]: https://github.com/sebastianbergmann/phpunit/compare/5.0.6...5.0.7
-[5.0.6]: https://github.com/sebastianbergmann/phpunit/compare/5.0.5...5.0.6
-[5.0.5]: https://github.com/sebastianbergmann/phpunit/compare/5.0.4...5.0.5
-[5.0.4]: https://github.com/sebastianbergmann/phpunit/compare/5.0.3...5.0.4
-[5.0.3]: https://github.com/sebastianbergmann/phpunit/compare/5.0.2...5.0.3
-[5.0.2]: https://github.com/sebastianbergmann/phpunit/compare/5.0.1...5.0.2
-[5.0.1]: https://github.com/sebastianbergmann/phpunit/compare/5.0.0...5.0.1
-[5.0.0]: https://github.com/sebastianbergmann/phpunit/compare/4.8...5.0.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-5.1.md b/vendor/phpunit/phpunit/ChangeLog-5.1.md
deleted file mode 100644
index 9a6a6f96..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-5.1.md
+++ /dev/null
@@ -1,68 +0,0 @@
-# Changes in PHPUnit 5.1
-
-All notable changes of the PHPUnit 5.1 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [5.1.7] - 2016-02-02
-
-### Fixed
-
-* Fixed [#2050](https://github.com/sebastianbergmann/phpunit/issues/2050): `PHPUnit_Util_XML::load()` raises exception with empty message when XML string is empty
-
-## [5.1.6] - 2016-01-29
-
-### Fixed
-
-* Fixed [#2052](https://github.com/sebastianbergmann/phpunit/issues/2052): PHPUnit 5.1.5 breaks coverage whitelist include directory globbing
-
-## [5.1.5] - 2016-01-29
-
-### Fixed
-
-* An exception is now raised when non-existant directories or files are to be added to the code coverage whitelist
-* Fixed a bug in `PHPUnit_Runner_Version::series()`
-
-## [5.1.4] - 2016-01-11
-
-### Fixed
-
-* Fixed [#1959](https://github.com/sebastianbergmann/phpunit/issues/1959): Prophecy errors are not handled correctly
-
-### Fixed
-
-## [5.1.3] - 2015-12-10
-
-### Added
-
-* Added support for `Throwable` to `PHPUnit_Framework_TestCase::throwsException()`
-
-## [5.1.2] - 2015-12-07
-
-### Fixed
-
-* Fixed a backwards compatibility break related to the execution order of `@before` and `setUp()` introduced in PHPUnit 5.1.0
-
-## [5.1.1] - 2015-12-07
-
-### Fixed
-
-* Fixed a backwards compatibility break in the `PHPUnit_Framework_TestListener` interface introduced in PHPUnit 5.1.0
-
-## [5.1.0] - 2015-12-04
-
-### Added
-
-* Implemented [#1802](https://github.com/sebastianbergmann/phpunit/issues/1802): Refactor how PHPUnit emits warnings (such as `No tests found in class "Test"`)
-* Merged [#1824](https://github.com/sebastianbergmann/phpunit/issues/1824): Added support for the `--CLEAN--` and `--EXPECTREGEX--` sections for PHPT test cases
-* Merged [#1825](https://github.com/sebastianbergmann/phpunit/issues/1825): Redirect STDERR to STDOUT when running PHPT test cases
-* Merged [#1871](https://github.com/sebastianbergmann/phpunit/issues/1871): Added support for `@testdox` annotations on classes
-* Merged [#1917](https://github.com/sebastianbergmann/phpunit/issues/1917): Allow `@coversDefaultClass` annotation to work on traits
-
-[5.1.7]: https://github.com/sebastianbergmann/phpunit/compare/5.1.6...5.1.7
-[5.1.6]: https://github.com/sebastianbergmann/phpunit/compare/5.1.5...5.1.6
-[5.1.5]: https://github.com/sebastianbergmann/phpunit/compare/5.1.4...5.1.5
-[5.1.4]: https://github.com/sebastianbergmann/phpunit/compare/5.1.3...5.1.4
-[5.1.3]: https://github.com/sebastianbergmann/phpunit/compare/5.1.2...5.1.3
-[5.1.2]: https://github.com/sebastianbergmann/phpunit/compare/5.1.1...5.1.2
-[5.1.1]: https://github.com/sebastianbergmann/phpunit/compare/5.1.0...5.1.1
-[5.1.0]: https://github.com/sebastianbergmann/phpunit/compare/5.0...5.1.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-5.2.md b/vendor/phpunit/phpunit/ChangeLog-5.2.md
deleted file mode 100644
index 01f0d249..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-5.2.md
+++ /dev/null
@@ -1,117 +0,0 @@
-# Changes in PHPUnit 5.2
-
-All notable changes of the PHPUnit 5.2 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [5.2.12] - 2016-03-15
-
-### Fixed
-
-* Fixed [#2112](https://github.com/sebastianbergmann/phpunit/issues/2112): Output is html entity encoded when ran through `phpdbg`
-* Fixed [#2118](https://github.com/sebastianbergmann/phpunit/issues/2118): Prophecy integration does not work on PHP 7
-
-## [5.2.11] - 2016-03-14
-
-### Fixed
-
-* Fixed [#2094](https://github.com/sebastianbergmann/phpunit/issues/2094): Missing argument for `PHPUnit_TextUI_TestRunner::run()`
-* Fixed [#2109](https://github.com/sebastianbergmann/phpunit/issues/2109): Process isolation leaks global variable
-
-## [5.2.10] - 2016-03-03
-
-### Fixed
-
-* Fixed [#2039](https://github.com/sebastianbergmann/phpunit/issues/2039): TestDox does not handle snake_case test methods properly
-* Fixed a bug that caused no code coverage to be generated for tests that execute custom comparators
-
-## [5.2.9] - 2016-02-19
-
-### Changed
-
-* Improved the TestDox HTML report
-
-### Fixed
-
-* Fixed [#2083](https://github.com/sebastianbergmann/phpunit/issues/2083): Restored backwards compatibility in deprecated `setExpectedException()` method
-
-## [5.2.8] - 2016-02-18
-
-### Changed
-
-* Updated dependency information in `composer.json`
-
-## [5.2.7] - 2016-02-18
-
-### Changed
-
-* Improved the typography of the TestDox HTML report
-
-## [5.2.6] - 2016-02-16
-
-### Fixed
-
-* `PHPUnit_Framework_InvalidCoversTargetException` is now properly handled and results in a warning 
-
-## [5.2.5] - 2016-02-13
-
-### Fixed
-
-* Fixed [#2076](https://github.com/sebastianbergmann/phpunit/issues/2076): Code of custom comparators should not result in a test being marked as risky when PHPUnit is strict about @covers annotation usage
-
-## [5.2.4] - 2016-02-11
-
-### Fixed
-
-* Fixed [#2072](https://github.com/sebastianbergmann/phpunit/issues/2072): Paths in XML configuration file were not handled correctly when they have whitespace around them
-
-## [5.2.3] - 2016-02-08
-
-### Removed
-
-* Removed the implementation of [#1899](https://github.com/sebastianbergmann/phpunit/issues/1899) due to a [bug](https://github.com/sebastianbergmann/php-code-coverage/issues/420) in PHP_CodeCoverage
-
-## [5.2.2] - 2016-02-07
-
-### Removed
-
-* Removed the implementation of [#1902](https://github.com/sebastianbergmann/phpunit/issues/1902) due to [#2042](https://github.com/sebastianbergmann/phpunit/issues/2042)
-
-## [5.2.1] - 2016-02-05
-
-### Fixed
-
-* Fixed [#2060](https://github.com/sebastianbergmann/phpunit/issues/2060): Allow usage of `sebastian/version` in version 1
-
-## [5.2.0] - 2016-02-05
-
-### Added
-
-* Implemented [#1899](https://github.com/sebastianbergmann/phpunit/issues/1899): Mark a test as risky that does not execute the code it wants to test
-* Implemented [#1902](https://github.com/sebastianbergmann/phpunit/issues/1902): Mark a test as risky when it performs an assertion on a test double
-* Implemented [#1905](https://github.com/sebastianbergmann/phpunit/issues/1905): Add `--fail-on-risky` and `--fail-on-warning` commandline options as well as `failOnRisky` and `failOnWarning` configuration options
-* Implemented [#1912](https://github.com/sebastianbergmann/phpunit/issues/1912): Add support for specifying the extension version with the `@requires` annotation
-* Implemented [#1977](https://github.com/sebastianbergmann/phpunit/issues/1977): Add support for disabling annotations that control the ignoring of code coverage
-* Added `PHPUnit_Framework_TestCase::expectException()`, `PHPUnit_Framework_TestCase::expectExceptionCode()`, `PHPUnit_Framework_TestCase::expectExceptionMessage()`, and `PHPUnit_Framework_TestCase::expectExceptionMessageRegExp()` for programmatically setting expectations for exceptions
-
-### Changed
-
-* Deprecated `PHPUnit_Framework_TestCase::setExpectedException()`
-* Deprecated the `checkForUnintentionallyCoveredCode` configuration setting (use `beStrictAboutCoversAnnotation` instead)
-
-### Removed
-
-* The `mapTestClassNameToCoveredClassName` configuration setting has been removed
-
-[5.2.12]: https://github.com/sebastianbergmann/phpunit/compare/5.2.11...5.2.12
-[5.2.11]: https://github.com/sebastianbergmann/phpunit/compare/5.2.10...5.2.11
-[5.2.10]: https://github.com/sebastianbergmann/phpunit/compare/5.2.9...5.2.10
-[5.2.9]: https://github.com/sebastianbergmann/phpunit/compare/5.2.8...5.2.9
-[5.2.8]: https://github.com/sebastianbergmann/phpunit/compare/5.2.7...5.2.8
-[5.2.7]: https://github.com/sebastianbergmann/phpunit/compare/5.2.6...5.2.7
-[5.2.6]: https://github.com/sebastianbergmann/phpunit/compare/5.2.5...5.2.6
-[5.2.5]: https://github.com/sebastianbergmann/phpunit/compare/5.2.4...5.2.5
-[5.2.4]: https://github.com/sebastianbergmann/phpunit/compare/5.2.3...5.2.4
-[5.2.3]: https://github.com/sebastianbergmann/phpunit/compare/5.2.2...5.2.3
-[5.2.2]: https://github.com/sebastianbergmann/phpunit/compare/5.2.1...5.2.2
-[5.2.1]: https://github.com/sebastianbergmann/phpunit/compare/5.2.0...5.2.1
-[5.2.0]: https://github.com/sebastianbergmann/phpunit/compare/5.1...5.2.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-5.3.md b/vendor/phpunit/phpunit/ChangeLog-5.3.md
deleted file mode 100644
index 87c657be..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-5.3.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Changes in PHPUnit 5.3
-
-All notable changes of the PHPUnit 5.3 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [5.3.5] - 2016-06-03
-
-### Fixed
-
-* Fixed [phpunit-mock-objects/#308](https://github.com/sebastianbergmann/phpunit-mock-objects/issues/308): Make sure that PHPUnit 5.3 does not pull in PHPUnit 5.4 dependencies
-
-## [5.3.4] - 2016-05-11
-
-### Changed
-
-* The checks that can be enabled by `--strict-coverage` and `beStrictAboutCoversAnnotation` are no longer performed for tests annotated with `@medium` or `@large`
-
-## [5.3.3] - 2016-05-10
-
-### Fixed
-
-* Fixed [#2158](https://github.com/sebastianbergmann/phpunit/issues/2158): Failure to run tests in separate processes if a file included into main process contains constant definition
-
-## [5.3.2] - 2016-04-12
-
-### Fixed
-
-* Fixed [#2134](https://github.com/sebastianbergmann/phpunit/issues/2134): Failures are not shown when there are warnings
-* Fixed [phpunit-mock-objects/#301](https://github.com/sebastianbergmann/phpunit-mock-objects/issues/301): `PHPUnit_Framework_MockObject_MockBuilder::getMock()` calls `PHPUnit_Framework_TestCase::getMock()` with more arguments than accepted
-
-## [5.3.1] - 2016-04-07
-
-### Fixed
-
-* Fixed [#2128](https://github.com/sebastianbergmann/phpunit/issues/2128): PHPUnit 5.3 50% slower than PHPUnit 5.2 (when using large data sets with `@dataProvider`)
-
-## [5.3.0] - 2016-04-01
-
-### Added
-
-* Implemented [#1984](https://github.com/sebastianbergmann/phpunit/issues/1984): Support for comparison operators to `@requires` annotation
-* Added `--generate-configuration` option to generate an XML configuration file with suggested settings
-
-### Changed
-
-* In strict coverage mode, a test will now be marked as risky when it does not have a `@covers` annotation but is supposed to have one
-* The passing of test doubles from one test to another has been improved
-* Implemented [phpunit-mock-objects/#296](https://github.com/sebastianbergmann/phpunit-mock-objects/issues/296): Trigger an error when final or private method is configured on a test double
-
-[5.3.5]: https://github.com/sebastianbergmann/phpunit/compare/5.3.4...5.3.5
-[5.3.4]: https://github.com/sebastianbergmann/phpunit/compare/5.3.3...5.3.4
-[5.3.3]: https://github.com/sebastianbergmann/phpunit/compare/5.3.2...5.3.3
-[5.3.2]: https://github.com/sebastianbergmann/phpunit/compare/5.3.1...5.3.2
-[5.3.1]: https://github.com/sebastianbergmann/phpunit/compare/5.3.0...5.3.1
-[5.3.0]: https://github.com/sebastianbergmann/phpunit/compare/5.2...5.3.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-5.4.md b/vendor/phpunit/phpunit/ChangeLog-5.4.md
deleted file mode 100644
index dfbc9e21..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-5.4.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# Changes in PHPUnit 5.4
-
-All notable changes of the PHPUnit 5.4 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [5.4.8] - 2016-07-26
-
-### Changed
-
-* Bumped required version of `phpunit/php-code-coverage` to `4.0.1`
-
-## [5.4.7] - 2016-07-21
-
-### Fixed
-
-* Fixed [#1968](https://github.com/sebastianbergmann/phpunit/issues/1968): Invalid data sets are not handled correctly for `@testWith` annotation
-* Fixed [#2200](https://github.com/sebastianbergmann/phpunit/issues/2200): No warnings when test runs in separate process
-* Fixed [#2221](https://github.com/sebastianbergmann/phpunit/issues/2221): `expectException()` accepts non-string argument
-
-## [5.4.6] - 2016-06-16
-
-### Fixed
-
-* Fixed [#2219](https://github.com/sebastianbergmann/phpunit/issues/2219): PHAR does not contain all dependencies
-
-## [5.4.5] - 2016-06-15
-
-### Fixed
-
-* Fixed [#2181](https://github.com/sebastianbergmann/phpunit/issues/2181): Use `setlocale()` with `0` as second argument to not affect current setting
-* Fixed [#2211](https://github.com/sebastianbergmann/phpunit/issues/2211): Correctly handle paths to PHP binary that contain spaces (`C:\Program Files`) on Microsoft Windows
-
-## [5.4.4] - 2016-06-09
-
-### Fixed
-
-* Blacklisted phpdocumentor/reflection-docblock 3.0.2 due to https://github.com/phpDocumentor/ReflectionDocBlock/pull/77
-
-## [5.4.3] - 2016-06-09
-
-### Changed
-
-* Renamed `phpunit\framework\TestCase` to `PHPUnit\Framework\TestCase`
-
-## [5.4.2] - 2016-06-03
-
-### Fixed
-
-* Reverted the JUnit XML logfile format change to restore backward compatibility
-
-## [5.4.1] - 2016-06-03
-
-### Fixed
-
-* Fixed [#2186](https://github.com/sebastianbergmann/phpunit/issues/2186): `PHPUnit_Framework_TestCase::getMockBuilder()` should be `public`, not `protected` 
-
-## [5.4.0] - 2016-06-03
-
-### Added
-
-* Implemented [#2037](https://github.com/sebastianbergmann/phpunit/issues/2037): Log more information about failures in JSON output
-* Implemented [#2152](https://github.com/sebastianbergmann/phpunit/issues/2152): Filter for which tests TestDox output is generated
-* Added the `PHPUnit\Framework\TestCase::createMock()` method for creating test doubles using best practice defaults
-* Added `registerMockObjectsFromTestArgumentsRecursively` configuration directive for optionally registering mock objects from test arguments recursively
-* Added support for the `ENV`, `STDIN`, `ARGS`, `FILEEOF`, `FILE_EXTERNAL`, `EXPECT_EXTERNAL`, `EXPECTF_EXTERNAL`, `EXPECTREGEX_EXTERNAL`, and `XFAIL` sections to PHPT test runner
-* Added TestDox XML logger
-* Added `phpunit\framework\TestCase` as an alias for `PHPUnit_Framework_TestCase` for forward compatibility
-
-### Changed
-
-* The `PHPUnit_Framework_TestCase::getMock()` method has been deprecated. Please use `PHPUnit_Framework_TestCase::createMock()` or `PHPUnit_Framework_TestCase::getMockBuilder()` instead.
-* The `PHPUnit_Framework_TestCase::getMockWithoutInvokingTheOriginalConstructor()` method has been deprecated. Please use `PHPUnit_Framework_TestCase::createMock()` instead.
-* The logfile format generated using the `--log-junit` option and the `<log type="junit" target="..."/>` configuration directive has been updated to match the [current format used by JUnit](http://llg.cubic.org/docs/junit/). Due to this change you may need to update how your continuous integration server processes test result logfiles generated by PHPUnit.
-* The methods `PHPUnit_Framework_TestCase::getMockBuilder()`, `PHPUnit_Framework_TestCase::createTestDouble()`, `PHPUnit_Framework_TestCase::getMock()`, `PHPUnit_Framework_TestCase::getMockWithoutInvokingTheOriginalConstructor()`, `PHPUnit_Framework_TestCase::getMockForAbstractClass()` and `PHPUnit_Framework_TestCase::getMockForTrait()` are now protected (they were public before).
-
-[5.4.8]: https://github.com/sebastianbergmann/phpunit/compare/5.4.7...5.4.8
-[5.4.7]: https://github.com/sebastianbergmann/phpunit/compare/5.4.6...5.4.7
-[5.4.6]: https://github.com/sebastianbergmann/phpunit/compare/5.4.5...5.4.6
-[5.4.5]: https://github.com/sebastianbergmann/phpunit/compare/5.4.4...5.4.5
-[5.4.4]: https://github.com/sebastianbergmann/phpunit/compare/5.4.3...5.4.4
-[5.4.3]: https://github.com/sebastianbergmann/phpunit/compare/5.4.2...5.4.3
-[5.4.2]: https://github.com/sebastianbergmann/phpunit/compare/5.4.1...5.4.2
-[5.4.1]: https://github.com/sebastianbergmann/phpunit/compare/5.4.0...5.4.1
-[5.4.0]: https://github.com/sebastianbergmann/phpunit/compare/5.3...5.4.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-5.5.md b/vendor/phpunit/phpunit/ChangeLog-5.5.md
deleted file mode 100644
index 841bdb63..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-5.5.md
+++ /dev/null
@@ -1,74 +0,0 @@
-# Changes in PHPUnit 5.5
-
-All notable changes of the PHPUnit 5.5 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [5.5.7] - 2016-10-03
-
-### Changed
-
-* Reverted [#2300](https://github.com/sebastianbergmann/phpunit/issues/2300): Exclude tests from package distribution
-
-## [5.5.6] - 2016-10-03
-
-### Changed
-
-* Implemented [#2300](https://github.com/sebastianbergmann/phpunit/issues/2300): Exclude tests from package distribution
-
-### Fixed
-
-* Fixed [#2261](https://github.com/sebastianbergmann/phpunit/issues/2261): Invalid test listener configuration leads to confusing behavior
-* Fixed [#2309](https://github.com/sebastianbergmann/phpunit/pull/2309): `PHPUnit\Framework\TestCase` is not declared `abstract`
-
-## [5.5.5] - 2016-09-21
-
-### Fixed
-
-* Fixed [#2101](https://github.com/sebastianbergmann/phpunit/issues/2101): Output Buffer Level consumption prevents custom output buffers from working
-
-## [5.5.4] - 2016-08-26
-
-New release of PHPUnit as PHAR with updated dependencies
-
-## [5.5.3] - 2016-08-25
-
-### Fixed
-
-* Fixed [#2270](https://github.com/sebastianbergmann/phpunit/pull/2270): Allow `createPartialMock()` to not mock any methods
-
-## [5.5.2] - 2016-08-18
-
-### Changed
-
-* The JUnit logger no longer uses `<warning>` elements when the `logIncompleteSkipped` configuration option is set to `false` (default)
-
-### Fixed
-
-* Restored the `logIncompleteSkipped` configuration option for the JUnit logger that got lost in PHPUnit 5.4.2
-
-## [5.5.1] - 2016-08-17
-
-### Fixed
-
-* Fixed [#1961](https://github.com/sebastianbergmann/phpunit/issues/1961): XSD schema in 5.x does not validate
-* Incorrect warning about missing `@covers` annotation is no longer shown when `@coversNothing` is used together with `forceCoversAnnotation=true`
-
-## [5.5.0] - 2016-08-05
-
-### Added
-
-* Added the `PHPUnit\Framework\TestCase::createPartialMock()` method for creating partial test doubles using best practice defaults
-* Merged [#2203](https://github.com/sebastianbergmann/phpunit/pull/2203): Ability to `--list-suites` for a given configuration
-
-### Changed
-
-* An `AssertionError` raised by an `assert()` in the tested code now causes the test to be interpreted as a failure instead of an error
-
-[5.5.7]: https://github.com/sebastianbergmann/phpunit/compare/5.5.6...5.5.7
-[5.5.6]: https://github.com/sebastianbergmann/phpunit/compare/5.5.5...5.5.6
-[5.5.5]: https://github.com/sebastianbergmann/phpunit/compare/5.5.4...5.5.5
-[5.5.4]: https://github.com/sebastianbergmann/phpunit/compare/5.5.3...5.5.4
-[5.5.3]: https://github.com/sebastianbergmann/phpunit/compare/5.5.2...5.5.3
-[5.5.2]: https://github.com/sebastianbergmann/phpunit/compare/5.5.1...5.5.2
-[5.5.1]: https://github.com/sebastianbergmann/phpunit/compare/5.5.0...5.5.1
-[5.5.0]: https://github.com/sebastianbergmann/phpunit/compare/5.4...5.5.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-5.6.md b/vendor/phpunit/phpunit/ChangeLog-5.6.md
deleted file mode 100644
index 213ee512..00000000
--- a/vendor/phpunit/phpunit/ChangeLog-5.6.md
+++ /dev/null
@@ -1,79 +0,0 @@
-# Changes in PHPUnit 5.6
-
-All notable changes of the PHPUnit 5.6 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
-
-## [5.6.8] - 2016-12-02
-
-### Fixed
-
-* Fixed [#1976](https://github.com/sebastianbergmann/phpunit/issues/1976): `str_repeat()` error when using lowest dependencies
-
-## [5.6.7] - 2016-11-28
-
-### Changed
-
-* The logic for not performing the check for unintentionally covered code on `@medium` and `@large` tests has been moved to `php-code-coverage`
-
-## [5.6.6] - 2016-11-28
-
-### Fixed
-
-* Fixed [#2367](https://github.com/sebastianbergmann/phpunit/pull/2367): Bug in `PHPUnit_Util_Test::parseAnnotationContent()`
-* Fixed [#2375](https://github.com/sebastianbergmann/phpunit/issues/2375): Invalid regular expression for `--filter` causes PHP warning
-
-## [5.6.5] - 2016-11-21
-
-### Fixed
-
-* Fixed [#2366](https://github.com/sebastianbergmann/phpunit/issues/2366): Using a test double from a data provider only works once
-
-### Changed
-
-Bumped the required versions of `sebastian/comparator`, `sebastian/exporter`, and `sebastian/enumerator`
-
-## [5.6.4] - 2016-11-18
-
-### Fixed
-
-* Fixed [#2361](https://github.com/sebastianbergmann/phpunit/issues/2361): Conflict with newer versions of `sebastian/recursion-context`
-
-## [5.6.3] - 2016-11-14
-
-### Fixed
-
-* Improved the fix for [#1955](https://github.com/sebastianbergmann/phpunit/issues/1955): Process isolation fails when running tests with `phpdbg -qrr`
-
-## [5.6.2] - 2016-10-25
-
-New PHAR release due to updated dependencies
-
-## [5.6.1] - 2016-10-07
-
-### Fixed
-
-* Fixed [#2320](https://github.com/sebastianbergmann/phpunit/issues/2320): Conflict between `PHPUnit_Framework_TestCase::getDataSet()` and `PHPUnit_Extensions_Database_TestCase::getDataSet()`
-
-## [5.6.0] - 2016-10-07
-
-### Added
-
-* Merged [#2240](https://github.com/sebastianbergmann/phpunit/pull/2240): Provide access to a test case's data set (for use in `setUp()`, for instance)
-* Merged [#2262](https://github.com/sebastianbergmann/phpunit/pull/2262): Add the `PHPUnit_Framework_Constraint_DirectoryExists`, `PHPUnit_Framework_Constraint_IsReadable`, and `PHPUnit_Framework_Constraint_IsWritable` constraints as well as the `assertIsReadable()`, `assertNotIsReadable()`, `assertIsWritable()`, `assertNotIsWritable()`, `assertDirectoryExists()`, `assertDirectoryNotExists()`, `assertDirectoryIsReadable()`, `assertDirectoryNotIsReadable()`, `assertDirectoryIsWritable()`, `assertDirectoryNotIsWritable()`, `assertFileIsReadable()`, `assertFileNotIsReadable()`, `assertFileIsWritable()`, and `assertFileNotIsWritable()` assertions
-* Added `PHPUnit\Framework\TestCase::createConfiguredMock()` based on [idea](https://twitter.com/kriswallsmith/status/763550169090625536) by Kris Wallsmith
-* Added the `@doesNotPerformAssertions` annotation for excluding a test from the "useless test" risky test check
-
-### Changed
-
-* Deprecated `PHPUnit\Framework\TestCase::setExpectedExceptionRegExp()`
-* `PHPUnit_Util_Printer` no longer optionally cleans up HTML output using `ext/tidy`
-
-[5.6.8]: https://github.com/sebastianbergmann/phpunit/compare/5.6.7...5.6.8
-[5.6.7]: https://github.com/sebastianbergmann/phpunit/compare/5.6.6...5.6.7
-[5.6.6]: https://github.com/sebastianbergmann/phpunit/compare/5.6.5...5.6.6
-[5.6.5]: https://github.com/sebastianbergmann/phpunit/compare/5.6.4...5.6.5
-[5.6.4]: https://github.com/sebastianbergmann/phpunit/compare/5.6.3...5.6.4
-[5.6.3]: https://github.com/sebastianbergmann/phpunit/compare/5.6.2...5.6.3
-[5.6.2]: https://github.com/sebastianbergmann/phpunit/compare/5.6.1...5.6.2
-[5.6.1]: https://github.com/sebastianbergmann/phpunit/compare/5.6.0...5.6.1
-[5.6.0]: https://github.com/sebastianbergmann/phpunit/compare/5.5...5.6.0
-
diff --git a/vendor/phpunit/phpunit/ChangeLog-5.7.md b/vendor/phpunit/phpunit/ChangeLog-5.7.md
index 9042befe..c8c77874 100644
--- a/vendor/phpunit/phpunit/ChangeLog-5.7.md
+++ b/vendor/phpunit/phpunit/ChangeLog-5.7.md
@@ -2,6 +2,40 @@
 
 All notable changes of the PHPUnit 5.7 release series are documented in this file using the [Keep a CHANGELOG](http://keepachangelog.com/) principles.
 
+## [5.7.27] - 2018-02-01
+
+### Fixed
+
+* Fixed [#2236](https://github.com/sebastianbergmann/phpunit/issues/2236): Exceptions in `tearDown()` do not affect `getStatus()`
+* Fixed [#2950](https://github.com/sebastianbergmann/phpunit/issues/2950): Class extending `PHPUnit\Framework\TestSuite` does not extend `PHPUnit\FrameworkTestCase`
+* Fixed [#2972](https://github.com/sebastianbergmann/phpunit/issues/2972): PHPUnit crashes when test suite contains both `.phpt` files and unconventionally named tests
+
+## [5.7.26] - 2017-12-17
+
+### Fixed
+
+* Fixed [#2472](https://github.com/sebastianbergmann/phpunit/issues/2472): `PHPUnit\Util\Getopt` uses deprecated `each()` function
+* Fixed [#2833](https://github.com/sebastianbergmann/phpunit/issues/2833): Test class loaded during data provider execution is not discovered
+* Fixed [#2922](https://github.com/sebastianbergmann/phpunit/issues/2922): Test class is not discovered when there is a test class with `@group` and provider throwing exception in it, tests are run with `--exclude-group` for that group, there is another class called later (after the class from above), and the name of that another class does not match its filename
+
+## [5.7.25] - 2017-11-14
+
+### Fixed
+
+* Fixed [#2859](https://github.com/sebastianbergmann/phpunit/issues/2859): Regression caused by fix for [#2833](https://github.com/sebastianbergmann/phpunit/issues/2833)
+
+## [5.7.24] - 2017-11-14
+
+### Fixed
+
+* Fixed [#2833](https://github.com/sebastianbergmann/phpunit/issues/2833): Test class loaded during data provider execution is not discovered
+
+## [5.7.23] - 2017-10-15
+
+### Fixed
+
+* Fixed [#2731](https://github.com/sebastianbergmann/phpunit/issues/2731): Empty exception message cannot be expected
+
 ## [5.7.22] - 2017-09-24
 
 ### Fixed
@@ -177,6 +211,11 @@ All notable changes of the PHPUnit 5.7 release series are documented in this fil
 * The `--tap` and `--log-tap` commandline options have been deprecated
 * The `--self-update` and `--self-upgrade` commandline options have been deprecated (PHAR binary only)
 
+[5.7.27]: https://github.com/sebastianbergmann/phpunit/compare/5.7.26...5.7.27
+[5.7.26]: https://github.com/sebastianbergmann/phpunit/compare/5.7.25...5.7.26
+[5.7.25]: https://github.com/sebastianbergmann/phpunit/compare/5.7.24...5.7.25
+[5.7.24]: https://github.com/sebastianbergmann/phpunit/compare/5.7.23...5.7.24
+[5.7.23]: https://github.com/sebastianbergmann/phpunit/compare/5.7.22...5.7.23
 [5.7.22]: https://github.com/sebastianbergmann/phpunit/compare/5.7.21...5.7.22
 [5.7.21]: https://github.com/sebastianbergmann/phpunit/compare/5.7.20...5.7.21
 [5.7.20]: https://github.com/sebastianbergmann/phpunit/compare/5.7.19...5.7.20
diff --git a/vendor/phpunit/phpunit/LICENSE b/vendor/phpunit/phpunit/LICENSE
index c9d881fc..faba2668 100644
--- a/vendor/phpunit/phpunit/LICENSE
+++ b/vendor/phpunit/phpunit/LICENSE
@@ -1,6 +1,6 @@
 PHPUnit
 
-Copyright (c) 2001-2017, Sebastian Bergmann <sebastian@xxxxxxxxxx>.
+Copyright (c) 2001-2018, Sebastian Bergmann <sebastian@xxxxxxxxxx>.
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/vendor/phpunit/phpunit/composer.json b/vendor/phpunit/phpunit/composer.json
index d0555853..53bd8bbc 100644
--- a/vendor/phpunit/phpunit/composer.json
+++ b/vendor/phpunit/phpunit/composer.json
@@ -28,7 +28,7 @@
         "phpunit/php-timer": "^1.0.6",
         "phpunit/phpunit-mock-objects": "^3.2",
         "phpspec/prophecy": "^1.6.2",
-        "symfony/yaml": "~2.1|~3.0",
+        "symfony/yaml": "~2.1|~3.0|~4.0",
         "sebastian/comparator": "^1.2.4",
         "sebastian/diff": "^1.4.3",
         "sebastian/environment": "^1.3.4 || ^2.0",
@@ -36,7 +36,7 @@
         "sebastian/global-state": "^1.1",
         "sebastian/object-enumerator": "~2.0",
         "sebastian/resource-operations": "~1.0",
-        "sebastian/version": "~1.0.3|~2.0",
+        "sebastian/version": "^1.0.6|^2.0.1",
         "myclabs/deep-copy": "~1.3",
         "ext-dom": "*",
         "ext-json": "*",
diff --git a/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php b/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php
index d11cebee..d2047e94 100644
--- a/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php
+++ b/vendor/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php
@@ -34,6 +34,10 @@ class PHPUnit_Framework_Constraint_ExceptionMessage extends PHPUnit_Framework_Co
      */
     protected function matches($other)
     {
+        if ($this->expectedMessage === '') {
+            return $other->getMessage() === '';
+        }
+
         return strpos($other->getMessage(), $this->expectedMessage) !== false;
     }
 
@@ -49,6 +53,13 @@ class PHPUnit_Framework_Constraint_ExceptionMessage extends PHPUnit_Framework_Co
      */
     protected function failureDescription($other)
     {
+        if ($this->expectedMessage === '') {
+            return sprintf(
+                "exception message is empty but is '%s'",
+                $other->getMessage()
+            );
+        }
+
         return sprintf(
             "exception message '%s' contains '%s'",
             $other->getMessage(),
@@ -61,6 +72,10 @@ class PHPUnit_Framework_Constraint_ExceptionMessage extends PHPUnit_Framework_Co
      */
     public function toString()
     {
+        if ($this->expectedMessage === '') {
+            return 'exception message is empty';
+        }
+
         return 'exception message contains ';
     }
 }
diff --git a/vendor/phpunit/phpunit/src/Framework/TestCase.php b/vendor/phpunit/phpunit/src/Framework/TestCase.php
index 24037478..bb3e8705 100644
--- a/vendor/phpunit/phpunit/src/Framework/TestCase.php
+++ b/vendor/phpunit/phpunit/src/Framework/TestCase.php
@@ -141,21 +141,21 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple
      *
      * @var string
      */
-    private $expectedExceptionMessage = '';
+    private $expectedExceptionMessage = null;
 
     /**
      * The regex pattern to validate the expected Exception message.
      *
      * @var string
      */
-    private $expectedExceptionMessageRegExp = '';
+    private $expectedExceptionMessageRegExp = null;
 
     /**
      * The code of the expected Exception.
      *
      * @var int|string
      */
-    private $expectedExceptionCode;
+    private $expectedExceptionCode = null;
 
     /**
      * The name of the test case.
@@ -190,7 +190,7 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple
     private $mockObjects = [];
 
     /**
-     * @var array
+     * @var MockGenerator
      */
     private $mockObjectGenerator = null;
 
@@ -510,8 +510,8 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple
 
     /**
      * @param mixed      $exception
-     * @param string     $message
-     * @param int|string $code
+     * @param string     $message   Null means we do not check message at all, string (even empty) means we do. Default: null.
+     * @param int|string $code      Null means we do not check code at all, non-null means we do.
      *
      * @throws PHPUnit_Framework_Exception
      *
@@ -519,9 +519,17 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple
      */
     public function setExpectedException($exception, $message = '', $code = null)
     {
+        if (null !== $message && !is_string($message)) {
+            throw PHPUnit_Util_InvalidArgumentHelper::factory(2, 'string');
+        }
+
+        if (func_num_args() < 2) {
+            $message = null;
+        }
+
         $this->expectedException = $exception;
 
-        if ($message !== null && $message !== '') {
+        if ($message !== null) {
             $this->expectExceptionMessage($message);
         }
 
@@ -937,11 +945,6 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple
             $e = $_e;
         }
 
-        if (isset($_e)) {
-            $this->status        = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
-            $this->statusMessage = $_e->getMessage();
-        }
-
         // Clean up the mock objects.
         $this->mockObjects = [];
         $this->prophet     = null;
@@ -978,6 +981,11 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple
             }
         }
 
+        if (isset($_e)) {
+            $this->status        = PHPUnit_Runner_BaseTestRunner::STATUS_ERROR;
+            $this->statusMessage = $_e->getMessage();
+        }
+
         clearstatcache();
 
         if ($currentWorkingDirectory != getcwd()) {
@@ -1085,8 +1093,7 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple
                     )
                 );
 
-                if (is_string($this->expectedExceptionMessage) &&
-                    !empty($this->expectedExceptionMessage)) {
+                if ($this->expectedExceptionMessage !== null) {
                     $this->assertThat(
                         $e,
                         new PHPUnit_Framework_Constraint_ExceptionMessage(
@@ -1095,8 +1102,7 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple
                     );
                 }
 
-                if (is_string($this->expectedExceptionMessageRegExp) &&
-                    !empty($this->expectedExceptionMessageRegExp)) {
+                if ($this->expectedExceptionMessageRegExp !== null) {
                     $this->assertThat(
                         $e,
                         new PHPUnit_Framework_Constraint_ExceptionMessageRegExp(
@@ -2124,7 +2130,7 @@ abstract class PHPUnit_Framework_TestCase extends PHPUnit_Framework_Assert imple
     /**
      * Performs assertions shared by all tests of a test case.
      *
-     * This method is called before the execution of a test ends
+     * This method is called after the execution of a test ends
      * and before tearDown() is called.
      */
     protected function assertPostConditions()
diff --git a/vendor/phpunit/phpunit/src/Framework/TestSuite.php b/vendor/phpunit/phpunit/src/Framework/TestSuite.php
index 6d5a3df9..0ed6be4f 100644
--- a/vendor/phpunit/phpunit/src/Framework/TestSuite.php
+++ b/vendor/phpunit/phpunit/src/Framework/TestSuite.php
@@ -88,6 +88,11 @@ class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Fra
     private $iteratorFilter = null;
 
     /**
+     * @var string[]
+     */
+    private $declaredClasses;
+
+    /**
      * Constructs a new TestSuite:
      *
      *   - PHPUnit_Framework_TestSuite() constructs an empty TestSuite.
@@ -111,6 +116,8 @@ class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Fra
      */
     public function __construct($theClass = '', $name = '')
     {
+        $this->declaredClasses = get_declared_classes();
+
         $argumentsValid = false;
 
         if (is_object($theClass) &&
@@ -270,7 +277,7 @@ class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Fra
                 }
             }
 
-            if (!$suiteMethod && !$testClass->isAbstract()) {
+            if (!$suiteMethod && !$testClass->isAbstract() && $testClass->isSubclassOf(PHPUnit_Framework_TestCase::class)) {
                 $this->addTest(new self($testClass));
             }
         } else {
@@ -306,9 +313,8 @@ class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Fra
 
         // The given file may contain further stub classes in addition to the
         // test class itself. Figure out the actual test class.
-        $classes    = get_declared_classes();
         $filename   = PHPUnit_Util_Fileloader::checkAndLoad($filename);
-        $newClasses = array_diff(get_declared_classes(), $classes);
+        $newClasses = array_diff(get_declared_classes(), $this->declaredClasses);
 
         // The diff is empty in case a parent class (with test methods) is added
         // AFTER a child class that inherited from it. To account for that case,
@@ -319,6 +325,7 @@ class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Fra
             // process discovered classes in approximate LIFO order, so as to
             // avoid unnecessary reflection.
             $this->foundClasses = array_merge($newClasses, $this->foundClasses);
+            $this->declaredClasses = get_declared_classes();
         }
 
         // The test class's name must match the filename, either in full, or as
@@ -341,6 +348,10 @@ class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Fra
         }
 
         foreach ($newClasses as $className) {
+            if (strpos($className, 'PHPUnit_Framework') === 0) {
+                continue;
+            }
+
             $class = new ReflectionClass($className);
 
             if (!$class->isAbstract()) {
@@ -713,7 +724,7 @@ class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Fra
 
             if ($test instanceof PHPUnit_Framework_TestCase ||
                 $test instanceof self) {
-                $test->setbeStrictAboutChangesToGlobalState($this->beStrictAboutChangesToGlobalState);
+                $test->setBeStrictAboutChangesToGlobalState($this->beStrictAboutChangesToGlobalState);
                 $test->setBackupGlobals($this->backupGlobals);
                 $test->setBackupStaticAttributes($this->backupStaticAttributes);
                 $test->setRunTestInSeparateProcess($this->runTestInSeparateProcess);
@@ -917,7 +928,7 @@ class PHPUnit_Framework_TestSuite implements PHPUnit_Framework_Test, PHPUnit_Fra
     /**
      * @param bool $beStrictAboutChangesToGlobalState
      */
-    public function setbeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState)
+    public function setBeStrictAboutChangesToGlobalState($beStrictAboutChangesToGlobalState)
     {
         if (is_null($this->beStrictAboutChangesToGlobalState) && is_bool($beStrictAboutChangesToGlobalState)) {
             $this->beStrictAboutChangesToGlobalState = $beStrictAboutChangesToGlobalState;
diff --git a/vendor/phpunit/phpunit/src/Framework/Warning.php b/vendor/phpunit/phpunit/src/Framework/Warning.php
index 96df3000..70ccf9a7 100644
--- a/vendor/phpunit/phpunit/src/Framework/Warning.php
+++ b/vendor/phpunit/phpunit/src/Framework/Warning.php
@@ -9,7 +9,7 @@
  */
 
 /**
- * Thrown when an there is a warning.
+ * Thrown when there is a warning.
  */
 class PHPUnit_Framework_Warning extends PHPUnit_Framework_Exception implements PHPUnit_Framework_SelfDescribing
 {
diff --git a/vendor/phpunit/phpunit/src/Runner/Version.php b/vendor/phpunit/phpunit/src/Runner/Version.php
index dcc65923..9fe325e6 100644
--- a/vendor/phpunit/phpunit/src/Runner/Version.php
+++ b/vendor/phpunit/phpunit/src/Runner/Version.php
@@ -30,7 +30,7 @@ class PHPUnit_Runner_Version
         }
 
         if (self::$version === null) {
-            $version       = new Version('5.7.22', dirname(dirname(__DIR__)));
+            $version       = new Version('5.7.27', dirname(dirname(__DIR__)));
             self::$version = $version->getVersion();
         }
 
diff --git a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php
index 6ba9840d..5e17a258 100644
--- a/vendor/phpunit/phpunit/src/TextUI/TestRunner.php
+++ b/vendor/phpunit/phpunit/src/TextUI/TestRunner.php
@@ -177,7 +177,7 @@ class PHPUnit_TextUI_TestRunner extends PHPUnit_Runner_BaseTestRunner
         }
 
         if ($arguments['beStrictAboutChangesToGlobalState'] === true) {
-            $suite->setbeStrictAboutChangesToGlobalState(true);
+            $suite->setBeStrictAboutChangesToGlobalState(true);
         }
 
         if (is_int($arguments['repeat'])) {
diff --git a/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php b/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php
index ad7d4304..e1d95724 100644
--- a/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php
+++ b/vendor/phpunit/phpunit/src/Util/ConfigurationGenerator.php
@@ -24,7 +24,7 @@ class PHPUnit_Util_ConfigurationGenerator
          beStrictAboutTestsThatDoNotTestAnything="true"
          beStrictAboutTodoAnnotatedTests="true"
          verbose="true">
-    <testsuite>
+    <testsuite name="default">
         <directory suffix="Test.php">{tests_directory}</directory>
     </testsuite>
 
diff --git a/vendor/phpunit/phpunit/src/Util/Getopt.php b/vendor/phpunit/phpunit/src/Util/Getopt.php
index dc3af7c4..894778d4 100644
--- a/vendor/phpunit/phpunit/src/Util/Getopt.php
+++ b/vendor/phpunit/phpunit/src/Util/Getopt.php
@@ -32,18 +32,24 @@ class PHPUnit_Util_Getopt
 
         reset($args);
 
-        while (list($i, $arg) = @each($args)) {
+        $args = array_map('trim', $args);
+
+        while (false !== $arg = current($args)) {
+            $i = key($args);
+            next($args);
             if ($arg == '') {
                 continue;
             }
 
             if ($arg == '--') {
                 $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
+
                 break;
             }
 
             if ($arg[0] != '-' || (strlen($arg) > 1 && $arg[1] == '-' && !$long_options)) {
                 $non_opts[] = $args[$i];
+
                 continue;
             } elseif (strlen($arg) > 1 && $arg[1] == '-') {
                 self::parseLongOption(
@@ -80,21 +86,18 @@ class PHPUnit_Util_Getopt
             }
 
             if (strlen($spec) > 1 && $spec[1] == ':') {
-                if (strlen($spec) > 2 && $spec[2] == ':') {
-                    if ($i + 1 < $argLen) {
-                        $opts[] = [$opt, substr($arg, $i + 1)];
-                        break;
-                    }
-                } else {
-                    if ($i + 1 < $argLen) {
-                        $opts[] = [$opt, substr($arg, $i + 1)];
-                        break;
-                    } elseif (list(, $opt_arg) = @each($args)) {
-                    } else {
+                if ($i + 1 < $argLen) {
+                    $opts[] = [$opt, substr($arg, $i + 1)];
+
+                    break;
+                }
+                if (!(strlen($spec) > 2 && $spec[2] == ':')) {
+                    if (false === $opt_arg = current($args)) {
                         throw new PHPUnit_Framework_Exception(
                             "option requires an argument -- $opt"
                         );
                     }
+                    next($args);
                 }
             }
 
@@ -134,10 +137,13 @@ class PHPUnit_Util_Getopt
 
             if (substr($long_opt, -1) == '=') {
                 if (substr($long_opt, -2) != '==') {
-                    if (!strlen($opt_arg) && !(list(, $opt_arg) = @each($args))) {
-                        throw new PHPUnit_Framework_Exception(
-                            "option --$opt requires an argument"
-                        );
+                    if (!strlen($opt_arg)) {
+                        if (false === $opt_arg = current($args)) {
+                            throw new PHPUnit_Framework_Exception(
+                                "option --$opt requires an argument"
+                            );
+                        }
+                        next($args);
                     }
                 }
             } elseif ($opt_arg) {
@@ -155,3 +161,4 @@ class PHPUnit_Util_Getopt
         throw new PHPUnit_Framework_Exception("unrecognized option --$opt");
     }
 }
+
diff --git a/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php b/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php
index d42f4086..399efb95 100644
--- a/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php
+++ b/vendor/phpunit/phpunit/src/Util/Log/TeamCity.php
@@ -322,9 +322,9 @@ class PHPUnit_Util_Log_TeamCity extends PHPUnit_TextUI_ResultPrinter
     {
         $message = '';
 
-        if (!$e instanceof PHPUnit_Framework_Exception) {
-            if (strlen(get_class($e)) != 0) {
-                $message = $message . get_class($e);
+        if ($e instanceof PHPUnit_Framework_ExceptionWrapper) {
+            if (strlen($e->getClassName()) != 0) {
+                $message = $message . $e->getClassName();
             }
 
             if (strlen($message) != 0 && strlen($e->getMessage()) != 0) {
diff --git a/vendor/phpunit/phpunit/tests/Framework/TestCaseTest.php b/vendor/phpunit/phpunit/tests/Framework/TestCaseTest.php
index b3a20b8c..ae2870cb 100644
--- a/vendor/phpunit/phpunit/tests/Framework/TestCaseTest.php
+++ b/vendor/phpunit/phpunit/tests/Framework/TestCaseTest.php
@@ -159,6 +159,7 @@ class Framework_TestCaseTest extends PHPUnit_Framework_TestCase
         $this->assertTrue($test->testSomething);
         $this->assertTrue($test->assertPostConditions);
         $this->assertTrue($test->tearDown);
+        $this->assertEquals(PHPUnit_Runner_BaseTestRunner::STATUS_ERROR, $test->getStatus());
     }
 
     public function testNoArgTestCasePasses()
diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/2811.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/2811.phpt
new file mode 100644
index 00000000..c179b12c
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/2811.phpt
@@ -0,0 +1,20 @@
+--TEST--
+GH-2811: expectExceptionMessage() does not work without expectException()
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = 'Issue2811Test';
+$_SERVER['argv'][3] = __DIR__ . '/2811/Issue2811Test.php';
+
+require __DIR__ . '/../../bootstrap.php';
+
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann and contributors.
+
+.                                                                   1 / 1 (100%)
+
+Time: %s, Memory: %s
+
+OK (1 test, 2 assertions)
diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/2811/Issue2811Test.php b/vendor/phpunit/phpunit/tests/Regression/GitHub/2811/Issue2811Test.php
new file mode 100644
index 00000000..20bb5703
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/2811/Issue2811Test.php
@@ -0,0 +1,10 @@
+<?php
+class Issue2811Test extends PHPUnit\Framework\TestCase
+{
+    public function testOne()
+    {
+        $this->expectExceptionMessage('hello');
+
+        throw new \Exception('hello');
+    }
+}
diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/2972.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/2972.phpt
new file mode 100644
index 00000000..a46ced14
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/2972.phpt
@@ -0,0 +1,18 @@
+--TEST--
+GH-2972: Test suite shouldn't fail when it contains both *.phpt files and unconventionally named tests
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = __DIR__ . '/2972/';
+
+require __DIR__ . '/../../bootstrap.php';
+PHPUnit_TextUI_Command::main();
+?>
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann and contributors.
+
+..                                                                  2 / 2 (100%)
+
+Time: %s, Memory: %s
+
+OK (2 tests, 2 assertions)
diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/2972/issue-2972-test.phpt b/vendor/phpunit/phpunit/tests/Regression/GitHub/2972/issue-2972-test.phpt
new file mode 100644
index 00000000..4d09cf5a
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/2972/issue-2972-test.phpt
@@ -0,0 +1,10 @@
+--TEST--
+Just a sample test for issue 2972, does not actually test anything
+--FILE--
+<?php
+echo "Hello world\n";
+?>
+===DONE===
+--EXPECT--
+Hello world
+===DONE===
diff --git a/vendor/phpunit/phpunit/tests/Regression/GitHub/2972/unconventiallyNamedIssue2972Test.php b/vendor/phpunit/phpunit/tests/Regression/GitHub/2972/unconventiallyNamedIssue2972Test.php
new file mode 100644
index 00000000..3fd57f01
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/Regression/GitHub/2972/unconventiallyNamedIssue2972Test.php
@@ -0,0 +1,13 @@
+<?php
+
+namespace Issue2972;
+
+use PHPUnit\Framework\TestCase;
+
+class Issue2972Test extends TestCase
+{
+    public function testHello()
+    {
+        $this->assertNotEmpty('Hello world!');
+    }
+}
diff --git a/vendor/phpunit/phpunit/tests/TextUI/dataprovider-issue-2833.phpt b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-issue-2833.phpt
new file mode 100644
index 00000000..63818985
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-issue-2833.phpt
@@ -0,0 +1,17 @@
+--TEST--
+phpunit ../_files/DataProviderIssue2833
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = __DIR__ . '/../_files/DataProviderIssue2833';
+
+require __DIR__ . '/../bootstrap.php';
+PHPUnit_TextUI_Command::main();
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann and contributors.
+
+..                                                                  2 / 2 (100%)
+
+Time: %s, Memory: %s
+
+OK (2 tests, 2 assertions)
diff --git a/vendor/phpunit/phpunit/tests/TextUI/dataprovider-issue-2859.phpt b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-issue-2859.phpt
new file mode 100644
index 00000000..34588209
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-issue-2859.phpt
@@ -0,0 +1,17 @@
+--TEST--
+phpunit -c ../_files/DataProviderIssue2859/phpunit.xml
+--FILE--
+<?php
+$_SERVER['argv'][1] = '-c';
+$_SERVER['argv'][2] = __DIR__ . '/../_files/DataProviderIssue2859/phpunit.xml';
+
+require __DIR__ . '/../bootstrap.php';
+PHPUnit_TextUI_Command::main();
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann and contributors.
+
+.                                                                   1 / 1 (100%)
+
+Time: %s, Memory: %s
+
+OK (1 test, 1 assertion)
diff --git a/vendor/phpunit/phpunit/tests/TextUI/dataprovider-issue-2922.phpt b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-issue-2922.phpt
new file mode 100644
index 00000000..3de85a9a
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/TextUI/dataprovider-issue-2922.phpt
@@ -0,0 +1,18 @@
+--TEST--
+phpunit --exclude-group=foo ../_files/DataProviderIssue2922
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--exclude-group=foo';
+$_SERVER['argv'][3] = __DIR__ . '/../_files/DataProviderIssue2922';
+
+require __DIR__ . '/../bootstrap.php';
+PHPUnit_TextUI_Command::main();
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann and contributors.
+
+.                                                                   1 / 1 (100%)
+
+Time: %s, Memory: %s
+
+OK (1 test, 1 assertion)
diff --git a/vendor/phpunit/phpunit/tests/TextUI/teamcity-inner-exceptions.phpt b/vendor/phpunit/phpunit/tests/TextUI/teamcity-inner-exceptions.phpt
new file mode 100644
index 00000000..17d769ae
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/TextUI/teamcity-inner-exceptions.phpt
@@ -0,0 +1,39 @@
+--TEST--
+phpunit --teamcity ExceptionStackTest ../_files/ExceptionStackTest.php
+--FILE--
+<?php
+$_SERVER['argv'][1] = '--no-configuration';
+$_SERVER['argv'][2] = '--teamcity';
+$_SERVER['argv'][3] = 'ExceptionStackTest';
+$_SERVER['argv'][4] = __DIR__ . '/../_files/ExceptionStackTest.php';
+
+require __DIR__ . '/../bootstrap.php';
+PHPUnit_TextUI_Command::main();
+--EXPECTF--
+PHPUnit %s by Sebastian Bergmann and contributors.
+
+
+##teamcity[testCount count='2' flowId='%d']
+
+##teamcity[testSuiteStarted name='ExceptionStackTest' locationHint='php_qn://%s/tests/_files/ExceptionStackTest.php::\ExceptionStackTest' flowId='%d']
+
+##teamcity[testStarted name='testPrintingChildException' locationHint='php_qn://%s/tests/_files/ExceptionStackTest.php::\ExceptionStackTest::testPrintingChildException' flowId='%d']
+
+##teamcity[testFailed name='testPrintingChildException' message='Child exception|nmessage|nFailed asserting that two arrays are equal.|n--- Expected|n+++ Actual|n@@ @@|n Array (|n-    0 => 1|n+    0 => 2|n )|n' details=' %s/tests/_files/ExceptionStackTest.php:10|n |n Caused by|n message|n Failed asserting that two arrays are equal.|n --- Expected|n +++ Actual|n @@ @@|n  Array (|n -    0 => 1|n +    0 => 2|n  )|n |n %s/tests/_files/ExceptionStackTest.php:7|n ' flowId='%d']
+
+##teamcity[testFinished name='testPrintingChildException' duration='%d' flowId='%d']
+
+##teamcity[testStarted name='testNestedExceptions' locationHint='php_qn://%s/tests/_files/ExceptionStackTest.php::\ExceptionStackTest::testNestedExceptions' flowId='%d']
+
+##teamcity[testFailed name='testNestedExceptions' message='Exception : One' details=' %s/tests/_files/ExceptionStackTest.php:18|n ' flowId='%d']
+
+##teamcity[testFinished name='testNestedExceptions' duration='%d' flowId='%d']
+
+##teamcity[testSuiteFinished name='ExceptionStackTest' flowId='%d']
+
+
+Time: %s, Memory: %s
+
+
+ERRORS!
+Tests: 2, Assertions: 1, Errors: 2.
\ No newline at end of file
diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/FirstTest.php b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/FirstTest.php
new file mode 100644
index 00000000..741aabf5
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/FirstTest.php
@@ -0,0 +1,23 @@
+<?php
+
+namespace Foo\DataProviderIssue2833;
+
+use PHPUnit\Framework\TestCase;
+
+class FirstTest extends TestCase
+{
+    /**
+     * @dataProvider provide
+     */
+    public function testFirst($x)
+    {
+        $this->assertTrue(true);
+    }
+
+    public function provide()
+    {
+        SecondTest::DUMMY;
+
+        return [[true]];
+    }
+}
diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/SecondTest.php b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/SecondTest.php
new file mode 100644
index 00000000..86adb28b
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2833/SecondTest.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Foo\DataProviderIssue2833;
+
+use PHPUnit\Framework\TestCase;
+
+class SecondTest extends TestCase
+{
+    const DUMMY = 'dummy';
+
+    public function testSecond()
+    {
+        $this->assertTrue(true);
+    }
+}
diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2859/phpunit.xml b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2859/phpunit.xml
new file mode 100644
index 00000000..1e47e512
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2859/phpunit.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit>
+    <testsuites>
+        <testsuite name="Test Suite">
+            <directory>./tests/</directory>
+            <directory>./tests/*/</directory>
+        </testsuite>
+    </testsuites>
+</phpunit>
diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2859/tests/another/TestWithDataProviderTest.php b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2859/tests/another/TestWithDataProviderTest.php
new file mode 100644
index 00000000..4bffb49a
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2859/tests/another/TestWithDataProviderTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Foo\DataProviderIssue2859;
+
+use PHPUnit\Framework\TestCase;
+
+class TestWithDataProviderTest extends TestCase
+{
+    /**
+     * @dataProvider provide
+     */
+    public function testFirst($x)
+    {
+        $this->assertTrue(true);
+    }
+
+    public function provide()
+    {
+        return [[true]];
+    }
+}
diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/FirstTest.php b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/FirstTest.php
new file mode 100644
index 00000000..8b3302ca
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/FirstTest.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace Foo\DataProviderIssue2922;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @group foo
+ */
+class FirstTest extends TestCase
+{
+    /**
+     * @dataProvider provide
+     */
+    public function testFirst($x)
+    {
+        $this->assertTrue(true);
+    }
+
+    public function provide()
+    {
+        throw new \Exception();
+    }
+}
diff --git a/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/SecondTest.php b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/SecondTest.php
new file mode 100644
index 00000000..570ae560
--- /dev/null
+++ b/vendor/phpunit/phpunit/tests/_files/DataProviderIssue2922/SecondTest.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace Foo\DataProviderIssue2922;
+
+use PHPUnit\Framework\TestCase;
+
+// the name of the class cannot match file name - if they match all is fine
+class SecondHelloWorldTest extends TestCase
+{
+    public function testSecond()
+    {
+        $this->assertTrue(true);
+    }
+}
diff --git a/vendor/pimple/pimple/CHANGELOG b/vendor/pimple/pimple/CHANGELOG
index f277b969..ba56760c 100644
--- a/vendor/pimple/pimple/CHANGELOG
+++ b/vendor/pimple/pimple/CHANGELOG
@@ -1,3 +1,7 @@
+* 3.2.3 (2017-XX-XX)
+
+ * n/a
+
 * 3.2.2 (2017-07-23)
 
  * reverted extending a protected closure throws an exception (deprecated it instead)
diff --git a/vendor/pimple/pimple/README.rst b/vendor/pimple/pimple/README.rst
index d27d8aa3..a03b6d3a 100644
--- a/vendor/pimple/pimple/README.rst
+++ b/vendor/pimple/pimple/README.rst
@@ -108,7 +108,7 @@ If you change the ``session_storage`` service definition like below:
     };
 
 You can now easily change the cookie name by overriding the
-``session_storage_class`` parameter instead of redefining the service
+``cookie_name`` parameter instead of redefining the service
 definition.
 
 Protecting Parameters
diff --git a/vendor/pimple/pimple/ext/pimple/php_pimple.h b/vendor/pimple/pimple/ext/pimple/php_pimple.h
index 258f3eea..eed7c173 100644
--- a/vendor/pimple/pimple/ext/pimple/php_pimple.h
+++ b/vendor/pimple/pimple/ext/pimple/php_pimple.h
@@ -41,7 +41,7 @@ extern zend_module_entry pimple_module_entry;
 #include "TSRM.h"
 #endif
 
-#define PIMPLE_VERSION "3.2.2-DEV"
+#define PIMPLE_VERSION "3.2.3-DEV"
 
 #define PIMPLE_NS "Pimple"
 #define PSR_CONTAINER_NS "Psr\\Container"
diff --git a/vendor/pimple/pimple/src/Pimple/Container.php b/vendor/pimple/pimple/src/Pimple/Container.php
index e761964b..707b92b8 100644
--- a/vendor/pimple/pimple/src/Pimple/Container.php
+++ b/vendor/pimple/pimple/src/Pimple/Container.php
@@ -103,9 +103,9 @@ class Container implements \ArrayAccess
 
         if (
             isset($this->raw[$id])
-            || !is_object($this->values[$id])
+            || !\is_object($this->values[$id])
             || isset($this->protected[$this->values[$id]])
-            || !method_exists($this->values[$id], '__invoke')
+            || !\method_exists($this->values[$id], '__invoke')
         ) {
             return $this->values[$id];
         }
@@ -143,7 +143,7 @@ class Container implements \ArrayAccess
     public function offsetUnset($id)
     {
         if (isset($this->keys[$id])) {
-            if (is_object($this->values[$id])) {
+            if (\is_object($this->values[$id])) {
                 unset($this->factories[$this->values[$id]], $this->protected[$this->values[$id]]);
             }
 
@@ -162,7 +162,7 @@ class Container implements \ArrayAccess
      */
     public function factory($callable)
     {
-        if (!method_exists($callable, '__invoke')) {
+        if (!\method_exists($callable, '__invoke')) {
             throw new ExpectedInvokableException('Service definition is not a Closure or invokable object.');
         }
 
@@ -184,7 +184,7 @@ class Container implements \ArrayAccess
      */
     public function protect($callable)
     {
-        if (!method_exists($callable, '__invoke')) {
+        if (!\method_exists($callable, '__invoke')) {
             throw new ExpectedInvokableException('Callable is not a Closure or invokable object.');
         }
 
@@ -241,15 +241,15 @@ class Container implements \ArrayAccess
             throw new FrozenServiceException($id);
         }
 
-        if (!is_object($this->values[$id]) || !method_exists($this->values[$id], '__invoke')) {
+        if (!\is_object($this->values[$id]) || !\method_exists($this->values[$id], '__invoke')) {
             throw new InvalidServiceIdentifierException($id);
         }
 
         if (isset($this->protected[$this->values[$id]])) {
-            @trigger_error(sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), E_USER_DEPRECATED);
+            @\trigger_error(\sprintf('How Pimple behaves when extending protected closures will be fixed in Pimple 4. Are you sure "%s" should be protected?', $id), \E_USER_DEPRECATED);
         }
 
-        if (!is_object($callable) || !method_exists($callable, '__invoke')) {
+        if (!\is_object($callable) || !\method_exists($callable, '__invoke')) {
             throw new ExpectedInvokableException('Extension service definition is not a Closure or invokable object.');
         }
 
@@ -274,7 +274,7 @@ class Container implements \ArrayAccess
      */
     public function keys()
     {
-        return array_keys($this->values);
+        return \array_keys($this->values);
     }
 
     /**
diff --git a/vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php b/vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php
index 64b02659..e4d2f6d3 100644
--- a/vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php
+++ b/vendor/pimple/pimple/src/Pimple/Exception/FrozenServiceException.php
@@ -40,6 +40,6 @@ class FrozenServiceException extends \RuntimeException implements ContainerExcep
      */
     public function __construct($id)
     {
-        parent::__construct(sprintf('Cannot override frozen service "%s".', $id));
+        parent::__construct(\sprintf('Cannot override frozen service "%s".', $id));
     }
 }
diff --git a/vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php b/vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php
index 9df9c663..91e82f98 100644
--- a/vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php
+++ b/vendor/pimple/pimple/src/Pimple/Exception/InvalidServiceIdentifierException.php
@@ -40,6 +40,6 @@ class InvalidServiceIdentifierException extends \InvalidArgumentException implem
      */
     public function __construct($id)
     {
-        parent::__construct(sprintf('Identifier "%s" does not contain an object definition.', $id));
+        parent::__construct(\sprintf('Identifier "%s" does not contain an object definition.', $id));
     }
 }
diff --git a/vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php b/vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php
index 28413189..fb6b626e 100644
--- a/vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php
+++ b/vendor/pimple/pimple/src/Pimple/Exception/UnknownIdentifierException.php
@@ -40,6 +40,6 @@ class UnknownIdentifierException extends \InvalidArgumentException implements No
      */
     public function __construct($id)
     {
-        parent::__construct(sprintf('Identifier "%s" is not defined.', $id));
+        parent::__construct(\sprintf('Identifier "%s" is not defined.', $id));
     }
 }
diff --git a/vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php b/vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php
index 61e49848..3361c6f1 100644
--- a/vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php
+++ b/vendor/pimple/pimple/src/Pimple/Psr11/ServiceLocator.php
@@ -49,7 +49,7 @@ class ServiceLocator implements ContainerInterface
         $this->container = $container;
 
         foreach ($ids as $key => $id) {
-            $this->aliases[is_int($key) ? $id : $key] = $id;
+            $this->aliases[\is_int($key) ? $id : $key] = $id;
         }
     }
 
diff --git a/vendor/pimple/pimple/src/Pimple/ServiceIterator.php b/vendor/pimple/pimple/src/Pimple/ServiceIterator.php
index 744271dd..5cde5188 100644
--- a/vendor/pimple/pimple/src/Pimple/ServiceIterator.php
+++ b/vendor/pimple/pimple/src/Pimple/ServiceIterator.php
@@ -44,26 +44,26 @@ final class ServiceIterator implements \Iterator
 
     public function rewind()
     {
-        reset($this->ids);
+        \reset($this->ids);
     }
 
     public function current()
     {
-        return $this->container[current($this->ids)];
+        return $this->container[\current($this->ids)];
     }
 
     public function key()
     {
-        return current($this->ids);
+        return \current($this->ids);
     }
 
     public function next()
     {
-        next($this->ids);
+        \next($this->ids);
     }
 
     public function valid()
     {
-        return null !== key($this->ids);
+        return null !== \key($this->ids);
     }
 }
diff --git a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
index a0391a52..4b861c3e 100644
--- a/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
+++ b/vendor/psr/log/Psr/Log/Test/LoggerInterfaceTest.php
@@ -101,6 +101,9 @@ abstract class LoggerInterfaceTest extends \PHPUnit_Framework_TestCase
 
     public function testContextCanContainAnything()
     {
+        $closed = fopen('php://memory', 'r');
+        fclose($closed);
+
         $context = array(
             'bool' => true,
             'null' => null,
@@ -110,6 +113,7 @@ abstract class LoggerInterfaceTest extends \PHPUnit_Framework_TestCase
             'nested' => array('with object' => new DummyTest),
             'object' => new \DateTime,
             'resource' => fopen('php://memory', 'r'),
+            'closed' => $closed,
         );
 
         $this->getLogger()->warning('Crazy context data', $context);
diff --git a/vendor/psr/log/Psr/Log/Test/TestLogger.php b/vendor/psr/log/Psr/Log/Test/TestLogger.php
new file mode 100644
index 00000000..0cdffe4f
--- /dev/null
+++ b/vendor/psr/log/Psr/Log/Test/TestLogger.php
@@ -0,0 +1,146 @@
+<?php
+
+namespace Psr\Log\Test;
+
+use Psr\Log\AbstractLogger;
+
+/**
+ * Used for testing purposes.
+ *
+ * It records all records and gives you access to them for verification.
+ *
+ * @method bool hasEmergency($record)
+ * @method bool hasAlert($record)
+ * @method bool hasCritical($record)
+ * @method bool hasError($record)
+ * @method bool hasWarning($record)
+ * @method bool hasNotice($record)
+ * @method bool hasInfo($record)
+ * @method bool hasDebug($record)
+ *
+ * @method bool hasEmergencyRecords()
+ * @method bool hasAlertRecords()
+ * @method bool hasCriticalRecords()
+ * @method bool hasErrorRecords()
+ * @method bool hasWarningRecords()
+ * @method bool hasNoticeRecords()
+ * @method bool hasInfoRecords()
+ * @method bool hasDebugRecords()
+ *
+ * @method bool hasEmergencyThatContains($message)
+ * @method bool hasAlertThatContains($message)
+ * @method bool hasCriticalThatContains($message)
+ * @method bool hasErrorThatContains($message)
+ * @method bool hasWarningThatContains($message)
+ * @method bool hasNoticeThatContains($message)
+ * @method bool hasInfoThatContains($message)
+ * @method bool hasDebugThatContains($message)
+ *
+ * @method bool hasEmergencyThatMatches($message)
+ * @method bool hasAlertThatMatches($message)
+ * @method bool hasCriticalThatMatches($message)
+ * @method bool hasErrorThatMatches($message)
+ * @method bool hasWarningThatMatches($message)
+ * @method bool hasNoticeThatMatches($message)
+ * @method bool hasInfoThatMatches($message)
+ * @method bool hasDebugThatMatches($message)
+ *
+ * @method bool hasEmergencyThatPasses($message)
+ * @method bool hasAlertThatPasses($message)
+ * @method bool hasCriticalThatPasses($message)
+ * @method bool hasErrorThatPasses($message)
+ * @method bool hasWarningThatPasses($message)
+ * @method bool hasNoticeThatPasses($message)
+ * @method bool hasInfoThatPasses($message)
+ * @method bool hasDebugThatPasses($message)
+ */
+class TestLogger extends AbstractLogger
+{
+    /**
+     * @var array
+     */
+    public $records = [];
+
+    public $recordsByLevel = [];
+
+    /**
+     * @inheritdoc
+     */
+    public function log($level, $message, array $context = [])
+    {
+        $record = [
+            'level' => $level,
+            'message' => $message,
+            'context' => $context,
+        ];
+
+        $this->recordsByLevel[$record['level']][] = $record;
+        $this->records[] = $record;
+    }
+
+    public function hasRecords($level)
+    {
+        return isset($this->recordsByLevel[$level]);
+    }
+
+    public function hasRecord($record, $level)
+    {
+        if (is_string($record)) {
+            $record = ['message' => $record];
+        }
+        return $this->hasRecordThatPasses(function ($rec) use ($record) {
+            if ($rec['message'] !== $record['message']) {
+                return false;
+            }
+            if (isset($record['context']) && $rec['context'] !== $record['context']) {
+                return false;
+            }
+            return true;
+        }, $level);
+    }
+
+    public function hasRecordThatContains($message, $level)
+    {
+        return $this->hasRecordThatPasses(function ($rec) use ($message) {
+            return strpos($rec['message'], $message) !== false;
+        }, $level);
+    }
+
+    public function hasRecordThatMatches($regex, $level)
+    {
+        return $this->hasRecordThatPasses(function ($rec) use ($regex) {
+            return preg_match($regex, $rec['message']) > 0;
+        }, $level);
+    }
+
+    public function hasRecordThatPasses(callable $predicate, $level)
+    {
+        if (!isset($this->recordsByLevel[$level])) {
+            return false;
+        }
+        foreach ($this->recordsByLevel[$level] as $i => $rec) {
+            if (call_user_func($predicate, $rec, $i)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public function __call($method, $args)
+    {
+        if (preg_match('/(.*)(Debug|Info|Notice|Warning|Error|Critical|Alert|Emergency)(.*)/', $method, $matches) > 0) {
+            $genericMethod = $matches[1] . ('Records' !== $matches[3] ? 'Record' : '') . $matches[3];
+            $level = strtolower($matches[2]);
+            if (method_exists($this, $genericMethod)) {
+                $args[] = $level;
+                return call_user_func_array([$this, $genericMethod], $args);
+            }
+        }
+        throw new \BadMethodCallException('Call to undefined method ' . get_class($this) . '::' . $method . '()');
+    }
+
+    public function reset()
+    {
+        $this->records = [];
+    }
+}
diff --git a/vendor/psr/log/README.md b/vendor/psr/log/README.md
index 574bc1cb..5571a25e 100644
--- a/vendor/psr/log/README.md
+++ b/vendor/psr/log/README.md
@@ -7,6 +7,13 @@ This repository holds all interfaces/classes/traits related to
 Note that this is not a logger of its own. It is merely an interface that
 describes a logger. See the specification for more details.
 
+Installation
+------------
+
+```bash
+composer require psr/log
+```
+
 Usage
 -----
 
diff --git a/vendor/ralouphie/getallheaders/.gitignore b/vendor/ralouphie/getallheaders/.gitignore
new file mode 100644
index 00000000..1324e7d3
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/.gitignore
@@ -0,0 +1,5 @@
+.idea
+.DS_store
+/vendor/
+composer.phar
+composer.lock
diff --git a/vendor/ralouphie/getallheaders/.travis.yml b/vendor/ralouphie/getallheaders/.travis.yml
new file mode 100644
index 00000000..f45b55fa
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/.travis.yml
@@ -0,0 +1,18 @@
+language: php
+
+php:
+  - 5.3
+  - 5.4
+  - 5.5
+  - 5.6
+  - 7.0
+
+before_script:
+  - composer install
+
+script:
+  - mkdir -p build/logs
+  - php vendor/bin/phpunit -c phpunit.xml
+
+after_script:
+  - php vendor/bin/coveralls -v
\ No newline at end of file
diff --git a/vendor/ralouphie/getallheaders/LICENSE b/vendor/ralouphie/getallheaders/LICENSE
new file mode 100644
index 00000000..be5540c2
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Ralph Khattar
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/ralouphie/getallheaders/README.md b/vendor/ralouphie/getallheaders/README.md
new file mode 100644
index 00000000..f3329d66
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/README.md
@@ -0,0 +1,19 @@
+getallheaders
+=============
+
+PHP `getallheaders()` polyfill. Compatible with PHP >= 5.3.
+
+[![Build Status](https://travis-ci.org/ralouphie/getallheaders.svg?branch=master)](https://travis-ci.org/ralouphie/getallheaders)
+[![Coverage Status](https://coveralls.io/repos/ralouphie/getallheaders/badge.png?branch=master)](https://coveralls.io/r/ralouphie/getallheaders?branch=master)
+[![Latest Stable Version](https://poser.pugx.org/ralouphie/getallheaders/v/stable.png)](https://packagist.org/packages/ralouphie/getallheaders)
+[![Latest Unstable Version](https://poser.pugx.org/ralouphie/getallheaders/v/unstable.png)](https://packagist.org/packages/ralouphie/getallheaders)
+[![License](https://poser.pugx.org/ralouphie/getallheaders/license.png)](https://packagist.org/packages/ralouphie/getallheaders)
+
+
+This is a simple polyfill for [`getallheaders()`](http://www.php.net/manual/en/function.getallheaders.php).
+
+## Install
+
+```
+composer require ralouphie/getallheaders
+```
diff --git a/vendor/ralouphie/getallheaders/composer.json b/vendor/ralouphie/getallheaders/composer.json
new file mode 100644
index 00000000..5a0d595c
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/composer.json
@@ -0,0 +1,21 @@
+{
+	"name": "ralouphie/getallheaders",
+	"description": "A polyfill for getallheaders.",
+	"license": "MIT",
+	"authors": [
+		{
+			"name": "Ralph Khattar",
+			"email": "ralph.khattar@xxxxxxxxx"
+		}
+	],
+	"require": {
+		"php": ">=5.3"
+	},
+	"require-dev": {
+		"phpunit/phpunit": "~3.7.0",
+		"satooshi/php-coveralls": ">=1.0"
+	},
+	"autoload": {
+		"files": ["src/getallheaders.php"]
+	}
+}
\ No newline at end of file
diff --git a/vendor/ralouphie/getallheaders/phpunit.xml b/vendor/ralouphie/getallheaders/phpunit.xml
new file mode 100644
index 00000000..7255b23d
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/phpunit.xml
@@ -0,0 +1,22 @@
+<phpunit
+	bootstrap="vendor/autoload.php"
+	convertErrorsToExceptions="true"
+	convertNoticesToExceptions="true"
+	convertWarningsToExceptions="true"
+	strict="true">
+
+	<testsuite>
+		<directory>./tests</directory>
+	</testsuite>
+
+	<filter>
+		<whitelist>
+			<directory suffix=".php">src</directory>
+		</whitelist>
+	</filter>
+
+	<logging>
+		<log type="coverage-clover" target="build/logs/clover.xml"/>
+	</logging>
+
+</phpunit>
\ No newline at end of file
diff --git a/vendor/ralouphie/getallheaders/src/getallheaders.php b/vendor/ralouphie/getallheaders/src/getallheaders.php
new file mode 100644
index 00000000..c7285a5b
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/src/getallheaders.php
@@ -0,0 +1,46 @@
+<?php
+
+if (!function_exists('getallheaders')) {
+
+    /**
+     * Get all HTTP header key/values as an associative array for the current request.
+     *
+     * @return string[string] The HTTP header key/value pairs.
+     */
+    function getallheaders()
+    {
+        $headers = array();
+
+        $copy_server = array(
+            'CONTENT_TYPE'   => 'Content-Type',
+            'CONTENT_LENGTH' => 'Content-Length',
+            'CONTENT_MD5'    => 'Content-Md5',
+        );
+
+        foreach ($_SERVER as $key => $value) {
+            if (substr($key, 0, 5) === 'HTTP_') {
+                $key = substr($key, 5);
+                if (!isset($copy_server[$key]) || !isset($_SERVER[$key])) {
+                    $key = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', $key))));
+                    $headers[$key] = $value;
+                }
+            } elseif (isset($copy_server[$key])) {
+                $headers[$copy_server[$key]] = $value;
+            }
+        }
+
+        if (!isset($headers['Authorization'])) {
+            if (isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION'])) {
+                $headers['Authorization'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
+            } elseif (isset($_SERVER['PHP_AUTH_USER'])) {
+                $basic_pass = isset($_SERVER['PHP_AUTH_PW']) ? $_SERVER['PHP_AUTH_PW'] : '';
+                $headers['Authorization'] = 'Basic ' . base64_encode($_SERVER['PHP_AUTH_USER'] . ':' . $basic_pass);
+            } elseif (isset($_SERVER['PHP_AUTH_DIGEST'])) {
+                $headers['Authorization'] = $_SERVER['PHP_AUTH_DIGEST'];
+            }
+        }
+
+        return $headers;
+    }
+
+}
diff --git a/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php b/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php
new file mode 100644
index 00000000..8e3d1790
--- /dev/null
+++ b/vendor/ralouphie/getallheaders/tests/GetAllHeadersTest.php
@@ -0,0 +1,121 @@
+<?php
+
+class GetAllHeadersTest extends \PHPUnit_Framework_TestCase
+{
+
+    /**
+     * @dataProvider testWorksData
+     */
+    public function testWorks($test_type, $expected, $server)
+    {
+        foreach ($server as $key => $val) {
+            $_SERVER[$key] = $val;
+        }
+        $result = getallheaders();
+        $this->assertEquals($expected, $result, "Error testing $test_type works.");
+    }
+
+    public function testWorksData()
+    {
+        return array(
+            array(
+                'normal case',
+                array(
+                    'Key-One'                 => 'foo',
+                    'Key-Two'                 => 'bar',
+                    'Another-Key-For-Testing' => 'baz'
+                ),
+                array(
+                    'HTTP_KEY_ONE'                 => 'foo',
+                    'HTTP_KEY_TWO'                 => 'bar',
+                    'HTTP_ANOTHER_KEY_FOR_TESTING' => 'baz'
+                )
+            ),
+            array(
+                'Content-Type',
+                array(
+                    'Content-Type' => 'two'
+                ),
+                array(
+                    'HTTP_CONTENT_TYPE' => 'one',
+                    'CONTENT_TYPE'      => 'two'
+                )
+            ),
+            array(
+                'Content-Length',
+                array(
+                    'Content-Length' => '222'
+                ),
+                array(
+                    'CONTENT_LENGTH'      => '222',
+                    'HTTP_CONTENT_LENGTH' => '111'
+                )
+            ),
+            array(
+                'Content-Length (HTTP_CONTENT_LENGTH only)',
+                array(
+                    'Content-Length' => '111'
+                ),
+                array(
+                    'HTTP_CONTENT_LENGTH' => '111'
+                )
+            ),
+            array(
+                'Content-MD5',
+                array(
+                    'Content-Md5' => 'aef123'
+                ),
+                array(
+                    'CONTENT_MD5'      => 'aef123',
+                    'HTTP_CONTENT_MD5' => 'fea321'
+                )
+            ),
+            array(
+                'Content-MD5 (HTTP_CONTENT_MD5 only)',
+                array(
+                    'Content-Md5' => 'f123'
+                ),
+                array(
+                    'HTTP_CONTENT_MD5' => 'f123'
+                )
+            ),
+            array(
+                'Authorization (normal)',
+                array(
+                    'Authorization' => 'testing'
+                ),
+                array(
+                    'HTTP_AUTHORIZATION' => 'testing',
+                )
+            ),
+            array(
+                'Authorization (redirect)',
+                array(
+                    'Authorization' => 'testing redirect'
+                ),
+                array(
+                    'REDIRECT_HTTP_AUTHORIZATION' => 'testing redirect',
+                )
+            ),
+            array(
+                'Authorization (PHP_AUTH_USER + PHP_AUTH_PW)',
+                array(
+                    'Authorization' => 'Basic ' . base64_encode('foo:bar')
+                ),
+                array(
+                    'PHP_AUTH_USER' => 'foo',
+                    'PHP_AUTH_PW'   => 'bar'
+                )
+            ),
+            array(
+                'Authorization (PHP_AUTH_DIGEST)',
+                array(
+                    'Authorization' => 'example-digest'
+                ),
+                array(
+                    'PHP_AUTH_DIGEST' => 'example-digest'
+                )
+            )
+        );
+    }
+}
diff --git a/vendor/chrisboulton/php-resque/.gitignore b/vendor/resque/php-resque/.gitignore
similarity index 65%
rename from vendor/chrisboulton/php-resque/.gitignore
rename to vendor/resque/php-resque/.gitignore
index a793d958..9102bb31 100644
--- a/vendor/chrisboulton/php-resque/.gitignore
+++ b/vendor/resque/php-resque/.gitignore
@@ -1,3 +1,4 @@
 vendor/
 *.swp
 phpunit.xml
+composer.lock
diff --git a/vendor/chrisboulton/php-resque/.travis.yml b/vendor/resque/php-resque/.travis.yml
similarity index 100%
rename from vendor/chrisboulton/php-resque/.travis.yml
rename to vendor/resque/php-resque/.travis.yml
diff --git a/vendor/chrisboulton/php-resque/CHANGELOG.md b/vendor/resque/php-resque/CHANGELOG.md
similarity index 100%
rename from vendor/chrisboulton/php-resque/CHANGELOG.md
rename to vendor/resque/php-resque/CHANGELOG.md
diff --git a/vendor/chrisboulton/php-resque/HOWITWORKS.md b/vendor/resque/php-resque/HOWITWORKS.md
similarity index 100%
rename from vendor/chrisboulton/php-resque/HOWITWORKS.md
rename to vendor/resque/php-resque/HOWITWORKS.md
diff --git a/vendor/chrisboulton/php-resque/LICENSE b/vendor/resque/php-resque/LICENSE
similarity index 100%
rename from vendor/chrisboulton/php-resque/LICENSE
rename to vendor/resque/php-resque/LICENSE
diff --git a/vendor/chrisboulton/php-resque/README.md b/vendor/resque/php-resque/README.md
similarity index 100%
rename from vendor/chrisboulton/php-resque/README.md
rename to vendor/resque/php-resque/README.md
diff --git a/vendor/chrisboulton/php-resque/bin/resque b/vendor/resque/php-resque/bin/resque
similarity index 50%
rename from vendor/chrisboulton/php-resque/bin/resque
rename to vendor/resque/php-resque/bin/resque
index 1d604851..d6ac0d6b 100755
--- a/vendor/chrisboulton/php-resque/bin/resque
+++ b/vendor/resque/php-resque/bin/resque
@@ -93,35 +93,93 @@ if(!empty($PREFIX)) {
     Resque_Redis::prefix($PREFIX);
 }
 
+function cleanup_children($signal){
+	$GLOBALS['send_signal'] = $signal;
+}
+
 if($count > 1) {
-    for($i = 0; $i < $count; ++$i) {
-        $pid = Resque::fork();
-        if($pid === false || $pid === -1) {
-            $logger->log(Psr\Log\LogLevel::EMERGENCY, 'Could not fork worker {count}', array('count' => $i));
-            die();
-        }
-        // Child, start the worker
-        else if(!$pid) {
-            $queues = explode(',', $QUEUE);
-            $worker = new Resque_Worker($queues);
-            $worker->setLogger($logger);
-            $logger->log(Psr\Log\LogLevel::NOTICE, 'Starting worker {worker}', array('worker' => $worker));
-            $worker->work($interval, $BLOCKING);
-            break;
-        }
-    }
+	$children = array();
+	$GLOBALS['send_signal'] = FALSE;
+	
+	$die_signals = array(SIGTERM, SIGINT, SIGQUIT);
+	$all_signals = array_merge($die_signals, array(SIGUSR1, SIGUSR2, SIGCONT, SIGPIPE));
+	
+	for($i = 0; $i < $count; ++$i) {
+		$pid = Resque::fork();
+		if($pid == -1) {
+			die("Could not fork worker ".$i."\n");
+		}
+		// Child, start the worker
+		elseif(!$pid) {
+			$queues = explode(',', $QUEUE);
+			$worker = new Resque_Worker($queues);
+			$worker->logLevel = $logLevel;
+			$worker->hasParent = TRUE;
+			fwrite(STDOUT, '*** Starting worker '.$worker."\n");
+			$worker->work($interval);
+			break;
+		}
+		else {
+			$children[$pid] = 1;
+			while (count($children) == $count){
+				if (!isset($registered)) {
+					declare(ticks = 1);
+					foreach ($all_signals as $signal) {
+						pcntl_signal($signal,  "cleanup_children");
+					}
+					
+					$PIDFILE = getenv('PIDFILE');
+					if ($PIDFILE) {
+						if(file_put_contents($PIDFILE, getmypid()) === false){
+							$logger->log(Psr\Log\LogLevel::NOTICE, 'Could not write PID information to {pidfile}', array('pidfile' => $PIDFILE));
+                                                        die(2);
+                                                }
+					}
+					
+					$registered = TRUE;
+				}
+				
+				if(function_exists('setproctitle')) {
+					setproctitle('resque-' . Resque::VERSION . ": Monitoring {$count} children: [".implode(',', array_keys($children))."]");
+				}
+				
+				$childPID = pcntl_waitpid(-1, $childStatus, WNOHANG);
+				if ($childPID != 0) {
+					fwrite(STDOUT, "*** A child worker died: {$childPID}\n");
+					unset($children[$childPID]);
+					$i--;					
+				}
+				usleep(250000);
+				if ($GLOBALS['send_signal'] !== FALSE){
+					foreach ($children as $k => $v){
+						posix_kill($k, $GLOBALS['send_signal']);
+						if (in_array($GLOBALS['send_signal'], $die_signals)) {
+							pcntl_waitpid($k, $childStatus);
+						}
+					}
+					if (in_array($GLOBALS['send_signal'], $die_signals)) {
+						exit;
+					}
+					$GLOBALS['send_signal'] = FALSE;
+				}
+			}
+		}
+	}
 }
 // Start a single worker
 else {
-    $queues = explode(',', $QUEUE);
-    $worker = new Resque_Worker($queues);
-    $worker->setLogger($logger);
-
-    $PIDFILE = getenv('PIDFILE');
-    if ($PIDFILE) {
-        file_put_contents($PIDFILE, getmypid()) or
-            die('Could not write PID information to ' . $PIDFILE);
-    }
+	$queues = explode(',', $QUEUE);
+	$worker = new Resque_Worker($queues);
+	$worker->logLevel = $logLevel;
+	$worker->hasParent = FALSE;
+
+	$PIDFILE = getenv('PIDFILE');
+	if ($PIDFILE) {
+		if(file_put_contents($PIDFILE, getmypid()) === false) {
+			$logger->log(Psr\Log\LogLevel::NOTICE, 'Could not write PID information to {pidfile}', array('pidfile' => $PIDFILE));
+                        die(2);
+                }
+	}
 
     $logger->log(Psr\Log\LogLevel::NOTICE, 'Starting worker {worker}', array('worker' => $worker));
     $worker->work($interval, $BLOCKING);
diff --git a/vendor/chrisboulton/php-resque/build.xml b/vendor/resque/php-resque/build.xml
similarity index 100%
rename from vendor/chrisboulton/php-resque/build.xml
rename to vendor/resque/php-resque/build.xml
diff --git a/vendor/chrisboulton/php-resque/composer.json b/vendor/resque/php-resque/composer.json
similarity index 97%
rename from vendor/chrisboulton/php-resque/composer.json
rename to vendor/resque/php-resque/composer.json
index 28a0bf58..b12fa291 100644
--- a/vendor/chrisboulton/php-resque/composer.json
+++ b/vendor/resque/php-resque/composer.json
@@ -21,7 +21,7 @@
 		"php": ">=5.3.0",
 		"ext-pcntl": "*",
 		"colinmollenhour/credis": "~1.7",
-		"psr/log": "1.0.0"
+		"psr/log": "~1.0"
 	},
 	"suggest": {
 		"ext-proctitle": "Allows php-resque to rename the title of UNIX processes to show the status of a worker.",
diff --git a/vendor/chrisboulton/php-resque/demo/bad_job.php b/vendor/resque/php-resque/demo/bad_job.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/demo/bad_job.php
rename to vendor/resque/php-resque/demo/bad_job.php
diff --git a/vendor/chrisboulton/php-resque/demo/check_status.php b/vendor/resque/php-resque/demo/check_status.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/demo/check_status.php
rename to vendor/resque/php-resque/demo/check_status.php
diff --git a/vendor/chrisboulton/php-resque/demo/init.php b/vendor/resque/php-resque/demo/init.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/demo/init.php
rename to vendor/resque/php-resque/demo/init.php
diff --git a/vendor/chrisboulton/php-resque/demo/job.php b/vendor/resque/php-resque/demo/job.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/demo/job.php
rename to vendor/resque/php-resque/demo/job.php
diff --git a/vendor/chrisboulton/php-resque/demo/long_job.php b/vendor/resque/php-resque/demo/long_job.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/demo/long_job.php
rename to vendor/resque/php-resque/demo/long_job.php
diff --git a/vendor/chrisboulton/php-resque/demo/php_error_job.php b/vendor/resque/php-resque/demo/php_error_job.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/demo/php_error_job.php
rename to vendor/resque/php-resque/demo/php_error_job.php
diff --git a/vendor/chrisboulton/php-resque/demo/queue.php b/vendor/resque/php-resque/demo/queue.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/demo/queue.php
rename to vendor/resque/php-resque/demo/queue.php
diff --git a/vendor/chrisboulton/php-resque/demo/resque.php b/vendor/resque/php-resque/demo/resque.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/demo/resque.php
rename to vendor/resque/php-resque/demo/resque.php
diff --git a/vendor/chrisboulton/php-resque/extras/resque.logrotate b/vendor/resque/php-resque/extras/resque.logrotate
similarity index 100%
rename from vendor/chrisboulton/php-resque/extras/resque.logrotate
rename to vendor/resque/php-resque/extras/resque.logrotate
diff --git a/vendor/chrisboulton/php-resque/extras/resque.monit b/vendor/resque/php-resque/extras/resque.monit
similarity index 100%
rename from vendor/chrisboulton/php-resque/extras/resque.monit
rename to vendor/resque/php-resque/extras/resque.monit
diff --git a/vendor/chrisboulton/php-resque/extras/sample-plugin.php b/vendor/resque/php-resque/extras/sample-plugin.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/extras/sample-plugin.php
rename to vendor/resque/php-resque/extras/sample-plugin.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque.php b/vendor/resque/php-resque/lib/Resque.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque.php
rename to vendor/resque/php-resque/lib/Resque.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Event.php b/vendor/resque/php-resque/lib/Resque/Event.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Event.php
rename to vendor/resque/php-resque/lib/Resque/Event.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Exception.php b/vendor/resque/php-resque/lib/Resque/Exception.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Exception.php
rename to vendor/resque/php-resque/lib/Resque/Exception.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Failure.php b/vendor/resque/php-resque/lib/Resque/Failure.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Failure.php
rename to vendor/resque/php-resque/lib/Resque/Failure.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Failure/Interface.php b/vendor/resque/php-resque/lib/Resque/Failure/Interface.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Failure/Interface.php
rename to vendor/resque/php-resque/lib/Resque/Failure/Interface.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Failure/Redis.php b/vendor/resque/php-resque/lib/Resque/Failure/Redis.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Failure/Redis.php
rename to vendor/resque/php-resque/lib/Resque/Failure/Redis.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Job.php b/vendor/resque/php-resque/lib/Resque/Job.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Job.php
rename to vendor/resque/php-resque/lib/Resque/Job.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Job/DirtyExitException.php b/vendor/resque/php-resque/lib/Resque/Job/DirtyExitException.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Job/DirtyExitException.php
rename to vendor/resque/php-resque/lib/Resque/Job/DirtyExitException.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Job/DontCreate.php b/vendor/resque/php-resque/lib/Resque/Job/DontCreate.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Job/DontCreate.php
rename to vendor/resque/php-resque/lib/Resque/Job/DontCreate.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Job/DontPerform.php b/vendor/resque/php-resque/lib/Resque/Job/DontPerform.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Job/DontPerform.php
rename to vendor/resque/php-resque/lib/Resque/Job/DontPerform.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Job/Factory.php b/vendor/resque/php-resque/lib/Resque/Job/Factory.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Job/Factory.php
rename to vendor/resque/php-resque/lib/Resque/Job/Factory.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Job/FactoryInterface.php b/vendor/resque/php-resque/lib/Resque/Job/FactoryInterface.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Job/FactoryInterface.php
rename to vendor/resque/php-resque/lib/Resque/Job/FactoryInterface.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Job/Status.php b/vendor/resque/php-resque/lib/Resque/Job/Status.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Job/Status.php
rename to vendor/resque/php-resque/lib/Resque/Job/Status.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/JobInterface.php b/vendor/resque/php-resque/lib/Resque/JobInterface.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/JobInterface.php
rename to vendor/resque/php-resque/lib/Resque/JobInterface.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Log.php b/vendor/resque/php-resque/lib/Resque/Log.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Log.php
rename to vendor/resque/php-resque/lib/Resque/Log.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Redis.php b/vendor/resque/php-resque/lib/Resque/Redis.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Redis.php
rename to vendor/resque/php-resque/lib/Resque/Redis.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/RedisException.php b/vendor/resque/php-resque/lib/Resque/RedisException.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/RedisException.php
rename to vendor/resque/php-resque/lib/Resque/RedisException.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Stat.php b/vendor/resque/php-resque/lib/Resque/Stat.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/lib/Resque/Stat.php
rename to vendor/resque/php-resque/lib/Resque/Stat.php
diff --git a/vendor/chrisboulton/php-resque/lib/Resque/Worker.php b/vendor/resque/php-resque/lib/Resque/Worker.php
similarity index 95%
rename from vendor/chrisboulton/php-resque/lib/Resque/Worker.php
rename to vendor/resque/php-resque/lib/Resque/Worker.php
index 04714c1c..3add46ee 100644
--- a/vendor/chrisboulton/php-resque/lib/Resque/Worker.php
+++ b/vendor/resque/php-resque/lib/Resque/Worker.php
@@ -17,6 +17,11 @@ class Resque_Worker
 	public $logger;
 
 	/**
+	 * @var bool Whether this worker is running in a forked child process.
+	 */
+	public $hasParent = false;
+
+	/**
 	 * @var array Array of all associated queues for this worker.
 	 */
 	private $queues = array();
@@ -213,12 +218,22 @@ class Resque_Worker
 
 				// Wait until the child process finishes before continuing
 				pcntl_wait($status);
-				$exitStatus = pcntl_wexitstatus($status);
-				if($exitStatus !== 0) {
+
+				if (pcntl_wifexited($status) !== true) {
+					$job->fail(new Resque_Job_DirtyExitException('Job exited abnormally'));
+				} elseif (($exitStatus = pcntl_wexitstatus($status)) !== 0) {
 					$job->fail(new Resque_Job_DirtyExitException(
 						'Job exited with exit code ' . $exitStatus
 					));
 				}
+				else
+				{
+					if (in_array($job->getStatus(), array(Resque_Job_Status::STATUS_WAITING, Resque_Job_Status::STATUS_RUNNING)))
+					{
+						$job->updateStatus(Resque_Job_Status::STATUS_COMPLETE);
+						$this->logger->log(Psr\Log\LogLevel::INFO, 'done ' . $job);
+					}
+				}
 			}
 
 			$this->child = null;
@@ -256,6 +271,12 @@ class Resque_Worker
 	 */
 	public function reserve($blocking = false, $timeout = null)
 	{
+		if ($this->hasParent && !posix_kill(posix_getppid(), 0))
+		{
+			$this->shutdown();
+			return false;
+		}
+
 		$queues = $this->queues();
 		if(!is_array($queues)) {
 			return;
diff --git a/vendor/chrisboulton/php-resque/phpunit.xml.dist b/vendor/resque/php-resque/phpunit.xml.dist
similarity index 100%
rename from vendor/chrisboulton/php-resque/phpunit.xml.dist
rename to vendor/resque/php-resque/phpunit.xml.dist
diff --git a/vendor/chrisboulton/php-resque/test/Resque/Tests/EventTest.php b/vendor/resque/php-resque/test/Resque/Tests/EventTest.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/test/Resque/Tests/EventTest.php
rename to vendor/resque/php-resque/test/Resque/Tests/EventTest.php
diff --git a/vendor/chrisboulton/php-resque/test/Resque/Tests/JobStatusTest.php b/vendor/resque/php-resque/test/Resque/Tests/JobStatusTest.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/test/Resque/Tests/JobStatusTest.php
rename to vendor/resque/php-resque/test/Resque/Tests/JobStatusTest.php
diff --git a/vendor/chrisboulton/php-resque/test/Resque/Tests/JobTest.php b/vendor/resque/php-resque/test/Resque/Tests/JobTest.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/test/Resque/Tests/JobTest.php
rename to vendor/resque/php-resque/test/Resque/Tests/JobTest.php
diff --git a/vendor/chrisboulton/php-resque/test/Resque/Tests/LogTest.php b/vendor/resque/php-resque/test/Resque/Tests/LogTest.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/test/Resque/Tests/LogTest.php
rename to vendor/resque/php-resque/test/Resque/Tests/LogTest.php
diff --git a/vendor/chrisboulton/php-resque/test/Resque/Tests/RedisTest.php b/vendor/resque/php-resque/test/Resque/Tests/RedisTest.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/test/Resque/Tests/RedisTest.php
rename to vendor/resque/php-resque/test/Resque/Tests/RedisTest.php
diff --git a/vendor/chrisboulton/php-resque/test/Resque/Tests/StatTest.php b/vendor/resque/php-resque/test/Resque/Tests/StatTest.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/test/Resque/Tests/StatTest.php
rename to vendor/resque/php-resque/test/Resque/Tests/StatTest.php
diff --git a/vendor/chrisboulton/php-resque/test/Resque/Tests/TestCase.php b/vendor/resque/php-resque/test/Resque/Tests/TestCase.php
similarity index 100%
rename from vendor/chrisboulton/php-resque/test/Resque/Tests/TestCase.php
rename to vendor/resque/php-resque/test/Resque/Tests/TestCase.php
diff --git a/vendor/chrisboulton/php-resque/test/Resque/Tests/WorkerTest.php b/vendor/resque/php-resque/test/Resque/Tests/WorkerTest.php
similarity index 96%
rename from vendor/chrisboulton/php-resque/test/Resque/Tests/WorkerTest.php
rename to vendor/resque/php-resque/test/Resque/Tests/WorkerTest.php
index 93c0621a..938ee24c 100644
--- a/vendor/chrisboulton/php-resque/test/Resque/Tests/WorkerTest.php
+++ b/vendor/resque/php-resque/test/Resque/Tests/WorkerTest.php
@@ -290,4 +290,15 @@ class Resque_Tests_WorkerTest extends Resque_Tests_TestCase
 
         $this->assertEquals(2, $i);
     }
+
+    public function testWorkerFailsSegmentationFaultJob()
+    {
+        Resque::enqueue('jobs', 'Test_Infinite_Recursion_Job');
+
+        $worker = new Resque_Worker('jobs');
+        $worker->setLogger(new Resque_Log());
+        $worker->work(0);
+
+        $this->assertEquals(1, Resque_Stat::get('failed'));
+    }
 }
\ No newline at end of file
diff --git a/vendor/chrisboulton/php-resque/test/bootstrap.php b/vendor/resque/php-resque/test/bootstrap.php
similarity index 96%
rename from vendor/chrisboulton/php-resque/test/bootstrap.php
rename to vendor/resque/php-resque/test/bootstrap.php
index a4b68377..e4f25fda 100644
--- a/vendor/chrisboulton/php-resque/test/bootstrap.php
+++ b/vendor/resque/php-resque/test/bootstrap.php
@@ -145,4 +145,12 @@ class Test_Job_With_TearDown
 	{
 		self::$called = true;
 	}
+}
+
+class Test_Infinite_Recursion_Job
+{
+    public function perform()
+    {
+        $this->perform();
+    }
 }
\ No newline at end of file
diff --git a/vendor/chrisboulton/php-resque/test/misc/redis.conf b/vendor/resque/php-resque/test/misc/redis.conf
similarity index 100%
rename from vendor/chrisboulton/php-resque/test/misc/redis.conf
rename to vendor/resque/php-resque/test/misc/redis.conf
diff --git a/vendor/slim/slim/CODE_OF_CONDUCT.md b/vendor/slim/slim/CODE_OF_CONDUCT.md
new file mode 100644
index 00000000..7fcbf4e7
--- /dev/null
+++ b/vendor/slim/slim/CODE_OF_CONDUCT.md
@@ -0,0 +1,8 @@
+# Code of Conduct
+
+The Slim Framework code of conduct is derived from the Ruby code of conduct. This document provides community guidelines for a safe, respectful, productive, and collaborative place for any person who is willing to contribute to the Slim Framework community. It applies to all â??collaborative spaceâ??, which is defined as community communications channels (such as mailing lists, IRC, Slack, forums, submitted patches, commit comments, etc.). Any violations of the code of conduct may be reported by contacting one or more of the project maintainers either directly or via email to maintainers@xxxxxxxxxxxxxxxxx.
+
+* Participants will be tolerant of opposing views.
+* Participants must ensure that their language and actions are free of personal attacks and disparaging personal remarks.
+* When interpreting the words and actions of others, participants should always assume good intentions.
+* Behaviour that the project maintainers consider to be harassment will not be tolerated.
diff --git a/vendor/slim/slim/LICENSE.md b/vendor/slim/slim/LICENSE.md
index 682c21dc..116e902f 100644
--- a/vendor/slim/slim/LICENSE.md
+++ b/vendor/slim/slim/LICENSE.md
@@ -1,4 +1,4 @@
-Copyright (c) 2011-2017 Josh Lockhart
+Copyright (c) 2011-2019 Josh Lockhart
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/slim/slim/MAINTAINERS.md b/vendor/slim/slim/MAINTAINERS.md
new file mode 100644
index 00000000..2b8ad049
--- /dev/null
+++ b/vendor/slim/slim/MAINTAINERS.md
@@ -0,0 +1,17 @@
+# Maintainers
+
+There aren't many rules for maintainers of Slim to remember; what we have is listed here.
+
+## We don't merge our own PRs
+
+Our code is better if more than one set of eyes looks at it. Therefore we do not merge our own pull requests unless there is an exceptional circumstance. This helps to spot errors in the patch and also enables us to share information about the project around the maintainer team.
+
+## PRs tagged `WIP` are not ready to be merged
+
+Sometimes it's helpful to collaborate on a patch before it's ready to be merged. We use the text `WIP` (for _Work in Progress_) in the title to mark these PRs. 
+
+If a PR has `WIP` in its title, then it is not to be merged. The person who raised the PR will remove the `WIP` text when they are ready for a full review and merge.
+
+## Assign a merged PR to a milestone
+
+By ensuring that all merged PRs are assigned to a milestone, we can easily find which PRs were in which release.
diff --git a/vendor/slim/slim/Slim/App.php b/vendor/slim/slim/Slim/App.php
index 587e6710..3611798a 100644
--- a/vendor/slim/slim/Slim/App.php
+++ b/vendor/slim/slim/Slim/App.php
@@ -9,8 +9,8 @@
 namespace Slim;
 
 use Exception;
+use Psr\Http\Message\UriInterface;
 use Slim\Exception\InvalidMethodException;
-use Slim\Http\Response;
 use Throwable;
 use Closure;
 use InvalidArgumentException;
@@ -26,7 +26,6 @@ use Slim\Http\Uri;
 use Slim\Http\Headers;
 use Slim\Http\Body;
 use Slim\Http\Request;
-use Slim\Interfaces\Http\EnvironmentInterface;
 use Slim\Interfaces\RouteGroupInterface;
 use Slim\Interfaces\RouteInterface;
 use Slim\Interfaces\RouterInterface;
@@ -52,7 +51,7 @@ class App
      *
      * @var string
      */
-    const VERSION = '3.8.1';
+    const VERSION = '3.12.1';
 
     /**
      * Container
@@ -249,14 +248,32 @@ class App
     }
 
     /**
+     * Add a route that sends an HTTP redirect
+     *
+     * @param string              $from
+     * @param string|UriInterface $to
+     * @param int                 $status
+     *
+     * @return RouteInterface
+     */
+    public function redirect($from, $to, $status = 302)
+    {
+        $handler = function ($request, ResponseInterface $response) use ($to, $status) {
+            return $response->withHeader('Location', (string)$to)->withStatus($status);
+        };
+
+        return $this->get($from, $handler);
+    }
+
+    /**
      * Route Groups
      *
      * This method accepts a route pattern and a callback. All route
      * declarations in the callback will be prepended by the group(s)
      * that it is in.
      *
-     * @param string   $pattern
-     * @param callable $callable
+     * @param string           $pattern
+     * @param callable|Closure $callable
      *
      * @return RouteGroupInterface
      */
@@ -292,11 +309,29 @@ class App
         $response = $this->container->get('response');
 
         try {
+            ob_start();
             $response = $this->process($this->container->get('request'), $response);
         } catch (InvalidMethodException $e) {
             $response = $this->processInvalidMethod($e->getRequest(), $response);
+        } finally {
+            $output = ob_get_clean();
+        }
+
+        if (!empty($output) && $response->getBody()->isWritable()) {
+            $outputBuffering = $this->container->get('settings')['outputBuffering'];
+            if ($outputBuffering === 'prepend') {
+                // prepend output buffer content
+                $body = new Http\Body(fopen('php://temp', 'r+'));
+                $body->write($output . $response->getBody());
+                $response = $response->withBody($body);
+            } elseif ($outputBuffering === 'append') {
+                // append output buffer content
+                $response->getBody()->write($output);
+            }
         }
 
+        $response = $this->finalize($response);
+
         if (!$silent) {
             $this->respond($response);
         }
@@ -374,13 +409,11 @@ class App
             $response = $this->handlePhpError($e, $request, $response);
         }
 
-        $response = $this->finalize($response);
-
         return $response;
     }
 
     /**
-     * Send the response the client
+     * Send the response to the client
      *
      * @param ResponseInterface $response
      */
@@ -388,24 +421,30 @@ class App
     {
         // Send response
         if (!headers_sent()) {
+            // Headers
+            foreach ($response->getHeaders() as $name => $values) {
+                $first = stripos($name, 'Set-Cookie') === 0 ? false : true;
+                foreach ($values as $value) {
+                    header(sprintf('%s: %s', $name, $value), $first);
+                    $first = false;
+                }
+            }
+
+            // Set the status _after_ the headers, because of PHP's "helpful" behavior with location headers.
+            // See https://github.com/slimphp/Slim/issues/1730
+
             // Status
             header(sprintf(
                 'HTTP/%s %s %s',
                 $response->getProtocolVersion(),
                 $response->getStatusCode(),
                 $response->getReasonPhrase()
-            ));
-
-            // Headers
-            foreach ($response->getHeaders() as $name => $values) {
-                foreach ($values as $value) {
-                    header(sprintf('%s: %s', $name, $value), false);
-                }
-            }
+            ), true, $response->getStatusCode());
         }
 
         // Body
-        if (!$this->isEmptyResponse($response)) {
+        $request = $this->container->get('request');
+        if (!$this->isEmptyResponse($response) && !$this->isHeadRequest($request)) {
             $body = $response->getBody();
             if ($body->isSeekable()) {
                 $body->rewind();
@@ -422,7 +461,7 @@ class App
             if (isset($contentLength)) {
                 $amountToRead = $contentLength;
                 while ($amountToRead > 0 && !$body->eof()) {
-                    $data = $body->read(min($chunkSize, $amountToRead));
+                    $data = $body->read(min((int)$chunkSize, (int)$amountToRead));
                     echo $data;
 
                     $amountToRead -= strlen($data);
@@ -433,7 +472,7 @@ class App
                 }
             } else {
                 while (!$body->eof()) {
-                    echo $body->read($chunkSize);
+                    echo $body->read((int)$chunkSize);
                     if (connection_status() != CONNECTION_NORMAL) {
                         break;
                     }
@@ -574,7 +613,8 @@ class App
         // stop PHP sending a Content-Type automatically
         ini_set('default_mimetype', '');
 
-        if ($this->isEmptyResponse($response)) {
+        $request = $this->container->get('request');
+        if ($this->isEmptyResponse($response) && !$this->isHeadRequest($request)) {
             return $response->withoutHeader('Content-Type')->withoutHeader('Content-Length');
         }
 
@@ -591,6 +631,11 @@ class App
             }
         }
 
+        // clear the body if this is a HEAD request
+        if ($this->isHeadRequest($request)) {
+            return $response->withBody(new Body(fopen('php://temp', 'r+')));
+        }
+
         return $response;
     }
 
@@ -613,6 +658,18 @@ class App
     }
 
     /**
+     * Helper method to check if the current request is a HEAD request
+     *
+     * @param RequestInterface $request
+     *
+     * @return bool
+     */
+    protected function isHeadRequest(RequestInterface $request)
+    {
+        return strtoupper($request->getMethod()) === 'HEAD';
+    }
+
+    /**
      * Call relevant handler from the Container if needed. If it doesn't exist,
      * then just re-throw.
      *
diff --git a/vendor/slim/slim/Slim/CallableResolver.php b/vendor/slim/slim/Slim/CallableResolver.php
index b2ce3683..2211a329 100644
--- a/vendor/slim/slim/Slim/CallableResolver.php
+++ b/vendor/slim/slim/Slim/CallableResolver.php
@@ -34,7 +34,7 @@ final class CallableResolver implements CallableResolverInterface
     }
 
     /**
-     * Resolve toResolve into a closure that that the router can dispatch.
+     * Resolve toResolve into a closure so that the router can dispatch.
      *
      * If toResolve is of the format 'class:method', then try to extract 'class'
      * from the container otherwise instantiate it and then dispatch 'method'.
diff --git a/vendor/slim/slim/Slim/Container.php b/vendor/slim/slim/Slim/Container.php
index ac0d9179..09a42293 100644
--- a/vendor/slim/slim/Slim/Container.php
+++ b/vendor/slim/slim/Slim/Container.php
@@ -17,11 +17,11 @@ use Slim\Exception\ContainerException as SlimContainerException;
 /**
  * Slim's default DI container is Pimple.
  *
- * Slim\App expects a container that implements Interop\Container\ContainerInterface
+ * Slim\App expects a container that implements Psr\Container\ContainerInterface
  * with these service keys configured and ready for use:
  *
  *  - settings: an array or instance of \ArrayAccess
- *  - environment: an instance of \Slim\Interfaces\Http\EnvironmentInterface
+ *  - environment: an instance of \Slim\Http\Environment
  *  - request: an instance of \Psr\Http\Message\ServerRequestInterface
  *  - response: an instance of \Psr\Http\Message\ResponseInterface
  *  - router: an instance of \Slim\Interfaces\RouterInterface
@@ -31,16 +31,16 @@ use Slim\Exception\ContainerException as SlimContainerException;
  *  - notAllowedHandler: a callable with the signature: function($request, $response, $allowedHttpMethods)
  *  - callableResolver: an instance of \Slim\Interfaces\CallableResolverInterface
  *
- * @property-read array settings
- * @property-read \Slim\Interfaces\Http\EnvironmentInterface environment
- * @property-read \Psr\Http\Message\ServerRequestInterface request
- * @property-read \Psr\Http\Message\ResponseInterface response
- * @property-read \Slim\Interfaces\RouterInterface router
- * @property-read \Slim\Interfaces\InvocationStrategyInterface foundHandler
- * @property-read callable errorHandler
- * @property-read callable notFoundHandler
- * @property-read callable notAllowedHandler
- * @property-read \Slim\Interfaces\CallableResolverInterface callableResolver
+ * @property-read array $settings
+ * @property-read \Slim\Http\Environment $environment
+ * @property-read \Psr\Http\Message\ServerRequestInterface $request
+ * @property-read \Psr\Http\Message\ResponseInterface $response
+ * @property-read \Slim\Interfaces\RouterInterface $router
+ * @property-read \Slim\Interfaces\InvocationStrategyInterface $foundHandler
+ * @property-read callable $errorHandler
+ * @property-read callable $notFoundHandler
+ * @property-read callable $notAllowedHandler
+ * @property-read \Slim\Interfaces\CallableResolverInterface $callableResolver
  */
 class Container extends PimpleContainer implements ContainerInterface
 {
@@ -101,7 +101,7 @@ class Container extends PimpleContainer implements ContainerInterface
     }
 
     /********************************************************************************
-     * Methods to satisfy Interop\Container\ContainerInterface
+     * Methods to satisfy Psr\Container\ContainerInterface
      *******************************************************************************/
 
     /**
diff --git a/vendor/slim/slim/Slim/DefaultServicesProvider.php b/vendor/slim/slim/Slim/DefaultServicesProvider.php
index 7087e4e8..ebcf72bb 100644
--- a/vendor/slim/slim/Slim/DefaultServicesProvider.php
+++ b/vendor/slim/slim/Slim/DefaultServicesProvider.php
@@ -20,7 +20,6 @@ use Slim\Http\Headers;
 use Slim\Http\Request;
 use Slim\Http\Response;
 use Slim\Interfaces\CallableResolverInterface;
-use Slim\Interfaces\Http\EnvironmentInterface;
 use Slim\Interfaces\InvocationStrategyInterface;
 use Slim\Interfaces\RouterInterface;
 
@@ -39,9 +38,9 @@ class DefaultServicesProvider
         if (!isset($container['environment'])) {
             /**
              * This service MUST return a shared instance
-             * of \Slim\Interfaces\Http\EnvironmentInterface.
+             * of \Slim\Http\Environment.
              *
-             * @return EnvironmentInterface
+             * @return Environment
              */
             $container['environment'] = function () {
                 return new Environment($_SERVER);
@@ -152,7 +151,9 @@ class DefaultServicesProvider
              * @return callable
              */
             $container['errorHandler'] = function ($container) {
-                return new Error($container->get('settings')['displayErrorDetails']);
+                return new Error(
+                    $container->get('settings')['displayErrorDetails']
+                );
             };
         }
 
diff --git a/vendor/slim/slim/Slim/Exception/ContainerException.php b/vendor/slim/slim/Slim/Exception/ContainerException.php
index b147eb99..06163f1d 100644
--- a/vendor/slim/slim/Slim/Exception/ContainerException.php
+++ b/vendor/slim/slim/Slim/Exception/ContainerException.php
@@ -4,7 +4,7 @@
  *
  * @link      https://github.com/slimphp/Slim
  * @copyright Copyright (c) 2011-2017 Josh Lockhart
- * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE (MIT License)
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
  */
 namespace Slim\Exception;
 
diff --git a/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php b/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php
index c5033b6d..33de07e3 100644
--- a/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php
+++ b/vendor/slim/slim/Slim/Exception/ContainerValueNotFoundException.php
@@ -4,7 +4,7 @@
  *
  * @link      https://github.com/slimphp/Slim
  * @copyright Copyright (c) 2011-2017 Josh Lockhart
- * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE (MIT License)
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
  */
 namespace Slim\Exception;
 
diff --git a/vendor/slim/slim/Slim/Exception/InvalidMethodException.php b/vendor/slim/slim/Slim/Exception/InvalidMethodException.php
index 238bf7a3..4aabf833 100644
--- a/vendor/slim/slim/Slim/Exception/InvalidMethodException.php
+++ b/vendor/slim/slim/Slim/Exception/InvalidMethodException.php
@@ -1,5 +1,11 @@
 <?php
-
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
 namespace Slim\Exception;
 
 use Psr\Http\Message\ServerRequestInterface;
diff --git a/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php b/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php
index e73b99ee..951f5dfb 100644
--- a/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php
+++ b/vendor/slim/slim/Slim/Exception/MethodNotAllowedException.php
@@ -4,7 +4,7 @@
  *
  * @link      https://github.com/slimphp/Slim
  * @copyright Copyright (c) 2011-2017 Josh Lockhart
- * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE (MIT License)
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
  */
 namespace Slim\Exception;
 
diff --git a/vendor/slim/slim/Slim/Exception/NotFoundException.php b/vendor/slim/slim/Slim/Exception/NotFoundException.php
index 8095eaca..9e72e14e 100644
--- a/vendor/slim/slim/Slim/Exception/NotFoundException.php
+++ b/vendor/slim/slim/Slim/Exception/NotFoundException.php
@@ -4,7 +4,7 @@
  *
  * @link      https://github.com/slimphp/Slim
  * @copyright Copyright (c) 2011-2017 Josh Lockhart
- * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE (MIT License)
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
  */
 namespace Slim\Exception;
 
diff --git a/vendor/slim/slim/Slim/Handlers/AbstractError.php b/vendor/slim/slim/Slim/Handlers/AbstractError.php
index 42f8dde3..90bdcdef 100644
--- a/vendor/slim/slim/Slim/Handlers/AbstractError.php
+++ b/vendor/slim/slim/Slim/Handlers/AbstractError.php
@@ -90,7 +90,7 @@ abstract class AbstractError extends AbstractHandler
     /**
      * Wraps the error_log function so that this can be easily tested
      *
-     * @param $message
+     * @param string $message
      */
     protected function logError($message)
     {
diff --git a/vendor/slim/slim/Slim/Handlers/NotAllowed.php b/vendor/slim/slim/Slim/Handlers/NotAllowed.php
index 9f382c45..345f0ff8 100644
--- a/vendor/slim/slim/Slim/Handlers/NotAllowed.php
+++ b/vendor/slim/slim/Slim/Handlers/NotAllowed.php
@@ -36,7 +36,7 @@ class NotAllowed extends AbstractHandler
         if ($request->getMethod() === 'OPTIONS') {
             $status = 200;
             $contentType = 'text/plain';
-            $output = $this->renderPlainNotAllowedMessage($methods);
+            $output = $this->renderPlainOptionsMessage($methods);
         } else {
             $status = 405;
             $contentType = $this->determineContentType($request);
@@ -70,12 +70,12 @@ class NotAllowed extends AbstractHandler
     }
 
     /**
-     * Render PLAIN not allowed message
+     * Render PLAIN message for OPTIONS response
      *
      * @param  array                  $methods
      * @return string
      */
-    protected function renderPlainNotAllowedMessage($methods)
+    protected function renderPlainOptionsMessage($methods)
     {
         $allow = implode(', ', $methods);
 
diff --git a/vendor/slim/slim/Slim/Handlers/NotFound.php b/vendor/slim/slim/Slim/Handlers/NotFound.php
index d4a9dec4..7ad2faaa 100644
--- a/vendor/slim/slim/Slim/Handlers/NotFound.php
+++ b/vendor/slim/slim/Slim/Handlers/NotFound.php
@@ -32,23 +32,28 @@ class NotFound extends AbstractHandler
      */
     public function __invoke(ServerRequestInterface $request, ResponseInterface $response)
     {
-        $contentType = $this->determineContentType($request);
-        switch ($contentType) {
-            case 'application/json':
-                $output = $this->renderJsonNotFoundOutput();
-                break;
+        if ($request->getMethod() === 'OPTIONS') {
+            $contentType = 'text/plain';
+            $output = $this->renderPlainNotFoundOutput();
+        } else {
+            $contentType = $this->determineContentType($request);
+            switch ($contentType) {
+                case 'application/json':
+                    $output = $this->renderJsonNotFoundOutput();
+                    break;
 
-            case 'text/xml':
-            case 'application/xml':
-                $output = $this->renderXmlNotFoundOutput();
-                break;
+                case 'text/xml':
+                case 'application/xml':
+                    $output = $this->renderXmlNotFoundOutput();
+                    break;
 
-            case 'text/html':
-                $output = $this->renderHtmlNotFoundOutput($request);
-                break;
+                case 'text/html':
+                    $output = $this->renderHtmlNotFoundOutput($request);
+                    break;
 
-            default:
-                throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType);
+                default:
+                    throw new UnexpectedValueException('Cannot render unknown content type ' . $contentType);
+            }
         }
 
         $body = new Body(fopen('php://temp', 'r+'));
@@ -60,9 +65,19 @@ class NotFound extends AbstractHandler
     }
 
     /**
+     * Render plain not found message
+     *
+     * @return string
+     */
+    protected function renderPlainNotFoundOutput()
+    {
+        return 'Not found';
+    }
+
+    /**
      * Return a response for application/json content not found
      *
-     * @return ResponseInterface
+     * @return string
      */
     protected function renderJsonNotFoundOutput()
     {
@@ -72,7 +87,7 @@ class NotFound extends AbstractHandler
     /**
      * Return a response for xml content not found
      *
-     * @return ResponseInterface
+     * @return string
      */
     protected function renderXmlNotFoundOutput()
     {
@@ -84,7 +99,7 @@ class NotFound extends AbstractHandler
      *
      * @param  ServerRequestInterface $request  The most recent Request object
      *
-     * @return ResponseInterface
+     * @return string
      */
     protected function renderHtmlNotFoundOutput(ServerRequestInterface $request)
     {
diff --git a/vendor/slim/slim/Slim/Http/Cookies.php b/vendor/slim/slim/Slim/Http/Cookies.php
index c07c96f2..0ca0b0bf 100644
--- a/vendor/slim/slim/Slim/Http/Cookies.php
+++ b/vendor/slim/slim/Slim/Http/Cookies.php
@@ -42,7 +42,8 @@ class Cookies implements CookiesInterface
         'path' => null,
         'expires' => null,
         'secure' => false,
-        'httponly' => false
+        'httponly' => false,
+        'samesite' => null
     ];
 
     /**
@@ -150,6 +151,11 @@ class Cookies implements CookiesInterface
             $result .= '; HttpOnly';
         }
 
+        if (isset($properties['samesite']) && in_array(strtolower($properties['samesite']), ['lax', 'strict'], true)) {
+            // While strtolower is needed for correct comparison, the RFC doesn't care about case
+            $result .= '; SameSite=' . $properties['samesite'];
+        }
+
         return $result;
     }
 
diff --git a/vendor/slim/slim/Slim/Http/Environment.php b/vendor/slim/slim/Slim/Http/Environment.php
index 786dc0a2..cd452fcf 100644
--- a/vendor/slim/slim/Slim/Http/Environment.php
+++ b/vendor/slim/slim/Slim/Http/Environment.php
@@ -29,14 +29,25 @@ class Environment extends Collection implements EnvironmentInterface
      */
     public static function mock(array $userData = [])
     {
+        //Validates if default protocol is HTTPS to set default port 443
+        if ((isset($userData['HTTPS']) && $userData['HTTPS'] !== 'off') ||
+            ((isset($userData['REQUEST_SCHEME']) && $userData['REQUEST_SCHEME'] === 'https'))) {
+            $defscheme = 'https';
+            $defport = 443;
+        } else {
+            $defscheme = 'http';
+            $defport = 80;
+        }
+
         $data = array_merge([
             'SERVER_PROTOCOL'      => 'HTTP/1.1',
             'REQUEST_METHOD'       => 'GET',
+            'REQUEST_SCHEME'       => $defscheme,
             'SCRIPT_NAME'          => '',
             'REQUEST_URI'          => '',
             'QUERY_STRING'         => '',
             'SERVER_NAME'          => 'localhost',
-            'SERVER_PORT'          => 80,
+            'SERVER_PORT'          => $defport,
             'HTTP_HOST'            => 'localhost',
             'HTTP_ACCEPT'          => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
             'HTTP_ACCEPT_LANGUAGE' => 'en-US,en;q=0.8',
diff --git a/vendor/slim/slim/Slim/Http/Headers.php b/vendor/slim/slim/Slim/Http/Headers.php
index f8c4ac14..ef50f84b 100644
--- a/vendor/slim/slim/Slim/Http/Headers.php
+++ b/vendor/slim/slim/Slim/Http/Headers.php
@@ -77,7 +77,7 @@ class Headers extends Collection implements HeadersInterface
     {
         $authorization = $environment->get('HTTP_AUTHORIZATION');
 
-        if (null === $authorization && is_callable('getallheaders')) {
+        if (empty($authorization) && is_callable('getallheaders')) {
             $headers = getallheaders();
             $headers = array_change_key_case($headers, CASE_LOWER);
             if (isset($headers['authorization'])) {
diff --git a/vendor/slim/slim/Slim/Http/Message.php b/vendor/slim/slim/Slim/Http/Message.php
index d02a43c8..9195fb5b 100644
--- a/vendor/slim/slim/Slim/Http/Message.php
+++ b/vendor/slim/slim/Slim/Http/Message.php
@@ -40,6 +40,7 @@ abstract class Message implements MessageInterface
         '1.0' => true,
         '1.1' => true,
         '2.0' => true,
+        '2' => true,
     ];
 
     /**
diff --git a/vendor/slim/slim/Slim/Http/Request.php b/vendor/slim/slim/Slim/Http/Request.php
index f67050ba..fb57f990 100644
--- a/vendor/slim/slim/Slim/Http/Request.php
+++ b/vendor/slim/slim/Slim/Http/Request.php
@@ -17,7 +17,6 @@ use Psr\Http\Message\UriInterface;
 use Psr\Http\Message\StreamInterface;
 use Slim\Collection;
 use Slim\Exception\InvalidMethodException;
-use Slim\Exception\MethodNotAllowedException;
 use Slim\Interfaces\Http\HeadersInterface;
 
 /**
@@ -114,6 +113,7 @@ class Request extends Message implements ServerRequestInterface
      * Valid request methods
      *
      * @var string[]
+     * @deprecated
      */
     protected $validMethods = [
         'CONNECT' => 1,
@@ -197,8 +197,10 @@ class Request extends Message implements ServerRequestInterface
             $this->protocolVersion = str_replace('HTTP/', '', $serverParams['SERVER_PROTOCOL']);
         }
 
-        if (!$this->headers->has('Host') || $this->uri->getHost() !== '') {
-            $this->headers->set('Host', $this->uri->getHost());
+        if (!$this->headers->has('Host') && $this->uri->getHost() !== '') {
+            $port = $this->uri->getPort() ? ":{$this->uri->getPort()}" : '';
+
+            $this->headers->set('Host', $this->uri->getHost() . $port);
         }
 
         $this->registerMediaTypeParser('application/json', function ($input) {
@@ -349,7 +351,7 @@ class Request extends Message implements ServerRequestInterface
         }
 
         $method = strtoupper($method);
-        if (!isset($this->validMethods[$method])) {
+        if (preg_match("/^[!#$%&'*+.^_`|~0-9a-z-]+$/i", $method) !== 1) {
             throw new InvalidMethodException($this, $method);
         }
 
@@ -1028,13 +1030,16 @@ class Request extends Message implements ServerRequestInterface
 
         $mediaType = $this->getMediaType();
 
-        // look for a media type with a structured syntax suffix (RFC 6839)
-        $parts = explode('+', $mediaType);
-        if (count($parts) >= 2) {
-            $mediaType = 'application/' . $parts[count($parts)-1];
+        // Check if this specific media type has a parser registered first
+        if (!isset($this->bodyParsers[$mediaType])) {
+            // If not, look for a media type with a structured syntax suffix (RFC 6839)
+            $parts = explode('+', $mediaType);
+            if (count($parts) >= 2) {
+                $mediaType = 'application/' . $parts[count($parts)-1];
+            }
         }
 
-        if (isset($this->bodyParsers[$mediaType]) === true) {
+        if (isset($this->bodyParsers[$mediaType])) {
             $body = (string)$this->getBody();
             $parsed = $this->bodyParsers[$mediaType]($body);
 
@@ -1132,7 +1137,7 @@ class Request extends Message implements ServerRequestInterface
      * Note: This method is not part of the PSR-7 standard.
      *
      * @param  string $key The parameter key.
-     * @param  string $default The default value.
+     * @param  mixed $default The default value.
      *
      * @return mixed The parameter value.
      */
@@ -1201,14 +1206,25 @@ class Request extends Message implements ServerRequestInterface
      *
      * Note: This method is not part of the PSR-7 standard.
      *
-     * @return array
+     * @param array|null $only list the keys to retrieve.
+     * @return array|null
      */
-    public function getParams()
+    public function getParams(array $only = null)
     {
         $params = $this->getQueryParams();
         $postParams = $this->getParsedBody();
         if ($postParams) {
-            $params = array_merge($params, (array)$postParams);
+            $params = array_replace($params, (array)$postParams);
+        }
+
+        if ($only) {
+            $onlyParams = [];
+            foreach ($only as $key) {
+                if (array_key_exists($key, $params)) {
+                    $onlyParams[$key] = $params[$key];
+                }
+            }
+            return $onlyParams;
         }
 
         return $params;
diff --git a/vendor/slim/slim/Slim/Http/Response.php b/vendor/slim/slim/Slim/Http/Response.php
index dd965052..33a9eda4 100644
--- a/vendor/slim/slim/Slim/Http/Response.php
+++ b/vendor/slim/slim/Slim/Http/Response.php
@@ -31,7 +31,7 @@ class Response extends Message implements ResponseInterface
      *
      * @var int
      */
-    protected $status = 200;
+    protected $status = StatusCode::HTTP_OK;
 
     /**
      * Reason phrase
@@ -47,74 +47,74 @@ class Response extends Message implements ResponseInterface
      */
     protected static $messages = [
         //Informational 1xx
-        100 => 'Continue',
-        101 => 'Switching Protocols',
-        102 => 'Processing',
+        StatusCode::HTTP_CONTINUE => 'Continue',
+        StatusCode::HTTP_SWITCHING_PROTOCOLS => 'Switching Protocols',
+        StatusCode::HTTP_PROCESSING => 'Processing',
         //Successful 2xx
-        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',
-        226 => 'IM Used',
+        StatusCode::HTTP_OK => 'OK',
+        StatusCode::HTTP_CREATED => 'Created',
+        StatusCode::HTTP_ACCEPTED => 'Accepted',
+        StatusCode::HTTP_NONAUTHORITATIVE_INFORMATION => 'Non-Authoritative Information',
+        StatusCode::HTTP_NO_CONTENT => 'No Content',
+        StatusCode::HTTP_RESET_CONTENT => 'Reset Content',
+        StatusCode::HTTP_PARTIAL_CONTENT => 'Partial Content',
+        StatusCode::HTTP_MULTI_STATUS => 'Multi-Status',
+        StatusCode::HTTP_ALREADY_REPORTED => 'Already Reported',
+        StatusCode::HTTP_IM_USED => 'IM Used',
         //Redirection 3xx
-        300 => 'Multiple Choices',
-        301 => 'Moved Permanently',
-        302 => 'Found',
-        303 => 'See Other',
-        304 => 'Not Modified',
-        305 => 'Use Proxy',
-        306 => '(Unused)',
-        307 => 'Temporary Redirect',
-        308 => 'Permanent Redirect',
+        StatusCode::HTTP_MULTIPLE_CHOICES => 'Multiple Choices',
+        StatusCode::HTTP_MOVED_PERMANENTLY => 'Moved Permanently',
+        StatusCode::HTTP_FOUND => 'Found',
+        StatusCode::HTTP_SEE_OTHER => 'See Other',
+        StatusCode::HTTP_NOT_MODIFIED => 'Not Modified',
+        StatusCode::HTTP_USE_PROXY => 'Use Proxy',
+        StatusCode::HTTP_UNUSED => '(Unused)',
+        StatusCode::HTTP_TEMPORARY_REDIRECT => 'Temporary Redirect',
+        StatusCode::HTTP_PERMANENT_REDIRECT => 'Permanent Redirect',
         //Client Error 4xx
-        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 Timeout',
-        409 => 'Conflict',
-        410 => 'Gone',
-        411 => 'Length Required',
-        412 => 'Precondition Failed',
-        413 => 'Request Entity Too Large',
-        414 => 'Request-URI Too Long',
-        415 => 'Unsupported Media Type',
-        416 => 'Requested Range Not Satisfiable',
-        417 => 'Expectation Failed',
-        418 => 'I\'m a teapot',
-        421 => 'Misdirected Request',
-        422 => 'Unprocessable Entity',
-        423 => 'Locked',
-        424 => 'Failed Dependency',
-        426 => 'Upgrade Required',
-        428 => 'Precondition Required',
-        429 => 'Too Many Requests',
-        431 => 'Request Header Fields Too Large',
-        444 => 'Connection Closed Without Response',
-        451 => 'Unavailable For Legal Reasons',
-        499 => 'Client Closed Request',
+        StatusCode::HTTP_BAD_REQUEST => 'Bad Request',
+        StatusCode::HTTP_UNAUTHORIZED => 'Unauthorized',
+        StatusCode::HTTP_PAYMENT_REQUIRED => 'Payment Required',
+        StatusCode::HTTP_FORBIDDEN => 'Forbidden',
+        StatusCode::HTTP_NOT_FOUND => 'Not Found',
+        StatusCode::HTTP_METHOD_NOT_ALLOWED => 'Method Not Allowed',
+        StatusCode::HTTP_NOT_ACCEPTABLE => 'Not Acceptable',
+        StatusCode::HTTP_PROXY_AUTHENTICATION_REQUIRED => 'Proxy Authentication Required',
+        StatusCode::HTTP_REQUEST_TIMEOUT => 'Request Timeout',
+        StatusCode::HTTP_CONFLICT => 'Conflict',
+        StatusCode::HTTP_GONE => 'Gone',
+        StatusCode::HTTP_LENGTH_REQUIRED => 'Length Required',
+        StatusCode::HTTP_PRECONDITION_FAILED => 'Precondition Failed',
+        StatusCode::HTTP_REQUEST_ENTITY_TOO_LARGE => 'Request Entity Too Large',
+        StatusCode::HTTP_REQUEST_URI_TOO_LONG => 'Request-URI Too Long',
+        StatusCode::HTTP_UNSUPPORTED_MEDIA_TYPE => 'Unsupported Media Type',
+        StatusCode::HTTP_REQUESTED_RANGE_NOT_SATISFIABLE => 'Requested Range Not Satisfiable',
+        StatusCode::HTTP_EXPECTATION_FAILED => 'Expectation Failed',
+        StatusCode::HTTP_IM_A_TEAPOT => 'I\'m a teapot',
+        StatusCode::HTTP_MISDIRECTED_REQUEST => 'Misdirected Request',
+        StatusCode::HTTP_UNPROCESSABLE_ENTITY => 'Unprocessable Entity',
+        StatusCode::HTTP_LOCKED => 'Locked',
+        StatusCode::HTTP_FAILED_DEPENDENCY => 'Failed Dependency',
+        StatusCode::HTTP_UPGRADE_REQUIRED => 'Upgrade Required',
+        StatusCode::HTTP_PRECONDITION_REQUIRED => 'Precondition Required',
+        StatusCode::HTTP_TOO_MANY_REQUESTS => 'Too Many Requests',
+        StatusCode::HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE => 'Request Header Fields Too Large',
+        StatusCode::HTTP_CONNECTION_CLOSED_WITHOUT_RESPONSE => 'Connection Closed Without Response',
+        StatusCode::HTTP_UNAVAILABLE_FOR_LEGAL_REASONS => 'Unavailable For Legal Reasons',
+        StatusCode::HTTP_CLIENT_CLOSED_REQUEST => 'Client Closed Request',
         //Server Error 5xx
-        500 => 'Internal Server Error',
-        501 => 'Not Implemented',
-        502 => 'Bad Gateway',
-        503 => 'Service Unavailable',
-        504 => 'Gateway Timeout',
-        505 => 'HTTP Version Not Supported',
-        506 => 'Variant Also Negotiates',
-        507 => 'Insufficient Storage',
-        508 => 'Loop Detected',
-        510 => 'Not Extended',
-        511 => 'Network Authentication Required',
-        599 => 'Network Connect Timeout Error',
+        StatusCode::HTTP_INTERNAL_SERVER_ERROR => 'Internal Server Error',
+        StatusCode::HTTP_NOT_IMPLEMENTED => 'Not Implemented',
+        StatusCode::HTTP_BAD_GATEWAY => 'Bad Gateway',
+        StatusCode::HTTP_SERVICE_UNAVAILABLE => 'Service Unavailable',
+        StatusCode::HTTP_GATEWAY_TIMEOUT => 'Gateway Timeout',
+        StatusCode::HTTP_VERSION_NOT_SUPPORTED => 'HTTP Version Not Supported',
+        StatusCode::HTTP_VARIANT_ALSO_NEGOTIATES => 'Variant Also Negotiates',
+        StatusCode::HTTP_INSUFFICIENT_STORAGE => 'Insufficient Storage',
+        StatusCode::HTTP_LOOP_DETECTED => 'Loop Detected',
+        StatusCode::HTTP_NOT_EXTENDED => 'Not Extended',
+        StatusCode::HTTP_NETWORK_AUTHENTICATION_REQUIRED => 'Network Authentication Required',
+        StatusCode::HTTP_NETWORK_CONNECTION_TIMEOUT_ERROR => 'Network Connect Timeout Error',
     ];
 
     /**
@@ -122,7 +122,7 @@ class Response extends Message implements ResponseInterface
      *
      * @var string
      */
-     const EOL = "\r\n";
+    const EOL = "\r\n";
 
     /**
      * Create new HTTP response.
@@ -131,8 +131,11 @@ class Response extends Message implements ResponseInterface
      * @param HeadersInterface|null $headers The response headers.
      * @param StreamInterface|null  $body    The response body.
      */
-    public function __construct($status = 200, HeadersInterface $headers = null, StreamInterface $body = null)
-    {
+    public function __construct(
+        $status = StatusCode::HTTP_OK,
+        HeadersInterface $headers = null,
+        StreamInterface $body = null
+    ) {
         $this->status = $this->filterStatus($status);
         $this->headers = $headers ? $headers : new Headers();
         $this->body = $body ? $body : new Body(fopen('php://temp', 'r+'));
@@ -218,7 +221,10 @@ class Response extends Message implements ResponseInterface
      */
     protected function filterStatus($status)
     {
-        if (!is_integer($status) || $status<100 || $status>599) {
+        if (!is_integer($status) ||
+            $status<StatusCode::HTTP_CONTINUE ||
+            $status>StatusCode::HTTP_NETWORK_CONNECTION_TIMEOUT_ERROR
+        ) {
             throw new InvalidArgumentException('Invalid HTTP status code');
         }
 
@@ -250,6 +256,34 @@ class Response extends Message implements ResponseInterface
     }
 
     /*******************************************************************************
+     * Headers
+     ******************************************************************************/
+
+    /**
+     * Return an instance with the provided value replacing the specified header.
+     *
+     * If a Location header is set and the status code is 200, then set the status
+     * code to 302 to mimic what PHP does. See https://github.com/slimphp/Slim/issues/1730
+     *
+     * @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)
+    {
+        $clone = clone $this;
+        $clone->headers->set($name, $value);
+
+        if ($clone->getStatusCode() === StatusCode::HTTP_OK && strtolower($name) === 'location') {
+            $clone = $clone->withStatus(StatusCode::HTTP_FOUND);
+        }
+
+        return $clone;
+    }
+
+
+    /*******************************************************************************
      * Body
      ******************************************************************************/
 
@@ -290,8 +324,8 @@ class Response extends Message implements ResponseInterface
     {
         $responseWithRedirect = $this->withHeader('Location', (string)$url);
 
-        if (is_null($status) && $this->getStatusCode() === 200) {
-            $status = 302;
+        if (is_null($status) && $this->getStatusCode() === StatusCode::HTTP_OK) {
+            $status = StatusCode::HTTP_FOUND;
         }
 
         if (!is_null($status)) {
@@ -325,7 +359,7 @@ class Response extends Message implements ResponseInterface
             throw new \RuntimeException(json_last_error_msg(), json_last_error());
         }
 
-        $responseWithJson = $response->withHeader('Content-Type', 'application/json;charset=utf-8');
+        $responseWithJson = $response->withHeader('Content-Type', 'application/json');
         if (isset($status)) {
             return $responseWithJson->withStatus($status);
         }
@@ -341,7 +375,10 @@ class Response extends Message implements ResponseInterface
      */
     public function isEmpty()
     {
-        return in_array($this->getStatusCode(), [204, 205, 304]);
+        return in_array(
+            $this->getStatusCode(),
+            [StatusCode::HTTP_NO_CONTENT, StatusCode::HTTP_RESET_CONTENT, StatusCode::HTTP_NOT_MODIFIED]
+        );
     }
 
     /**
@@ -353,7 +390,7 @@ class Response extends Message implements ResponseInterface
      */
     public function isInformational()
     {
-        return $this->getStatusCode() >= 100 && $this->getStatusCode() < 200;
+        return $this->getStatusCode() >= StatusCode::HTTP_CONTINUE && $this->getStatusCode() < StatusCode::HTTP_OK;
     }
 
     /**
@@ -365,7 +402,7 @@ class Response extends Message implements ResponseInterface
      */
     public function isOk()
     {
-        return $this->getStatusCode() === 200;
+        return $this->getStatusCode() === StatusCode::HTTP_OK;
     }
 
     /**
@@ -377,7 +414,8 @@ class Response extends Message implements ResponseInterface
      */
     public function isSuccessful()
     {
-        return $this->getStatusCode() >= 200 && $this->getStatusCode() < 300;
+        return $this->getStatusCode() >= StatusCode::HTTP_OK &&
+            $this->getStatusCode() < StatusCode::HTTP_MULTIPLE_CHOICES;
     }
 
     /**
@@ -389,7 +427,16 @@ class Response extends Message implements ResponseInterface
      */
     public function isRedirect()
     {
-        return in_array($this->getStatusCode(), [301, 302, 303, 307]);
+        return in_array(
+            $this->getStatusCode(),
+            [
+                StatusCode::HTTP_MOVED_PERMANENTLY,
+                StatusCode::HTTP_FOUND,
+                StatusCode::HTTP_SEE_OTHER,
+                StatusCode::HTTP_TEMPORARY_REDIRECT,
+                StatusCode::HTTP_PERMANENT_REDIRECT
+            ]
+        );
     }
 
     /**
@@ -401,7 +448,8 @@ class Response extends Message implements ResponseInterface
      */
     public function isRedirection()
     {
-        return $this->getStatusCode() >= 300 && $this->getStatusCode() < 400;
+        return $this->getStatusCode() >= StatusCode::HTTP_MULTIPLE_CHOICES &&
+            $this->getStatusCode() < StatusCode::HTTP_BAD_REQUEST;
     }
 
     /**
@@ -414,7 +462,7 @@ class Response extends Message implements ResponseInterface
      */
     public function isForbidden()
     {
-        return $this->getStatusCode() === 403;
+        return $this->getStatusCode() === StatusCode::HTTP_FORBIDDEN;
     }
 
     /**
@@ -426,7 +474,7 @@ class Response extends Message implements ResponseInterface
      */
     public function isNotFound()
     {
-        return $this->getStatusCode() === 404;
+        return $this->getStatusCode() === StatusCode::HTTP_NOT_FOUND;
     }
 
     /**
@@ -438,7 +486,8 @@ class Response extends Message implements ResponseInterface
      */
     public function isClientError()
     {
-        return $this->getStatusCode() >= 400 && $this->getStatusCode() < 500;
+        return $this->getStatusCode() >= StatusCode::HTTP_BAD_REQUEST &&
+            $this->getStatusCode() < StatusCode::HTTP_INTERNAL_SERVER_ERROR;
     }
 
     /**
@@ -450,7 +499,7 @@ class Response extends Message implements ResponseInterface
      */
     public function isServerError()
     {
-        return $this->getStatusCode() >= 500 && $this->getStatusCode() < 600;
+        return $this->getStatusCode() >= StatusCode::HTTP_INTERNAL_SERVER_ERROR && $this->getStatusCode() < 600;
     }
 
     /**
diff --git a/vendor/slim/slim/Slim/Http/StatusCode.php b/vendor/slim/slim/Slim/Http/StatusCode.php
new file mode 100644
index 00000000..301bdd93
--- /dev/null
+++ b/vendor/slim/slim/Slim/Http/StatusCode.php
@@ -0,0 +1,81 @@
+<?php
+/**
+ * Slim Framework (https://slimframework.com)
+ *
+ * @link      https://github.com/slimphp/Slim
+ * @copyright Copyright (c) 2011-2017 Josh Lockhart
+ * @license   https://github.com/slimphp/Slim/blob/3.x/LICENSE.md (MIT License)
+ */
+namespace Slim\Http;
+
+class StatusCode
+{
+    const HTTP_CONTINUE = 100;
+    const HTTP_SWITCHING_PROTOCOLS = 101;
+    const HTTP_PROCESSING = 102;
+
+    const HTTP_OK = 200;
+    const HTTP_CREATED = 201;
+    const HTTP_ACCEPTED = 202;
+    const HTTP_NONAUTHORITATIVE_INFORMATION = 203;
+    const HTTP_NO_CONTENT = 204;
+    const HTTP_RESET_CONTENT = 205;
+    const HTTP_PARTIAL_CONTENT = 206;
+    const HTTP_MULTI_STATUS = 207;
+    const HTTP_ALREADY_REPORTED = 208;
+    const HTTP_IM_USED = 226;
+
+    const HTTP_MULTIPLE_CHOICES = 300;
+    const HTTP_MOVED_PERMANENTLY = 301;
+    const HTTP_FOUND = 302;
+    const HTTP_SEE_OTHER = 303;
+    const HTTP_NOT_MODIFIED = 304;
+    const HTTP_USE_PROXY = 305;
+    const HTTP_UNUSED= 306;
+    const HTTP_TEMPORARY_REDIRECT = 307;
+    const HTTP_PERMANENT_REDIRECT = 308;
+
+    const HTTP_BAD_REQUEST = 400;
+    const HTTP_UNAUTHORIZED  = 401;
+    const HTTP_PAYMENT_REQUIRED = 402;
+    const HTTP_FORBIDDEN = 403;
+    const HTTP_NOT_FOUND = 404;
+    const HTTP_METHOD_NOT_ALLOWED = 405;
+    const HTTP_NOT_ACCEPTABLE = 406;
+    const HTTP_PROXY_AUTHENTICATION_REQUIRED = 407;
+    const HTTP_REQUEST_TIMEOUT = 408;
+    const HTTP_CONFLICT = 409;
+    const HTTP_GONE = 410;
+    const HTTP_LENGTH_REQUIRED = 411;
+    const HTTP_PRECONDITION_FAILED = 412;
+    const HTTP_REQUEST_ENTITY_TOO_LARGE = 413;
+    const HTTP_REQUEST_URI_TOO_LONG = 414;
+    const HTTP_UNSUPPORTED_MEDIA_TYPE = 415;
+    const HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
+    const HTTP_EXPECTATION_FAILED = 417;
+    const HTTP_IM_A_TEAPOT = 418;
+    const HTTP_MISDIRECTED_REQUEST = 421;
+    const HTTP_UNPROCESSABLE_ENTITY = 422;
+    const HTTP_LOCKED = 423;
+    const HTTP_FAILED_DEPENDENCY = 424;
+    const HTTP_UPGRADE_REQUIRED = 426;
+    const HTTP_PRECONDITION_REQUIRED = 428;
+    const HTTP_TOO_MANY_REQUESTS = 429;
+    const HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431;
+    const HTTP_CONNECTION_CLOSED_WITHOUT_RESPONSE = 444;
+    const HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451;
+    const HTTP_CLIENT_CLOSED_REQUEST = 499;
+
+    const HTTP_INTERNAL_SERVER_ERROR = 500;
+    const HTTP_NOT_IMPLEMENTED = 501;
+    const HTTP_BAD_GATEWAY = 502;
+    const HTTP_SERVICE_UNAVAILABLE = 503;
+    const HTTP_GATEWAY_TIMEOUT = 504;
+    const HTTP_VERSION_NOT_SUPPORTED = 505;
+    const HTTP_VARIANT_ALSO_NEGOTIATES = 506;
+    const HTTP_INSUFFICIENT_STORAGE = 507;
+    const HTTP_LOOP_DETECTED = 508;
+    const HTTP_NOT_EXTENDED = 510;
+    const HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511;
+    const HTTP_NETWORK_CONNECTION_TIMEOUT_ERROR = 599;
+}
diff --git a/vendor/slim/slim/Slim/Http/UploadedFile.php b/vendor/slim/slim/Slim/Http/UploadedFile.php
index ae5dfb65..4bef0cae 100644
--- a/vendor/slim/slim/Slim/Http/UploadedFile.php
+++ b/vendor/slim/slim/Slim/Http/UploadedFile.php
@@ -85,7 +85,7 @@ class UploadedFile implements UploadedFileInterface
     {
         if (is_array($env['slim.files']) && $env->has('slim.files')) {
             return $env['slim.files'];
-        } elseif (isset($_FILES)) {
+        } elseif (! empty($_FILES)) {
             return static::parseUploadedFiles($_FILES);
         }
 
@@ -177,7 +177,7 @@ class UploadedFile implements UploadedFileInterface
     public function getStream()
     {
         if ($this->moved) {
-            throw new \RuntimeException(sprintf('Uploaded file %1s has already been moved', $this->name));
+            throw new \RuntimeException(sprintf('Uploaded file %s has already been moved', $this->name));
         }
         if ($this->stream === null) {
             $this->stream = new Stream(fopen($this->file, 'r'));
@@ -233,22 +233,22 @@ class UploadedFile implements UploadedFileInterface
 
         if ($targetIsStream) {
             if (!copy($this->file, $targetPath)) {
-                throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath));
+                throw new RuntimeException(sprintf('Error moving uploaded file %s to %s', $this->name, $targetPath));
             }
             if (!unlink($this->file)) {
-                throw new RuntimeException(sprintf('Error removing uploaded file %1s', $this->name));
+                throw new RuntimeException(sprintf('Error removing uploaded file %s', $this->name));
             }
         } elseif ($this->sapi) {
             if (!is_uploaded_file($this->file)) {
-                throw new RuntimeException(sprintf('%1s is not a valid uploaded file', $this->file));
+                throw new RuntimeException(sprintf('%s is not a valid uploaded file', $this->file));
             }
 
             if (!move_uploaded_file($this->file, $targetPath)) {
-                throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath));
+                throw new RuntimeException(sprintf('Error moving uploaded file %s to %s', $this->name, $targetPath));
             }
         } else {
             if (!rename($this->file, $targetPath)) {
-                throw new RuntimeException(sprintf('Error moving uploaded file %1s to %2s', $this->name, $targetPath));
+                throw new RuntimeException(sprintf('Error moving uploaded file %s to %s', $this->name, $targetPath));
             }
         }
 
diff --git a/vendor/slim/slim/Slim/Http/Uri.php b/vendor/slim/slim/Slim/Http/Uri.php
index 31f202a7..7e168a66 100644
--- a/vendor/slim/slim/Slim/Http/Uri.php
+++ b/vendor/slim/slim/Slim/Http/Uri.php
@@ -173,19 +173,21 @@ class Uri implements UriInterface
         $username = $env->get('PHP_AUTH_USER', '');
         $password = $env->get('PHP_AUTH_PW', '');
 
-        // Authority: Host
+        // Authority: Host and Port
         if ($env->has('HTTP_HOST')) {
             $host = $env->get('HTTP_HOST');
+            // set a port default
+            $port = null;
         } else {
             $host = $env->get('SERVER_NAME');
+            // set a port default
+            $port = (int)$env->get('SERVER_PORT', 80);
         }
 
-        // Authority: Port
-        $port = (int)$env->get('SERVER_PORT', 80);
         if (preg_match('/^(\[[a-fA-F0-9:.]+\])(:\d+)?\z/', $host, $matches)) {
             $host = $matches[1];
 
-            if ($matches[2]) {
+            if (isset($matches[2])) {
                 $port = (int) substr($matches[2], 1);
             }
         } else {
@@ -338,7 +340,7 @@ class Uri implements UriInterface
         $host = $this->getHost();
         $port = $this->getPort();
 
-        return ($userInfo ? $userInfo . '@' : '') . $host . ($port !== null ? ':' . $port : '');
+        return ($userInfo !== '' ? $userInfo . '@' : '') . $host . ($port !== null ? ':' . $port : '');
     }
 
     /**
@@ -358,7 +360,7 @@ class Uri implements UriInterface
      */
     public function getUserInfo()
     {
-        return $this->user . ($this->password ? ':' . $this->password : '');
+        return $this->user . ($this->password !== '' ? ':' . $this->password : '');
     }
 
     /**
@@ -378,13 +380,34 @@ class Uri implements UriInterface
     public function withUserInfo($user, $password = null)
     {
         $clone = clone $this;
-        $clone->user = $user;
-        $clone->password = $password ? $password : '';
+        $clone->user = $this->filterUserInfo($user);
+        if ('' !== $clone->user) {
+            $clone->password = !in_array($password, [null, ''], true) ? $this->filterUserInfo($password) : '';
+        } else {
+            $clone->password = '';
+        }
 
         return $clone;
     }
 
     /**
+     * Filters the user info string.
+     *
+     * @param string $query The raw uri query string.
+     * @return string The percent-encoded query string.
+     */
+    protected function filterUserInfo($query)
+    {
+        return preg_replace_callback(
+            '/(?:[^a-zA-Z0-9_\-\.~!\$&\'\(\)\*\+,;=]+|%(?![A-Fa-f0-9]{2}))/u',
+            function ($match) {
+                return rawurlencode($match[0]);
+            },
+            $query
+        );
+    }
+
+    /**
      * Retrieve the host component of the URI.
      *
      * If no host is present, this method MUST return an empty string.
@@ -791,11 +814,11 @@ class Uri implements UriInterface
 
         $path = $basePath . '/' . ltrim($path, '/');
 
-        return ($scheme ? $scheme . ':' : '')
-            . ($authority ? '//' . $authority : '')
+        return ($scheme !== '' ? $scheme . ':' : '')
+            . ($authority !== '' ? '//' . $authority : '')
             . $path
-            . ($query ? '?' . $query : '')
-            . ($fragment ? '#' . $fragment : '');
+            . ($query !== '' ? '?' . $query : '')
+            . ($fragment !== '' ? '#' . $fragment : '');
     }
 
     /**
@@ -813,11 +836,11 @@ class Uri implements UriInterface
         $authority = $this->getAuthority();
         $basePath = $this->getBasePath();
 
-        if ($authority && substr($basePath, 0, 1) !== '/') {
+        if ($authority !== '' && substr($basePath, 0, 1) !== '/') {
             $basePath = $basePath . '/' . $basePath;
         }
 
-        return ($scheme ? $scheme . ':' : '')
+        return ($scheme !== '' ? $scheme . ':' : '')
             . ($authority ? '//' . $authority : '')
             . rtrim($basePath, '/');
     }
diff --git a/vendor/slim/slim/Slim/Interfaces/RouteInterface.php b/vendor/slim/slim/Slim/Interfaces/RouteInterface.php
index d2d0d24d..64be5341 100644
--- a/vendor/slim/slim/Slim/Interfaces/RouteInterface.php
+++ b/vendor/slim/slim/Slim/Interfaces/RouteInterface.php
@@ -72,6 +72,17 @@ interface RouteInterface
     public function setArguments(array $arguments);
 
     /**
+     * Set output buffering mode
+     *
+     * One of: false, 'prepend' or 'append'
+     *
+     * @param boolean|string $mode
+     *
+     * @throws InvalidArgumentException If an unknown buffering mode is specified
+     */
+    public function setOutputBuffering($mode);
+
+    /**
      * Set route name
      *
      * @param string $name
diff --git a/vendor/slim/slim/Slim/Interfaces/RouterInterface.php b/vendor/slim/slim/Slim/Interfaces/RouterInterface.php
index 2ab8b678..4803c128 100644
--- a/vendor/slim/slim/Slim/Interfaces/RouterInterface.php
+++ b/vendor/slim/slim/Slim/Interfaces/RouterInterface.php
@@ -75,7 +75,7 @@ interface RouterInterface
     public function getNamedRoute($name);
 
     /**
-     * @param $identifier
+     * @param string $identifier
      *
      * @return \Slim\Interfaces\RouteInterface
      */
diff --git a/vendor/slim/slim/Slim/MiddlewareAwareTrait.php b/vendor/slim/slim/Slim/MiddlewareAwareTrait.php
index 14404b55..8b8a1755 100644
--- a/vendor/slim/slim/Slim/MiddlewareAwareTrait.php
+++ b/vendor/slim/slim/Slim/MiddlewareAwareTrait.php
@@ -9,8 +9,6 @@
 namespace Slim;
 
 use RuntimeException;
-use SplStack;
-use SplDoublyLinkedList;
 use Psr\Http\Message\ServerRequestInterface;
 use Psr\Http\Message\ResponseInterface;
 use UnexpectedValueException;
@@ -25,12 +23,11 @@ use UnexpectedValueException;
 trait MiddlewareAwareTrait
 {
     /**
-     * Middleware call stack
+     * Tip of the middleware call stack
      *
-     * @var  \SplStack
-     * @link http://php.net/manual/class.splstack.php
+     * @var callable
      */
-    protected $stack;
+    protected $tip;
 
     /**
      * Middleware stack lock
@@ -59,11 +56,11 @@ trait MiddlewareAwareTrait
             throw new RuntimeException('Middleware canâ??t be added once the stack is dequeuing');
         }
 
-        if (is_null($this->stack)) {
+        if (is_null($this->tip)) {
             $this->seedMiddlewareStack();
         }
-        $next = $this->stack->top();
-        $this->stack[] = function (
+        $next = $this->tip;
+        $this->tip = function (
             ServerRequestInterface $request,
             ResponseInterface $response
         ) use (
@@ -92,15 +89,13 @@ trait MiddlewareAwareTrait
      */
     protected function seedMiddlewareStack(callable $kernel = null)
     {
-        if (!is_null($this->stack)) {
+        if (!is_null($this->tip)) {
             throw new RuntimeException('MiddlewareStack can only be seeded once.');
         }
         if ($kernel === null) {
             $kernel = $this;
         }
-        $this->stack = new SplStack;
-        $this->stack->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO | SplDoublyLinkedList::IT_MODE_KEEP);
-        $this->stack[] = $kernel;
+        $this->tip = $kernel;
     }
 
     /**
@@ -113,11 +108,11 @@ trait MiddlewareAwareTrait
      */
     public function callMiddlewareStack(ServerRequestInterface $request, ResponseInterface $response)
     {
-        if (is_null($this->stack)) {
+        if (is_null($this->tip)) {
             $this->seedMiddlewareStack();
         }
         /** @var callable $start */
-        $start = $this->stack->top();
+        $start = $this->tip;
         $this->middlewareLock = true;
         $response = $start($request, $response);
         $this->middlewareLock = false;
diff --git a/vendor/slim/slim/Slim/Route.php b/vendor/slim/slim/Slim/Route.php
index 6a44b3fc..117c0998 100644
--- a/vendor/slim/slim/Slim/Route.php
+++ b/vendor/slim/slim/Slim/Route.php
@@ -8,12 +8,9 @@
  */
 namespace Slim;
 
-use Exception;
-use Throwable;
 use InvalidArgumentException;
 use Psr\Http\Message\ServerRequestInterface;
 use Psr\Http\Message\ResponseInterface;
-use Slim\Exception\SlimException;
 use Slim\Handlers\Strategies\RequestResponse;
 use Slim\Interfaces\InvocationStrategyInterface;
 use Slim\Interfaces\RouteInterface;
@@ -72,6 +69,13 @@ class Route extends Routable implements RouteInterface
     protected $arguments = [];
 
     /**
+     * Route arguments parameters
+     *
+     * @var null|array
+     */
+    protected $savedArguments = [];
+
+    /**
      * The callable payload
      *
      * @var callable
@@ -196,6 +200,8 @@ class Route extends Routable implements RouteInterface
      *
      * @param boolean|string $mode
      *
+     * @return self
+     *
      * @throws InvalidArgumentException If an unknown buffering mode is specified
      */
     public function setOutputBuffering($mode)
@@ -204,6 +210,7 @@ class Route extends Routable implements RouteInterface
             throw new InvalidArgumentException('Unknown output buffering mode');
         }
         $this->outputBuffering = $mode;
+        return $this;
     }
 
     /**
@@ -229,11 +236,15 @@ class Route extends Routable implements RouteInterface
      *
      * @param string $name
      * @param string $value
+     * @param bool $includeInSavedArguments
      *
      * @return self
      */
-    public function setArgument($name, $value)
+    public function setArgument($name, $value, $includeInSavedArguments = true)
     {
+        if ($includeInSavedArguments) {
+            $this->savedArguments[$name] = $value;
+        }
         $this->arguments[$name] = $value;
         return $this;
     }
@@ -242,11 +253,15 @@ class Route extends Routable implements RouteInterface
      * Replace route arguments
      *
      * @param array $arguments
+     * @param bool $includeInSavedArguments
      *
      * @return self
      */
-    public function setArguments(array $arguments)
+    public function setArguments(array $arguments, $includeInSavedArguments = true)
     {
+        if ($includeInSavedArguments) {
+            $this->savedArguments = $arguments;
+        }
         $this->arguments = $arguments;
         return $this;
     }
@@ -289,9 +304,12 @@ class Route extends Routable implements RouteInterface
      */
     public function prepare(ServerRequestInterface $request, array $arguments)
     {
-        // Add the arguments
+        // Remove temp arguments
+        $this->setArguments($this->savedArguments);
+
+        // Add the route arguments
         foreach ($arguments as $k => $v) {
-            $this->setArgument($k, $v);
+            $this->setArgument($k, $v, false);
         }
     }
 
@@ -335,24 +353,7 @@ class Route extends Routable implements RouteInterface
         /** @var InvocationStrategyInterface $handler */
         $handler = isset($this->container) ? $this->container->get('foundHandler') : new RequestResponse();
 
-        // invoke route callable
-        if ($this->outputBuffering === false) {
-            $newResponse = $handler($this->callable, $request, $response, $this->arguments);
-        } else {
-            try {
-                ob_start();
-                $newResponse = $handler($this->callable, $request, $response, $this->arguments);
-                $output = ob_get_clean();
-            // @codeCoverageIgnoreStart
-            } catch (Throwable $e) {
-                ob_end_clean();
-                throw $e;
-            // @codeCoverageIgnoreEnd
-            } catch (Exception $e) {
-                ob_end_clean();
-                throw $e;
-            }
-        }
+        $newResponse = $handler($this->callable, $request, $response, $this->arguments);
 
         if ($newResponse instanceof ResponseInterface) {
             // if route callback returns a ResponseInterface, then use it
@@ -364,18 +365,6 @@ class Route extends Routable implements RouteInterface
             }
         }
 
-        if (!empty($output) && $response->getBody()->isWritable()) {
-            if ($this->outputBuffering === 'prepend') {
-                // prepend output buffer content
-                $body = new Http\Body(fopen('php://temp', 'r+'));
-                $body->write($output . $response->getBody());
-                $response = $response->withBody($body);
-            } elseif ($this->outputBuffering === 'append') {
-                // append output buffer content
-                $response->getBody()->write($output);
-            }
-        }
-
         return $response;
     }
 }
diff --git a/vendor/slim/slim/Slim/RouteGroup.php b/vendor/slim/slim/Slim/RouteGroup.php
index 705ac45d..8260bbd6 100644
--- a/vendor/slim/slim/Slim/RouteGroup.php
+++ b/vendor/slim/slim/Slim/RouteGroup.php
@@ -33,7 +33,7 @@ class RouteGroup extends Routable implements RouteGroupInterface
     /**
      * Invoke the group to register any Routable objects within it.
      *
-     * @param App $app The App to bind the callable to.
+     * @param App $app The App instance to bind/pass to the group callable
      */
     public function __invoke(App $app = null)
     {
@@ -42,6 +42,6 @@ class RouteGroup extends Routable implements RouteGroupInterface
             $callable = $callable->bindTo($app);
         }
 
-        $callable();
+        $callable($app);
     }
 }
diff --git a/vendor/slim/slim/Slim/Router.php b/vendor/slim/slim/Slim/Router.php
index 83116288..d3ac825b 100644
--- a/vendor/slim/slim/Slim/Router.php
+++ b/vendor/slim/slim/Slim/Router.php
@@ -112,6 +112,16 @@ class Router implements RouterInterface
     }
 
     /**
+     * Get the base path used in pathFor()
+     *
+     * @return string
+     */
+    public function getBasePath()
+    {
+        return $this->basePath;
+    }
+
+    /**
      * Set path to fast route cache file. If this is false then route caching is disabled.
      *
      * @param string|false $cacheFile
@@ -121,16 +131,22 @@ class Router implements RouterInterface
     public function setCacheFile($cacheFile)
     {
         if (!is_string($cacheFile) && $cacheFile !== false) {
-            throw new InvalidArgumentException('Router cacheFile must be a string or false');
+            throw new InvalidArgumentException('Router cache file must be a string or false');
         }
 
-        $this->cacheFile = $cacheFile;
-
-        if ($cacheFile !== false && !is_writable(dirname($cacheFile))) {
-            throw new RuntimeException('Router cacheFile directory must be writable');
+        if ($cacheFile && file_exists($cacheFile) && !is_readable($cacheFile)) {
+            throw new RuntimeException(
+                sprintf('Router cache file `%s` is not readable', $cacheFile)
+            );
         }
 
+        if ($cacheFile && !file_exists($cacheFile) && !is_writable(dirname($cacheFile))) {
+            throw new RuntimeException(
+                sprintf('Router cache file directory `%s` is not writable', dirname($cacheFile))
+            );
+        }
 
+        $this->cacheFile = $cacheFile;
         return $this;
     }
 
@@ -167,8 +183,9 @@ class Router implements RouterInterface
         // According to RFC methods are defined in uppercase (See RFC 7231)
         $methods = array_map("strtoupper", $methods);
 
-        // Add route
+        /** @var \Slim\Route */
         $route = $this->createRoute($methods, $pattern, $handler);
+        // Add route
         $this->routes[$route->getIdentifier()] = $route;
         $this->routeCounter++;
 
@@ -335,7 +352,8 @@ class Router implements RouterInterface
     }
 
     /**
-     * @param $identifier
+     *
+     * @param string $identifier
      * @return \Slim\Interfaces\RouteInterface
      */
     public function lookupRoute($identifier)
@@ -371,6 +389,7 @@ class Router implements RouterInterface
         $routeDatas = array_reverse($routeDatas);
 
         $segments = [];
+        $segmentName = '';
         foreach ($routeDatas as $routeData) {
             foreach ($routeData as $item) {
                 if (is_string($item)) {
diff --git a/vendor/slim/slim/composer.json b/vendor/slim/slim/composer.json
index 554a838a..ca85d580 100644
--- a/vendor/slim/slim/composer.json
+++ b/vendor/slim/slim/composer.json
@@ -47,12 +47,15 @@
             "Slim\\": "Slim"
         }
     },
+    "autoload-dev": {
+        "files": [
+          "tests/Assets/PhpFunctionOverrides.php"
+        ]
+    },
     "scripts": {
         "test": [
-            "@phpunit",
-            "@phpcs"
-        ],
-        "phpunit": "php vendor/bin/phpunit",
-        "phpcs": "php vendor/bin/phpcs"
+            "phpunit",
+            "phpcs"
+        ]
     }
 }
diff --git a/vendor/slim/slim/phpstan.neon.dist b/vendor/slim/slim/phpstan.neon.dist
new file mode 100644
index 00000000..2fc56e79
--- /dev/null
+++ b/vendor/slim/slim/phpstan.neon.dist
@@ -0,0 +1,2 @@
+parameters:
+    level: 1
diff --git a/vendor/slim/twig-view/README.md b/vendor/slim/twig-view/README.md
index 13819761..dcb8af5a 100644
--- a/vendor/slim/twig-view/README.md
+++ b/vendor/slim/twig-view/README.md
@@ -30,8 +30,9 @@ $container['view'] = function ($c) {
     ]);
     
     // Instantiate and add Slim specific extension
-    $basePath = rtrim(str_ireplace('index.php', '', $c['request']->getUri()->getBasePath()), '/');
-    $view->addExtension(new \Slim\Views\TwigExtension($c['router'], $basePath));
+    $router = $c->get('router');
+    $uri = \Slim\Http\Uri::createFromEnvironment(new \Slim\Http\Environment($_SERVER));
+    $view->addExtension(new \Slim\Views\TwigExtension($router, $uri));
 
     return $view;
 };
@@ -58,18 +59,27 @@ $app->run();
 
 ## Custom template functions
 
-This component exposes a custom `path_for()` function to your Twig templates. You can use this function to generate complete URLs to any Slim application named route. This is an example Twig template:
+`TwigExtension` provides these functions to your Twig templates:
+
+* `path_for()` - returns the URL for a given route.
+* `base_url()` - returns the `Uri` object's base URL.
+* `is_current_path()` - returns true is the provided route name and parameters are valid for the current path.
+* `current_path()` - renders the current path, with or without the query string.
+
+
+You can use `path_for` to generate complete URLs to any Slim application named route and use `is_current_path` to determine if you need to mark a link as active as shown in this example Twig template:
 
     {% extends "layout.html" %}
 
     {% block body %}
     <h1>User List</h1>
     <ul>
-        <li><a href="{{ path_for('profile', { 'name': 'josh' }) }}" {% if is_current_path('profle', { 'name': 'josh' }) %}class="active"{% endif %}>Josh</a></li>
+        <li><a href="{{ path_for('profile', { 'name': 'josh' }) }}" {% if is_current_path('profile', { 'name': 'josh' }) %}class="active"{% endif %}>Josh</a></li>
         <li><a href="{{ path_for('profile', { 'name': 'andrew' }) }}">Andrew</a></li>
     </ul>
     {% endblock %}
 
+
 ## Testing
 
 ```bash
diff --git a/vendor/slim/twig-view/composer.json b/vendor/slim/twig-view/composer.json
index ddd1dbc8..1653ff3d 100644
--- a/vendor/slim/twig-view/composer.json
+++ b/vendor/slim/twig-view/composer.json
@@ -14,11 +14,12 @@
     ],
     "require": {
         "php": ">=5.5.0",
-        "twig/twig": "^1.18|^2.0",
+        "twig/twig": "^1.38|^2.7",
         "psr/http-message": "^1.0"
     },
     "require-dev": {
-        "phpunit/phpunit": "^4.8|^5.7"
+        "phpunit/phpunit": "^4.8|^5.7",
+        "slim/slim": "^3.10"
     },
     "autoload": {
         "psr-4": {
diff --git a/vendor/slim/twig-view/src/Twig.php b/vendor/slim/twig-view/src/Twig.php
index 5db67b3e..b0ffd90c 100644
--- a/vendor/slim/twig-view/src/Twig.php
+++ b/vendor/slim/twig-view/src/Twig.php
@@ -24,14 +24,14 @@ class Twig implements \ArrayAccess
     /**
      * Twig loader
      *
-     * @var \Twig_LoaderInterface
+     * @var \Twig\Loader\LoaderInterface
      */
     protected $loader;
 
     /**
      * Twig environment
      *
-     * @var \Twig_Environment
+     * @var \Twig\Environment
      */
     protected $environment;
 
@@ -55,7 +55,7 @@ class Twig implements \ArrayAccess
     public function __construct($path, $settings = [])
     {
         $this->loader = $this->createLoader(is_string($path) ? [$path] : $path);
-        $this->environment = new \Twig_Environment($this->loader, $settings);
+        $this->environment = new \Twig\Environment($this->loader, $settings);
     }
 
     /********************************************************************************
@@ -65,9 +65,9 @@ class Twig implements \ArrayAccess
     /**
      * Proxy method to add an extension to the Twig environment
      *
-     * @param \Twig_ExtensionInterface $extension A single extension instance or an array of instances
+     * @param \Twig\Extension\ExtensionInterface $extension A single extension instance or an array of instances
      */
-    public function addExtension(\Twig_ExtensionInterface $extension)
+    public function addExtension(\Twig\Extension\ExtensionInterface $extension)
     {
         $this->environment->addExtension($extension);
     }
@@ -79,6 +79,10 @@ class Twig implements \ArrayAccess
      * @param  string $template Template pathname relative to templates directory
      * @param  array  $data     Associative array of template variables
      *
+     * @throws \Twig\Error\LoaderError  When the template cannot be found
+     * @throws \Twig_Error\SyntaxError  When an error occurred during compilation
+     * @throws \Twig_Error\RuntimeError When an error occurred during rendering
+     *
      * @return string
      */
     public function fetch($template, $data = [])
@@ -138,11 +142,11 @@ class Twig implements \ArrayAccess
      * Create a loader with the given path
      *
      * @param array $paths
-     * @return \Twig_Loader_Filesystem
+     * @return \Twig\Loader\FilesystemLoader
      */
     private function createLoader(array $paths)
     {
-        $loader = new \Twig_Loader_Filesystem();
+        $loader = new \Twig\Loader\FilesystemLoader();
 
         foreach ($paths as $namespace => $path) {
             if (is_string($namespace)) {
@@ -162,7 +166,7 @@ class Twig implements \ArrayAccess
     /**
      * Return Twig loader
      *
-     * @return \Twig_LoaderInterface
+     * @return \Twig\Loader\LoaderInterface
      */
     public function getLoader()
     {
@@ -172,7 +176,7 @@ class Twig implements \ArrayAccess
     /**
      * Return Twig environment
      *
-     * @return \Twig_Environment
+     * @return \Twig\Environment
      */
     public function getEnvironment()
     {
diff --git a/vendor/slim/twig-view/src/TwigExtension.php b/vendor/slim/twig-view/src/TwigExtension.php
index 9b2f12e3..e4ca9999 100644
--- a/vendor/slim/twig-view/src/TwigExtension.php
+++ b/vendor/slim/twig-view/src/TwigExtension.php
@@ -8,7 +8,9 @@
  */
 namespace Slim\Views;
 
-class TwigExtension extends \Twig_Extension
+use Slim\Http\Uri;
+
+class TwigExtension extends \Twig\Extension\AbstractExtension
 {
     /**
      * @var \Slim\Interfaces\RouterInterface
@@ -34,9 +36,11 @@ class TwigExtension extends \Twig_Extension
     public function getFunctions()
     {
         return [
-            new \Twig_SimpleFunction('path_for', array($this, 'pathFor')),
-            new \Twig_SimpleFunction('base_url', array($this, 'baseUrl')),
-            new \Twig_SimpleFunction('is_current_path', array($this, 'isCurrentPath')),
+            new \Twig\TwigFunction('path_for', array($this, 'pathFor')),
+            new \Twig\TwigFunction('full_url_for', array($this, 'fullUrlFor')),
+            new \Twig\TwigFunction('base_url', array($this, 'baseUrl')),
+            new \Twig\TwigFunction('is_current_path', array($this, 'isCurrentPath')),
+            new \Twig\TwigFunction('current_path', array($this, 'currentPath')),
         ];
     }
 
@@ -45,6 +49,35 @@ class TwigExtension extends \Twig_Extension
         return $this->router->pathFor($name, $data, $queryParams);
     }
 
+    /**
+     * Similar to pathFor but returns a fully qualified URL
+     *
+     * @param string $name The name of the route
+     * @param array $data Route placeholders
+     * @param array $queryParams
+     * @param string $appName
+     * @return string fully qualified URL
+     */
+    public function fullUrlFor($name, $data = [], $queryParams = [], $appName = 'default')
+    {
+        $path = $this->pathFor($name, $data, $queryParams, $appName);
+
+        /** @var Uri $uri */
+        if (is_string($this->uri)) {
+            $uri = Uri::createFromString($this->uri);
+        } else {
+            $uri = $this->uri;
+        }
+
+        $scheme = $uri->getScheme();
+        $authority = $uri->getAuthority();
+
+        $host = ($scheme ? $scheme . ':' : '')
+            . ($authority ? '//' . $authority : '');
+
+        return $host.$path;
+    }
+
     public function baseUrl()
     {
         if (is_string($this->uri)) {
@@ -57,7 +90,28 @@ class TwigExtension extends \Twig_Extension
 
     public function isCurrentPath($name, $data = [])
     {
-        return $this->router->pathFor($name, $data) === $this->uri->getPath();
+        return $this->router->pathFor($name, $data) === $this->uri->getBasePath() . '/' . ltrim($this->uri->getPath(), '/');
+    }
+
+    /**
+     * Returns current path on given URI.
+     *
+     * @param bool $withQueryString
+     * @return string
+     */
+    public function currentPath($withQueryString = false)
+    {
+        if (is_string($this->uri)) {
+            return $this->uri;
+        }
+
+        $path = $this->uri->getBasePath() . '/' . ltrim($this->uri->getPath(), '/');
+
+        if ($withQueryString && '' !== $query = $this->uri->getQuery()) {
+            $path .= '?' . $query;
+        }
+
+        return $path;
     }
 
     /**
diff --git a/vendor/slim/twig-view/tests/TwigExtensionTest.php b/vendor/slim/twig-view/tests/TwigExtensionTest.php
new file mode 100644
index 00000000..a69a4fec
--- /dev/null
+++ b/vendor/slim/twig-view/tests/TwigExtensionTest.php
@@ -0,0 +1,91 @@
+<?php
+/**
+ * Slim Framework (http://slimframework.com)
+ *
+ * @link      https://github.com/codeguy/Slim
+ * @copyright Copyright (c) 2011-2015 Josh Lockhart
+ * @license   https://github.com/codeguy/Slim/blob/master/LICENSE (MIT License)
+ */
+namespace Slim\Tests\Views;
+
+use Slim\Http\Uri;
+use Slim\Router;
+use Slim\Views\TwigExtension;
+
+require dirname(__DIR__) . '/vendor/autoload.php';
+
+class TwigExtensionTest extends \PHPUnit_Framework_TestCase
+{
+    public function isCurrentPathProvider()
+    {
+        $router = new Router();
+
+        $router->map(['GET'], '/hello/{name}', null)->setName('foo');
+        $uri = Uri::createFromString('http://example.com/hello/world');
+
+        $uri2 = $uri->withBasePath('bar');
+        $router->map(['GET'], '/bar/hello/{name}', null)->setName('bar');
+
+        return [
+            [$router, $uri, 'foo', ['name' => 'world'], true],
+            [$router, $uri2, 'bar', ['name' => 'world'], true],
+            [$router, $uri, 'bar', ['name' => 'world'], false],
+        ];
+    }
+
+    /**
+     * @dataProvider isCurrentPathProvider
+     */
+    public function testIsCurrentPath($router, $uri, $name, $data, $expected)
+    {
+        $extension = new TwigExtension($router, $uri);
+        $result = $extension->isCurrentPath($name, $data);
+
+        $this->assertEquals($expected, $result);
+    }
+
+    public function currentPathProvider()
+    {
+        $router = new Router();
+
+        $router->map(['GET'], '/hello/{name}', null)->setName('foo');
+        $uri = Uri::createFromString('http://example.com/hello/world?a=b');
+
+        $uri2 = $uri->withBasePath('bar');
+        $router->map(['GET'], '/bar/hello/{name}', null)->setName('bar');
+
+        return [
+            [$router, '/foo', false, '/foo'],
+            [$router, '/foo', true, '/foo'], // string based URI doesn't care about $withQueryString
+            [$router, $uri, false, '/hello/world'],
+            [$router, $uri, true, '/hello/world?a=b'],
+            [$router, $uri2, false, '/bar/hello/world'],
+            [$router, $uri2, true, '/bar/hello/world?a=b'],
+        ];
+    }
+
+    /**
+     * @dataProvider currentPathProvider
+     */
+    public function testCurrentPath($router, $uri, $withQueryString, $expected)
+    {
+        $extension = new TwigExtension($router, $uri);
+        $result = $extension->currentPath($withQueryString);
+
+        $this->assertEquals($expected, $result);
+    }
+
+    public function testFullUrlFor()
+    {
+        $router = new Router();
+        $router->setBasePath('/app');
+        $router->map(['GET'], '/activate/{token}', null)->setName('activate');
+        $uri = Uri::createFromString('http://example.com/app/hello/world?a=b');
+
+        $extension = new TwigExtension($router, $uri);
+        $result = $extension->fullUrlFor('activate', ['token' => 'foo']);
+
+        $expected = 'http://example.com/app/activate/foo';
+        $this->assertEquals($expected, $result);
+    }
+}
diff --git a/vendor/symfony/http-foundation/AcceptHeader.php b/vendor/symfony/http-foundation/AcceptHeader.php
index 2aa91dc4..968b71f5 100644
--- a/vendor/symfony/http-foundation/AcceptHeader.php
+++ b/vendor/symfony/http-foundation/AcceptHeader.php
@@ -24,7 +24,7 @@ class AcceptHeader
     /**
      * @var AcceptHeaderItem[]
      */
-    private $items = array();
+    private $items = [];
 
     /**
      * @var bool
@@ -32,8 +32,6 @@ class AcceptHeader
     private $sorted = true;
 
     /**
-     * Constructor.
-     *
      * @param AcceptHeaderItem[] $items
      */
     public function __construct(array $items)
@@ -99,8 +97,6 @@ class AcceptHeader
     /**
      * Adds an item.
      *
-     * @param AcceptHeaderItem $item
-     *
      * @return $this
      */
     public function add(AcceptHeaderItem $item)
@@ -155,7 +151,7 @@ class AcceptHeader
     private function sort()
     {
         if (!$this->sorted) {
-            uasort($this->items, function ($a, $b) {
+            uasort($this->items, function (AcceptHeaderItem $a, AcceptHeaderItem $b) {
                 $qA = $a->getQuality();
                 $qB = $b->getQuality();
 
diff --git a/vendor/symfony/http-foundation/AcceptHeaderItem.php b/vendor/symfony/http-foundation/AcceptHeaderItem.php
index fb54b493..f6e89687 100644
--- a/vendor/symfony/http-foundation/AcceptHeaderItem.php
+++ b/vendor/symfony/http-foundation/AcceptHeaderItem.php
@@ -18,33 +18,16 @@ namespace Symfony\Component\HttpFoundation;
  */
 class AcceptHeaderItem
 {
-    /**
-     * @var string
-     */
     private $value;
-
-    /**
-     * @var float
-     */
     private $quality = 1.0;
-
-    /**
-     * @var int
-     */
     private $index = 0;
+    private $attributes = [];
 
     /**
-     * @var array
-     */
-    private $attributes = array();
-
-    /**
-     * Constructor.
-     *
      * @param string $value
      * @param array  $attributes
      */
-    public function __construct($value, array $attributes = array())
+    public function __construct($value, array $attributes = [])
     {
         $this->value = $value;
         foreach ($attributes as $name => $value) {
@@ -63,33 +46,33 @@ class AcceptHeaderItem
     {
         $bits = preg_split('/\s*(?:;*("[^"]+");*|;*(\'[^\']+\');*|;+)\s*/', $itemValue, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
         $value = array_shift($bits);
-        $attributes = array();
+        $attributes = [];
 
         $lastNullAttribute = null;
         foreach ($bits as $bit) {
-            if (($start = substr($bit, 0, 1)) === ($end = substr($bit, -1)) && ($start === '"' || $start === '\'')) {
+            if (($start = substr($bit, 0, 1)) === ($end = substr($bit, -1)) && ('"' === $start || '\'' === $start)) {
                 $attributes[$lastNullAttribute] = substr($bit, 1, -1);
             } elseif ('=' === $end) {
                 $lastNullAttribute = $bit = substr($bit, 0, -1);
                 $attributes[$bit] = null;
             } else {
                 $parts = explode('=', $bit);
-                $attributes[$parts[0]] = isset($parts[1]) && strlen($parts[1]) > 0 ? $parts[1] : '';
+                $attributes[$parts[0]] = isset($parts[1]) && \strlen($parts[1]) > 0 ? $parts[1] : '';
             }
         }
 
-        return new self(($start = substr($value, 0, 1)) === ($end = substr($value, -1)) && ($start === '"' || $start === '\'') ? substr($value, 1, -1) : $value, $attributes);
+        return new self(($start = substr($value, 0, 1)) === ($end = substr($value, -1)) && ('"' === $start || '\'' === $start) ? substr($value, 1, -1) : $value, $attributes);
     }
 
     /**
-     * Returns header  value's string representation.
+     * Returns header value's string representation.
      *
      * @return string
      */
     public function __toString()
     {
         $string = $this->value.($this->quality < 1 ? ';q='.$this->quality : '');
-        if (count($this->attributes) > 0) {
+        if (\count($this->attributes) > 0) {
             $string .= ';'.implode(';', array_map(function ($name, $value) {
                 return sprintf(preg_match('/[,;=]/', $value) ? '%s="%s"' : '%s=%s', $name, $value);
             }, array_keys($this->attributes), $this->attributes));
diff --git a/vendor/symfony/http-foundation/ApacheRequest.php b/vendor/symfony/http-foundation/ApacheRequest.php
index 84803eba..4e99186d 100644
--- a/vendor/symfony/http-foundation/ApacheRequest.php
+++ b/vendor/symfony/http-foundation/ApacheRequest.php
@@ -35,7 +35,7 @@ class ApacheRequest extends Request
 
         if (false === strpos($this->server->get('REQUEST_URI'), $baseUrl)) {
             // assume mod_rewrite
-            return rtrim(dirname($baseUrl), '/\\');
+            return rtrim(\dirname($baseUrl), '/\\');
         }
 
         return $baseUrl;
diff --git a/vendor/symfony/http-foundation/BinaryFileResponse.php b/vendor/symfony/http-foundation/BinaryFileResponse.php
index dcf5dcfe..cf648dfe 100644
--- a/vendor/symfony/http-foundation/BinaryFileResponse.php
+++ b/vendor/symfony/http-foundation/BinaryFileResponse.php
@@ -11,8 +11,8 @@
 
 namespace Symfony\Component\HttpFoundation;
 
-use Symfony\Component\HttpFoundation\File\File;
 use Symfony\Component\HttpFoundation\File\Exception\FileException;
+use Symfony\Component\HttpFoundation\File\File;
 
 /**
  * BinaryFileResponse represents an HTTP response delivering a file.
@@ -31,22 +31,20 @@ class BinaryFileResponse extends Response
      * @var File
      */
     protected $file;
-    protected $offset;
-    protected $maxlen;
+    protected $offset = 0;
+    protected $maxlen = -1;
     protected $deleteFileAfterSend = false;
 
     /**
-     * Constructor.
-     *
      * @param \SplFileInfo|string $file               The file to stream
      * @param int                 $status             The response status code
      * @param array               $headers            An array of response headers
      * @param bool                $public             Files are public by default
-     * @param null|string         $contentDisposition The type of Content-Disposition to set automatically with the filename
+     * @param string|null         $contentDisposition The type of Content-Disposition to set automatically with the filename
      * @param bool                $autoEtag           Whether the ETag header should be automatically set
      * @param bool                $autoLastModified   Whether the Last-Modified header should be automatically set
      */
-    public function __construct($file, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
+    public function __construct($file, $status = 200, $headers = [], $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
     {
         parent::__construct(null, $status, $headers);
 
@@ -62,13 +60,13 @@ class BinaryFileResponse extends Response
      * @param int                 $status             The response status code
      * @param array               $headers            An array of response headers
      * @param bool                $public             Files are public by default
-     * @param null|string         $contentDisposition The type of Content-Disposition to set automatically with the filename
+     * @param string|null         $contentDisposition The type of Content-Disposition to set automatically with the filename
      * @param bool                $autoEtag           Whether the ETag header should be automatically set
      * @param bool                $autoLastModified   Whether the Last-Modified header should be automatically set
      *
      * @return static
      */
-    public static function create($file = null, $status = 200, $headers = array(), $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
+    public static function create($file = null, $status = 200, $headers = [], $public = true, $contentDisposition = null, $autoEtag = false, $autoLastModified = true)
     {
         return new static($file, $status, $headers, $public, $contentDisposition, $autoEtag, $autoLastModified);
     }
@@ -141,7 +139,7 @@ class BinaryFileResponse extends Response
      */
     public function setAutoEtag()
     {
-        $this->setEtag(sha1_file($this->file->getPathname()));
+        $this->setEtag(base64_encode(hash_file('sha256', $this->file->getPathname(), true)));
 
         return $this;
     }
@@ -157,7 +155,7 @@ class BinaryFileResponse extends Response
      */
     public function setContentDisposition($disposition, $filename = '', $filenameFallback = '')
     {
-        if ($filename === '') {
+        if ('' === $filename) {
             $filename = $this->file->getFilename();
         }
 
@@ -167,7 +165,7 @@ class BinaryFileResponse extends Response
             for ($i = 0, $filenameLength = mb_strlen($filename, $encoding); $i < $filenameLength; ++$i) {
                 $char = mb_substr($filename, $i, 1, $encoding);
 
-                if ('%' === $char || ord($char) < 32 || ord($char) > 126) {
+                if ('%' === $char || \ord($char) < 32 || \ord($char) > 126) {
                     $filenameFallback .= '_';
                 } else {
                     $filenameFallback .= $char;
@@ -217,18 +215,18 @@ class BinaryFileResponse extends Response
             if (false === $path) {
                 $path = $this->file->getPathname();
             }
-            if (strtolower($type) === 'x-accel-redirect') {
+            if ('x-accel-redirect' === strtolower($type)) {
                 // Do X-Accel-Mapping substitutions.
                 // @link http://wiki.nginx.org/X-accel#X-Accel-Redirect
                 foreach (explode(',', $request->headers->get('X-Accel-Mapping', '')) as $mapping) {
                     $mapping = explode('=', $mapping, 2);
 
-                    if (2 === count($mapping)) {
+                    if (2 === \count($mapping)) {
                         $pathPrefix = trim($mapping[0]);
                         $location = trim($mapping[1]);
 
-                        if (substr($path, 0, strlen($pathPrefix)) === $pathPrefix) {
-                            $path = $location.substr($path, strlen($pathPrefix));
+                        if (substr($path, 0, \strlen($pathPrefix)) === $pathPrefix) {
+                            $path = $location.substr($path, \strlen($pathPrefix));
                             break;
                         }
                     }
@@ -241,7 +239,7 @@ class BinaryFileResponse extends Response
             if (!$request->headers->has('If-Range') || $this->hasValidIfRangeHeader($request->headers->get('If-Range'))) {
                 $range = $request->headers->get('Range');
 
-                list($start, $end) = explode('-', substr($range, 6), 2) + array(0);
+                list($start, $end) = explode('-', substr($range, 6), 2) + [0];
 
                 $end = ('' === $end) ? $fileSize - 1 : (int) $end;
 
@@ -256,7 +254,7 @@ class BinaryFileResponse extends Response
                     if ($start < 0 || $end > $fileSize - 1) {
                         $this->setStatusCode(416);
                         $this->headers->set('Content-Range', sprintf('bytes */%s', $fileSize));
-                    } elseif ($start !== 0 || $end !== $fileSize - 1) {
+                    } elseif (0 !== $start || $end !== $fileSize - 1) {
                         $this->maxlen = $end < $fileSize ? $end - $start + 1 : -1;
                         $this->offset = $start;
 
@@ -307,7 +305,7 @@ class BinaryFileResponse extends Response
         fclose($out);
         fclose($file);
 
-        if ($this->deleteFileAfterSend) {
+        if ($this->deleteFileAfterSend && file_exists($this->file->getPathname())) {
             unlink($this->file->getPathname());
         }
 
diff --git a/vendor/symfony/http-foundation/CHANGELOG.md b/vendor/symfony/http-foundation/CHANGELOG.md
index e1fdf77b..7bfde80f 100644
--- a/vendor/symfony/http-foundation/CHANGELOG.md
+++ b/vendor/symfony/http-foundation/CHANGELOG.md
@@ -1,6 +1,22 @@
 CHANGELOG
 =========
 
+3.4.14
+------
+
+ * [BC BREAK] Support for the IIS-only `X_ORIGINAL_URL` and `X_REWRITE_URL`
+   HTTP headers has been dropped for security reasons.
+
+3.4.0
+-----
+
+ * implemented PHP 7.0's `SessionUpdateTimestampHandlerInterface` with a new
+   `AbstractSessionHandler` base class and a new `StrictSessionHandler` wrapper
+ * deprecated the `WriteCheckSessionHandler`, `NativeSessionHandler` and `NativeProxy` classes
+ * deprecated setting session save handlers that do not implement `\SessionHandlerInterface` in `NativeSessionStorage::setSaveHandler()`
+ * deprecated using `MongoDbSessionHandler` with the legacy mongo extension; use it with the mongodb/mongodb package and ext-mongodb instead
+ * deprecated `MemcacheSessionHandler`; use `MemcachedSessionHandler` instead
+
 3.3.0
 -----
 
@@ -128,10 +144,10 @@ CHANGELOG
  * Added `FlashBag`. Flashes expire when retrieved by `get()` or `all()`. This
    implementation is ESI compatible.
  * Added `AutoExpireFlashBag` (default) to replicate Symfony 2.0.x auto expire
-   behaviour of messages auto expiring after one page page load.  Messages must
+   behavior of messages auto expiring after one page page load.  Messages must
    be retrieved by `get()` or `all()`.
  * Added `Symfony\Component\HttpFoundation\Attribute\AttributeBag` to replicate
-   attributes storage behaviour from 2.0.x (default).
+   attributes storage behavior from 2.0.x (default).
  * Added `Symfony\Component\HttpFoundation\Attribute\NamespacedAttributeBag` for
    namespace session attributes.
  * Flash API can stores messages in an array so there may be multiple messages
diff --git a/vendor/symfony/http-foundation/Cookie.php b/vendor/symfony/http-foundation/Cookie.php
index a2139ff6..83a97087 100644
--- a/vendor/symfony/http-foundation/Cookie.php
+++ b/vendor/symfony/http-foundation/Cookie.php
@@ -28,6 +28,7 @@ class Cookie
     private $raw;
     private $sameSite;
 
+    const SAMESITE_NONE = 'none';
     const SAMESITE_LAX = 'lax';
     const SAMESITE_STRICT = 'strict';
 
@@ -41,7 +42,7 @@ class Cookie
      */
     public static function fromString($cookie, $decode = false)
     {
-        $data = array(
+        $data = [
             'expires' => 0,
             'path' => '/',
             'domain' => null,
@@ -49,7 +50,7 @@ class Cookie
             'httponly' => false,
             'raw' => !$decode,
             'samesite' => null,
-        );
+        ];
         foreach (explode(';', $cookie) as $part) {
             if (false === strpos($part, '=')) {
                 $key = trim($part);
@@ -81,8 +82,6 @@ class Cookie
     }
 
     /**
-     * Constructor.
-     *
      * @param string                        $name     The name of the cookie
      * @param string|null                   $value    The value of the cookie
      * @param int|string|\DateTimeInterface $expire   The time the cookie expires
@@ -130,7 +129,7 @@ class Cookie
             $sameSite = strtolower($sameSite);
         }
 
-        if (!in_array($sameSite, array(self::SAMESITE_LAX, self::SAMESITE_STRICT, null), true)) {
+        if (!\in_array($sameSite, [self::SAMESITE_LAX, self::SAMESITE_STRICT, self::SAMESITE_NONE, null], true)) {
             throw new \InvalidArgumentException('The "sameSite" parameter value is not valid.');
         }
 
@@ -147,12 +146,12 @@ class Cookie
         $str = ($this->isRaw() ? $this->getName() : urlencode($this->getName())).'=';
 
         if ('' === (string) $this->getValue()) {
-            $str .= 'deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; max-age=-31536001';
+            $str .= 'deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; Max-Age=0';
         } else {
             $str .= $this->isRaw() ? $this->getValue() : rawurlencode($this->getValue());
 
             if (0 !== $this->getExpiresTime()) {
-                $str .= '; expires='.gmdate('D, d-M-Y H:i:s T', $this->getExpiresTime()).'; max-age='.$this->getMaxAge();
+                $str .= '; expires='.gmdate('D, d-M-Y H:i:s T', $this->getExpiresTime()).'; Max-Age='.$this->getMaxAge();
             }
         }
 
@@ -226,7 +225,9 @@ class Cookie
      */
     public function getMaxAge()
     {
-        return 0 !== $this->expire ? $this->expire - time() : 0;
+        $maxAge = $this->expire - time();
+
+        return 0 >= $maxAge ? 0 : $maxAge;
     }
 
     /**
@@ -266,7 +267,7 @@ class Cookie
      */
     public function isCleared()
     {
-        return $this->expire < time();
+        return 0 !== $this->expire && $this->expire < time();
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/ExpressionRequestMatcher.php b/vendor/symfony/http-foundation/ExpressionRequestMatcher.php
index e9c8441c..26bed7d3 100644
--- a/vendor/symfony/http-foundation/ExpressionRequestMatcher.php
+++ b/vendor/symfony/http-foundation/ExpressionRequestMatcher.php
@@ -35,13 +35,13 @@ class ExpressionRequestMatcher extends RequestMatcher
             throw new \LogicException('Unable to match the request as the expression language is not available.');
         }
 
-        return $this->language->evaluate($this->expression, array(
+        return $this->language->evaluate($this->expression, [
             'request' => $request,
             'method' => $request->getMethod(),
             'path' => rawurldecode($request->getPathInfo()),
             'host' => $request->getHost(),
             'ip' => $request->getClientIp(),
             'attributes' => $request->attributes->all(),
-        )) && parent::matches($request);
+        ]) && parent::matches($request);
     }
 }
diff --git a/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php b/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php
index 41f7a462..3b8e41d4 100644
--- a/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php
+++ b/vendor/symfony/http-foundation/File/Exception/AccessDeniedException.php
@@ -19,8 +19,6 @@ namespace Symfony\Component\HttpFoundation\File\Exception;
 class AccessDeniedException extends FileException
 {
     /**
-     * Constructor.
-     *
      * @param string $path The path to the accessed file
      */
     public function __construct($path)
diff --git a/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php b/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php
index ac90d403..bfcc37ec 100644
--- a/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php
+++ b/vendor/symfony/http-foundation/File/Exception/FileNotFoundException.php
@@ -19,8 +19,6 @@ namespace Symfony\Component\HttpFoundation\File\Exception;
 class FileNotFoundException extends FileException
 {
     /**
-     * Constructor.
-     *
      * @param string $path The path to the file that was not found
      */
     public function __construct($path)
diff --git a/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php b/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php
index 0444b877..62005d3b 100644
--- a/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php
+++ b/vendor/symfony/http-foundation/File/Exception/UnexpectedTypeException.php
@@ -15,6 +15,6 @@ class UnexpectedTypeException extends FileException
 {
     public function __construct($value, $expectedType)
     {
-        parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, is_object($value) ? get_class($value) : gettype($value)));
+        parent::__construct(sprintf('Expected argument of type %s, %s given', $expectedType, \is_object($value) ? \get_class($value) : \gettype($value)));
     }
 }
diff --git a/vendor/symfony/http-foundation/File/File.php b/vendor/symfony/http-foundation/File/File.php
index e2a67684..34220588 100644
--- a/vendor/symfony/http-foundation/File/File.php
+++ b/vendor/symfony/http-foundation/File/File.php
@@ -13,8 +13,8 @@ namespace Symfony\Component\HttpFoundation\File;
 
 use Symfony\Component\HttpFoundation\File\Exception\FileException;
 use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
-use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
 use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
+use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
 
 /**
  * A file in the file system.
@@ -93,9 +93,11 @@ class File extends \SplFileInfo
     {
         $target = $this->getTargetFile($directory, $name);
 
-        if (!@rename($this->getPathname(), $target)) {
-            $error = error_get_last();
-            throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error['message'])));
+        set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
+        $renamed = rename($this->getPathname(), $target);
+        restore_error_handler();
+        if (!$renamed) {
+            throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error)));
         }
 
         @chmod($target, 0666 & ~umask());
@@ -113,7 +115,7 @@ class File extends \SplFileInfo
             throw new FileException(sprintf('Unable to write in the "%s" directory', $directory));
         }
 
-        $target = rtrim($directory, '/\\').DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name));
+        $target = rtrim($directory, '/\\').\DIRECTORY_SEPARATOR.(null === $name ? $this->getBasename() : $this->getName($name));
 
         return new self($target, false);
     }
diff --git a/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php b/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php
index 921751f6..80f4d47f 100644
--- a/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/ExtensionGuesser.php
@@ -37,7 +37,7 @@ class ExtensionGuesser implements ExtensionGuesserInterface
      *
      * @var array
      */
-    protected $guessers = array();
+    protected $guessers = [];
 
     /**
      * Returns the singleton instance.
@@ -65,8 +65,6 @@ class ExtensionGuesser implements ExtensionGuesserInterface
      * Registers a new extension guesser.
      *
      * When guessing, this guesser is preferred over previously registered ones.
-     *
-     * @param ExtensionGuesserInterface $guesser
      */
     public function register(ExtensionGuesserInterface $guesser)
     {
diff --git a/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php b/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php
index f917a06d..34e015ee 100644
--- a/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/FileBinaryMimeTypeGuesser.php
@@ -11,8 +11,8 @@
 
 namespace Symfony\Component\HttpFoundation\File\MimeType;
 
-use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 
 /**
  * Guesses the mime type with the binary "file" (only available on *nix).
@@ -24,8 +24,6 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
     private $cmd;
 
     /**
-     * Constructor.
-     *
      * The $cmd pattern must contain a "%s" string that will be replaced
      * with the file name to guess.
      *
@@ -45,7 +43,21 @@ class FileBinaryMimeTypeGuesser implements MimeTypeGuesserInterface
      */
     public static function isSupported()
     {
-        return '\\' !== DIRECTORY_SEPARATOR && function_exists('passthru') && function_exists('escapeshellarg');
+        static $supported = null;
+
+        if (null !== $supported) {
+            return $supported;
+        }
+
+        if ('\\' === \DIRECTORY_SEPARATOR || !\function_exists('passthru') || !\function_exists('escapeshellarg')) {
+            return $supported = false;
+        }
+
+        ob_start();
+        passthru('command -v file', $exitStatus);
+        $binPath = trim(ob_get_clean());
+
+        return $supported = 0 === $exitStatus && '' !== $binPath;
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php b/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php
index 6fee9479..bf1ee9f5 100644
--- a/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/FileinfoMimeTypeGuesser.php
@@ -11,8 +11,8 @@
 
 namespace Symfony\Component\HttpFoundation\File\MimeType;
 
-use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 
 /**
  * Guesses the mime type using the PECL extension FileInfo.
@@ -24,8 +24,6 @@ class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface
     private $magicFile;
 
     /**
-     * Constructor.
-     *
      * @param string $magicFile A magic file to use with the finfo instance
      *
      * @see http://www.php.net/manual/en/function.finfo-open.php
@@ -42,7 +40,7 @@ class FileinfoMimeTypeGuesser implements MimeTypeGuesserInterface
      */
     public static function isSupported()
     {
-        return function_exists('finfo_open');
+        return \function_exists('finfo_open');
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php b/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php
index e327f834..c0f9140c 100644
--- a/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/MimeTypeExtensionGuesser.php
@@ -20,13 +20,11 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
      * A map of mime types and their default extensions.
      *
      * This list has been placed under the public domain by the Apache HTTPD project.
-     * This list has been updated from upstream on 2013-04-23.
+     * This list has been updated from upstream on 2019-01-14.
      *
-     * @see http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
-     *
-     * @var array
+     * @see https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types
      */
-    protected $defaultExtensions = array(
+    protected $defaultExtensions = [
         'application/andrew-inset' => 'ez',
         'application/applixware' => 'aw',
         'application/atom+xml' => 'atom',
@@ -601,6 +599,7 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
         'application/x-xliff+xml' => 'xlf',
         'application/x-xpinstall' => 'xpi',
         'application/x-xz' => 'xz',
+        'application/x-zip-compressed' => 'zip',
         'application/x-zmachine' => 'z1',
         'application/xaml+xml' => 'xaml',
         'application/xcap-diff+xml' => 'xdf',
@@ -619,7 +618,7 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
         'audio/adpcm' => 'adp',
         'audio/basic' => 'au',
         'audio/midi' => 'mid',
-        'audio/mp4' => 'mp4a',
+        'audio/mp4' => 'm4a',
         'audio/mpeg' => 'mpga',
         'audio/ogg' => 'oga',
         'audio/s3m' => 's3m',
@@ -654,6 +653,11 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
         'chemical/x-cml' => 'cml',
         'chemical/x-csml' => 'csml',
         'chemical/x-xyz' => 'xyz',
+        'font/collection' => 'ttc',
+        'font/otf' => 'otf',
+        'font/ttf' => 'ttf',
+        'font/woff' => 'woff',
+        'font/woff2' => 'woff2',
         'image/bmp' => 'bmp',
         'image/x-ms-bmp' => 'bmp',
         'image/cgm' => 'cgm',
@@ -670,8 +674,8 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
         'image/tiff' => 'tiff',
         'image/vnd.adobe.photoshop' => 'psd',
         'image/vnd.dece.graphic' => 'uvi',
-        'image/vnd.dvb.subtitle' => 'sub',
         'image/vnd.djvu' => 'djvu',
+        'image/vnd.dvb.subtitle' => 'sub',
         'image/vnd.dwg' => 'dwg',
         'image/vnd.dxf' => 'dxf',
         'image/vnd.fastbidsheet' => 'fbs',
@@ -733,8 +737,8 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
         'text/vcard' => 'vcard',
         'text/vnd.curl' => 'curl',
         'text/vnd.curl.dcurl' => 'dcurl',
-        'text/vnd.curl.scurl' => 'scurl',
         'text/vnd.curl.mcurl' => 'mcurl',
+        'text/vnd.curl.scurl' => 'scurl',
         'text/vnd.dvb.subtitle' => 'sub',
         'text/vnd.fly' => 'fly',
         'text/vnd.fmi.flexstor' => 'flx',
@@ -748,10 +752,10 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
         'text/x-asm' => 's',
         'text/x-c' => 'c',
         'text/x-fortran' => 'f',
-        'text/x-pascal' => 'p',
         'text/x-java-source' => 'java',
-        'text/x-opml' => 'opml',
         'text/x-nfo' => 'nfo',
+        'text/x-opml' => 'opml',
+        'text/x-pascal' => 'p',
         'text/x-setext' => 'etx',
         'text/x-sfv' => 'sfv',
         'text/x-uuencode' => 'uu',
@@ -797,13 +801,19 @@ class MimeTypeExtensionGuesser implements ExtensionGuesserInterface
         'video/x-sgi-movie' => 'movie',
         'video/x-smv' => 'smv',
         'x-conference/x-cooltalk' => 'ice',
-    );
+    ];
 
     /**
      * {@inheritdoc}
      */
     public function guess($mimeType)
     {
-        return isset($this->defaultExtensions[$mimeType]) ? $this->defaultExtensions[$mimeType] : null;
+        if (isset($this->defaultExtensions[$mimeType])) {
+            return $this->defaultExtensions[$mimeType];
+        }
+
+        $lcMimeType = strtolower($mimeType);
+
+        return isset($this->defaultExtensions[$lcMimeType]) ? $this->defaultExtensions[$lcMimeType] : null;
     }
 }
diff --git a/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php
index 69c803b4..95d1ee26 100644
--- a/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php
+++ b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesser.php
@@ -11,8 +11,8 @@
 
 namespace Symfony\Component\HttpFoundation\File\MimeType;
 
-use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 
 /**
  * A singleton mime type guesser.
@@ -51,7 +51,7 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface
      *
      * @var array
      */
-    protected $guessers = array();
+    protected $guessers = [];
 
     /**
      * Returns the singleton instance.
@@ -80,21 +80,14 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface
      */
     private function __construct()
     {
-        if (FileBinaryMimeTypeGuesser::isSupported()) {
-            $this->register(new FileBinaryMimeTypeGuesser());
-        }
-
-        if (FileinfoMimeTypeGuesser::isSupported()) {
-            $this->register(new FileinfoMimeTypeGuesser());
-        }
+        $this->register(new FileBinaryMimeTypeGuesser());
+        $this->register(new FileinfoMimeTypeGuesser());
     }
 
     /**
      * Registers a new mime type guesser.
      *
      * When guessing, this guesser is preferred over previously registered ones.
-     *
-     * @param MimeTypeGuesserInterface $guesser
      */
     public function register(MimeTypeGuesserInterface $guesser)
     {
@@ -127,18 +120,14 @@ class MimeTypeGuesser implements MimeTypeGuesserInterface
             throw new AccessDeniedException($path);
         }
 
-        if (!$this->guessers) {
-            $msg = 'Unable to guess the mime type as no guessers are available';
-            if (!FileinfoMimeTypeGuesser::isSupported()) {
-                $msg .= ' (Did you enable the php_fileinfo extension?)';
-            }
-            throw new \LogicException($msg);
-        }
-
         foreach ($this->guessers as $guesser) {
             if (null !== $mimeType = $guesser->guess($path)) {
                 return $mimeType;
             }
         }
+
+        if (2 === \count($this->guessers) && !FileBinaryMimeTypeGuesser::isSupported() && !FileinfoMimeTypeGuesser::isSupported()) {
+            throw new \LogicException('Unable to guess the mime type as no guessers are available (Did you enable the php_fileinfo extension?)');
+        }
     }
 }
diff --git a/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php
index f8c3ad22..5ac1acb8 100644
--- a/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php
+++ b/vendor/symfony/http-foundation/File/MimeType/MimeTypeGuesserInterface.php
@@ -11,8 +11,8 @@
 
 namespace Symfony\Component\HttpFoundation\File\MimeType;
 
-use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 use Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException;
+use Symfony\Component\HttpFoundation\File\Exception\FileNotFoundException;
 
 /**
  * Guesses the mime type of a file.
diff --git a/vendor/symfony/http-foundation/File/UploadedFile.php b/vendor/symfony/http-foundation/File/UploadedFile.php
index 10837726..a44c664b 100644
--- a/vendor/symfony/http-foundation/File/UploadedFile.php
+++ b/vendor/symfony/http-foundation/File/UploadedFile.php
@@ -24,41 +24,10 @@ use Symfony\Component\HttpFoundation\File\MimeType\ExtensionGuesser;
  */
 class UploadedFile extends File
 {
-    /**
-     * Whether the test mode is activated.
-     *
-     * Local files are used in test mode hence the code should not enforce HTTP uploads.
-     *
-     * @var bool
-     */
     private $test = false;
-
-    /**
-     * The original name of the uploaded file.
-     *
-     * @var string
-     */
     private $originalName;
-
-    /**
-     * The mime type provided by the uploader.
-     *
-     * @var string
-     */
     private $mimeType;
-
-    /**
-     * The file size provided by the uploader.
-     *
-     * @var int|null
-     */
     private $size;
-
-    /**
-     * The UPLOAD_ERR_XXX constant provided by the uploader.
-     *
-     * @var int
-     */
     private $error;
 
     /**
@@ -76,11 +45,12 @@ class UploadedFile extends File
      * Calling any other method on an non-valid instance will cause an unpredictable result.
      *
      * @param string      $path         The full temporary path to the file
-     * @param string      $originalName The original file name
+     * @param string      $originalName The original file name of the uploaded file
      * @param string|null $mimeType     The type of the file as provided by PHP; null defaults to application/octet-stream
-     * @param int|null    $size         The file size
+     * @param int|null    $size         The file size provided by the uploader
      * @param int|null    $error        The error constant of the upload (one of PHP's UPLOAD_ERR_XXX constants); null defaults to UPLOAD_ERR_OK
      * @param bool        $test         Whether the test mode is active
+     *                                  Local files are used in test mode hence the code should not enforce HTTP uploads
      *
      * @throws FileException         If file_uploads is disabled
      * @throws FileNotFoundException If the file does not exist
@@ -198,7 +168,7 @@ class UploadedFile extends File
      */
     public function isValid()
     {
-        $isOk = $this->error === UPLOAD_ERR_OK;
+        $isOk = UPLOAD_ERR_OK === $this->error;
 
         return $this->test ? $isOk : $isOk && is_uploaded_file($this->getPathname());
     }
@@ -222,9 +192,11 @@ class UploadedFile extends File
 
             $target = $this->getTargetFile($directory, $name);
 
-            if (!@move_uploaded_file($this->getPathname(), $target)) {
-                $error = error_get_last();
-                throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error['message'])));
+            set_error_handler(function ($type, $msg) use (&$error) { $error = $msg; });
+            $moved = move_uploaded_file($this->getPathname(), $target);
+            restore_error_handler();
+            if (!$moved) {
+                throw new FileException(sprintf('Could not move the file "%s" to "%s" (%s)', $this->getPathname(), $target, strip_tags($error)));
             }
 
             @chmod($target, 0666 & ~umask());
@@ -250,17 +222,20 @@ class UploadedFile extends File
 
         $max = ltrim($iniMax, '+');
         if (0 === strpos($max, '0x')) {
-            $max = intval($max, 16);
+            $max = \intval($max, 16);
         } elseif (0 === strpos($max, '0')) {
-            $max = intval($max, 8);
+            $max = \intval($max, 8);
         } else {
             $max = (int) $max;
         }
 
         switch (substr($iniMax, -1)) {
             case 't': $max *= 1024;
+            // no break
             case 'g': $max *= 1024;
+            // no break
             case 'm': $max *= 1024;
+            // no break
             case 'k': $max *= 1024;
         }
 
@@ -274,7 +249,7 @@ class UploadedFile extends File
      */
     public function getErrorMessage()
     {
-        static $errors = array(
+        static $errors = [
             UPLOAD_ERR_INI_SIZE => 'The file "%s" exceeds your upload_max_filesize ini directive (limit is %d KiB).',
             UPLOAD_ERR_FORM_SIZE => 'The file "%s" exceeds the upload limit defined in your form.',
             UPLOAD_ERR_PARTIAL => 'The file "%s" was only partially uploaded.',
@@ -282,10 +257,10 @@ class UploadedFile extends File
             UPLOAD_ERR_CANT_WRITE => 'The file "%s" could not be written on disk.',
             UPLOAD_ERR_NO_TMP_DIR => 'File could not be uploaded: missing temporary directory.',
             UPLOAD_ERR_EXTENSION => 'File upload was stopped by a PHP extension.',
-        );
+        ];
 
         $errorCode = $this->error;
-        $maxFilesize = $errorCode === UPLOAD_ERR_INI_SIZE ? self::getMaxFilesize() / 1024 : 0;
+        $maxFilesize = UPLOAD_ERR_INI_SIZE === $errorCode ? self::getMaxFilesize() / 1024 : 0;
         $message = isset($errors[$errorCode]) ? $errors[$errorCode] : 'The file "%s" was not uploaded due to an unknown error.';
 
         return sprintf($message, $this->getClientOriginalName(), $maxFilesize);
diff --git a/vendor/symfony/http-foundation/FileBag.php b/vendor/symfony/http-foundation/FileBag.php
index e17a9057..ca849b3d 100644
--- a/vendor/symfony/http-foundation/FileBag.php
+++ b/vendor/symfony/http-foundation/FileBag.php
@@ -21,14 +21,12 @@ use Symfony\Component\HttpFoundation\File\UploadedFile;
  */
 class FileBag extends ParameterBag
 {
-    private static $fileKeys = array('error', 'name', 'size', 'tmp_name', 'type');
+    private static $fileKeys = ['error', 'name', 'size', 'tmp_name', 'type'];
 
     /**
-     * Constructor.
-     *
      * @param array $parameters An array of HTTP files
      */
-    public function __construct(array $parameters = array())
+    public function __construct(array $parameters = [])
     {
         $this->replace($parameters);
     }
@@ -36,9 +34,9 @@ class FileBag extends ParameterBag
     /**
      * {@inheritdoc}
      */
-    public function replace(array $files = array())
+    public function replace(array $files = [])
     {
-        $this->parameters = array();
+        $this->parameters = [];
         $this->add($files);
     }
 
@@ -47,7 +45,7 @@ class FileBag extends ParameterBag
      */
     public function set($key, $value)
     {
-        if (!is_array($value) && !$value instanceof UploadedFile) {
+        if (!\is_array($value) && !$value instanceof UploadedFile) {
             throw new \InvalidArgumentException('An uploaded file must be an array or an instance of UploadedFile.');
         }
 
@@ -57,7 +55,7 @@ class FileBag extends ParameterBag
     /**
      * {@inheritdoc}
      */
-    public function add(array $files = array())
+    public function add(array $files = [])
     {
         foreach ($files as $key => $file) {
             $this->set($key, $file);
@@ -69,7 +67,7 @@ class FileBag extends ParameterBag
      *
      * @param array|UploadedFile $file A (multi-dimensional) array of uploaded file information
      *
-     * @return UploadedFile|UploadedFile[] A (multi-dimensional) array of UploadedFile instances
+     * @return UploadedFile[]|UploadedFile|null A (multi-dimensional) array of UploadedFile instances
      */
     protected function convertFileInformation($file)
     {
@@ -78,7 +76,7 @@ class FileBag extends ParameterBag
         }
 
         $file = $this->fixPhpFilesArray($file);
-        if (is_array($file)) {
+        if (\is_array($file)) {
             $keys = array_keys($file);
             sort($keys);
 
@@ -89,7 +87,10 @@ class FileBag extends ParameterBag
                     $file = new UploadedFile($file['tmp_name'], $file['name'], $file['type'], $file['size'], $file['error']);
                 }
             } else {
-                $file = array_map(array($this, 'convertFileInformation'), $file);
+                $file = array_map([$this, 'convertFileInformation'], $file);
+                if (array_keys($keys) === $keys) {
+                    $file = array_filter($file);
+                }
             }
         }
 
@@ -108,20 +109,18 @@ class FileBag extends ParameterBag
      * It's safe to pass an already converted array, in which case this method
      * just returns the original array unmodified.
      *
-     * @param array $data
-     *
      * @return array
      */
     protected function fixPhpFilesArray($data)
     {
-        if (!is_array($data)) {
+        if (!\is_array($data)) {
             return $data;
         }
 
         $keys = array_keys($data);
         sort($keys);
 
-        if (self::$fileKeys != $keys || !isset($data['name']) || !is_array($data['name'])) {
+        if (self::$fileKeys != $keys || !isset($data['name']) || !\is_array($data['name'])) {
             return $data;
         }
 
@@ -131,13 +130,13 @@ class FileBag extends ParameterBag
         }
 
         foreach ($data['name'] as $key => $name) {
-            $files[$key] = $this->fixPhpFilesArray(array(
+            $files[$key] = $this->fixPhpFilesArray([
                 'error' => $data['error'][$key],
                 'name' => $name,
                 'type' => $data['type'][$key],
                 'tmp_name' => $data['tmp_name'][$key],
                 'size' => $data['size'][$key],
-            ));
+            ]);
         }
 
         return $files;
diff --git a/vendor/symfony/http-foundation/HeaderBag.php b/vendor/symfony/http-foundation/HeaderBag.php
index 3cc9e702..9798173e 100644
--- a/vendor/symfony/http-foundation/HeaderBag.php
+++ b/vendor/symfony/http-foundation/HeaderBag.php
@@ -18,15 +18,13 @@ namespace Symfony\Component\HttpFoundation;
  */
 class HeaderBag implements \IteratorAggregate, \Countable
 {
-    protected $headers = array();
-    protected $cacheControl = array();
+    protected $headers = [];
+    protected $cacheControl = [];
 
     /**
-     * Constructor.
-     *
      * @param array $headers An array of HTTP headers
      */
-    public function __construct(array $headers = array())
+    public function __construct(array $headers = [])
     {
         foreach ($headers as $key => $values) {
             $this->set($key, $values);
@@ -82,9 +80,9 @@ class HeaderBag implements \IteratorAggregate, \Countable
      *
      * @param array $headers An array of HTTP headers
      */
-    public function replace(array $headers = array())
+    public function replace(array $headers = [])
     {
-        $this->headers = array();
+        $this->headers = [];
         $this->add($headers);
     }
 
@@ -103,27 +101,27 @@ class HeaderBag implements \IteratorAggregate, \Countable
     /**
      * Returns a header value by name.
      *
-     * @param string $key     The header name
-     * @param mixed  $default The default value
-     * @param bool   $first   Whether to return the first value or all header values
+     * @param string      $key     The header name
+     * @param string|null $default The default value
+     * @param bool        $first   Whether to return the first value or all header values
      *
-     * @return string|array The first header value if $first is true, an array of values otherwise
+     * @return string|string[]|null The first header value or default value if $first is true, an array of values otherwise
      */
     public function get($key, $default = null, $first = true)
     {
         $key = str_replace('_', '-', strtolower($key));
         $headers = $this->all();
 
-        if (!array_key_exists($key, $headers)) {
+        if (!\array_key_exists($key, $headers)) {
             if (null === $default) {
-                return $first ? null : array();
+                return $first ? null : [];
             }
 
-            return $first ? $default : array($default);
+            return $first ? $default : [$default];
         }
 
         if ($first) {
-            return count($headers[$key]) ? $headers[$key][0] : $default;
+            return \count($headers[$key]) ? $headers[$key][0] : $default;
         }
 
         return $headers[$key];
@@ -132,24 +130,32 @@ class HeaderBag implements \IteratorAggregate, \Countable
     /**
      * Sets a header by name.
      *
-     * @param string       $key     The key
-     * @param string|array $values  The value or an array of values
-     * @param bool         $replace Whether to replace the actual value or not (true by default)
+     * @param string          $key     The key
+     * @param string|string[] $values  The value or an array of values
+     * @param bool            $replace Whether to replace the actual value or not (true by default)
      */
     public function set($key, $values, $replace = true)
     {
         $key = str_replace('_', '-', strtolower($key));
 
-        $values = array_values((array) $values);
+        if (\is_array($values)) {
+            $values = array_values($values);
 
-        if (true === $replace || !isset($this->headers[$key])) {
-            $this->headers[$key] = $values;
+            if (true === $replace || !isset($this->headers[$key])) {
+                $this->headers[$key] = $values;
+            } else {
+                $this->headers[$key] = array_merge($this->headers[$key], $values);
+            }
         } else {
-            $this->headers[$key] = array_merge($this->headers[$key], $values);
+            if (true === $replace || !isset($this->headers[$key])) {
+                $this->headers[$key] = [$values];
+            } else {
+                $this->headers[$key][] = $values;
+            }
         }
 
         if ('cache-control' === $key) {
-            $this->cacheControl = $this->parseCacheControl($values[0]);
+            $this->cacheControl = $this->parseCacheControl(implode(', ', $this->headers[$key]));
         }
     }
 
@@ -162,7 +168,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
      */
     public function has($key)
     {
-        return array_key_exists(str_replace('_', '-', strtolower($key)), $this->all());
+        return \array_key_exists(str_replace('_', '-', strtolower($key)), $this->all());
     }
 
     /**
@@ -175,7 +181,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
      */
     public function contains($key, $value)
     {
-        return in_array($value, $this->get($key, null, false));
+        return \in_array($value, $this->get($key, null, false));
     }
 
     /**
@@ -190,7 +196,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
         unset($this->headers[$key]);
 
         if ('cache-control' === $key) {
-            $this->cacheControl = array();
+            $this->cacheControl = [];
         }
     }
 
@@ -200,7 +206,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
      * @param string    $key     The parameter key
      * @param \DateTime $default The default value
      *
-     * @return null|\DateTime The parsed DateTime or the default value if the header does not exist
+     * @return \DateTime|null The parsed DateTime or the default value if the header does not exist
      *
      * @throws \RuntimeException When the HTTP header is not parseable
      */
@@ -239,7 +245,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
      */
     public function hasCacheControlDirective($key)
     {
-        return array_key_exists($key, $this->cacheControl);
+        return \array_key_exists($key, $this->cacheControl);
     }
 
     /**
@@ -251,7 +257,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
      */
     public function getCacheControlDirective($key)
     {
-        return array_key_exists($key, $this->cacheControl) ? $this->cacheControl[$key] : null;
+        return \array_key_exists($key, $this->cacheControl) ? $this->cacheControl[$key] : null;
     }
 
     /**
@@ -283,12 +289,12 @@ class HeaderBag implements \IteratorAggregate, \Countable
      */
     public function count()
     {
-        return count($this->headers);
+        return \count($this->headers);
     }
 
     protected function getCacheControlHeader()
     {
-        $parts = array();
+        $parts = [];
         ksort($this->cacheControl);
         foreach ($this->cacheControl as $key => $value) {
             if (true === $value) {
@@ -314,7 +320,7 @@ class HeaderBag implements \IteratorAggregate, \Countable
      */
     protected function parseCacheControl($header)
     {
-        $cacheControl = array();
+        $cacheControl = [];
         preg_match_all('#([a-zA-Z][a-zA-Z_-]*)\s*(?:=(?:"([^"]*)"|([^ \t",;]*)))?#', $header, $matches, PREG_SET_ORDER);
         foreach ($matches as $match) {
             $cacheControl[strtolower($match[1])] = isset($match[3]) ? $match[3] : (isset($match[2]) ? $match[2] : true);
diff --git a/vendor/symfony/http-foundation/IpUtils.php b/vendor/symfony/http-foundation/IpUtils.php
index eba603b1..67d13e57 100644
--- a/vendor/symfony/http-foundation/IpUtils.php
+++ b/vendor/symfony/http-foundation/IpUtils.php
@@ -18,7 +18,7 @@ namespace Symfony\Component\HttpFoundation;
  */
 class IpUtils
 {
-    private static $checkedIps = array();
+    private static $checkedIps = [];
 
     /**
      * This class should not be instantiated.
@@ -37,8 +37,8 @@ class IpUtils
      */
     public static function checkIp($requestIp, $ips)
     {
-        if (!is_array($ips)) {
-            $ips = array($ips);
+        if (!\is_array($ips)) {
+            $ips = [$ips];
         }
 
         $method = substr_count($requestIp, ':') > 1 ? 'checkIp6' : 'checkIp4';
@@ -75,7 +75,7 @@ class IpUtils
         if (false !== strpos($ip, '/')) {
             list($address, $netmask) = explode('/', $ip, 2);
 
-            if ($netmask === '0') {
+            if ('0' === $netmask) {
                 return self::$checkedIps[$cacheKey] = filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
             }
 
@@ -87,6 +87,10 @@ class IpUtils
             $netmask = 32;
         }
 
+        if (false === ip2long($address)) {
+            return self::$checkedIps[$cacheKey] = false;
+        }
+
         return self::$checkedIps[$cacheKey] = 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask);
     }
 
@@ -112,13 +116,17 @@ class IpUtils
             return self::$checkedIps[$cacheKey];
         }
 
-        if (!((extension_loaded('sockets') && defined('AF_INET6')) || @inet_pton('::1'))) {
+        if (!((\extension_loaded('sockets') && \defined('AF_INET6')) || @inet_pton('::1'))) {
             throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".');
         }
 
         if (false !== strpos($ip, '/')) {
             list($address, $netmask) = explode('/', $ip, 2);
 
+            if ('0' === $netmask) {
+                return (bool) unpack('n*', @inet_pton($address));
+            }
+
             if ($netmask < 1 || $netmask > 128) {
                 return self::$checkedIps[$cacheKey] = false;
             }
diff --git a/vendor/symfony/http-foundation/JsonResponse.php b/vendor/symfony/http-foundation/JsonResponse.php
index 547a8e48..6fb32ee4 100644
--- a/vendor/symfony/http-foundation/JsonResponse.php
+++ b/vendor/symfony/http-foundation/JsonResponse.php
@@ -39,7 +39,7 @@ class JsonResponse extends Response
      * @param array $headers An array of response headers
      * @param bool  $json    If the data is already a JSON string
      */
-    public function __construct($data = null, $status = 200, $headers = array(), $json = false)
+    public function __construct($data = null, $status = 200, $headers = [], $json = false)
     {
         parent::__construct('', $status, $headers);
 
@@ -64,7 +64,7 @@ class JsonResponse extends Response
      *
      * @return static
      */
-    public static function create($data = null, $status = 200, $headers = array())
+    public static function create($data = null, $status = 200, $headers = [])
     {
         return new static($data, $status, $headers);
     }
@@ -72,7 +72,7 @@ class JsonResponse extends Response
     /**
      * Make easier the creation of JsonResponse from raw json.
      */
-    public static function fromJsonString($data = null, $status = 200, $headers = array())
+    public static function fromJsonString($data = null, $status = 200, $headers = [])
     {
         return new static($data, $status, $headers, true);
     }
@@ -94,14 +94,14 @@ class JsonResponse extends Response
             //      JsonpCallbackValidator is released under the MIT License. See https://github.com/willdurand/JsonpCallbackValidator/blob/v1.1.0/LICENSE for details.
             //      (c) William Durand <william.durand1@xxxxxxxxx>
             $pattern = '/^[$_\p{L}][$_\p{L}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{200C}\x{200D}]*(?:\[(?:"(?:\\\.|[^"\\\])*"|\'(?:\\\.|[^\'\\\])*\'|\d+)\])*?$/u';
-            $reserved = array(
+            $reserved = [
                 'break', 'do', 'instanceof', 'typeof', 'case', 'else', 'new', 'var', 'catch', 'finally', 'return', 'void', 'continue', 'for', 'switch', 'while',
                 'debugger', 'function', 'this', 'with', 'default', 'if', 'throw', 'delete', 'in', 'try', 'class', 'enum', 'extends', 'super',  'const', 'export',
                 'import', 'implements', 'let', 'private', 'public', 'yield', 'interface', 'package', 'protected', 'static', 'null', 'true', 'false',
-            );
+            ];
             $parts = explode('.', $callback);
             foreach ($parts as $part) {
-                if (!preg_match($pattern, $part) || in_array($part, $reserved, true)) {
+                if (!preg_match($pattern, $part) || \in_array($part, $reserved, true)) {
                     throw new \InvalidArgumentException('The callback name is not valid.');
                 }
             }
@@ -137,9 +137,9 @@ class JsonResponse extends Response
      *
      * @throws \InvalidArgumentException
      */
-    public function setData($data = array())
+    public function setData($data = [])
     {
-        if (defined('HHVM_VERSION')) {
+        if (\defined('HHVM_VERSION')) {
             // HHVM does not trigger any warnings and let exceptions
             // thrown from a JsonSerializable object pass through.
             // If only PHP did the same...
@@ -150,13 +150,13 @@ class JsonResponse extends Response
                 try {
                     $data = @json_encode($data, $this->encodingOptions);
                 } finally {
-                     restore_error_handler();
+                    restore_error_handler();
                 }
             } else {
                 try {
                     $data = json_encode($data, $this->encodingOptions);
                 } catch (\Exception $e) {
-                    if ('Exception' === get_class($e) && 0 === strpos($e->getMessage(), 'Failed calling ')) {
+                    if ('Exception' === \get_class($e) && 0 === strpos($e->getMessage(), 'Failed calling ')) {
                         throw $e->getPrevious() ?: $e;
                     }
                     throw $e;
diff --git a/vendor/symfony/http-foundation/LICENSE b/vendor/symfony/http-foundation/LICENSE
index 17d16a13..a677f437 100644
--- a/vendor/symfony/http-foundation/LICENSE
+++ b/vendor/symfony/http-foundation/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2017 Fabien Potencier
+Copyright (c) 2004-2019 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/http-foundation/ParameterBag.php b/vendor/symfony/http-foundation/ParameterBag.php
index c0b36479..f05e4a21 100644
--- a/vendor/symfony/http-foundation/ParameterBag.php
+++ b/vendor/symfony/http-foundation/ParameterBag.php
@@ -20,17 +20,13 @@ class ParameterBag implements \IteratorAggregate, \Countable
 {
     /**
      * Parameter storage.
-     *
-     * @var array
      */
     protected $parameters;
 
     /**
-     * Constructor.
-     *
      * @param array $parameters An array of parameters
      */
-    public function __construct(array $parameters = array())
+    public function __construct(array $parameters = [])
     {
         $this->parameters = $parameters;
     }
@@ -60,7 +56,7 @@ class ParameterBag implements \IteratorAggregate, \Countable
      *
      * @param array $parameters An array of parameters
      */
-    public function replace(array $parameters = array())
+    public function replace(array $parameters = [])
     {
         $this->parameters = $parameters;
     }
@@ -70,7 +66,7 @@ class ParameterBag implements \IteratorAggregate, \Countable
      *
      * @param array $parameters An array of parameters
      */
-    public function add(array $parameters = array())
+    public function add(array $parameters = [])
     {
         $this->parameters = array_replace($this->parameters, $parameters);
     }
@@ -85,7 +81,7 @@ class ParameterBag implements \IteratorAggregate, \Countable
      */
     public function get($key, $default = null)
     {
-        return array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default;
+        return \array_key_exists($key, $this->parameters) ? $this->parameters[$key] : $default;
     }
 
     /**
@@ -108,7 +104,7 @@ class ParameterBag implements \IteratorAggregate, \Countable
      */
     public function has($key)
     {
-        return array_key_exists($key, $this->parameters);
+        return \array_key_exists($key, $this->parameters);
     }
 
     /**
@@ -158,7 +154,7 @@ class ParameterBag implements \IteratorAggregate, \Countable
     public function getDigits($key, $default = '')
     {
         // we need to remove - and + because they're allowed in the filter
-        return str_replace(array('-', '+'), '', $this->filter($key, $default, FILTER_SANITIZE_NUMBER_INT));
+        return str_replace(['-', '+'], '', $this->filter($key, $default, FILTER_SANITIZE_NUMBER_INT));
     }
 
     /**
@@ -178,7 +174,7 @@ class ParameterBag implements \IteratorAggregate, \Countable
      * Returns the parameter value converted to boolean.
      *
      * @param string $key     The parameter key
-     * @param mixed  $default The default value if the parameter key does not exist
+     * @param bool   $default The default value if the parameter key does not exist
      *
      * @return bool The filtered value
      */
@@ -199,17 +195,17 @@ class ParameterBag implements \IteratorAggregate, \Countable
      *
      * @return mixed
      */
-    public function filter($key, $default = null, $filter = FILTER_DEFAULT, $options = array())
+    public function filter($key, $default = null, $filter = FILTER_DEFAULT, $options = [])
     {
         $value = $this->get($key, $default);
 
         // Always turn $options into an array - this allows filter_var option shortcuts.
-        if (!is_array($options) && $options) {
-            $options = array('flags' => $options);
+        if (!\is_array($options) && $options) {
+            $options = ['flags' => $options];
         }
 
         // Add a convenience check for arrays.
-        if (is_array($value) && !isset($options['flags'])) {
+        if (\is_array($value) && !isset($options['flags'])) {
             $options['flags'] = FILTER_REQUIRE_ARRAY;
         }
 
@@ -233,6 +229,6 @@ class ParameterBag implements \IteratorAggregate, \Countable
      */
     public function count()
     {
-        return count($this->parameters);
+        return \count($this->parameters);
     }
 }
diff --git a/vendor/symfony/http-foundation/RedirectResponse.php b/vendor/symfony/http-foundation/RedirectResponse.php
index cb1c58e8..5e1dfe58 100644
--- a/vendor/symfony/http-foundation/RedirectResponse.php
+++ b/vendor/symfony/http-foundation/RedirectResponse.php
@@ -32,7 +32,7 @@ class RedirectResponse extends Response
      *
      * @see http://tools.ietf.org/html/rfc2616#section-10.3
      */
-    public function __construct($url, $status = 302, $headers = array())
+    public function __construct($url, $status = 302, $headers = [])
     {
         parent::__construct('', $status, $headers);
 
@@ -42,15 +42,21 @@ class RedirectResponse extends Response
             throw new \InvalidArgumentException(sprintf('The HTTP status code is not a redirect ("%s" given).', $status));
         }
 
-        if (301 == $status && !array_key_exists('cache-control', $headers)) {
+        if (301 == $status && !\array_key_exists('cache-control', $headers)) {
             $this->headers->remove('cache-control');
         }
     }
 
     /**
-     * {@inheritdoc}
+     * Factory method for chainability.
+     *
+     * @param string $url     The url to redirect to
+     * @param int    $status  The response status code
+     * @param array  $headers An array of response headers
+     *
+     * @return static
      */
-    public static function create($url = '', $status = 302, $headers = array())
+    public static function create($url = '', $status = 302, $headers = [])
     {
         return new static($url, $status, $headers);
     }
diff --git a/vendor/symfony/http-foundation/Request.php b/vendor/symfony/http-foundation/Request.php
index 6fd0707b..ea3f460c 100644
--- a/vendor/symfony/http-foundation/Request.php
+++ b/vendor/symfony/http-foundation/Request.php
@@ -61,17 +61,17 @@ class Request
     /**
      * @var string[]
      */
-    protected static $trustedProxies = array();
+    protected static $trustedProxies = [];
 
     /**
      * @var string[]
      */
-    protected static $trustedHostPatterns = array();
+    protected static $trustedHostPatterns = [];
 
     /**
      * @var string[]
      */
-    protected static $trustedHosts = array();
+    protected static $trustedHosts = [];
 
     /**
      * Names for headers that can be trusted when
@@ -84,13 +84,13 @@ class Request
      *
      * @deprecated since version 3.3, to be removed in 4.0
      */
-    protected static $trustedHeaders = array(
+    protected static $trustedHeaders = [
         self::HEADER_FORWARDED => 'FORWARDED',
         self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
         self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
         self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
         self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
-    );
+    ];
 
     protected static $httpMethodParameterOverride = false;
 
@@ -144,7 +144,7 @@ class Request
     public $headers;
 
     /**
-     * @var string
+     * @var string|resource|false|null
      */
     protected $content;
 
@@ -221,39 +221,36 @@ class Request
     protected static $requestFactory;
 
     private $isHostValid = true;
-    private $isClientIpsValid = true;
     private $isForwardedValid = true;
 
     private static $trustedHeaderSet = -1;
 
     /** @deprecated since version 3.3, to be removed in 4.0 */
-    private static $trustedHeaderNames = array(
+    private static $trustedHeaderNames = [
         self::HEADER_FORWARDED => 'FORWARDED',
         self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR',
         self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST',
         self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO',
         self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT',
-    );
+    ];
 
-    private static $forwardedParams = array(
+    private static $forwardedParams = [
         self::HEADER_X_FORWARDED_FOR => 'for',
         self::HEADER_X_FORWARDED_HOST => 'host',
         self::HEADER_X_FORWARDED_PROTO => 'proto',
         self::HEADER_X_FORWARDED_PORT => 'host',
-    );
+    ];
 
     /**
-     * Constructor.
-     *
-     * @param array           $query      The GET parameters
-     * @param array           $request    The POST parameters
-     * @param array           $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
-     * @param array           $cookies    The COOKIE parameters
-     * @param array           $files      The FILES parameters
-     * @param array           $server     The SERVER parameters
-     * @param string|resource $content    The raw body data
+     * @param array                $query      The GET parameters
+     * @param array                $request    The POST parameters
+     * @param array                $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+     * @param array                $cookies    The COOKIE parameters
+     * @param array                $files      The FILES parameters
+     * @param array                $server     The SERVER parameters
+     * @param string|resource|null $content    The raw body data
      */
-    public function __construct(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
+    public function __construct(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null)
     {
         $this->initialize($query, $request, $attributes, $cookies, $files, $server, $content);
     }
@@ -263,15 +260,15 @@ class Request
      *
      * This method also re-initializes all properties.
      *
-     * @param array           $query      The GET parameters
-     * @param array           $request    The POST parameters
-     * @param array           $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
-     * @param array           $cookies    The COOKIE parameters
-     * @param array           $files      The FILES parameters
-     * @param array           $server     The SERVER parameters
-     * @param string|resource $content    The raw body data
+     * @param array                $query      The GET parameters
+     * @param array                $request    The POST parameters
+     * @param array                $attributes The request attributes (parameters parsed from the PATH_INFO, ...)
+     * @param array                $cookies    The COOKIE parameters
+     * @param array                $files      The FILES parameters
+     * @param array                $server     The SERVER parameters
+     * @param string|resource|null $content    The raw body data
      */
-    public function initialize(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
+    public function initialize(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null)
     {
         $this->request = new ParameterBag($request);
         $this->query = new ParameterBag($query);
@@ -305,19 +302,19 @@ class Request
         // stores the Content-Type and Content-Length header values in
         // HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH fields.
         $server = $_SERVER;
-        if ('cli-server' === PHP_SAPI) {
-            if (array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) {
+        if ('cli-server' === \PHP_SAPI) {
+            if (\array_key_exists('HTTP_CONTENT_LENGTH', $_SERVER)) {
                 $server['CONTENT_LENGTH'] = $_SERVER['HTTP_CONTENT_LENGTH'];
             }
-            if (array_key_exists('HTTP_CONTENT_TYPE', $_SERVER)) {
+            if (\array_key_exists('HTTP_CONTENT_TYPE', $_SERVER)) {
                 $server['CONTENT_TYPE'] = $_SERVER['HTTP_CONTENT_TYPE'];
             }
         }
 
-        $request = self::createRequestFromFactory($_GET, $_POST, array(), $_COOKIE, $_FILES, $server);
+        $request = self::createRequestFromFactory($_GET, $_POST, [], $_COOKIE, $_FILES, $server);
 
         if (0 === strpos($request->headers->get('CONTENT_TYPE'), 'application/x-www-form-urlencoded')
-            && in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), array('PUT', 'DELETE', 'PATCH'))
+            && \in_array(strtoupper($request->server->get('REQUEST_METHOD', 'GET')), ['PUT', 'DELETE', 'PATCH'])
         ) {
             parse_str($request->getContent(), $data);
             $request->request = new ParameterBag($data);
@@ -332,19 +329,19 @@ class Request
      * The information contained in the URI always take precedence
      * over the other information (server and parameters).
      *
-     * @param string $uri        The URI
-     * @param string $method     The HTTP method
-     * @param array  $parameters The query (GET) or request (POST) parameters
-     * @param array  $cookies    The request cookies ($_COOKIE)
-     * @param array  $files      The request files ($_FILES)
-     * @param array  $server     The server parameters ($_SERVER)
-     * @param string $content    The raw body data
+     * @param string               $uri        The URI
+     * @param string               $method     The HTTP method
+     * @param array                $parameters The query (GET) or request (POST) parameters
+     * @param array                $cookies    The request cookies ($_COOKIE)
+     * @param array                $files      The request files ($_FILES)
+     * @param array                $server     The server parameters ($_SERVER)
+     * @param string|resource|null $content    The raw body data
      *
      * @return static
      */
-    public static function create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null)
+    public static function create($uri, $method = 'GET', $parameters = [], $cookies = [], $files = [], $server = [], $content = null)
     {
-        $server = array_replace(array(
+        $server = array_replace([
             'SERVER_NAME' => 'localhost',
             'SERVER_PORT' => 80,
             'HTTP_HOST' => 'localhost',
@@ -357,7 +354,7 @@ class Request
             'SCRIPT_FILENAME' => '',
             'SERVER_PROTOCOL' => 'HTTP/1.1',
             'REQUEST_TIME' => time(),
-        ), $server);
+        ], $server);
 
         $server['PATH_INFO'] = '';
         $server['REQUEST_METHOD'] = strtoupper($method);
@@ -380,7 +377,7 @@ class Request
 
         if (isset($components['port'])) {
             $server['SERVER_PORT'] = $components['port'];
-            $server['HTTP_HOST'] = $server['HTTP_HOST'].':'.$components['port'];
+            $server['HTTP_HOST'] .= ':'.$components['port'];
         }
 
         if (isset($components['user'])) {
@@ -405,10 +402,10 @@ class Request
                 // no break
             case 'PATCH':
                 $request = $parameters;
-                $query = array();
+                $query = [];
                 break;
             default:
-                $request = array();
+                $request = [];
                 $query = $parameters;
                 break;
         }
@@ -431,7 +428,7 @@ class Request
         $server['REQUEST_URI'] = $components['path'].('' !== $queryString ? '?'.$queryString : '');
         $server['QUERY_STRING'] = $queryString;
 
-        return self::createRequestFromFactory($query, $request, array(), $cookies, $files, $server, $content);
+        return self::createRequestFromFactory($query, $request, [], $cookies, $files, $server, $content);
     }
 
     /**
@@ -463,22 +460,22 @@ class Request
     public function duplicate(array $query = null, array $request = null, array $attributes = null, array $cookies = null, array $files = null, array $server = null)
     {
         $dup = clone $this;
-        if ($query !== null) {
+        if (null !== $query) {
             $dup->query = new ParameterBag($query);
         }
-        if ($request !== null) {
+        if (null !== $request) {
             $dup->request = new ParameterBag($request);
         }
-        if ($attributes !== null) {
+        if (null !== $attributes) {
             $dup->attributes = new ParameterBag($attributes);
         }
-        if ($cookies !== null) {
+        if (null !== $cookies) {
             $dup->cookies = new ParameterBag($cookies);
         }
-        if ($files !== null) {
+        if (null !== $files) {
             $dup->files = new FileBag($files);
         }
-        if ($server !== null) {
+        if (null !== $server) {
             $dup->server = new ServerBag($server);
             $dup->headers = new HeaderBag($dup->server->getHeaders());
         }
@@ -534,9 +531,21 @@ class Request
             return trigger_error($e, E_USER_ERROR);
         }
 
+        $cookieHeader = '';
+        $cookies = [];
+
+        foreach ($this->cookies as $k => $v) {
+            $cookies[] = $k.'='.$v;
+        }
+
+        if (!empty($cookies)) {
+            $cookieHeader = 'Cookie: '.implode('; ', $cookies)."\r\n";
+        }
+
         return
             sprintf('%s %s %s', $this->getMethod(), $this->getRequestUri(), $this->server->get('SERVER_PROTOCOL'))."\r\n".
-            $this->headers."\r\n".
+            $this->headers.
+            $cookieHeader."\r\n".
             $content;
     }
 
@@ -548,7 +557,7 @@ class Request
      */
     public function overrideGlobals()
     {
-        $this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), null, '&')));
+        $this->server->set('QUERY_STRING', static::normalizeQueryString(http_build_query($this->query->all(), '', '&')));
 
         $_GET = $this->query->all();
         $_POST = $this->request->all();
@@ -557,19 +566,19 @@ class Request
 
         foreach ($this->headers->all() as $key => $value) {
             $key = strtoupper(str_replace('-', '_', $key));
-            if (in_array($key, array('CONTENT_TYPE', 'CONTENT_LENGTH'))) {
+            if (\in_array($key, ['CONTENT_TYPE', 'CONTENT_LENGTH'])) {
                 $_SERVER[$key] = implode(', ', $value);
             } else {
                 $_SERVER['HTTP_'.$key] = implode(', ', $value);
             }
         }
 
-        $request = array('g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE);
+        $request = ['g' => $_GET, 'p' => $_POST, 'c' => $_COOKIE];
 
         $requestOrder = ini_get('request_order') ?: ini_get('variables_order');
         $requestOrder = preg_replace('#[^cgp]#', '', strtolower($requestOrder)) ?: 'gp';
 
-        $_REQUEST = array();
+        $_REQUEST = [];
         foreach (str_split($requestOrder) as $order) {
             $_REQUEST = array_merge($_REQUEST, $request[$order]);
         }
@@ -589,8 +598,8 @@ class Request
     {
         self::$trustedProxies = $proxies;
 
-        if (2 > func_num_args()) {
-            @trigger_error(sprintf('The %s() method expects a bit field of Request::HEADER_* as second argument since version 3.3. Defining it will be required in 4.0. ', __METHOD__), E_USER_DEPRECATED);
+        if (2 > \func_num_args()) {
+            @trigger_error(sprintf('The %s() method expects a bit field of Request::HEADER_* as second argument since Symfony 3.3. Defining it will be required in 4.0. ', __METHOD__), E_USER_DEPRECATED);
 
             return;
         }
@@ -632,10 +641,10 @@ class Request
     public static function setTrustedHosts(array $hostPatterns)
     {
         self::$trustedHostPatterns = array_map(function ($hostPattern) {
-            return sprintf('#%s#i', $hostPattern);
+            return sprintf('{%s}i', $hostPattern);
         }, $hostPatterns);
         // we need to reset trusted hosts on trusted host patterns change
-        self::$trustedHosts = array();
+        self::$trustedHosts = [];
     }
 
     /**
@@ -670,7 +679,7 @@ class Request
      */
     public static function setTrustedHeaderName($key, $value)
     {
-        @trigger_error(sprintf('The "%s()" method is deprecated since version 3.3 and will be removed in 4.0. Use the $trustedHeaderSet argument of the Request::setTrustedProxies() method instead.', __METHOD__), E_USER_DEPRECATED);
+        @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the $trustedHeaderSet argument of the Request::setTrustedProxies() method instead.', __METHOD__), E_USER_DEPRECATED);
 
         if ('forwarded' === $key) {
             $key = self::HEADER_FORWARDED;
@@ -682,7 +691,7 @@ class Request
             $key = self::HEADER_CLIENT_PROTO;
         } elseif ('client_port' === $key) {
             $key = self::HEADER_CLIENT_PORT;
-        } elseif (!array_key_exists($key, self::$trustedHeaders)) {
+        } elseif (!\array_key_exists($key, self::$trustedHeaders)) {
             throw new \InvalidArgumentException(sprintf('Unable to set the trusted header name for key "%s".', $key));
         }
 
@@ -709,11 +718,11 @@ class Request
      */
     public static function getTrustedHeaderName($key)
     {
-        if (2 > func_num_args() || func_get_arg(1)) {
-            @trigger_error(sprintf('The "%s()" method is deprecated since version 3.3 and will be removed in 4.0. Use the Request::getTrustedHeaderSet() method instead.', __METHOD__), E_USER_DEPRECATED);
+        if (2 > \func_num_args() || func_get_arg(1)) {
+            @trigger_error(sprintf('The "%s()" method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the Request::getTrustedHeaderSet() method instead.', __METHOD__), E_USER_DEPRECATED);
         }
 
-        if (!array_key_exists($key, self::$trustedHeaders)) {
+        if (!\array_key_exists($key, self::$trustedHeaders)) {
             throw new \InvalidArgumentException(sprintf('Unable to get the trusted header name for key "%s".', $key));
         }
 
@@ -736,8 +745,8 @@ class Request
             return '';
         }
 
-        $parts = array();
-        $order = array();
+        $parts = [];
+        $order = [];
 
         foreach (explode('&', $qs) as $param) {
             if ('' === $param || '=' === $param[0]) {
@@ -798,8 +807,8 @@ class Request
      *
      * Order of precedence: PATH (routing placeholders or custom attributes), GET, BODY
      *
-     * @param string $key     the key
-     * @param mixed  $default the default value if the parameter key does not exist
+     * @param string $key     The key
+     * @param mixed  $default The default value if the parameter key does not exist
      *
      * @return mixed
      */
@@ -884,10 +893,10 @@ class Request
         $ip = $this->server->get('REMOTE_ADDR');
 
         if (!$this->isFromTrustedProxy()) {
-            return array($ip);
+            return [$ip];
         }
 
-        return $this->getTrustedValues(self::HEADER_CLIENT_IP, $ip) ?: array($ip);
+        return $this->getTrustedValues(self::HEADER_CLIENT_IP, $ip) ?: [$ip];
     }
 
     /**
@@ -1022,7 +1031,7 @@ class Request
             return $this->server->get('SERVER_PORT');
         }
 
-        if ($host[0] === '[') {
+        if ('[' === $host[0]) {
             $pos = strpos($host, ':', strrpos($host, ']'));
         } else {
             $pos = strrpos($host, ':');
@@ -1084,7 +1093,7 @@ class Request
         $scheme = $this->getScheme();
         $port = $this->getPort();
 
-        if (('http' == $scheme && $port == 80) || ('https' == $scheme && $port == 443)) {
+        if (('http' == $scheme && 80 == $port) || ('https' == $scheme && 443 == $port)) {
             return $this->getHost();
         }
 
@@ -1177,7 +1186,7 @@ class Request
         }
 
         $sourceDirs = explode('/', isset($basePath[0]) && '/' === $basePath[0] ? substr($basePath, 1) : $basePath);
-        $targetDirs = explode('/', isset($path[0]) && '/' === $path[0] ? substr($path, 1) : $path);
+        $targetDirs = explode('/', substr($path, 1));
         array_pop($sourceDirs);
         $targetFile = array_pop($targetDirs);
 
@@ -1190,7 +1199,7 @@ class Request
         }
 
         $targetDirs[] = $targetFile;
-        $path = str_repeat('../', count($sourceDirs)).implode('/', $targetDirs);
+        $path = str_repeat('../', \count($sourceDirs)).implode('/', $targetDirs);
 
         // A reference to the same base directory or an empty subdirectory must be prefixed with "./".
         // This also applies to a segment with a colon character (e.g., "file:colon") that cannot be used
@@ -1233,7 +1242,7 @@ class Request
     public function isSecure()
     {
         if ($this->isFromTrustedProxy() && $proto = $this->getTrustedValues(self::HEADER_CLIENT_PROTO)) {
-            return in_array(strtolower($proto[0]), array('https', 'on', 'ssl', '1'), true);
+            return \in_array(strtolower($proto[0]), ['https', 'on', 'ssl', '1'], true);
         }
 
         $https = $this->server->get('HTTPS');
@@ -1283,10 +1292,10 @@ class Request
             throw new SuspiciousOperationException(sprintf('Invalid Host "%s".', $host));
         }
 
-        if (count(self::$trustedHostPatterns) > 0) {
+        if (\count(self::$trustedHostPatterns) > 0) {
             // to avoid host header injection attacks, you should provide a list of trusted host patterns
 
-            if (in_array($host, self::$trustedHosts)) {
+            if (\in_array($host, self::$trustedHosts)) {
                 return $host;
             }
 
@@ -1337,19 +1346,37 @@ class Request
      */
     public function getMethod()
     {
-        if (null === $this->method) {
-            $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));
+        if (null !== $this->method) {
+            return $this->method;
+        }
 
-            if ('POST' === $this->method) {
-                if ($method = $this->headers->get('X-HTTP-METHOD-OVERRIDE')) {
-                    $this->method = strtoupper($method);
-                } elseif (self::$httpMethodParameterOverride) {
-                    $this->method = strtoupper($this->request->get('_method', $this->query->get('_method', 'POST')));
-                }
-            }
+        $this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));
+
+        if ('POST' !== $this->method) {
+            return $this->method;
+        }
+
+        $method = $this->headers->get('X-HTTP-METHOD-OVERRIDE');
+
+        if (!$method && self::$httpMethodParameterOverride) {
+            $method = $this->request->get('_method', $this->query->get('_method', 'POST'));
+        }
+
+        if (!\is_string($method)) {
+            return $this->method;
+        }
+
+        $method = strtoupper($method);
+
+        if (\in_array($method, ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'PATCH', 'PURGE', 'TRACE'], true)) {
+            return $this->method = $method;
         }
 
-        return $this->method;
+        if (!preg_match('/^[A-Z]++$/D', $method)) {
+            throw new SuspiciousOperationException(sprintf('Invalid method override "%s".', $method));
+        }
+
+        return $this->method = $method;
     }
 
     /**
@@ -1369,7 +1396,7 @@ class Request
      *
      * @param string $format The format
      *
-     * @return string The associated mime type (null if not found)
+     * @return string|null The associated mime type (null if not found)
      */
     public function getMimeType($format)
     {
@@ -1393,7 +1420,7 @@ class Request
             static::initializeFormats();
         }
 
-        return isset(static::$formats[$format]) ? static::$formats[$format] : array();
+        return isset(static::$formats[$format]) ? static::$formats[$format] : [];
     }
 
     /**
@@ -1407,7 +1434,7 @@ class Request
     {
         $canonicalMimeType = null;
         if (false !== $pos = strpos($mimeType, ';')) {
-            $canonicalMimeType = substr($mimeType, 0, $pos);
+            $canonicalMimeType = trim(substr($mimeType, 0, $pos));
         }
 
         if (null === static::$formats) {
@@ -1415,10 +1442,10 @@ class Request
         }
 
         foreach (static::$formats as $format => $mimeTypes) {
-            if (in_array($mimeType, (array) $mimeTypes)) {
+            if (\in_array($mimeType, (array) $mimeTypes)) {
                 return $format;
             }
-            if (null !== $canonicalMimeType && in_array($canonicalMimeType, (array) $mimeTypes)) {
+            if (null !== $canonicalMimeType && \in_array($canonicalMimeType, (array) $mimeTypes)) {
                 return $format;
             }
         }
@@ -1436,7 +1463,7 @@ class Request
             static::initializeFormats();
         }
 
-        static::$formats[$format] = is_array($mimeTypes) ? $mimeTypes : array($mimeTypes);
+        static::$formats[$format] = \is_array($mimeTypes) ? $mimeTypes : [$mimeTypes];
     }
 
     /**
@@ -1448,9 +1475,9 @@ class Request
      *  * _format request attribute
      *  * $default
      *
-     * @param string $default The default format
+     * @param string|null $default The default format
      *
-     * @return string The request format
+     * @return string|null The request format
      */
     public function getRequestFormat($default = 'html')
     {
@@ -1548,15 +1575,15 @@ class Request
      */
     public function isMethodSafe(/* $andCacheable = true */)
     {
-        if (!func_num_args() || func_get_arg(0)) {
+        if (!\func_num_args() || func_get_arg(0)) {
             // This deprecation should be turned into a BadMethodCallException in 4.0 (without adding the argument in the signature)
             // then setting $andCacheable to false should be deprecated in 4.1
-            @trigger_error('Checking only for cacheable HTTP methods with Symfony\Component\HttpFoundation\Request::isMethodSafe() is deprecated since version 3.2 and will throw an exception in 4.0. Disable checking only for cacheable methods by calling the method with `false` as first argument or use the Request::isMethodCacheable() instead.', E_USER_DEPRECATED);
+            @trigger_error('Checking only for cacheable HTTP methods with Symfony\Component\HttpFoundation\Request::isMethodSafe() is deprecated since Symfony 3.2 and will throw an exception in 4.0. Disable checking only for cacheable methods by calling the method with `false` as first argument or use the Request::isMethodCacheable() instead.', E_USER_DEPRECATED);
 
-            return in_array($this->getMethod(), array('GET', 'HEAD'));
+            return \in_array($this->getMethod(), ['GET', 'HEAD']);
         }
 
-        return in_array($this->getMethod(), array('GET', 'HEAD', 'OPTIONS', 'TRACE'));
+        return \in_array($this->getMethod(), ['GET', 'HEAD', 'OPTIONS', 'TRACE']);
     }
 
     /**
@@ -1566,7 +1593,7 @@ class Request
      */
     public function isMethodIdempotent()
     {
-        return in_array($this->getMethod(), array('HEAD', 'GET', 'PUT', 'DELETE', 'TRACE', 'OPTIONS', 'PURGE'));
+        return \in_array($this->getMethod(), ['HEAD', 'GET', 'PUT', 'DELETE', 'TRACE', 'OPTIONS', 'PURGE']);
     }
 
     /**
@@ -1574,11 +1601,35 @@ class Request
      *
      * @see https://tools.ietf.org/html/rfc7231#section-4.2.3
      *
-     * @return bool
+     * @return bool True for GET and HEAD, false otherwise
      */
     public function isMethodCacheable()
     {
-        return in_array($this->getMethod(), array('GET', 'HEAD'));
+        return \in_array($this->getMethod(), ['GET', 'HEAD']);
+    }
+
+    /**
+     * Returns the protocol version.
+     *
+     * If the application is behind a proxy, the protocol version used in the
+     * requests between the client and the proxy and between the proxy and the
+     * server might be different. This returns the former (from the "Via" header)
+     * if the proxy is trusted (see "setTrustedProxies()"), otherwise it returns
+     * the latter (from the "SERVER_PROTOCOL" server parameter).
+     *
+     * @return string
+     */
+    public function getProtocolVersion()
+    {
+        if ($this->isFromTrustedProxy()) {
+            preg_match('~^(HTTP/)?([1-9]\.[0-9]) ~', $this->headers->get('Via'), $matches);
+
+            if ($matches) {
+                return 'HTTP/'.$matches[2];
+            }
+        }
+
+        return $this->server->get('SERVER_PROTOCOL');
     }
 
     /**
@@ -1592,7 +1643,7 @@ class Request
      */
     public function getContent($asResource = false)
     {
-        $currentContentIsResource = is_resource($this->content);
+        $currentContentIsResource = \is_resource($this->content);
         if (\PHP_VERSION_ID < 50600 && false === $this->content) {
             throw new \LogicException('getContent() can only be called once when using the resource return type and PHP below 5.6.');
         }
@@ -1605,7 +1656,7 @@ class Request
             }
 
             // Content passed in parameter (test)
-            if (is_string($this->content)) {
+            if (\is_string($this->content)) {
                 $resource = fopen('php://temp', 'r+');
                 fwrite($resource, $this->content);
                 rewind($resource);
@@ -1668,12 +1719,12 @@ class Request
             return $locales[0];
         }
 
-        $extendedPreferredLanguages = array();
+        $extendedPreferredLanguages = [];
         foreach ($preferredLanguages as $language) {
             $extendedPreferredLanguages[] = $language;
             if (false !== $position = strpos($language, '_')) {
                 $superLanguage = substr($language, 0, $position);
-                if (!in_array($superLanguage, $preferredLanguages)) {
+                if (!\in_array($superLanguage, $preferredLanguages)) {
                     $extendedPreferredLanguages[] = $superLanguage;
                 }
             }
@@ -1696,7 +1747,7 @@ class Request
         }
 
         $languages = AcceptHeader::fromString($this->headers->get('Accept-Language'))->all();
-        $this->languages = array();
+        $this->languages = [];
         foreach ($languages as $lang => $acceptHeaderItem) {
             if (false !== strpos($lang, '-')) {
                 $codes = explode('-', $lang);
@@ -1704,12 +1755,12 @@ class Request
                     // Language not listed in ISO 639 that are not variants
                     // of any listed language, which can be registered with the
                     // i-prefix, such as i-cherokee
-                    if (count($codes) > 1) {
+                    if (\count($codes) > 1) {
                         $lang = $codes[1];
                     }
                 } else {
-                    for ($i = 0, $max = count($codes); $i < $max; ++$i) {
-                        if ($i === 0) {
+                    for ($i = 0, $max = \count($codes); $i < $max; ++$i) {
+                        if (0 === $i) {
                             $lang = strtolower($codes[0]);
                         } else {
                             $lang .= '_'.strtoupper($codes[$i]);
@@ -1793,28 +1844,31 @@ class Request
     {
         $requestUri = '';
 
-        if ($this->headers->has('X_ORIGINAL_URL')) {
-            // IIS with Microsoft Rewrite Module
-            $requestUri = $this->headers->get('X_ORIGINAL_URL');
-            $this->headers->remove('X_ORIGINAL_URL');
-            $this->server->remove('HTTP_X_ORIGINAL_URL');
-            $this->server->remove('UNENCODED_URL');
-            $this->server->remove('IIS_WasUrlRewritten');
-        } elseif ($this->headers->has('X_REWRITE_URL')) {
-            // IIS with ISAPI_Rewrite
-            $requestUri = $this->headers->get('X_REWRITE_URL');
-            $this->headers->remove('X_REWRITE_URL');
-        } elseif ($this->server->get('IIS_WasUrlRewritten') == '1' && $this->server->get('UNENCODED_URL') != '') {
+        if ('1' == $this->server->get('IIS_WasUrlRewritten') && '' != $this->server->get('UNENCODED_URL')) {
             // IIS7 with URL Rewrite: make sure we get the unencoded URL (double slash problem)
             $requestUri = $this->server->get('UNENCODED_URL');
             $this->server->remove('UNENCODED_URL');
             $this->server->remove('IIS_WasUrlRewritten');
         } elseif ($this->server->has('REQUEST_URI')) {
             $requestUri = $this->server->get('REQUEST_URI');
-            // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path, only use URL path
-            $schemeAndHttpHost = $this->getSchemeAndHttpHost();
-            if (strpos($requestUri, $schemeAndHttpHost) === 0) {
-                $requestUri = substr($requestUri, strlen($schemeAndHttpHost));
+
+            if ('' !== $requestUri && '/' === $requestUri[0]) {
+                // To only use path and query remove the fragment.
+                if (false !== $pos = strpos($requestUri, '#')) {
+                    $requestUri = substr($requestUri, 0, $pos);
+                }
+            } else {
+                // HTTP proxy reqs setup request URI with scheme and host [and port] + the URL path,
+                // only use URL path.
+                $uriComponents = parse_url($requestUri);
+
+                if (isset($uriComponents['path'])) {
+                    $requestUri = $uriComponents['path'];
+                }
+
+                if (isset($uriComponents['query'])) {
+                    $requestUri .= '?'.$uriComponents['query'];
+                }
             }
         } elseif ($this->server->has('ORIG_PATH_INFO')) {
             // IIS 5.0, PHP as CGI
@@ -1854,7 +1908,7 @@ class Request
             $segs = explode('/', trim($file, '/'));
             $segs = array_reverse($segs);
             $index = 0;
-            $last = count($segs);
+            $last = \count($segs);
             $baseUrl = '';
             do {
                 $seg = $segs[$index];
@@ -1865,15 +1919,18 @@ class Request
 
         // Does the baseUrl have anything in common with the request_uri?
         $requestUri = $this->getRequestUri();
+        if ('' !== $requestUri && '/' !== $requestUri[0]) {
+            $requestUri = '/'.$requestUri;
+        }
 
         if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, $baseUrl)) {
             // full $baseUrl matches
             return $prefix;
         }
 
-        if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, rtrim(dirname($baseUrl), '/'.DIRECTORY_SEPARATOR).'/')) {
+        if ($baseUrl && false !== $prefix = $this->getUrlencodedPrefix($requestUri, rtrim(\dirname($baseUrl), '/'.\DIRECTORY_SEPARATOR).'/')) {
             // directory portion of $baseUrl matches
-            return rtrim($prefix, '/'.DIRECTORY_SEPARATOR);
+            return rtrim($prefix, '/'.\DIRECTORY_SEPARATOR);
         }
 
         $truncatedRequestUri = $requestUri;
@@ -1890,11 +1947,11 @@ class Request
         // If using mod_rewrite or ISAPI_Rewrite strip the script filename
         // out of baseUrl. $pos !== 0 makes sure it is not matching a value
         // from PATH_INFO or QUERY_STRING
-        if (strlen($requestUri) >= strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && $pos !== 0) {
-            $baseUrl = substr($requestUri, 0, $pos + strlen($baseUrl));
+        if (\strlen($requestUri) >= \strlen($baseUrl) && (false !== $pos = strpos($requestUri, $baseUrl)) && 0 !== $pos) {
+            $baseUrl = substr($requestUri, 0, $pos + \strlen($baseUrl));
         }
 
-        return rtrim($baseUrl, '/'.DIRECTORY_SEPARATOR);
+        return rtrim($baseUrl, '/'.\DIRECTORY_SEPARATOR);
     }
 
     /**
@@ -1904,19 +1961,19 @@ class Request
      */
     protected function prepareBasePath()
     {
-        $filename = basename($this->server->get('SCRIPT_FILENAME'));
         $baseUrl = $this->getBaseUrl();
         if (empty($baseUrl)) {
             return '';
         }
 
+        $filename = basename($this->server->get('SCRIPT_FILENAME'));
         if (basename($baseUrl) === $filename) {
-            $basePath = dirname($baseUrl);
+            $basePath = \dirname($baseUrl);
         } else {
             $basePath = $baseUrl;
         }
 
-        if ('\\' === DIRECTORY_SEPARATOR) {
+        if ('\\' === \DIRECTORY_SEPARATOR) {
             $basePath = str_replace('\\', '/', $basePath);
         }
 
@@ -1930,23 +1987,26 @@ class Request
      */
     protected function preparePathInfo()
     {
-        $baseUrl = $this->getBaseUrl();
-
         if (null === ($requestUri = $this->getRequestUri())) {
             return '/';
         }
 
         // Remove the query string from REQUEST_URI
-        if ($pos = strpos($requestUri, '?')) {
+        if (false !== $pos = strpos($requestUri, '?')) {
             $requestUri = substr($requestUri, 0, $pos);
         }
+        if ('' !== $requestUri && '/' !== $requestUri[0]) {
+            $requestUri = '/'.$requestUri;
+        }
+
+        if (null === ($baseUrl = $this->getBaseUrl())) {
+            return $requestUri;
+        }
 
-        $pathInfo = substr($requestUri, strlen($baseUrl));
-        if (null !== $baseUrl && (false === $pathInfo || '' === $pathInfo)) {
+        $pathInfo = substr($requestUri, \strlen($baseUrl));
+        if (false === $pathInfo || '' === $pathInfo) {
             // If substr() returns false then PATH_INFO is set to an empty string
             return '/';
-        } elseif (null === $baseUrl) {
-            return $requestUri;
         }
 
         return (string) $pathInfo;
@@ -1957,18 +2017,19 @@ class Request
      */
     protected static function initializeFormats()
     {
-        static::$formats = array(
-            'html' => array('text/html', 'application/xhtml+xml'),
-            'txt' => array('text/plain'),
-            'js' => array('application/javascript', 'application/x-javascript', 'text/javascript'),
-            'css' => array('text/css'),
-            'json' => array('application/json', 'application/x-json'),
-            'xml' => array('text/xml', 'application/xml', 'application/x-xml'),
-            'rdf' => array('application/rdf+xml'),
-            'atom' => array('application/atom+xml'),
-            'rss' => array('application/rss+xml'),
-            'form' => array('application/x-www-form-urlencoded'),
-        );
+        static::$formats = [
+            'html' => ['text/html', 'application/xhtml+xml'],
+            'txt' => ['text/plain'],
+            'js' => ['application/javascript', 'application/x-javascript', 'text/javascript'],
+            'css' => ['text/css'],
+            'json' => ['application/json', 'application/x-json'],
+            'jsonld' => ['application/ld+json'],
+            'xml' => ['text/xml', 'application/xml', 'application/x-xml'],
+            'rdf' => ['application/rdf+xml'],
+            'atom' => ['application/atom+xml'],
+            'rss' => ['application/rss+xml'],
+            'form' => ['application/x-www-form-urlencoded'],
+        ];
     }
 
     /**
@@ -1989,7 +2050,7 @@ class Request
         }
     }
 
-    /*
+    /**
      * Returns the prefix as encoded in the string when the string starts with
      * the given prefix, false otherwise.
      *
@@ -2004,7 +2065,7 @@ class Request
             return false;
         }
 
-        $len = strlen($prefix);
+        $len = \strlen($prefix);
 
         if (preg_match(sprintf('#^(%%[[:xdigit:]]{2}|.){%d}#', $len), $string, $match)) {
             return $match[0];
@@ -2013,10 +2074,10 @@ class Request
         return false;
     }
 
-    private static function createRequestFromFactory(array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null)
+    private static function createRequestFromFactory(array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null)
     {
         if (self::$requestFactory) {
-            $request = call_user_func(self::$requestFactory, $query, $request, $attributes, $cookies, $files, $server, $content);
+            $request = \call_user_func(self::$requestFactory, $query, $request, $attributes, $cookies, $files, $server, $content);
 
             if (!$request instanceof self) {
                 throw new \LogicException('The Request factory must return an instance of Symfony\Component\HttpFoundation\Request.');
@@ -2043,8 +2104,8 @@ class Request
 
     private function getTrustedValues($type, $ip = null)
     {
-        $clientValues = array();
-        $forwardedValues = array();
+        $clientValues = [];
+        $forwardedValues = [];
 
         if (self::$trustedHeaders[$type] && $this->headers->has(self::$trustedHeaders[$type])) {
             foreach (explode(',', $this->headers->get(self::$trustedHeaders[$type])) as $v) {
@@ -2054,7 +2115,15 @@ class Request
 
         if (self::$trustedHeaders[self::HEADER_FORWARDED] && $this->headers->has(self::$trustedHeaders[self::HEADER_FORWARDED])) {
             $forwardedValues = $this->headers->get(self::$trustedHeaders[self::HEADER_FORWARDED]);
-            $forwardedValues = preg_match_all(sprintf('{(?:%s)=(?:"?\[?)([a-zA-Z0-9\.:_\-/]*+)}', self::$forwardedParams[$type]), $forwardedValues, $matches) ? $matches[1] : array();
+            $forwardedValues = preg_match_all(sprintf('{(?:%s)="?([a-zA-Z0-9\.:_\-/\[\]]*+)}', self::$forwardedParams[$type]), $forwardedValues, $matches) ? $matches[1] : [];
+            if (self::HEADER_CLIENT_PORT === $type) {
+                foreach ($forwardedValues as $k => $v) {
+                    if (']' === substr($v, -1) || false === $v = strrchr($v, ':')) {
+                        $v = $this->isSecure() ? ':443' : ':80';
+                    }
+                    $forwardedValues[$k] = '0.0.0.0'.$v;
+                }
+            }
         }
 
         if (null !== $ip) {
@@ -2071,7 +2140,7 @@ class Request
         }
 
         if (!$this->isForwardedValid) {
-            return null !== $ip ? array('0.0.0.0', $ip) : array();
+            return null !== $ip ? ['0.0.0.0', $ip] : [];
         }
         $this->isForwardedValid = false;
 
@@ -2081,15 +2150,23 @@ class Request
     private function normalizeAndFilterClientIps(array $clientIps, $ip)
     {
         if (!$clientIps) {
-            return array();
+            return [];
         }
         $clientIps[] = $ip; // Complete the IP chain with the IP the request actually came from
         $firstTrustedIp = null;
 
         foreach ($clientIps as $key => $clientIp) {
-            // Remove port (unfortunately, it does happen)
-            if (preg_match('{((?:\d+\.){3}\d+)\:\d+}', $clientIp, $match)) {
-                $clientIps[$key] = $clientIp = $match[1];
+            if (strpos($clientIp, '.')) {
+                // Strip :port from IPv4 addresses. This is allowed in Forwarded
+                // and may occur in X-Forwarded-For.
+                $i = strpos($clientIp, ':');
+                if ($i) {
+                    $clientIps[$key] = $clientIp = substr($clientIp, 0, $i);
+                }
+            } elseif (0 === strpos($clientIp, '[')) {
+                // Strip brackets and :port from IPv6 addresses.
+                $i = strpos($clientIp, ']', 1);
+                $clientIps[$key] = $clientIp = substr($clientIp, 1, $i - 1);
             }
 
             if (!filter_var($clientIp, FILTER_VALIDATE_IP)) {
@@ -2109,6 +2186,6 @@ class Request
         }
 
         // Now the IP chain contains only untrusted proxies and the client IP
-        return $clientIps ? array_reverse($clientIps) : array($firstTrustedIp);
+        return $clientIps ? array_reverse($clientIps) : [$firstTrustedIp];
     }
 }
diff --git a/vendor/symfony/http-foundation/RequestMatcher.php b/vendor/symfony/http-foundation/RequestMatcher.php
index aa4f67b5..cadf70c5 100644
--- a/vendor/symfony/http-foundation/RequestMatcher.php
+++ b/vendor/symfony/http-foundation/RequestMatcher.php
@@ -31,22 +31,22 @@ class RequestMatcher implements RequestMatcherInterface
     /**
      * @var string[]
      */
-    private $methods = array();
+    private $methods = [];
 
     /**
      * @var string[]
      */
-    private $ips = array();
+    private $ips = [];
 
     /**
      * @var array
      */
-    private $attributes = array();
+    private $attributes = [];
 
     /**
      * @var string[]
      */
-    private $schemes = array();
+    private $schemes = [];
 
     /**
      * @param string|null          $path
@@ -56,7 +56,7 @@ class RequestMatcher implements RequestMatcherInterface
      * @param array                $attributes
      * @param string|string[]|null $schemes
      */
-    public function __construct($path = null, $host = null, $methods = null, $ips = null, array $attributes = array(), $schemes = null)
+    public function __construct($path = null, $host = null, $methods = null, $ips = null, array $attributes = [], $schemes = null)
     {
         $this->matchPath($path);
         $this->matchHost($host);
@@ -76,7 +76,7 @@ class RequestMatcher implements RequestMatcherInterface
      */
     public function matchScheme($scheme)
     {
-        $this->schemes = null !== $scheme ? array_map('strtolower', (array) $scheme) : array();
+        $this->schemes = null !== $scheme ? array_map('strtolower', (array) $scheme) : [];
     }
 
     /**
@@ -116,7 +116,7 @@ class RequestMatcher implements RequestMatcherInterface
      */
     public function matchIps($ips)
     {
-        $this->ips = null !== $ips ? (array) $ips : array();
+        $this->ips = null !== $ips ? (array) $ips : [];
     }
 
     /**
@@ -126,7 +126,7 @@ class RequestMatcher implements RequestMatcherInterface
      */
     public function matchMethod($method)
     {
-        $this->methods = null !== $method ? array_map('strtoupper', (array) $method) : array();
+        $this->methods = null !== $method ? array_map('strtoupper', (array) $method) : [];
     }
 
     /**
@@ -145,11 +145,11 @@ class RequestMatcher implements RequestMatcherInterface
      */
     public function matches(Request $request)
     {
-        if ($this->schemes && !in_array($request->getScheme(), $this->schemes, true)) {
+        if ($this->schemes && !\in_array($request->getScheme(), $this->schemes, true)) {
             return false;
         }
 
-        if ($this->methods && !in_array($request->getMethod(), $this->methods, true)) {
+        if ($this->methods && !\in_array($request->getMethod(), $this->methods, true)) {
             return false;
         }
 
@@ -173,6 +173,6 @@ class RequestMatcher implements RequestMatcherInterface
 
         // Note to future implementors: add additional checks above the
         // foreach above or else your check might not be run!
-        return count($this->ips) === 0;
+        return 0 === \count($this->ips);
     }
 }
diff --git a/vendor/symfony/http-foundation/RequestMatcherInterface.php b/vendor/symfony/http-foundation/RequestMatcherInterface.php
index 066e7e8b..c26db3e6 100644
--- a/vendor/symfony/http-foundation/RequestMatcherInterface.php
+++ b/vendor/symfony/http-foundation/RequestMatcherInterface.php
@@ -21,8 +21,6 @@ interface RequestMatcherInterface
     /**
      * Decides whether the rule(s) implemented by the strategy matches the supplied request.
      *
-     * @param Request $request The request to check for a match
-     *
      * @return bool true if the request matches, false otherwise
      */
     public function matches(Request $request);
diff --git a/vendor/symfony/http-foundation/RequestStack.php b/vendor/symfony/http-foundation/RequestStack.php
index 3d9cfd0c..885d78a5 100644
--- a/vendor/symfony/http-foundation/RequestStack.php
+++ b/vendor/symfony/http-foundation/RequestStack.php
@@ -21,7 +21,7 @@ class RequestStack
     /**
      * @var Request[]
      */
-    private $requests = array();
+    private $requests = [];
 
     /**
      * Pushes a Request on the stack.
@@ -92,7 +92,7 @@ class RequestStack
      */
     public function getParentRequest()
     {
-        $pos = count($this->requests) - 2;
+        $pos = \count($this->requests) - 2;
 
         if (!isset($this->requests[$pos])) {
             return;
diff --git a/vendor/symfony/http-foundation/Response.php b/vendor/symfony/http-foundation/Response.php
index 4af1e0ba..b7d11625 100644
--- a/vendor/symfony/http-foundation/Response.php
+++ b/vendor/symfony/http-foundation/Response.php
@@ -21,6 +21,7 @@ class Response
     const HTTP_CONTINUE = 100;
     const HTTP_SWITCHING_PROTOCOLS = 101;
     const HTTP_PROCESSING = 102;            // RFC2518
+    const HTTP_EARLY_HINTS = 103;           // RFC8297
     const HTTP_OK = 200;
     const HTTP_CREATED = 201;
     const HTTP_ACCEPTED = 202;
@@ -63,7 +64,12 @@ class Response
     const HTTP_UNPROCESSABLE_ENTITY = 422;                                        // RFC4918
     const HTTP_LOCKED = 423;                                                      // RFC4918
     const HTTP_FAILED_DEPENDENCY = 424;                                           // RFC4918
+
+    /**
+     * @deprecated
+     */
     const HTTP_RESERVED_FOR_WEBDAV_ADVANCED_COLLECTIONS_EXPIRED_PROPOSAL = 425;   // RFC2817
+    const HTTP_TOO_EARLY = 425;                                                   // RFC-ietf-httpbis-replay-04
     const HTTP_UPGRADE_REQUIRED = 426;                                            // RFC2817
     const HTTP_PRECONDITION_REQUIRED = 428;                                       // RFC6585
     const HTTP_TOO_MANY_REQUESTS = 429;                                           // RFC6585
@@ -122,10 +128,11 @@ class Response
      *
      * @var array
      */
-    public static $statusTexts = array(
+    public static $statusTexts = [
         100 => 'Continue',
         101 => 'Switching Protocols',
         102 => 'Processing',            // RFC2518
+        103 => 'Early Hints',
         200 => 'OK',
         201 => 'Created',
         202 => 'Accepted',
@@ -167,7 +174,7 @@ class Response
         422 => 'Unprocessable Entity',                                        // RFC4918
         423 => 'Locked',                                                      // RFC4918
         424 => 'Failed Dependency',                                           // RFC4918
-        425 => 'Reserved for WebDAV advanced collections expired proposal',   // RFC2817
+        425 => 'Too Early',                                                   // RFC-ietf-httpbis-replay-04
         426 => 'Upgrade Required',                                            // RFC2817
         428 => 'Precondition Required',                                       // RFC6585
         429 => 'Too Many Requests',                                           // RFC6585
@@ -184,28 +191,21 @@ class Response
         508 => 'Loop Detected',                                               // RFC5842
         510 => 'Not Extended',                                                // RFC2774
         511 => 'Network Authentication Required',                             // RFC6585
-    );
+    ];
 
     /**
-     * Constructor.
-     *
      * @param mixed $content The response content, see setContent()
      * @param int   $status  The response status code
      * @param array $headers An array of response headers
      *
      * @throws \InvalidArgumentException When the HTTP status code is not valid
      */
-    public function __construct($content = '', $status = 200, $headers = array())
+    public function __construct($content = '', $status = 200, $headers = [])
     {
         $this->headers = new ResponseHeaderBag($headers);
         $this->setContent($content);
         $this->setStatusCode($status);
         $this->setProtocolVersion('1.0');
-
-        /* RFC2616 - 14.18 says all Responses need to have a Date */
-        if (!$this->headers->has('Date')) {
-            $this->setDate(\DateTime::createFromFormat('U', time()));
-        }
     }
 
     /**
@@ -222,7 +222,7 @@ class Response
      *
      * @return static
      */
-    public static function create($content = '', $status = 200, $headers = array())
+    public static function create($content = '', $status = 200, $headers = [])
     {
         return new static($content, $status, $headers);
     }
@@ -261,8 +261,6 @@ class Response
      * compliant with RFC 2616. Most of the changes are based on
      * the Request that is "associated" with this Response.
      *
-     * @param Request $request A Request instance
-     *
      * @return $this
      */
     public function prepare(Request $request)
@@ -312,9 +310,9 @@ class Response
         }
 
         // Check if we need to send extra expire info headers
-        if ('1.0' == $this->getProtocolVersion() && false !== strpos($this->headers->get('Cache-Control'), 'no-cache')) {
-            $this->headers->set('pragma', 'no-cache');
-            $this->headers->set('expires', -1);
+        if ('1.0' == $this->getProtocolVersion() && false !== strpos($headers->get('Cache-Control'), 'no-cache')) {
+            $headers->set('pragma', 'no-cache');
+            $headers->set('expires', -1);
         }
 
         $this->ensureIEOverSSLCompatibility($request);
@@ -334,30 +332,22 @@ class Response
             return $this;
         }
 
-        /* RFC2616 - 14.18 says all Responses need to have a Date */
-        if (!$this->headers->has('Date')) {
-            $this->setDate(\DateTime::createFromFormat('U', time()));
-        }
-
         // headers
         foreach ($this->headers->allPreserveCaseWithoutCookies() as $name => $values) {
+            $replace = 0 === strcasecmp($name, 'Content-Type');
             foreach ($values as $value) {
-                header($name.': '.$value, false, $this->statusCode);
+                header($name.': '.$value, $replace, $this->statusCode);
             }
         }
 
-        // status
-        header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);
-
         // cookies
         foreach ($this->headers->getCookies() as $cookie) {
-            if ($cookie->isRaw()) {
-                setrawcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
-            } else {
-                setcookie($cookie->getName(), $cookie->getValue(), $cookie->getExpiresTime(), $cookie->getPath(), $cookie->getDomain(), $cookie->isSecure(), $cookie->isHttpOnly());
-            }
+            header('Set-Cookie: '.$cookie->getName().strstr($cookie, '='), false, $this->statusCode);
         }
 
+        // status
+        header(sprintf('HTTP/%s %s %s', $this->version, $this->statusCode, $this->statusText), true, $this->statusCode);
+
         return $this;
     }
 
@@ -383,9 +373,9 @@ class Response
         $this->sendHeaders();
         $this->sendContent();
 
-        if (function_exists('fastcgi_finish_request')) {
+        if (\function_exists('fastcgi_finish_request')) {
             fastcgi_finish_request();
-        } elseif ('cli' !== PHP_SAPI) {
+        } elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg'], true)) {
             static::closeOutputBuffers(0, true);
         }
 
@@ -405,8 +395,8 @@ class Response
      */
     public function setContent($content)
     {
-        if (null !== $content && !is_string($content) && !is_numeric($content) && !is_callable(array($content, '__toString'))) {
-            throw new \UnexpectedValueException(sprintf('The Response content must be a string or object implementing __toString(), "%s" given.', gettype($content)));
+        if (null !== $content && !\is_string($content) && !is_numeric($content) && !\is_callable([$content, '__toString'])) {
+            throw new \UnexpectedValueException(sprintf('The Response content must be a string or object implementing __toString(), "%s" given.', \gettype($content)));
         }
 
         $this->content = (string) $content;
@@ -455,12 +445,12 @@ class Response
     /**
      * Sets the response status code.
      *
-     * @param int   $code HTTP status code
-     * @param mixed $text HTTP status text
-     *
      * If the status text is null it will be automatically populated for the known
      * status codes and left empty otherwise.
      *
+     * @param int   $code HTTP status code
+     * @param mixed $text HTTP status text
+     *
      * @return $this
      *
      * @throws \InvalidArgumentException When the HTTP status code is not valid
@@ -532,13 +522,19 @@ class Response
     }
 
     /**
-     * Returns true if the response is worth caching under any circumstance.
+     * Returns true if the response may safely be kept in a shared (surrogate) cache.
      *
      * Responses marked "private" with an explicit Cache-Control directive are
      * considered uncacheable.
      *
      * Responses with neither a freshness lifetime (Expires, max-age) nor cache
-     * validator (Last-Modified, ETag) are considered uncacheable.
+     * validator (Last-Modified, ETag) are considered uncacheable because there is
+     * no way to tell when or how to remove them from the cache.
+     *
+     * Note that RFC 7231 and RFC 7234 possibly allow for a more permissive implementation,
+     * for example "status codes that are defined as cacheable by default [...]
+     * can be reused by a cache with heuristic expiration unless otherwise indicated"
+     * (https://tools.ietf.org/html/rfc7231#section-6.1)
      *
      * @return bool true if the response is worth caching, false otherwise
      *
@@ -546,7 +542,7 @@ class Response
      */
     public function isCacheable()
     {
-        if (!in_array($this->statusCode, array(200, 203, 300, 301, 302, 404, 410))) {
+        if (!\in_array($this->statusCode, [200, 203, 300, 301, 302, 404, 410])) {
             return false;
         }
 
@@ -621,6 +617,38 @@ class Response
     }
 
     /**
+     * Marks the response as "immutable".
+     *
+     * @param bool $immutable enables or disables the immutable directive
+     *
+     * @return $this
+     *
+     * @final
+     */
+    public function setImmutable($immutable = true)
+    {
+        if ($immutable) {
+            $this->headers->addCacheControlDirective('immutable');
+        } else {
+            $this->headers->removeCacheControlDirective('immutable');
+        }
+
+        return $this;
+    }
+
+    /**
+     * Returns true if the response is marked as "immutable".
+     *
+     * @return bool returns true if the response is marked as "immutable"; otherwise false
+     *
+     * @final
+     */
+    public function isImmutable()
+    {
+        return $this->headers->hasCacheControlDirective('immutable');
+    }
+
+    /**
      * Returns true if the response must be revalidated by caches.
      *
      * This method indicates that the response must not be served stale by a
@@ -648,23 +676,12 @@ class Response
      */
     public function getDate()
     {
-        /*
-            RFC2616 - 14.18 says all Responses need to have a Date.
-            Make sure we provide one even if it the header
-            has been removed in the meantime.
-         */
-        if (!$this->headers->has('Date')) {
-            $this->setDate(\DateTime::createFromFormat('U', time()));
-        }
-
         return $this->headers->getDate('Date');
     }
 
     /**
      * Sets the Date header.
      *
-     * @param \DateTime $date A \DateTime instance
-     *
      * @return $this
      *
      * @final since version 3.2
@@ -702,6 +719,7 @@ class Response
     {
         if ($this->isFresh()) {
             $this->headers->set('Age', $this->getMaxAge());
+            $this->headers->remove('Expires');
         }
 
         return $this;
@@ -944,7 +962,7 @@ class Response
     /**
      * Sets the response's cache headers (validation and/or expiration).
      *
-     * Available options are: etag, last_modified, max_age, s_maxage, private, and public.
+     * Available options are: etag, last_modified, max_age, s_maxage, private, public and immutable.
      *
      * @param array $options An array of cache options
      *
@@ -956,8 +974,8 @@ class Response
      */
     public function setCache(array $options)
     {
-        if ($diff = array_diff(array_keys($options), array('etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public'))) {
-            throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', array_values($diff))));
+        if ($diff = array_diff(array_keys($options), ['etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public', 'immutable'])) {
+            throw new \InvalidArgumentException(sprintf('Response does not support the following options: "%s".', implode('", "', $diff)));
         }
 
         if (isset($options['etag'])) {
@@ -992,6 +1010,10 @@ class Response
             }
         }
 
+        if (isset($options['immutable'])) {
+            $this->setImmutable((bool) $options['immutable']);
+        }
+
         return $this;
     }
 
@@ -1013,7 +1035,7 @@ class Response
         $this->setContent(null);
 
         // remove headers that MUST NOT be included with 304 Not Modified responses
-        foreach (array('Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified') as $header) {
+        foreach (['Allow', 'Content-Encoding', 'Content-Language', 'Content-Length', 'Content-MD5', 'Content-Type', 'Last-Modified'] as $header) {
             $this->headers->remove($header);
         }
 
@@ -1042,10 +1064,10 @@ class Response
     public function getVary()
     {
         if (!$vary = $this->headers->get('Vary', null, false)) {
-            return array();
+            return [];
         }
 
-        $ret = array();
+        $ret = [];
         foreach ($vary as $item) {
             $ret = array_merge($ret, preg_split('/[\s,]+/', $item));
         }
@@ -1077,8 +1099,6 @@ class Response
      * If the Response is not modified, it sets the status code to 304 and
      * removes the actual content by calling the setNotModified() method.
      *
-     * @param Request $request A Request instance
-     *
      * @return bool true if the Response validators match the Request, false otherwise
      *
      * @final since version 3.3
@@ -1094,7 +1114,7 @@ class Response
         $modifiedSince = $request->headers->get('If-Modified-Since');
 
         if ($etags = $request->getETags()) {
-            $notModified = in_array($this->getEtag(), $etags) || in_array('*', $etags);
+            $notModified = \in_array($this->getEtag(), $etags) || \in_array('*', $etags);
         }
 
         if ($modifiedSince && $lastModified) {
@@ -1229,7 +1249,7 @@ class Response
      */
     public function isRedirect($location = null)
     {
-        return in_array($this->statusCode, array(201, 301, 302, 303, 307, 308)) && (null === $location ?: $location == $this->headers->get('Location'));
+        return \in_array($this->statusCode, [201, 301, 302, 303, 307, 308]) && (null === $location ?: $location == $this->headers->get('Location'));
     }
 
     /**
@@ -1241,7 +1261,7 @@ class Response
      */
     public function isEmpty()
     {
-        return in_array($this->statusCode, array(204, 304));
+        return \in_array($this->statusCode, [204, 304]);
     }
 
     /**
@@ -1257,11 +1277,11 @@ class Response
     public static function closeOutputBuffers($targetLevel, $flush)
     {
         $status = ob_get_status(true);
-        $level = count($status);
+        $level = \count($status);
         // PHP_OUTPUT_HANDLER_* are not defined on HHVM 3.3
-        $flags = defined('PHP_OUTPUT_HANDLER_REMOVABLE') ? PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? PHP_OUTPUT_HANDLER_FLUSHABLE : PHP_OUTPUT_HANDLER_CLEANABLE) : -1;
+        $flags = \defined('PHP_OUTPUT_HANDLER_REMOVABLE') ? PHP_OUTPUT_HANDLER_REMOVABLE | ($flush ? PHP_OUTPUT_HANDLER_FLUSHABLE : PHP_OUTPUT_HANDLER_CLEANABLE) : -1;
 
-        while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || $flags === ($s['flags'] & $flags) : $s['del'])) {
+        while ($level-- > $targetLevel && ($s = $status[$level]) && (!isset($s['del']) ? !isset($s['flags']) || ($s['flags'] & $flags) === $flags : $s['del'])) {
             if ($flush) {
                 ob_end_flush();
             } else {
@@ -1279,7 +1299,7 @@ class Response
      */
     protected function ensureIEOverSSLCompatibility(Request $request)
     {
-        if (false !== stripos($this->headers->get('Content-Disposition'), 'attachment') && preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT'), $match) == 1 && true === $request->isSecure()) {
+        if (false !== stripos($this->headers->get('Content-Disposition'), 'attachment') && 1 == preg_match('/MSIE (.*?);/i', $request->server->get('HTTP_USER_AGENT'), $match) && true === $request->isSecure()) {
             if ((int) preg_replace('/(MSIE )(.*?);/', '$2', $match[0]) < 9) {
                 $this->headers->remove('Cache-Control');
             }
diff --git a/vendor/symfony/http-foundation/ResponseHeaderBag.php b/vendor/symfony/http-foundation/ResponseHeaderBag.php
index df2931be..1dc8dc2c 100644
--- a/vendor/symfony/http-foundation/ResponseHeaderBag.php
+++ b/vendor/symfony/http-foundation/ResponseHeaderBag.php
@@ -24,33 +24,22 @@ class ResponseHeaderBag extends HeaderBag
     const DISPOSITION_ATTACHMENT = 'attachment';
     const DISPOSITION_INLINE = 'inline';
 
-    /**
-     * @var array
-     */
-    protected $computedCacheControl = array();
-
-    /**
-     * @var array
-     */
-    protected $cookies = array();
-
-    /**
-     * @var array
-     */
-    protected $headerNames = array();
+    protected $computedCacheControl = [];
+    protected $cookies = [];
+    protected $headerNames = [];
 
-    /**
-     * Constructor.
-     *
-     * @param array $headers An array of HTTP headers
-     */
-    public function __construct(array $headers = array())
+    public function __construct(array $headers = [])
     {
         parent::__construct($headers);
 
         if (!isset($this->headers['cache-control'])) {
             $this->set('Cache-Control', '');
         }
+
+        /* RFC2616 - 14.18 says all Responses need to have a Date */
+        if (!isset($this->headers['date'])) {
+            $this->initDate();
+        }
     }
 
     /**
@@ -60,7 +49,7 @@ class ResponseHeaderBag extends HeaderBag
      */
     public function allPreserveCase()
     {
-        $headers = array();
+        $headers = [];
         foreach ($this->all() as $name => $value) {
             $headers[isset($this->headerNames[$name]) ? $this->headerNames[$name] : $name] = $value;
         }
@@ -81,15 +70,19 @@ class ResponseHeaderBag extends HeaderBag
     /**
      * {@inheritdoc}
      */
-    public function replace(array $headers = array())
+    public function replace(array $headers = [])
     {
-        $this->headerNames = array();
+        $this->headerNames = [];
 
         parent::replace($headers);
 
         if (!isset($this->headers['cache-control'])) {
             $this->set('Cache-Control', '');
         }
+
+        if (!isset($this->headers['date'])) {
+            $this->initDate();
+        }
     }
 
     /**
@@ -114,7 +107,7 @@ class ResponseHeaderBag extends HeaderBag
 
         if ('set-cookie' === $uniqueKey) {
             if ($replace) {
-                $this->cookies = array();
+                $this->cookies = [];
             }
             foreach ((array) $values as $cookie) {
                 $this->setCookie(Cookie::fromString($cookie));
@@ -129,9 +122,9 @@ class ResponseHeaderBag extends HeaderBag
         parent::set($key, $values, $replace);
 
         // ensure the cache-control header has sensible defaults
-        if (in_array($uniqueKey, array('cache-control', 'etag', 'last-modified', 'expires'))) {
+        if (\in_array($uniqueKey, ['cache-control', 'etag', 'last-modified', 'expires'], true)) {
             $computed = $this->computeCacheControlValue();
-            $this->headers['cache-control'] = array($computed);
+            $this->headers['cache-control'] = [$computed];
             $this->headerNames['cache-control'] = 'Cache-Control';
             $this->computedCacheControl = $this->parseCacheControl($computed);
         }
@@ -146,7 +139,7 @@ class ResponseHeaderBag extends HeaderBag
         unset($this->headerNames[$uniqueKey]);
 
         if ('set-cookie' === $uniqueKey) {
-            $this->cookies = array();
+            $this->cookies = [];
 
             return;
         }
@@ -154,7 +147,11 @@ class ResponseHeaderBag extends HeaderBag
         parent::remove($key);
 
         if ('cache-control' === $uniqueKey) {
-            $this->computedCacheControl = array();
+            $this->computedCacheControl = [];
+        }
+
+        if ('date' === $uniqueKey) {
+            $this->initDate();
         }
     }
 
@@ -163,7 +160,7 @@ class ResponseHeaderBag extends HeaderBag
      */
     public function hasCacheControlDirective($key)
     {
-        return array_key_exists($key, $this->computedCacheControl);
+        return \array_key_exists($key, $this->computedCacheControl);
     }
 
     /**
@@ -171,14 +168,9 @@ class ResponseHeaderBag extends HeaderBag
      */
     public function getCacheControlDirective($key)
     {
-        return array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null;
+        return \array_key_exists($key, $this->computedCacheControl) ? $this->computedCacheControl[$key] : null;
     }
 
-    /**
-     * Sets a cookie.
-     *
-     * @param Cookie $cookie
-     */
     public function setCookie(Cookie $cookie)
     {
         $this->cookies[$cookie->getDomain()][$cookie->getPath()][$cookie->getName()] = $cookie;
@@ -218,21 +210,21 @@ class ResponseHeaderBag extends HeaderBag
      *
      * @param string $format
      *
-     * @return array
+     * @return Cookie[]
      *
      * @throws \InvalidArgumentException When the $format is invalid
      */
     public function getCookies($format = self::COOKIES_FLAT)
     {
-        if (!in_array($format, array(self::COOKIES_FLAT, self::COOKIES_ARRAY))) {
-            throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', array(self::COOKIES_FLAT, self::COOKIES_ARRAY))));
+        if (!\in_array($format, [self::COOKIES_FLAT, self::COOKIES_ARRAY])) {
+            throw new \InvalidArgumentException(sprintf('Format "%s" invalid (%s).', $format, implode(', ', [self::COOKIES_FLAT, self::COOKIES_ARRAY])));
         }
 
         if (self::COOKIES_ARRAY === $format) {
             return $this->cookies;
         }
 
-        $flattenedCookies = array();
+        $flattenedCookies = [];
         foreach ($this->cookies as $path) {
             foreach ($path as $cookies) {
                 foreach ($cookies as $cookie) {
@@ -275,7 +267,7 @@ class ResponseHeaderBag extends HeaderBag
      */
     public function makeDisposition($disposition, $filename, $filenameFallback = '')
     {
-        if (!in_array($disposition, array(self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE))) {
+        if (!\in_array($disposition, [self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE])) {
             throw new \InvalidArgumentException(sprintf('The disposition must be either "%s" or "%s".', self::DISPOSITION_ATTACHMENT, self::DISPOSITION_INLINE));
         }
 
@@ -338,4 +330,11 @@ class ResponseHeaderBag extends HeaderBag
 
         return $header;
     }
+
+    private function initDate()
+    {
+        $now = \DateTime::createFromFormat('U', time());
+        $now->setTimezone(new \DateTimeZone('UTC'));
+        $this->set('Date', $now->format('D, d M Y H:i:s').' GMT');
+    }
 }
diff --git a/vendor/symfony/http-foundation/ServerBag.php b/vendor/symfony/http-foundation/ServerBag.php
index 0d38c08a..90da49fa 100644
--- a/vendor/symfony/http-foundation/ServerBag.php
+++ b/vendor/symfony/http-foundation/ServerBag.php
@@ -27,8 +27,8 @@ class ServerBag extends ParameterBag
      */
     public function getHeaders()
     {
-        $headers = array();
-        $contentHeaders = array('CONTENT_LENGTH' => true, 'CONTENT_MD5' => true, 'CONTENT_TYPE' => true);
+        $headers = [];
+        $contentHeaders = ['CONTENT_LENGTH' => true, 'CONTENT_MD5' => true, 'CONTENT_TYPE' => true];
         foreach ($this->parameters as $key => $value) {
             if (0 === strpos($key, 'HTTP_')) {
                 $headers[substr($key, 5)] = $value;
@@ -68,7 +68,7 @@ class ServerBag extends ParameterBag
                 if (0 === stripos($authorizationHeader, 'basic ')) {
                     // Decode AUTHORIZATION header into PHP_AUTH_USER and PHP_AUTH_PW when authorization header is basic
                     $exploded = explode(':', base64_decode(substr($authorizationHeader, 6)), 2);
-                    if (count($exploded) == 2) {
+                    if (2 == \count($exploded)) {
                         list($headers['PHP_AUTH_USER'], $headers['PHP_AUTH_PW']) = $exploded;
                     }
                 } elseif (empty($this->parameters['PHP_AUTH_DIGEST']) && (0 === stripos($authorizationHeader, 'digest '))) {
diff --git a/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php b/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php
index af292e37..07118e89 100644
--- a/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php
+++ b/vendor/symfony/http-foundation/Session/Attribute/AttributeBag.php
@@ -17,20 +17,11 @@ namespace Symfony\Component\HttpFoundation\Session\Attribute;
 class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Countable
 {
     private $name = 'attributes';
-
-    /**
-     * @var string
-     */
     private $storageKey;
 
-    /**
-     * @var array
-     */
-    protected $attributes = array();
+    protected $attributes = [];
 
     /**
-     * Constructor.
-     *
      * @param string $storageKey The key used to store attributes in the session
      */
     public function __construct($storageKey = '_sf2_attributes')
@@ -72,7 +63,7 @@ class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Counta
      */
     public function has($name)
     {
-        return array_key_exists($name, $this->attributes);
+        return \array_key_exists($name, $this->attributes);
     }
 
     /**
@@ -80,7 +71,7 @@ class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Counta
      */
     public function get($name, $default = null)
     {
-        return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;
+        return \array_key_exists($name, $this->attributes) ? $this->attributes[$name] : $default;
     }
 
     /**
@@ -104,7 +95,7 @@ class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Counta
      */
     public function replace(array $attributes)
     {
-        $this->attributes = array();
+        $this->attributes = [];
         foreach ($attributes as $key => $value) {
             $this->set($key, $value);
         }
@@ -116,7 +107,7 @@ class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Counta
     public function remove($name)
     {
         $retval = null;
-        if (array_key_exists($name, $this->attributes)) {
+        if (\array_key_exists($name, $this->attributes)) {
             $retval = $this->attributes[$name];
             unset($this->attributes[$name]);
         }
@@ -130,7 +121,7 @@ class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Counta
     public function clear()
     {
         $return = $this->attributes;
-        $this->attributes = array();
+        $this->attributes = [];
 
         return $return;
     }
@@ -152,6 +143,6 @@ class AttributeBag implements AttributeBagInterface, \IteratorAggregate, \Counta
      */
     public function count()
     {
-        return count($this->attributes);
+        return \count($this->attributes);
     }
 }
diff --git a/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php b/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php
index d797a6f2..bbf2e39c 100644
--- a/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php
+++ b/vendor/symfony/http-foundation/Session/Attribute/NamespacedAttributeBag.php
@@ -19,16 +19,9 @@ namespace Symfony\Component\HttpFoundation\Session\Attribute;
  */
 class NamespacedAttributeBag extends AttributeBag
 {
-    /**
-     * Namespace character.
-     *
-     * @var string
-     */
     private $namespaceCharacter;
 
     /**
-     * Constructor.
-     *
      * @param string $storageKey         Session storage key
      * @param string $namespaceCharacter Namespace character to use in keys
      */
@@ -51,7 +44,7 @@ class NamespacedAttributeBag extends AttributeBag
             return false;
         }
 
-        return array_key_exists($name, $attributes);
+        return \array_key_exists($name, $attributes);
     }
 
     /**
@@ -67,7 +60,7 @@ class NamespacedAttributeBag extends AttributeBag
             return $default;
         }
 
-        return array_key_exists($name, $attributes) ? $attributes[$name] : $default;
+        return \array_key_exists($name, $attributes) ? $attributes[$name] : $default;
     }
 
     /**
@@ -88,7 +81,7 @@ class NamespacedAttributeBag extends AttributeBag
         $retval = null;
         $attributes = &$this->resolveAttributePath($name);
         $name = $this->resolveKey($name);
-        if (null !== $attributes && array_key_exists($name, $attributes)) {
+        if (null !== $attributes && \array_key_exists($name, $attributes)) {
             $retval = $attributes[$name];
             unset($attributes[$name]);
         }
@@ -109,7 +102,7 @@ class NamespacedAttributeBag extends AttributeBag
     protected function &resolveAttributePath($name, $writeContext = false)
     {
         $array = &$this->attributes;
-        $name = (strpos($name, $this->namespaceCharacter) === 0) ? substr($name, 1) : $name;
+        $name = (0 === strpos($name, $this->namespaceCharacter)) ? substr($name, 1) : $name;
 
         // Check if there is anything to do, else return
         if (!$name) {
@@ -117,21 +110,27 @@ class NamespacedAttributeBag extends AttributeBag
         }
 
         $parts = explode($this->namespaceCharacter, $name);
-        if (count($parts) < 2) {
+        if (\count($parts) < 2) {
             if (!$writeContext) {
                 return $array;
             }
 
-            $array[$parts[0]] = array();
+            $array[$parts[0]] = [];
 
             return $array;
         }
 
-        unset($parts[count($parts) - 1]);
+        unset($parts[\count($parts) - 1]);
 
         foreach ($parts as $part) {
-            if (null !== $array && !array_key_exists($part, $array)) {
-                $array[$part] = $writeContext ? array() : null;
+            if (null !== $array && !\array_key_exists($part, $array)) {
+                if (!$writeContext) {
+                    $null = null;
+
+                    return $null;
+                }
+
+                $array[$part] = [];
             }
 
             $array = &$array[$part];
diff --git a/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php b/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php
index ddd603fd..451c4a5a 100644
--- a/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php
+++ b/vendor/symfony/http-foundation/Session/Flash/AutoExpireFlashBag.php
@@ -19,27 +19,13 @@ namespace Symfony\Component\HttpFoundation\Session\Flash;
 class AutoExpireFlashBag implements FlashBagInterface
 {
     private $name = 'flashes';
-
-    /**
-     * Flash messages.
-     *
-     * @var array
-     */
-    private $flashes = array('display' => array(), 'new' => array());
-
-    /**
-     * The storage key for flashes in the session.
-     *
-     * @var string
-     */
+    private $flashes = ['display' => [], 'new' => []];
     private $storageKey;
 
     /**
-     * Constructor.
-     *
      * @param string $storageKey The key used to store flashes in the session
      */
-    public function __construct($storageKey = '_sf2_flashes')
+    public function __construct($storageKey = '_symfony_flashes')
     {
         $this->storageKey = $storageKey;
     }
@@ -67,8 +53,8 @@ class AutoExpireFlashBag implements FlashBagInterface
         // The logic: messages from the last request will be stored in new, so we move them to previous
         // This request we will show what is in 'display'.  What is placed into 'new' this time round will
         // be moved to display next time round.
-        $this->flashes['display'] = array_key_exists('new', $this->flashes) ? $this->flashes['new'] : array();
-        $this->flashes['new'] = array();
+        $this->flashes['display'] = \array_key_exists('new', $this->flashes) ? $this->flashes['new'] : [];
+        $this->flashes['new'] = [];
     }
 
     /**
@@ -82,7 +68,7 @@ class AutoExpireFlashBag implements FlashBagInterface
     /**
      * {@inheritdoc}
      */
-    public function peek($type, array $default = array())
+    public function peek($type, array $default = [])
     {
         return $this->has($type) ? $this->flashes['display'][$type] : $default;
     }
@@ -92,13 +78,13 @@ class AutoExpireFlashBag implements FlashBagInterface
      */
     public function peekAll()
     {
-        return array_key_exists('display', $this->flashes) ? (array) $this->flashes['display'] : array();
+        return \array_key_exists('display', $this->flashes) ? (array) $this->flashes['display'] : [];
     }
 
     /**
      * {@inheritdoc}
      */
-    public function get($type, array $default = array())
+    public function get($type, array $default = [])
     {
         $return = $default;
 
@@ -120,7 +106,7 @@ class AutoExpireFlashBag implements FlashBagInterface
     public function all()
     {
         $return = $this->flashes['display'];
-        $this->flashes = array('new' => array(), 'display' => array());
+        $this->flashes['display'] = [];
 
         return $return;
     }
@@ -146,7 +132,7 @@ class AutoExpireFlashBag implements FlashBagInterface
      */
     public function has($type)
     {
-        return array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type];
+        return \array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type];
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/Session/Flash/FlashBag.php b/vendor/symfony/http-foundation/Session/Flash/FlashBag.php
index 85b4f00b..f5d984af 100644
--- a/vendor/symfony/http-foundation/Session/Flash/FlashBag.php
+++ b/vendor/symfony/http-foundation/Session/Flash/FlashBag.php
@@ -19,27 +19,13 @@ namespace Symfony\Component\HttpFoundation\Session\Flash;
 class FlashBag implements FlashBagInterface
 {
     private $name = 'flashes';
-
-    /**
-     * Flash messages.
-     *
-     * @var array
-     */
-    private $flashes = array();
-
-    /**
-     * The storage key for flashes in the session.
-     *
-     * @var string
-     */
+    private $flashes = [];
     private $storageKey;
 
     /**
-     * Constructor.
-     *
      * @param string $storageKey The key used to store flashes in the session
      */
-    public function __construct($storageKey = '_sf2_flashes')
+    public function __construct($storageKey = '_symfony_flashes')
     {
         $this->storageKey = $storageKey;
     }
@@ -76,7 +62,7 @@ class FlashBag implements FlashBagInterface
     /**
      * {@inheritdoc}
      */
-    public function peek($type, array $default = array())
+    public function peek($type, array $default = [])
     {
         return $this->has($type) ? $this->flashes[$type] : $default;
     }
@@ -92,7 +78,7 @@ class FlashBag implements FlashBagInterface
     /**
      * {@inheritdoc}
      */
-    public function get($type, array $default = array())
+    public function get($type, array $default = [])
     {
         if (!$this->has($type)) {
             return $default;
@@ -111,7 +97,7 @@ class FlashBag implements FlashBagInterface
     public function all()
     {
         $return = $this->peekAll();
-        $this->flashes = array();
+        $this->flashes = [];
 
         return $return;
     }
@@ -137,7 +123,7 @@ class FlashBag implements FlashBagInterface
      */
     public function has($type)
     {
-        return array_key_exists($type, $this->flashes) && $this->flashes[$type];
+        return \array_key_exists($type, $this->flashes) && $this->flashes[$type];
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php b/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php
index 25f3d57b..99e80742 100644
--- a/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php
+++ b/vendor/symfony/http-foundation/Session/Flash/FlashBagInterface.php
@@ -21,20 +21,20 @@ use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
 interface FlashBagInterface extends SessionBagInterface
 {
     /**
-     * Adds a flash message for type.
+     * Adds a flash message for the given type.
      *
      * @param string $type
-     * @param string $message
+     * @param mixed  $message
      */
     public function add($type, $message);
 
     /**
-     * Registers a message for a given type.
+     * Registers one or more messages for a given type.
      *
      * @param string       $type
-     * @param string|array $message
+     * @param string|array $messages
      */
-    public function set($type, $message);
+    public function set($type, $messages);
 
     /**
      * Gets flash messages for a given type.
@@ -44,7 +44,7 @@ interface FlashBagInterface extends SessionBagInterface
      *
      * @return array
      */
-    public function peek($type, array $default = array());
+    public function peek($type, array $default = []);
 
     /**
      * Gets all flash messages.
@@ -61,7 +61,7 @@ interface FlashBagInterface extends SessionBagInterface
      *
      * @return array
      */
-    public function get($type, array $default = array());
+    public function get($type, array $default = []);
 
     /**
      * Gets and clears flashes from the stack.
@@ -72,8 +72,6 @@ interface FlashBagInterface extends SessionBagInterface
 
     /**
      * Sets all flash messages.
-     *
-     * @param array $messages
      */
     public function setAll(array $messages);
 
diff --git a/vendor/symfony/http-foundation/Session/Session.php b/vendor/symfony/http-foundation/Session/Session.php
index 70bcf3e0..867ceba9 100644
--- a/vendor/symfony/http-foundation/Session/Session.php
+++ b/vendor/symfony/http-foundation/Session/Session.php
@@ -11,41 +11,27 @@
 
 namespace Symfony\Component\HttpFoundation\Session;
 
-use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface;
 use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
 use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBagInterface;
 use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
 use Symfony\Component\HttpFoundation\Session\Flash\FlashBagInterface;
 use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
+use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface;
 
 /**
- * Session.
- *
  * @author Fabien Potencier <fabien@xxxxxxxxxxx>
  * @author Drak <drak@xxxxxxxxxx>
  */
 class Session implements SessionInterface, \IteratorAggregate, \Countable
 {
-    /**
-     * Storage driver.
-     *
-     * @var SessionStorageInterface
-     */
     protected $storage;
 
-    /**
-     * @var string
-     */
     private $flashName;
-
-    /**
-     * @var string
-     */
     private $attributeName;
+    private $data = [];
+    private $usageIndex = 0;
 
     /**
-     * Constructor.
-     *
      * @param SessionStorageInterface $storage    A SessionStorageInterface instance
      * @param AttributeBagInterface   $attributes An AttributeBagInterface instance, (defaults null for default AttributeBag)
      * @param FlashBagInterface       $flashes    A FlashBagInterface instance (defaults null for default FlashBag)
@@ -124,7 +110,7 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable
      */
     public function clear()
     {
-        $this->storage->getBag($this->attributeName)->clear();
+        $this->getAttributeBag()->clear();
     }
 
     /**
@@ -152,7 +138,36 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable
      */
     public function count()
     {
-        return count($this->getAttributeBag()->all());
+        return \count($this->getAttributeBag()->all());
+    }
+
+    /**
+     * @return int
+     *
+     * @internal
+     */
+    public function getUsageIndex()
+    {
+        return $this->usageIndex;
+    }
+
+    /**
+     * @return bool
+     *
+     * @internal
+     */
+    public function isEmpty()
+    {
+        if ($this->isStarted()) {
+            ++$this->usageIndex;
+        }
+        foreach ($this->data as &$data) {
+            if (!empty($data)) {
+                return false;
+            }
+        }
+
+        return true;
     }
 
     /**
@@ -194,7 +209,9 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable
      */
     public function setId($id)
     {
-        $this->storage->setId($id);
+        if ($this->storage->getId() !== $id) {
+            $this->storage->setId($id);
+        }
     }
 
     /**
@@ -218,6 +235,8 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable
      */
     public function getMetadataBag()
     {
+        ++$this->usageIndex;
+
         return $this->storage->getMetadataBag();
     }
 
@@ -226,7 +245,7 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable
      */
     public function registerBag(SessionBagInterface $bag)
     {
-        $this->storage->registerBag($bag);
+        $this->storage->registerBag(new SessionBagProxy($bag, $this->data, $this->usageIndex));
     }
 
     /**
@@ -234,7 +253,7 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable
      */
     public function getBag($name)
     {
-        return $this->storage->getBag($name);
+        return $this->storage->getBag($name)->getBag();
     }
 
     /**
@@ -256,6 +275,6 @@ class Session implements SessionInterface, \IteratorAggregate, \Countable
      */
     private function getAttributeBag()
     {
-        return $this->storage->getBag($this->attributeName);
+        return $this->getBag($this->attributeName);
     }
 }
diff --git a/vendor/symfony/http-foundation/Session/SessionBagInterface.php b/vendor/symfony/http-foundation/Session/SessionBagInterface.php
index aca18aac..8e37d06d 100644
--- a/vendor/symfony/http-foundation/Session/SessionBagInterface.php
+++ b/vendor/symfony/http-foundation/Session/SessionBagInterface.php
@@ -27,8 +27,6 @@ interface SessionBagInterface
 
     /**
      * Initializes the Bag.
-     *
-     * @param array $array
      */
     public function initialize(array &$array);
 
diff --git a/vendor/symfony/http-foundation/Session/SessionBagProxy.php b/vendor/symfony/http-foundation/Session/SessionBagProxy.php
new file mode 100644
index 00000000..3504bdfe
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/SessionBagProxy.php
@@ -0,0 +1,89 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session;
+
+/**
+ * @author Nicolas Grekas <p@xxxxxxxxxxx>
+ *
+ * @internal
+ */
+final class SessionBagProxy implements SessionBagInterface
+{
+    private $bag;
+    private $data;
+    private $usageIndex;
+
+    public function __construct(SessionBagInterface $bag, array &$data, &$usageIndex)
+    {
+        $this->bag = $bag;
+        $this->data = &$data;
+        $this->usageIndex = &$usageIndex;
+    }
+
+    /**
+     * @return SessionBagInterface
+     */
+    public function getBag()
+    {
+        ++$this->usageIndex;
+
+        return $this->bag;
+    }
+
+    /**
+     * @return bool
+     */
+    public function isEmpty()
+    {
+        if (!isset($this->data[$this->bag->getStorageKey()])) {
+            return true;
+        }
+        ++$this->usageIndex;
+
+        return empty($this->data[$this->bag->getStorageKey()]);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getName()
+    {
+        return $this->bag->getName();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function initialize(array &$array)
+    {
+        ++$this->usageIndex;
+        $this->data[$this->bag->getStorageKey()] = &$array;
+
+        $this->bag->initialize($array);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getStorageKey()
+    {
+        return $this->bag->getStorageKey();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function clear()
+    {
+        return $this->bag->clear();
+    }
+}
diff --git a/vendor/symfony/http-foundation/Session/SessionInterface.php b/vendor/symfony/http-foundation/Session/SessionInterface.php
index d3fcd2ee..95fca857 100644
--- a/vendor/symfony/http-foundation/Session/SessionInterface.php
+++ b/vendor/symfony/http-foundation/Session/SessionInterface.php
@@ -25,7 +25,7 @@ interface SessionInterface
      *
      * @return bool True if session started
      *
-     * @throws \RuntimeException If session fails to start.
+     * @throws \RuntimeException if session fails to start
      */
     public function start();
 
@@ -159,8 +159,6 @@ interface SessionInterface
 
     /**
      * Registers a SessionBagInterface with the session.
-     *
-     * @param SessionBagInterface $bag
      */
     public function registerBag(SessionBagInterface $bag);
 
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php
new file mode 100644
index 00000000..eb09c0b5
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/AbstractSessionHandler.php
@@ -0,0 +1,168 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+/**
+ * This abstract session handler provides a generic implementation
+ * of the PHP 7.0 SessionUpdateTimestampHandlerInterface,
+ * enabling strict and lazy session handling.
+ *
+ * @author Nicolas Grekas <p@xxxxxxxxxxx>
+ */
+abstract class AbstractSessionHandler implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface
+{
+    private $sessionName;
+    private $prefetchId;
+    private $prefetchData;
+    private $newSessionId;
+    private $igbinaryEmptyData;
+
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        $this->sessionName = $sessionName;
+        if (!headers_sent() && !ini_get('session.cache_limiter') && '0' !== ini_get('session.cache_limiter')) {
+            header(sprintf('Cache-Control: max-age=%d, private, must-revalidate', 60 * (int) ini_get('session.cache_expire')));
+        }
+
+        return true;
+    }
+
+    /**
+     * @param string $sessionId
+     *
+     * @return string
+     */
+    abstract protected function doRead($sessionId);
+
+    /**
+     * @param string $sessionId
+     * @param string $data
+     *
+     * @return bool
+     */
+    abstract protected function doWrite($sessionId, $data);
+
+    /**
+     * @param string $sessionId
+     *
+     * @return bool
+     */
+    abstract protected function doDestroy($sessionId);
+
+    /**
+     * {@inheritdoc}
+     */
+    public function validateId($sessionId)
+    {
+        $this->prefetchData = $this->read($sessionId);
+        $this->prefetchId = $sessionId;
+
+        return '' !== $this->prefetchData;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        if (null !== $this->prefetchId) {
+            $prefetchId = $this->prefetchId;
+            $prefetchData = $this->prefetchData;
+            $this->prefetchId = $this->prefetchData = null;
+
+            if ($prefetchId === $sessionId || '' === $prefetchData) {
+                $this->newSessionId = '' === $prefetchData ? $sessionId : null;
+
+                return $prefetchData;
+            }
+        }
+
+        $data = $this->doRead($sessionId);
+        $this->newSessionId = '' === $data ? $sessionId : null;
+        if (\PHP_VERSION_ID < 70000) {
+            $this->prefetchData = $data;
+        }
+
+        return $data;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        if (\PHP_VERSION_ID < 70000 && $this->prefetchData) {
+            $readData = $this->prefetchData;
+            $this->prefetchData = null;
+
+            if ($readData === $data) {
+                return $this->updateTimestamp($sessionId, $data);
+            }
+        }
+        if (null === $this->igbinaryEmptyData) {
+            // see https://github.com/igbinary/igbinary/issues/146
+            $this->igbinaryEmptyData = \function_exists('igbinary_serialize') ? igbinary_serialize([]) : '';
+        }
+        if ('' === $data || $this->igbinaryEmptyData === $data) {
+            return $this->destroy($sessionId);
+        }
+        $this->newSessionId = null;
+
+        return $this->doWrite($sessionId, $data);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        if (\PHP_VERSION_ID < 70000) {
+            $this->prefetchData = null;
+        }
+        if (!headers_sent() && filter_var(ini_get('session.use_cookies'), FILTER_VALIDATE_BOOLEAN)) {
+            if (!$this->sessionName) {
+                throw new \LogicException(sprintf('Session name cannot be empty, did you forget to call "parent::open()" in "%s"?.', \get_class($this)));
+            }
+            $sessionCookie = sprintf(' %s=', urlencode($this->sessionName));
+            $sessionCookieWithId = sprintf('%s%s;', $sessionCookie, urlencode($sessionId));
+            $sessionCookieFound = false;
+            $otherCookies = [];
+            foreach (headers_list() as $h) {
+                if (0 !== stripos($h, 'Set-Cookie:')) {
+                    continue;
+                }
+                if (11 === strpos($h, $sessionCookie, 11)) {
+                    $sessionCookieFound = true;
+
+                    if (11 !== strpos($h, $sessionCookieWithId, 11)) {
+                        $otherCookies[] = $h;
+                    }
+                } else {
+                    $otherCookies[] = $h;
+                }
+            }
+            if ($sessionCookieFound) {
+                header_remove('Set-Cookie');
+                foreach ($otherCookies as $h) {
+                    header($h, false);
+                }
+            } else {
+                setcookie($this->sessionName, '', 0, ini_get('session.cookie_path'), ini_get('session.cookie_domain'), filter_var(ini_get('session.cookie_secure'), FILTER_VALIDATE_BOOLEAN), filter_var(ini_get('session.cookie_httponly'), FILTER_VALIDATE_BOOLEAN));
+            }
+        }
+
+        return $this->newSessionId === $sessionId || $this->doDestroy($sessionId);
+    }
+}
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php
index 4e490a05..3abc33ca 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcacheSessionHandler.php
@@ -11,16 +11,15 @@
 
 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 
+@trigger_error(sprintf('The class %s is deprecated since Symfony 3.4 and will be removed in 4.0. Use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler instead.', MemcacheSessionHandler::class), E_USER_DEPRECATED);
+
 /**
- * MemcacheSessionHandler.
- *
  * @author Drak <drak@xxxxxxxxxx>
+ *
+ * @deprecated since version 3.4, to be removed in 4.0. Use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcachedSessionHandler instead.
  */
 class MemcacheSessionHandler implements \SessionHandlerInterface
 {
-    /**
-     * @var \Memcache Memcache driver
-     */
     private $memcache;
 
     /**
@@ -45,12 +44,10 @@ class MemcacheSessionHandler implements \SessionHandlerInterface
      *
      * @throws \InvalidArgumentException When unsupported options are passed
      */
-    public function __construct(\Memcache $memcache, array $options = array())
+    public function __construct(\Memcache $memcache, array $options = [])
     {
-        if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {
-            throw new \InvalidArgumentException(sprintf(
-                'The following options are not supported "%s"', implode(', ', $diff)
-            ));
+        if ($diff = array_diff(array_keys($options), ['prefix', 'expiretime'])) {
+            throw new \InvalidArgumentException(sprintf('The following options are not supported "%s"', implode(', ', $diff)));
         }
 
         $this->memcache = $memcache;
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php
index 67a49ad6..1db590b3 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MemcachedSessionHandler.php
@@ -12,8 +12,6 @@
 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 
 /**
- * MemcachedSessionHandler.
- *
  * Memcached based session storage handler based on the Memcached class
  * provided by the PHP memcached extension.
  *
@@ -21,11 +19,8 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
  *
  * @author Drak <drak@xxxxxxxxxx>
  */
-class MemcachedSessionHandler implements \SessionHandlerInterface
+class MemcachedSessionHandler extends AbstractSessionHandler
 {
-    /**
-     * @var \Memcached Memcached driver
-     */
     private $memcached;
 
     /**
@@ -43,21 +38,19 @@ class MemcachedSessionHandler implements \SessionHandlerInterface
      *
      * List of available options:
      *  * prefix: The prefix to use for the memcached keys in order to avoid collision
-     *  * expiretime: The time to live in seconds
+     *  * expiretime: The time to live in seconds.
      *
      * @param \Memcached $memcached A \Memcached instance
      * @param array      $options   An associative array of Memcached options
      *
      * @throws \InvalidArgumentException When unsupported options are passed
      */
-    public function __construct(\Memcached $memcached, array $options = array())
+    public function __construct(\Memcached $memcached, array $options = [])
     {
         $this->memcached = $memcached;
 
-        if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {
-            throw new \InvalidArgumentException(sprintf(
-                'The following options are not supported "%s"', implode(', ', $diff)
-            ));
+        if ($diff = array_diff(array_keys($options), ['prefix', 'expiretime'])) {
+            throw new \InvalidArgumentException(sprintf('The following options are not supported "%s"', implode(', ', $diff)));
         }
 
         $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;
@@ -67,31 +60,33 @@ class MemcachedSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function open($savePath, $sessionName)
+    public function close()
     {
-        return true;
+        return $this->memcached->quit();
     }
 
     /**
      * {@inheritdoc}
      */
-    public function close()
+    protected function doRead($sessionId)
     {
-        return true;
+        return $this->memcached->get($this->prefix.$sessionId) ?: '';
     }
 
     /**
      * {@inheritdoc}
      */
-    public function read($sessionId)
+    public function updateTimestamp($sessionId, $data)
     {
-        return $this->memcached->get($this->prefix.$sessionId) ?: '';
+        $this->memcached->touch($this->prefix.$sessionId, time() + $this->ttl);
+
+        return true;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function write($sessionId, $data)
+    protected function doWrite($sessionId, $data)
     {
         return $this->memcached->set($this->prefix.$sessionId, $data, time() + $this->ttl);
     }
@@ -99,11 +94,11 @@ class MemcachedSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function destroy($sessionId)
+    protected function doDestroy($sessionId)
     {
         $result = $this->memcached->delete($this->prefix.$sessionId);
 
-        return $result || $this->memcached->getResultCode() == \Memcached::RES_NOTFOUND;
+        return $result || \Memcached::RES_NOTFOUND == $this->memcached->getResultCode();
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php
index 8408f000..3b5ccaa8 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/MongoDbSessionHandler.php
@@ -12,15 +12,15 @@
 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 
 /**
- * MongoDB session handler.
+ * Session handler using the mongodb/mongodb package and MongoDB driver extension.
  *
  * @author Markus Bachmann <markus.bachmann@xxxxxxxxx>
+ *
+ * @see https://packagist.org/packages/mongodb/mongodb
+ * @see http://php.net/manual/en/set.mongodb.php
  */
-class MongoDbSessionHandler implements \SessionHandlerInterface
+class MongoDbSessionHandler extends AbstractSessionHandler
 {
-    /**
-     * @var \Mongo|\MongoClient|\MongoDB\Client
-     */
     private $mongo;
 
     /**
@@ -42,7 +42,7 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
      *  * id_field: The field name for storing the session id [default: _id]
      *  * data_field: The field name for storing the session data [default: data]
      *  * time_field: The field name for storing the timestamp [default: time]
-     *  * expiry_field: The field name for storing the expiry-timestamp [default: expires_at]
+     *  * expiry_field: The field name for storing the expiry-timestamp [default: expires_at].
      *
      * It is strongly recommended to put an index on the `expiry_field` for
      * garbage-collection. Alternatively it's possible to automatically expire
@@ -61,14 +61,18 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
      * If you use such an index, you can drop `gc_probability` to 0 since
      * no garbage-collection is required.
      *
-     * @param \Mongo|\MongoClient|\MongoDB\Client $mongo   A MongoDB\Client, MongoClient or Mongo instance
-     * @param array                               $options An associative array of field options
+     * @param \MongoDB\Client $mongo   A MongoDB\Client instance
+     * @param array           $options An associative array of field options
      *
      * @throws \InvalidArgumentException When MongoClient or Mongo instance not provided
      * @throws \InvalidArgumentException When "database" or "collection" not provided
      */
     public function __construct($mongo, array $options)
     {
+        if ($mongo instanceof \MongoClient || $mongo instanceof \Mongo) {
+            @trigger_error(sprintf('Using %s with the legacy mongo extension is deprecated as of 3.4 and will be removed in 4.0. Use it with the mongodb/mongodb package and ext-mongodb instead.', __CLASS__), E_USER_DEPRECATED);
+        }
+
         if (!($mongo instanceof \MongoDB\Client || $mongo instanceof \MongoClient || $mongo instanceof \Mongo)) {
             throw new \InvalidArgumentException('MongoClient or Mongo instance required');
         }
@@ -79,20 +83,12 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
 
         $this->mongo = $mongo;
 
-        $this->options = array_merge(array(
+        $this->options = array_merge([
             'id_field' => '_id',
             'data_field' => 'data',
             'time_field' => 'time',
             'expiry_field' => 'expires_at',
-        ), $options);
-    }
-
-    /**
-     * {@inheritdoc}
-     */
-    public function open($savePath, $sessionName)
-    {
-        return true;
+        ], $options);
     }
 
     /**
@@ -106,13 +102,13 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function destroy($sessionId)
+    protected function doDestroy($sessionId)
     {
         $methodName = $this->mongo instanceof \MongoDB\Client ? 'deleteOne' : 'remove';
 
-        $this->getCollection()->$methodName(array(
+        $this->getCollection()->$methodName([
             $this->options['id_field'] => $sessionId,
-        ));
+        ]);
 
         return true;
     }
@@ -122,11 +118,11 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
      */
     public function gc($maxlifetime)
     {
-        $methodName = $this->mongo instanceof \MongoDB\Client ? 'deleteOne' : 'remove';
+        $methodName = $this->mongo instanceof \MongoDB\Client ? 'deleteMany' : 'remove';
 
-        $this->getCollection()->$methodName(array(
-            $this->options['expiry_field'] => array('$lt' => $this->createDateTime()),
-        ));
+        $this->getCollection()->$methodName([
+            $this->options['expiry_field'] => ['$lt' => $this->createDateTime()],
+        ]);
 
         return true;
     }
@@ -134,16 +130,16 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function write($sessionId, $data)
+    protected function doWrite($sessionId, $data)
     {
         $expiry = $this->createDateTime(time() + (int) ini_get('session.gc_maxlifetime'));
 
-        $fields = array(
+        $fields = [
             $this->options['time_field'] => $this->createDateTime(),
             $this->options['expiry_field'] => $expiry,
-        );
+        ];
 
-        $options = array('upsert' => true);
+        $options = ['upsert' => true];
 
         if ($this->mongo instanceof \MongoDB\Client) {
             $fields[$this->options['data_field']] = new \MongoDB\BSON\Binary($data, \MongoDB\BSON\Binary::TYPE_OLD_BINARY);
@@ -155,8 +151,35 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
         $methodName = $this->mongo instanceof \MongoDB\Client ? 'updateOne' : 'update';
 
         $this->getCollection()->$methodName(
-            array($this->options['id_field'] => $sessionId),
-            array('$set' => $fields),
+            [$this->options['id_field'] => $sessionId],
+            ['$set' => $fields],
+            $options
+        );
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function updateTimestamp($sessionId, $data)
+    {
+        $expiry = $this->createDateTime(time() + (int) ini_get('session.gc_maxlifetime'));
+
+        if ($this->mongo instanceof \MongoDB\Client) {
+            $methodName = 'updateOne';
+            $options = [];
+        } else {
+            $methodName = 'update';
+            $options = ['multiple' => false];
+        }
+
+        $this->getCollection()->$methodName(
+            [$this->options['id_field'] => $sessionId],
+            ['$set' => [
+                $this->options['time_field'] => $this->createDateTime(),
+                $this->options['expiry_field'] => $expiry,
+            ]],
             $options
         );
 
@@ -166,12 +189,12 @@ class MongoDbSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function read($sessionId)
+    protected function doRead($sessionId)
     {
-        $dbData = $this->getCollection()->findOne(array(
+        $dbData = $this->getCollection()->findOne([
             $this->options['id_field'] => $sessionId,
-            $this->options['expiry_field'] => array('$gte' => $this->createDateTime()),
-        ));
+            $this->options['expiry_field'] => ['$gte' => $this->createDateTime()],
+        ]);
 
         if (null === $dbData) {
             return '';
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
index 1be0a398..4e9704bd 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeFileSessionHandler.php
@@ -12,8 +12,6 @@
 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 
 /**
- * NativeFileSessionHandler.
- *
  * Native session handler using PHP's built in file storage.
  *
  * @author Drak <drak@xxxxxxxxxx>
@@ -21,8 +19,6 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 class NativeFileSessionHandler extends NativeSessionHandler
 {
     /**
-     * Constructor.
-     *
      * @param string $savePath Path of directory to save session files
      *                         Default null will leave setting as defined by PHP.
      *                         '/path', 'N;/path', or 'N;octal-mode;/path
@@ -30,6 +26,7 @@ class NativeFileSessionHandler extends NativeSessionHandler
      * @see http://php.net/session.configuration.php#ini.session.save-path for further details.
      *
      * @throws \InvalidArgumentException On invalid $savePath
+     * @throws \RuntimeException         When failing to create the save directory
      */
     public function __construct($savePath = null)
     {
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php
index 4ae410f9..9be4528a 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NativeSessionHandler.php
@@ -12,10 +12,13 @@
 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 
 /**
- * Adds SessionHandler functionality if available.
- *
+ * @deprecated since version 3.4, to be removed in 4.0. Use \SessionHandler instead.
  * @see http://php.net/sessionhandler
  */
 class NativeSessionHandler extends \SessionHandler
 {
+    public function __construct()
+    {
+        @trigger_error('The '.__NAMESPACE__.'\NativeSessionHandler class is deprecated since Symfony 3.4 and will be removed in 4.0. Use the \SessionHandler class instead.', E_USER_DEPRECATED);
+    }
 }
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php
index 1516d431..8d193155 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/NullSessionHandler.php
@@ -12,18 +12,16 @@
 namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
 
 /**
- * NullSessionHandler.
- *
  * Can be used in unit testing or in a situations where persisted sessions are not desired.
  *
  * @author Drak <drak@xxxxxxxxxx>
  */
-class NullSessionHandler implements \SessionHandlerInterface
+class NullSessionHandler extends AbstractSessionHandler
 {
     /**
      * {@inheritdoc}
      */
-    public function open($savePath, $sessionName)
+    public function close()
     {
         return true;
     }
@@ -31,7 +29,7 @@ class NullSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function close()
+    public function validateId($sessionId)
     {
         return true;
     }
@@ -39,7 +37,7 @@ class NullSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function read($sessionId)
+    protected function doRead($sessionId)
     {
         return '';
     }
@@ -47,7 +45,15 @@ class NullSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function write($sessionId, $data)
+    public function updateTimestamp($sessionId, $data)
+    {
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doWrite($sessionId, $data)
     {
         return true;
     }
@@ -55,7 +61,7 @@ class NullSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function destroy($sessionId)
+    protected function doDestroy($sessionId)
     {
         return true;
     }
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php
index 8909a5f4..bc088e77 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/PdoSessionHandler.php
@@ -38,7 +38,7 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
  * @author Michael Williams <michael.williams@xxxxxxxxxxxxxxx>
  * @author Tobias Schultze <http://tobion.de>
  */
-class PdoSessionHandler implements \SessionHandlerInterface
+class PdoSessionHandler extends AbstractSessionHandler
 {
     /**
      * No locking is done. This means sessions are prone to loss of data due to
@@ -71,7 +71,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
     private $pdo;
 
     /**
-     * @var string|null|false DSN string or null for session.save_path or false when lazy connection disabled
+     * @var string|false|null DSN string or null for session.save_path or false when lazy connection disabled
      */
     private $dsn = false;
 
@@ -118,7 +118,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
     /**
      * @var array Connection options when lazy-connect
      */
-    private $connectionOptions = array();
+    private $connectionOptions = [];
 
     /**
      * @var int The strategy for locking, see constants
@@ -130,7 +130,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
      *
      * @var \PDOStatement[] An array of statements to release advisory locks
      */
-    private $unlockStatements = array();
+    private $unlockStatements = [];
 
     /**
      * @var bool True when the current session exists but expired according to session.gc_maxlifetime
@@ -148,8 +148,6 @@ class PdoSessionHandler implements \SessionHandlerInterface
     private $gcCalled = false;
 
     /**
-     * Constructor.
-     *
      * You can either pass an existing database connection as PDO instance or
      * pass a DSN string that will be used to lazy-connect to the database
      * when the session is actually used. Furthermore it's possible to pass null
@@ -163,15 +161,15 @@ class PdoSessionHandler implements \SessionHandlerInterface
      *  * db_time_col: The column where to store the timestamp [default: sess_time]
      *  * db_username: The username when lazy-connect [default: '']
      *  * db_password: The password when lazy-connect [default: '']
-     *  * db_connection_options: An array of driver-specific connection options [default: array()]
+     *  * db_connection_options: An array of driver-specific connection options [default: []]
      *  * lock_mode: The strategy for locking, see constants [default: LOCK_TRANSACTIONAL]
      *
-     * @param \PDO|string|null $pdoOrDsn A \PDO instance or DSN string or null
+     * @param \PDO|string|null $pdoOrDsn A \PDO instance or DSN string or URL string or null
      * @param array            $options  An associative array of options
      *
      * @throws \InvalidArgumentException When PDO error mode is not PDO::ERRMODE_EXCEPTION
      */
-    public function __construct($pdoOrDsn = null, array $options = array())
+    public function __construct($pdoOrDsn = null, array $options = [])
     {
         if ($pdoOrDsn instanceof \PDO) {
             if (\PDO::ERRMODE_EXCEPTION !== $pdoOrDsn->getAttribute(\PDO::ATTR_ERRMODE)) {
@@ -180,6 +178,8 @@ class PdoSessionHandler implements \SessionHandlerInterface
 
             $this->pdo = $pdoOrDsn;
             $this->driver = $this->pdo->getAttribute(\PDO::ATTR_DRIVER_NAME);
+        } elseif (\is_string($pdoOrDsn) && false !== strpos($pdoOrDsn, '://')) {
+            $this->dsn = $this->buildDsnFromUrl($pdoOrDsn);
         } else {
             $this->dsn = $pdoOrDsn;
         }
@@ -262,11 +262,13 @@ class PdoSessionHandler implements \SessionHandlerInterface
      */
     public function open($savePath, $sessionName)
     {
+        $this->sessionExpired = false;
+
         if (null === $this->pdo) {
             $this->connect($this->dsn ?: $savePath);
         }
 
-        return true;
+        return parent::open($savePath, $sessionName);
     }
 
     /**
@@ -275,7 +277,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
     public function read($sessionId)
     {
         try {
-            return $this->doRead($sessionId);
+            return parent::read($sessionId);
         } catch (\PDOException $e) {
             $this->rollback();
 
@@ -298,7 +300,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function destroy($sessionId)
+    protected function doDestroy($sessionId)
     {
         // delete the record associated with this id
         $sql = "DELETE FROM $this->table WHERE $this->idCol = :id";
@@ -319,7 +321,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
-    public function write($sessionId, $data)
+    protected function doWrite($sessionId, $data)
     {
         $maxlifetime = (int) ini_get('session.gc_maxlifetime');
 
@@ -332,13 +334,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
                 return true;
             }
 
-            $updateStmt = $this->pdo->prepare(
-                "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id"
-            );
-            $updateStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
-            $updateStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
-            $updateStmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
-            $updateStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+            $updateStmt = $this->getUpdateStatement($sessionId, $data, $maxlifetime);
             $updateStmt->execute();
 
             // When MERGE is not supported, like in Postgres < 9.5, we have to use this approach that can result in
@@ -348,13 +344,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
             // false positives due to longer gap locking.
             if (!$updateStmt->rowCount()) {
                 try {
-                    $insertStmt = $this->pdo->prepare(
-                        "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)"
-                    );
-                    $insertStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
-                    $insertStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
-                    $insertStmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
-                    $insertStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+                    $insertStmt = $this->getInsertStatement($sessionId, $data, $maxlifetime);
                     $insertStmt->execute();
                 } catch (\PDOException $e) {
                     // Handle integrity violation SQLSTATE 23000 (or a subclass like 23505 in Postgres) for duplicate keys
@@ -377,6 +367,30 @@ class PdoSessionHandler implements \SessionHandlerInterface
     /**
      * {@inheritdoc}
      */
+    public function updateTimestamp($sessionId, $data)
+    {
+        $maxlifetime = (int) ini_get('session.gc_maxlifetime');
+
+        try {
+            $updateStmt = $this->pdo->prepare(
+                "UPDATE $this->table SET $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id"
+            );
+            $updateStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+            $updateStmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
+            $updateStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+            $updateStmt->execute();
+        } catch (\PDOException $e) {
+            $this->rollback();
+
+            throw $e;
+        }
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
     public function close()
     {
         $this->commit();
@@ -389,7 +403,11 @@ class PdoSessionHandler implements \SessionHandlerInterface
             $this->gcCalled = false;
 
             // delete the session records that have expired
-            $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol < :time";
+            if ('mysql' === $this->driver) {
+                $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol + $this->timeCol < :time";
+            } else {
+                $sql = "DELETE FROM $this->table WHERE $this->lifetimeCol < :time - $this->timeCol";
+            }
 
             $stmt = $this->pdo->prepare($sql);
             $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
@@ -416,6 +434,102 @@ class PdoSessionHandler implements \SessionHandlerInterface
     }
 
     /**
+     * Builds a PDO DSN from a URL-like connection string.
+     *
+     * @param string $dsnOrUrl
+     *
+     * @return string
+     *
+     * @todo implement missing support for oci DSN (which look totally different from other PDO ones)
+     */
+    private function buildDsnFromUrl($dsnOrUrl)
+    {
+        // (pdo_)?sqlite3?:///... => (pdo_)?sqlite3?://localhost/... or else the URL will be invalid
+        $url = preg_replace('#^((?:pdo_)?sqlite3?):///#', '$1://localhost/', $dsnOrUrl);
+
+        $params = parse_url($url);
+
+        if (false === $params) {
+            return $dsnOrUrl; // If the URL is not valid, let's assume it might be a DSN already.
+        }
+
+        $params = array_map('rawurldecode', $params);
+
+        // Override the default username and password. Values passed through options will still win over these in the constructor.
+        if (isset($params['user'])) {
+            $this->username = $params['user'];
+        }
+
+        if (isset($params['pass'])) {
+            $this->password = $params['pass'];
+        }
+
+        if (!isset($params['scheme'])) {
+            throw new \InvalidArgumentException('URLs without scheme are not supported to configure the PdoSessionHandler');
+        }
+
+        $driverAliasMap = [
+            'mssql' => 'sqlsrv',
+            'mysql2' => 'mysql', // Amazon RDS, for some weird reason
+            'postgres' => 'pgsql',
+            'postgresql' => 'pgsql',
+            'sqlite3' => 'sqlite',
+        ];
+
+        $driver = isset($driverAliasMap[$params['scheme']]) ? $driverAliasMap[$params['scheme']] : $params['scheme'];
+
+        // Doctrine DBAL supports passing its internal pdo_* driver names directly too (allowing both dashes and underscores). This allows supporting the same here.
+        if (0 === strpos($driver, 'pdo_') || 0 === strpos($driver, 'pdo-')) {
+            $driver = substr($driver, 4);
+        }
+
+        switch ($driver) {
+            case 'mysql':
+            case 'pgsql':
+                $dsn = $driver.':';
+
+                if (isset($params['host']) && '' !== $params['host']) {
+                    $dsn .= 'host='.$params['host'].';';
+                }
+
+                if (isset($params['port']) && '' !== $params['port']) {
+                    $dsn .= 'port='.$params['port'].';';
+                }
+
+                if (isset($params['path'])) {
+                    $dbName = substr($params['path'], 1); // Remove the leading slash
+                    $dsn .= 'dbname='.$dbName.';';
+                }
+
+                return $dsn;
+
+            case 'sqlite':
+                return 'sqlite:'.substr($params['path'], 1);
+
+            case 'sqlsrv':
+                $dsn = 'sqlsrv:server=';
+
+                if (isset($params['host'])) {
+                    $dsn .= $params['host'];
+                }
+
+                if (isset($params['port']) && '' !== $params['port']) {
+                    $dsn .= ','.$params['port'];
+                }
+
+                if (isset($params['path'])) {
+                    $dbName = substr($params['path'], 1); // Remove the leading slash
+                    $dsn .= ';Database='.$dbName;
+                }
+
+                return $dsn;
+
+            default:
+                throw new \InvalidArgumentException(sprintf('The scheme "%s" is not supported by the PdoSessionHandler URL configuration. Pass a PDO DSN directly.', $params['scheme']));
+        }
+    }
+
+    /**
      * Helper method to begin a transaction.
      *
      * Since SQLite does not support row level locks, we have to acquire a reserved lock
@@ -493,10 +607,8 @@ class PdoSessionHandler implements \SessionHandlerInterface
      *
      * @return string The session data
      */
-    private function doRead($sessionId)
+    protected function doRead($sessionId)
     {
-        $this->sessionExpired = false;
-
         if (self::LOCK_ADVISORY === $this->lockMode) {
             $this->unlockStatements[] = $this->doAdvisoryLock($sessionId);
         }
@@ -504,6 +616,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
         $selectSql = $this->getSelectSql();
         $selectStmt = $this->pdo->prepare($selectSql);
         $selectStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+        $insertStmt = null;
 
         do {
             $selectStmt->execute();
@@ -516,20 +629,21 @@ class PdoSessionHandler implements \SessionHandlerInterface
                     return '';
                 }
 
-                return is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0];
+                return \is_resource($sessionRows[0][0]) ? stream_get_contents($sessionRows[0][0]) : $sessionRows[0][0];
+            }
+
+            if (null !== $insertStmt) {
+                $this->rollback();
+                throw new \RuntimeException('Failed to read session: INSERT reported a duplicate id but next SELECT did not return any data.');
             }
 
-            if (self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) {
+            if (!filter_var(ini_get('session.use_strict_mode'), FILTER_VALIDATE_BOOLEAN) && self::LOCK_TRANSACTIONAL === $this->lockMode && 'sqlite' !== $this->driver) {
+                // In strict mode, session fixation is not possible: new sessions always start with a unique
+                // random id, so that concurrency is not possible and this code path can be skipped.
                 // Exclusive-reading of non-existent rows does not block, so we need to do an insert to block
                 // until other connections to the session are committed.
                 try {
-                    $insertStmt = $this->pdo->prepare(
-                        "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)"
-                    );
-                    $insertStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
-                    $insertStmt->bindValue(':data', '', \PDO::PARAM_LOB);
-                    $insertStmt->bindValue(':lifetime', 0, \PDO::PARAM_INT);
-                    $insertStmt->bindValue(':time', time(), \PDO::PARAM_INT);
+                    $insertStmt = $this->getInsertStatement($sessionId, '', 0);
                     $insertStmt->execute();
                 } catch (\PDOException $e) {
                     // Catch duplicate key error because other connection created the session already.
@@ -568,23 +682,25 @@ class PdoSessionHandler implements \SessionHandlerInterface
     {
         switch ($this->driver) {
             case 'mysql':
+                // MySQL 5.7.5 and later enforces a maximum length on lock names of 64 characters. Previously, no limit was enforced.
+                $lockId = \substr($sessionId, 0, 64);
                 // should we handle the return value? 0 on timeout, null on error
                 // we use a timeout of 50 seconds which is also the default for innodb_lock_wait_timeout
                 $stmt = $this->pdo->prepare('SELECT GET_LOCK(:key, 50)');
-                $stmt->bindValue(':key', $sessionId, \PDO::PARAM_STR);
+                $stmt->bindValue(':key', $lockId, \PDO::PARAM_STR);
                 $stmt->execute();
 
                 $releaseStmt = $this->pdo->prepare('DO RELEASE_LOCK(:key)');
-                $releaseStmt->bindValue(':key', $sessionId, \PDO::PARAM_STR);
+                $releaseStmt->bindValue(':key', $lockId, \PDO::PARAM_STR);
 
                 return $releaseStmt;
             case 'pgsql':
                 // Obtaining an exclusive session level advisory lock requires an integer key.
-                // So we convert the HEX representation of the session id to an integer.
-                // Since integers are signed, we have to skip one hex char to fit in the range.
-                if (4 === PHP_INT_SIZE) {
-                    $sessionInt1 = hexdec(substr($sessionId, 0, 7));
-                    $sessionInt2 = hexdec(substr($sessionId, 7, 7));
+                // When session.sid_bits_per_character > 4, the session id can contain non-hex-characters.
+                // So we cannot just use hexdec().
+                if (4 === \PHP_INT_SIZE) {
+                    $sessionInt1 = $this->convertStringToInt($sessionId);
+                    $sessionInt2 = $this->convertStringToInt(substr($sessionId, 4, 4));
 
                     $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key1, :key2)');
                     $stmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT);
@@ -595,7 +711,7 @@ class PdoSessionHandler implements \SessionHandlerInterface
                     $releaseStmt->bindValue(':key1', $sessionInt1, \PDO::PARAM_INT);
                     $releaseStmt->bindValue(':key2', $sessionInt2, \PDO::PARAM_INT);
                 } else {
-                    $sessionBigInt = hexdec(substr($sessionId, 0, 15));
+                    $sessionBigInt = $this->convertStringToInt($sessionId);
 
                     $stmt = $this->pdo->prepare('SELECT pg_advisory_lock(:key)');
                     $stmt->bindValue(':key', $sessionBigInt, \PDO::PARAM_INT);
@@ -614,6 +730,27 @@ class PdoSessionHandler implements \SessionHandlerInterface
     }
 
     /**
+     * Encodes the first 4 (when PHP_INT_SIZE == 4) or 8 characters of the string as an integer.
+     *
+     * Keep in mind, PHP integers are signed.
+     *
+     * @param string $string
+     *
+     * @return int
+     */
+    private function convertStringToInt($string)
+    {
+        if (4 === \PHP_INT_SIZE) {
+            return (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]);
+        }
+
+        $int1 = (\ord($string[7]) << 24) + (\ord($string[6]) << 16) + (\ord($string[5]) << 8) + \ord($string[4]);
+        $int2 = (\ord($string[3]) << 24) + (\ord($string[2]) << 16) + (\ord($string[1]) << 8) + \ord($string[0]);
+
+        return $int2 + ($int1 << 32);
+    }
+
+    /**
      * Return a locking or nonlocking SQL query to read session information.
      *
      * @return string The SQL string
@@ -644,6 +781,72 @@ class PdoSessionHandler implements \SessionHandlerInterface
     }
 
     /**
+     * Returns an insert statement supported by the database for writing session data.
+     *
+     * @param string $sessionId   Session ID
+     * @param string $sessionData Encoded session data
+     * @param int    $maxlifetime session.gc_maxlifetime
+     *
+     * @return \PDOStatement The insert statement
+     */
+    private function getInsertStatement($sessionId, $sessionData, $maxlifetime)
+    {
+        switch ($this->driver) {
+            case 'oci':
+                $data = fopen('php://memory', 'r+');
+                fwrite($data, $sessionData);
+                rewind($data);
+                $sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, EMPTY_BLOB(), :lifetime, :time) RETURNING $this->dataCol into :data";
+                break;
+            default:
+                $data = $sessionData;
+                $sql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time)";
+                break;
+        }
+
+        $stmt = $this->pdo->prepare($sql);
+        $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+        $stmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+        $stmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
+        $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
+
+        return $stmt;
+    }
+
+    /**
+     * Returns an update statement supported by the database for writing session data.
+     *
+     * @param string $sessionId   Session ID
+     * @param string $sessionData Encoded session data
+     * @param int    $maxlifetime session.gc_maxlifetime
+     *
+     * @return \PDOStatement The update statement
+     */
+    private function getUpdateStatement($sessionId, $sessionData, $maxlifetime)
+    {
+        switch ($this->driver) {
+            case 'oci':
+                $data = fopen('php://memory', 'r+');
+                fwrite($data, $sessionData);
+                rewind($data);
+                $sql = "UPDATE $this->table SET $this->dataCol = EMPTY_BLOB(), $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id RETURNING $this->dataCol into :data";
+                break;
+            default:
+                $data = $sessionData;
+                $sql = "UPDATE $this->table SET $this->dataCol = :data, $this->lifetimeCol = :lifetime, $this->timeCol = :time WHERE $this->idCol = :id";
+                break;
+        }
+
+        $stmt = $this->pdo->prepare($sql);
+        $stmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+        $stmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+        $stmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
+        $stmt->bindValue(':time', time(), \PDO::PARAM_INT);
+
+        return $stmt;
+    }
+
+    /**
      * Returns a merge/upsert (i.e. insert or update) statement when supported by the database for writing session data.
      *
      * @param string $sessionId   Session ID
@@ -654,18 +857,11 @@ class PdoSessionHandler implements \SessionHandlerInterface
      */
     private function getMergeStatement($sessionId, $data, $maxlifetime)
     {
-        $mergeSql = null;
         switch (true) {
             case 'mysql' === $this->driver:
                 $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time) ".
                     "ON DUPLICATE KEY UPDATE $this->dataCol = VALUES($this->dataCol), $this->lifetimeCol = VALUES($this->lifetimeCol), $this->timeCol = VALUES($this->timeCol)";
                 break;
-            case 'oci' === $this->driver:
-                // DUAL is Oracle specific dummy table
-                $mergeSql = "MERGE INTO $this->table USING DUAL ON ($this->idCol = ?) ".
-                    "WHEN NOT MATCHED THEN INSERT ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (?, ?, ?, ?) ".
-                    "WHEN MATCHED THEN UPDATE SET $this->dataCol = ?, $this->lifetimeCol = ?, $this->timeCol = ?";
-                break;
             case 'sqlsrv' === $this->driver && version_compare($this->pdo->getAttribute(\PDO::ATTR_SERVER_VERSION), '10', '>='):
                 // MERGE is only available since SQL Server 2008 and must be terminated by semicolon
                 // It also requires HOLDLOCK according to http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition-With-MERGE.aspx
@@ -680,29 +876,30 @@ class PdoSessionHandler implements \SessionHandlerInterface
                 $mergeSql = "INSERT INTO $this->table ($this->idCol, $this->dataCol, $this->lifetimeCol, $this->timeCol) VALUES (:id, :data, :lifetime, :time) ".
                     "ON CONFLICT ($this->idCol) DO UPDATE SET ($this->dataCol, $this->lifetimeCol, $this->timeCol) = (EXCLUDED.$this->dataCol, EXCLUDED.$this->lifetimeCol, EXCLUDED.$this->timeCol)";
                 break;
+            default:
+                // MERGE is not supported with LOBs: http://www.oracle.com/technetwork/articles/fuecks-lobs-095315.html
+                return null;
         }
 
-        if (null !== $mergeSql) {
-            $mergeStmt = $this->pdo->prepare($mergeSql);
-
-            if ('sqlsrv' === $this->driver || 'oci' === $this->driver) {
-                $mergeStmt->bindParam(1, $sessionId, \PDO::PARAM_STR);
-                $mergeStmt->bindParam(2, $sessionId, \PDO::PARAM_STR);
-                $mergeStmt->bindParam(3, $data, \PDO::PARAM_LOB);
-                $mergeStmt->bindParam(4, $maxlifetime, \PDO::PARAM_INT);
-                $mergeStmt->bindValue(5, time(), \PDO::PARAM_INT);
-                $mergeStmt->bindParam(6, $data, \PDO::PARAM_LOB);
-                $mergeStmt->bindParam(7, $maxlifetime, \PDO::PARAM_INT);
-                $mergeStmt->bindValue(8, time(), \PDO::PARAM_INT);
-            } else {
-                $mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
-                $mergeStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
-                $mergeStmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
-                $mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT);
-            }
-
-            return $mergeStmt;
+        $mergeStmt = $this->pdo->prepare($mergeSql);
+
+        if ('sqlsrv' === $this->driver) {
+            $mergeStmt->bindParam(1, $sessionId, \PDO::PARAM_STR);
+            $mergeStmt->bindParam(2, $sessionId, \PDO::PARAM_STR);
+            $mergeStmt->bindParam(3, $data, \PDO::PARAM_LOB);
+            $mergeStmt->bindParam(4, $maxlifetime, \PDO::PARAM_INT);
+            $mergeStmt->bindValue(5, time(), \PDO::PARAM_INT);
+            $mergeStmt->bindParam(6, $data, \PDO::PARAM_LOB);
+            $mergeStmt->bindParam(7, $maxlifetime, \PDO::PARAM_INT);
+            $mergeStmt->bindValue(8, time(), \PDO::PARAM_INT);
+        } else {
+            $mergeStmt->bindParam(':id', $sessionId, \PDO::PARAM_STR);
+            $mergeStmt->bindParam(':data', $data, \PDO::PARAM_LOB);
+            $mergeStmt->bindParam(':lifetime', $maxlifetime, \PDO::PARAM_INT);
+            $mergeStmt->bindValue(':time', time(), \PDO::PARAM_INT);
         }
+
+        return $mergeStmt;
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php
new file mode 100644
index 00000000..83a1f2c0
--- /dev/null
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/StrictSessionHandler.php
@@ -0,0 +1,103 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
+
+/**
+ * Adds basic `SessionUpdateTimestampHandlerInterface` behaviors to another `SessionHandlerInterface`.
+ *
+ * @author Nicolas Grekas <p@xxxxxxxxxxx>
+ */
+class StrictSessionHandler extends AbstractSessionHandler
+{
+    private $handler;
+    private $doDestroy;
+
+    public function __construct(\SessionHandlerInterface $handler)
+    {
+        if ($handler instanceof \SessionUpdateTimestampHandlerInterface) {
+            throw new \LogicException(sprintf('"%s" is already an instance of "SessionUpdateTimestampHandlerInterface", you cannot wrap it with "%s".', \get_class($handler), self::class));
+        }
+
+        $this->handler = $handler;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function open($savePath, $sessionName)
+    {
+        parent::open($savePath, $sessionName);
+
+        return $this->handler->open($savePath, $sessionName);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doRead($sessionId)
+    {
+        return $this->handler->read($sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function updateTimestamp($sessionId, $data)
+    {
+        return $this->write($sessionId, $data);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doWrite($sessionId, $data)
+    {
+        return $this->handler->write($sessionId, $data);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        $this->doDestroy = true;
+        $destroyed = parent::destroy($sessionId);
+
+        return $this->doDestroy ? $this->doDestroy($sessionId) : $destroyed;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    protected function doDestroy($sessionId)
+    {
+        $this->doDestroy = false;
+
+        return $this->handler->destroy($sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function close()
+    {
+        return $this->handler->close();
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function gc($maxlifetime)
+    {
+        return $this->handler->gc($maxlifetime);
+    }
+}
diff --git a/vendor/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php b/vendor/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php
index d49c36ca..127e47f2 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Handler/WriteCheckSessionHandler.php
@@ -15,12 +15,11 @@ namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;
  * Wraps another SessionHandlerInterface to only write the session when it has been modified.
  *
  * @author Adrien Brault <adrien.brault@xxxxxxxxx>
+ *
+ * @deprecated since version 3.4, to be removed in 4.0. Implement `SessionUpdateTimestampHandlerInterface` or extend `AbstractSessionHandler` instead.
  */
 class WriteCheckSessionHandler implements \SessionHandlerInterface
 {
-    /**
-     * @var \SessionHandlerInterface
-     */
     private $wrappedSessionHandler;
 
     /**
@@ -30,6 +29,8 @@ class WriteCheckSessionHandler implements \SessionHandlerInterface
 
     public function __construct(\SessionHandlerInterface $wrappedSessionHandler)
     {
+        @trigger_error(sprintf('The %s class is deprecated since Symfony 3.4 and will be removed in 4.0. Implement `SessionUpdateTimestampHandlerInterface` or extend `AbstractSessionHandler` instead.', self::class), E_USER_DEPRECATED);
+
         $this->wrappedSessionHandler = $wrappedSessionHandler;
     }
 
diff --git a/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php b/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php
index 322dd560..a62f108b 100644
--- a/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php
+++ b/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php
@@ -39,7 +39,7 @@ class MetadataBag implements SessionBagInterface
     /**
      * @var array
      */
-    protected $meta = array(self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0);
+    protected $meta = [self::CREATED => 0, self::UPDATED => 0, self::LIFETIME => 0];
 
     /**
      * Unix timestamp.
@@ -54,8 +54,6 @@ class MetadataBag implements SessionBagInterface
     private $updateThreshold;
 
     /**
-     * Constructor.
-     *
      * @param string $storageKey      The key used to store bag in the session
      * @param int    $updateThreshold The time to wait between two UPDATED updates
      */
diff --git a/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
index 348fd230..c1e7523c 100644
--- a/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/MockArraySessionStorage.php
@@ -50,7 +50,7 @@ class MockArraySessionStorage implements SessionStorageInterface
     /**
      * @var array
      */
-    protected $data = array();
+    protected $data = [];
 
     /**
      * @var MetadataBag
@@ -60,11 +60,9 @@ class MockArraySessionStorage implements SessionStorageInterface
     /**
      * @var array|SessionBagInterface[]
      */
-    protected $bags = array();
+    protected $bags = [];
 
     /**
-     * Constructor.
-     *
      * @param string      $name    Session name
      * @param MetadataBag $metaBag MetadataBag instance
      */
@@ -74,11 +72,6 @@ class MockArraySessionStorage implements SessionStorageInterface
         $this->setMetadataBag($metaBag);
     }
 
-    /**
-     * Sets the session data.
-     *
-     * @param array $array
-     */
     public function setSessionData(array $array)
     {
         $this->data = $array;
@@ -177,7 +170,7 @@ class MockArraySessionStorage implements SessionStorageInterface
         }
 
         // clear out the session
-        $this->data = array();
+        $this->data = [];
 
         // reconnect the bags to the session
         $this->loadSession();
@@ -215,11 +208,6 @@ class MockArraySessionStorage implements SessionStorageInterface
         return $this->started;
     }
 
-    /**
-     * Sets the MetadataBag.
-     *
-     * @param MetadataBag $bag
-     */
     public function setMetadataBag(MetadataBag $bag = null)
     {
         if (null === $bag) {
@@ -254,11 +242,11 @@ class MockArraySessionStorage implements SessionStorageInterface
 
     protected function loadSession()
     {
-        $bags = array_merge($this->bags, array($this->metadataBag));
+        $bags = array_merge($this->bags, [$this->metadataBag]);
 
         foreach ($bags as $bag) {
             $key = $bag->getStorageKey();
-            $this->data[$key] = isset($this->data[$key]) ? $this->data[$key] : array();
+            $this->data[$key] = isset($this->data[$key]) ? $this->data[$key] : [];
             $bag->initialize($this->data[$key]);
         }
 
diff --git a/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
index 71f9e555..9bbd1baf 100644
--- a/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/MockFileSessionStorage.php
@@ -24,14 +24,9 @@ namespace Symfony\Component\HttpFoundation\Session\Storage;
  */
 class MockFileSessionStorage extends MockArraySessionStorage
 {
-    /**
-     * @var string
-     */
     private $savePath;
 
     /**
-     * Constructor.
-     *
      * @param string      $savePath Path of directory to save session files
      * @param string      $name     Session name
      * @param MetadataBag $metaBag  MetadataBag instance
@@ -96,7 +91,26 @@ class MockFileSessionStorage extends MockArraySessionStorage
             throw new \RuntimeException('Trying to save a session that was not started yet or was already closed');
         }
 
-        file_put_contents($this->getFilePath(), serialize($this->data));
+        $data = $this->data;
+
+        foreach ($this->bags as $bag) {
+            if (empty($data[$key = $bag->getStorageKey()])) {
+                unset($data[$key]);
+            }
+        }
+        if ([$key = $this->metadataBag->getStorageKey()] === array_keys($data)) {
+            unset($data[$key]);
+        }
+
+        try {
+            if ($data) {
+                file_put_contents($this->getFilePath(), serialize($data));
+            } else {
+                $this->destroy();
+            }
+        } finally {
+            $this->data = $data;
+        }
 
         // this is needed for Silex, where the session object is re-used across requests
         // in functional tests. In Symfony, the container is rebooted, so we don't have
@@ -131,7 +145,7 @@ class MockFileSessionStorage extends MockArraySessionStorage
     private function read()
     {
         $filePath = $this->getFilePath();
-        $this->data = is_readable($filePath) && is_file($filePath) ? unserialize(file_get_contents($filePath)) : array();
+        $this->data = is_readable($filePath) && is_file($filePath) ? unserialize(file_get_contents($filePath)) : [];
 
         $this->loadSession();
     }
diff --git a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
index 97161b8d..c4dbe758 100644
--- a/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/NativeSessionStorage.php
@@ -11,9 +11,8 @@
 
 namespace Symfony\Component\HttpFoundation\Session\Storage;
 
-use Symfony\Component\Debug\Exception\ContextErrorException;
 use Symfony\Component\HttpFoundation\Session\SessionBagInterface;
-use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
+use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler;
 use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
 use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
 
@@ -25,11 +24,9 @@ use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
 class NativeSessionStorage implements SessionStorageInterface
 {
     /**
-     * Array of SessionBagInterface.
-     *
      * @var SessionBagInterface[]
      */
-    protected $bags;
+    protected $bags = [];
 
     /**
      * @var bool
@@ -42,7 +39,7 @@ class NativeSessionStorage implements SessionStorageInterface
     protected $closed = false;
 
     /**
-     * @var AbstractProxy
+     * @var AbstractProxy|\SessionHandlerInterface
      */
     protected $saveHandler;
 
@@ -52,8 +49,6 @@ class NativeSessionStorage implements SessionStorageInterface
     protected $metadataBag;
 
     /**
-     * Constructor.
-     *
      * Depending on how you want the storage driver to behave you probably
      * want to override this constructor entirely.
      *
@@ -66,6 +61,7 @@ class NativeSessionStorage implements SessionStorageInterface
      * PHP starts to execute user-land code. Setting during runtime has no effect).
      *
      * cache_limiter, "" (use "0" to prevent headers from being sent entirely).
+     * cache_expire, "0"
      * cookie_domain, ""
      * cookie_httponly, ""
      * cookie_lifetime, "0"
@@ -78,6 +74,7 @@ class NativeSessionStorage implements SessionStorageInterface
      * gc_probability, "1"
      * hash_bits_per_character, "4"
      * hash_function, "0"
+     * lazy_write, "1"
      * name, "PHPSESSID"
      * referer_check, ""
      * serialize_handler, "php"
@@ -97,14 +94,18 @@ class NativeSessionStorage implements SessionStorageInterface
      * trans_sid_hosts, $_SERVER['HTTP_HOST']
      * trans_sid_tags, "a=href,area=href,frame=src,form="
      *
-     * @param array                                                            $options Session configuration options
-     * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $handler
-     * @param MetadataBag                                                      $metaBag MetadataBag
+     * @param array                         $options Session configuration options
+     * @param \SessionHandlerInterface|null $handler
+     * @param MetadataBag                   $metaBag MetadataBag
      */
-    public function __construct(array $options = array(), $handler = null, MetadataBag $metaBag = null)
+    public function __construct(array $options = [], $handler = null, MetadataBag $metaBag = null)
     {
-        session_cache_limiter(''); // disable by default because it's managed by HeaderBag (if used)
-        ini_set('session.use_cookies', 1);
+        $options += [
+            'cache_limiter' => '',
+            'cache_expire' => 0,
+            'use_cookies' => 1,
+            'lazy_write' => 1,
+        ];
 
         session_register_shutdown();
 
@@ -116,7 +117,7 @@ class NativeSessionStorage implements SessionStorageInterface
     /**
      * Gets the save handler instance.
      *
-     * @return AbstractProxy
+     * @return AbstractProxy|\SessionHandlerInterface
      */
     public function getSaveHandler()
     {
@@ -136,7 +137,7 @@ class NativeSessionStorage implements SessionStorageInterface
             throw new \RuntimeException('Failed to start the session: already started by PHP.');
         }
 
-        if (ini_get('session.use_cookies') && headers_sent($file, $line)) {
+        if (filter_var(ini_get('session.use_cookies'), FILTER_VALIDATE_BOOLEAN) && headers_sent($file, $line)) {
             throw new \RuntimeException(sprintf('Failed to start the session because headers have already been sent by "%s" at line %d.', $file, $line));
         }
 
@@ -192,6 +193,10 @@ class NativeSessionStorage implements SessionStorageInterface
             return false;
         }
 
+        if (headers_sent()) {
+            return false;
+        }
+
         if (null !== $lifetime) {
             ini_set('session.cookie_lifetime', $lifetime);
         }
@@ -214,24 +219,32 @@ class NativeSessionStorage implements SessionStorageInterface
      */
     public function save()
     {
-        // Register custom error handler to catch a possible failure warning during session write
-        set_error_handler(function ($errno, $errstr, $errfile, $errline, $errcontext) {
-            throw new ContextErrorException($errstr, $errno, E_WARNING, $errfile, $errline, $errcontext);
-        }, E_WARNING);
+        $session = $_SESSION;
 
-        try {
-            session_write_close();
-            restore_error_handler();
-        } catch (ContextErrorException $e) {
-            // The default PHP error message is not very helpful, as it does not give any information on the current save handler.
-            // Therefore, we catch this error and trigger a warning with a better error message
-            $handler = $this->getSaveHandler();
-            if ($handler instanceof SessionHandlerProxy) {
-                $handler = $handler->getHandler();
+        foreach ($this->bags as $bag) {
+            if (empty($_SESSION[$key = $bag->getStorageKey()])) {
+                unset($_SESSION[$key]);
+            }
+        }
+        if ([$key = $this->metadataBag->getStorageKey()] === array_keys($_SESSION)) {
+            unset($_SESSION[$key]);
+        }
+
+        // Register error handler to add information about the current save handler
+        $previousHandler = set_error_handler(function ($type, $msg, $file, $line) use (&$previousHandler) {
+            if (E_WARNING === $type && 0 === strpos($msg, 'session_write_close():')) {
+                $handler = $this->saveHandler instanceof SessionHandlerProxy ? $this->saveHandler->getHandler() : $this->saveHandler;
+                $msg = sprintf('session_write_close(): Failed to write session data with "%s" handler', \get_class($handler));
             }
 
+            return $previousHandler ? $previousHandler($type, $msg, $file, $line) : false;
+        });
+
+        try {
+            session_write_close();
+        } finally {
             restore_error_handler();
-            trigger_error(sprintf('session_write_close(): Failed to write session data with %s handler', get_class($handler)), E_USER_WARNING);
+            $_SESSION = $session;
         }
 
         $this->closed = true;
@@ -249,7 +262,7 @@ class NativeSessionStorage implements SessionStorageInterface
         }
 
         // clear out the session
-        $_SESSION = array();
+        $_SESSION = [];
 
         // reconnect the bags to the session
         $this->loadSession();
@@ -276,7 +289,7 @@ class NativeSessionStorage implements SessionStorageInterface
             throw new \InvalidArgumentException(sprintf('The SessionBagInterface %s is not registered.', $name));
         }
 
-        if ($this->saveHandler->isActive() && !$this->started) {
+        if (!$this->started && $this->saveHandler->isActive()) {
             $this->loadSession();
         } elseif (!$this->started) {
             $this->start();
@@ -285,11 +298,6 @@ class NativeSessionStorage implements SessionStorageInterface
         return $this->bags[$name];
     }
 
-    /**
-     * Sets the MetadataBag.
-     *
-     * @param MetadataBag $metaBag
-     */
     public function setMetadataBag(MetadataBag $metaBag = null)
     {
         if (null === $metaBag) {
@@ -323,28 +331,32 @@ class NativeSessionStorage implements SessionStorageInterface
      * For convenience we omit 'session.' from the beginning of the keys.
      * Explicitly ignores other ini keys.
      *
-     * @param array $options Session ini directives array(key => value)
+     * @param array $options Session ini directives [key => value]
      *
      * @see http://php.net/session.configuration
      */
     public function setOptions(array $options)
     {
-        $validOptions = array_flip(array(
-            'cache_limiter', 'cookie_domain', 'cookie_httponly',
+        if (headers_sent() || \PHP_SESSION_ACTIVE === session_status()) {
+            return;
+        }
+
+        $validOptions = array_flip([
+            'cache_expire', 'cache_limiter', 'cookie_domain', 'cookie_httponly',
             'cookie_lifetime', 'cookie_path', 'cookie_secure',
             'entropy_file', 'entropy_length', 'gc_divisor',
             'gc_maxlifetime', 'gc_probability', 'hash_bits_per_character',
-            'hash_function', 'name', 'referer_check',
+            'hash_function', 'lazy_write', 'name', 'referer_check',
             'serialize_handler', 'use_strict_mode', 'use_cookies',
             'use_only_cookies', 'use_trans_sid', 'upload_progress.enabled',
             'upload_progress.cleanup', 'upload_progress.prefix', 'upload_progress.name',
-            'upload_progress.freq', 'upload_progress.min-freq', 'url_rewriter.tags',
+            'upload_progress.freq', 'upload_progress.min_freq', 'url_rewriter.tags',
             'sid_length', 'sid_bits_per_character', 'trans_sid_hosts', 'trans_sid_tags',
-        ));
+        ]);
 
         foreach ($options as $key => $value) {
             if (isset($validOptions[$key])) {
-                ini_set('session.'.$key, $value);
+                ini_set('url_rewriter.tags' !== $key ? 'session.'.$key : $key, $value);
             }
         }
     }
@@ -358,7 +370,7 @@ class NativeSessionStorage implements SessionStorageInterface
      *     ini_set('session.save_handler', 'files');
      *     ini_set('session.save_path', '/tmp');
      *
-     * or pass in a NativeSessionHandler instance which configures session.save_handler in the
+     * or pass in a \SessionHandler instance which configures session.save_handler in the
      * constructor, for a template see NativeFileSessionHandler or use handlers in
      * composer package drak/native-session
      *
@@ -367,28 +379,31 @@ class NativeSessionStorage implements SessionStorageInterface
      * @see http://php.net/sessionhandler
      * @see http://github.com/drak/NativeSession
      *
-     * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $saveHandler
+     * @param \SessionHandlerInterface|null $saveHandler
      *
      * @throws \InvalidArgumentException
      */
     public function setSaveHandler($saveHandler = null)
     {
         if (!$saveHandler instanceof AbstractProxy &&
-            !$saveHandler instanceof NativeSessionHandler &&
             !$saveHandler instanceof \SessionHandlerInterface &&
             null !== $saveHandler) {
-            throw new \InvalidArgumentException('Must be instance of AbstractProxy or NativeSessionHandler; implement \SessionHandlerInterface; or be null.');
+            throw new \InvalidArgumentException('Must be instance of AbstractProxy; implement \SessionHandlerInterface; or be null.');
         }
 
         // Wrap $saveHandler in proxy and prevent double wrapping of proxy
         if (!$saveHandler instanceof AbstractProxy && $saveHandler instanceof \SessionHandlerInterface) {
             $saveHandler = new SessionHandlerProxy($saveHandler);
         } elseif (!$saveHandler instanceof AbstractProxy) {
-            $saveHandler = new SessionHandlerProxy(new \SessionHandler());
+            $saveHandler = new SessionHandlerProxy(new StrictSessionHandler(new \SessionHandler()));
         }
         $this->saveHandler = $saveHandler;
 
-        if ($this->saveHandler instanceof \SessionHandlerInterface) {
+        if (headers_sent() || \PHP_SESSION_ACTIVE === session_status()) {
+            return;
+        }
+
+        if ($this->saveHandler instanceof SessionHandlerProxy) {
             session_set_save_handler($this->saveHandler, false);
         }
     }
@@ -400,8 +415,6 @@ class NativeSessionStorage implements SessionStorageInterface
      * are set to (either PHP's internal, or a custom save handler set with session_set_save_handler()).
      * PHP takes the return value from the read() handler, unserializes it
      * and populates $_SESSION with the result automatically.
-     *
-     * @param array|null $session
      */
     protected function loadSession(array &$session = null)
     {
@@ -409,11 +422,11 @@ class NativeSessionStorage implements SessionStorageInterface
             $session = &$_SESSION;
         }
 
-        $bags = array_merge($this->bags, array($this->metadataBag));
+        $bags = array_merge($this->bags, [$this->metadataBag]);
 
         foreach ($bags as $bag) {
             $key = $bag->getStorageKey();
-            $session[$key] = isset($session[$key]) ? $session[$key] : array();
+            $session[$key] = isset($session[$key]) ? $session[$key] : [];
             $bag->initialize($session[$key]);
         }
 
diff --git a/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php b/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php
index 6f02a7fd..662ed501 100644
--- a/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php
+++ b/vendor/symfony/http-foundation/Session/Storage/PhpBridgeSessionStorage.php
@@ -11,9 +11,6 @@
 
 namespace Symfony\Component\HttpFoundation\Session\Storage;
 
-use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
-use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
-
 /**
  * Allows session to be started by PHP and managed by Symfony.
  *
@@ -22,10 +19,8 @@ use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandle
 class PhpBridgeSessionStorage extends NativeSessionStorage
 {
     /**
-     * Constructor.
-     *
-     * @param AbstractProxy|NativeSessionHandler|\SessionHandlerInterface|null $handler
-     * @param MetadataBag                                                      $metaBag MetadataBag
+     * @param \SessionHandlerInterface|null $handler
+     * @param MetadataBag                   $metaBag MetadataBag
      */
     public function __construct($handler = null, MetadataBag $metaBag = null)
     {
diff --git a/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php b/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
index a7478656..09c92483 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/AbstractProxy.php
@@ -12,8 +12,6 @@
 namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;
 
 /**
- * AbstractProxy.
- *
  * @author Drak <drak@xxxxxxxxxx>
  */
 abstract class AbstractProxy
diff --git a/vendor/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php b/vendor/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php
index 0db34aa2..082eed14 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/NativeProxy.php
@@ -11,18 +11,17 @@
 
 namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;
 
+@trigger_error('The '.__NAMESPACE__.'\NativeProxy class is deprecated since Symfony 3.4 and will be removed in 4.0. Use your session handler implementation directly.', E_USER_DEPRECATED);
+
 /**
- * NativeProxy.
+ * This proxy is built-in session handlers in PHP 5.3.x.
  *
- * This proxy is built-in session handlers in PHP 5.3.x
+ * @deprecated since version 3.4, to be removed in 4.0. Use your session handler implementation directly.
  *
  * @author Drak <drak@xxxxxxxxxx>
  */
 class NativeProxy extends AbstractProxy
 {
-    /**
-     * Constructor.
-     */
     public function __construct()
     {
         // this makes an educated guess as to what the handler is since it should already be set.
diff --git a/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php b/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php
index 68ed713c..b11cc397 100644
--- a/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php
+++ b/vendor/symfony/http-foundation/Session/Storage/Proxy/SessionHandlerProxy.php
@@ -12,22 +12,12 @@
 namespace Symfony\Component\HttpFoundation\Session\Storage\Proxy;
 
 /**
- * SessionHandler proxy.
- *
  * @author Drak <drak@xxxxxxxxxx>
  */
-class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface
+class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterface, \SessionUpdateTimestampHandlerInterface
 {
-    /**
-     * @var \SessionHandlerInterface
-     */
     protected $handler;
 
-    /**
-     * Constructor.
-     *
-     * @param \SessionHandlerInterface $handler
-     */
     public function __construct(\SessionHandlerInterface $handler)
     {
         $this->handler = $handler;
@@ -92,4 +82,20 @@ class SessionHandlerProxy extends AbstractProxy implements \SessionHandlerInterf
     {
         return (bool) $this->handler->gc($maxlifetime);
     }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function validateId($sessionId)
+    {
+        return !$this->handler instanceof \SessionUpdateTimestampHandlerInterface || $this->handler->validateId($sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function updateTimestamp($sessionId, $data)
+    {
+        return $this->handler instanceof \SessionUpdateTimestampHandlerInterface ? $this->handler->updateTimestamp($sessionId, $data) : $this->write($sessionId, $data);
+    }
 }
diff --git a/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php b/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php
index 34f6c463..66e8b33d 100644
--- a/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php
+++ b/vendor/symfony/http-foundation/Session/Storage/SessionStorageInterface.php
@@ -26,7 +26,7 @@ interface SessionStorageInterface
      *
      * @return bool True if started
      *
-     * @throws \RuntimeException If something goes wrong starting the session.
+     * @throws \RuntimeException if something goes wrong starting the session
      */
     public function start();
 
@@ -104,8 +104,8 @@ interface SessionStorageInterface
      * a real PHP session would interfere with testing, in which case
      * it should actually persist the session data if required.
      *
-     * @throws \RuntimeException If the session is saved without being started, or if the session
-     *                           is already closed.
+     * @throws \RuntimeException if the session is saved without being started, or if the session
+     *                           is already closed
      */
     public function save();
 
@@ -127,8 +127,6 @@ interface SessionStorageInterface
 
     /**
      * Registers a SessionBagInterface for use.
-     *
-     * @param SessionBagInterface $bag
      */
     public function registerBag(SessionBagInterface $bag);
 
diff --git a/vendor/symfony/http-foundation/StreamedResponse.php b/vendor/symfony/http-foundation/StreamedResponse.php
index 92853130..8bc5fc91 100644
--- a/vendor/symfony/http-foundation/StreamedResponse.php
+++ b/vendor/symfony/http-foundation/StreamedResponse.php
@@ -17,7 +17,7 @@ namespace Symfony\Component\HttpFoundation;
  * A StreamedResponse uses a callback for its content.
  *
  * The callback should use the standard PHP functions like echo
- * to stream the response back to the client. The flush() method
+ * to stream the response back to the client. The flush() function
  * can also be used if needed.
  *
  * @see flush()
@@ -31,13 +31,11 @@ class StreamedResponse extends Response
     private $headersSent;
 
     /**
-     * Constructor.
-     *
      * @param callable|null $callback A valid PHP callback or null to set it later
      * @param int           $status   The response status code
      * @param array         $headers  An array of response headers
      */
-    public function __construct(callable $callback = null, $status = 200, $headers = array())
+    public function __construct(callable $callback = null, $status = 200, $headers = [])
     {
         parent::__construct(null, $status, $headers);
 
@@ -57,7 +55,7 @@ class StreamedResponse extends Response
      *
      * @return static
      */
-    public static function create($callback = null, $status = 200, $headers = array())
+    public static function create($callback = null, $status = 200, $headers = [])
     {
         return new static($callback, $status, $headers);
     }
@@ -66,37 +64,45 @@ class StreamedResponse extends Response
      * Sets the PHP callback associated with this Response.
      *
      * @param callable $callback A valid PHP callback
+     *
+     * @return $this
      */
     public function setCallback(callable $callback)
     {
         $this->callback = $callback;
+
+        return $this;
     }
 
     /**
      * {@inheritdoc}
      *
      * This method only sends the headers once.
+     *
+     * @return $this
      */
     public function sendHeaders()
     {
         if ($this->headersSent) {
-            return;
+            return $this;
         }
 
         $this->headersSent = true;
 
-        parent::sendHeaders();
+        return parent::sendHeaders();
     }
 
     /**
      * {@inheritdoc}
      *
      * This method only sends the content once.
+     *
+     * @return $this
      */
     public function sendContent()
     {
         if ($this->streamed) {
-            return;
+            return $this;
         }
 
         $this->streamed = true;
@@ -105,19 +111,27 @@ class StreamedResponse extends Response
             throw new \LogicException('The Response callback must not be null.');
         }
 
-        call_user_func($this->callback);
+        \call_user_func($this->callback);
+
+        return $this;
     }
 
     /**
      * {@inheritdoc}
      *
      * @throws \LogicException when the content is not null
+     *
+     * @return $this
      */
     public function setContent($content)
     {
         if (null !== $content) {
             throw new \LogicException('The content cannot be set on a StreamedResponse instance.');
         }
+
+        $this->streamed = true;
+
+        return $this;
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php b/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php
index cb43bb35..a40a7621 100644
--- a/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php
+++ b/vendor/symfony/http-foundation/Tests/AcceptHeaderItemTest.php
@@ -28,24 +28,24 @@ class AcceptHeaderItemTest extends TestCase
 
     public function provideFromStringData()
     {
-        return array(
-            array(
+        return [
+            [
                 'text/html',
-                'text/html', array(),
-            ),
-            array(
+                'text/html', [],
+            ],
+            [
                 '"this;should,not=matter"',
-                'this;should,not=matter', array(),
-            ),
-            array(
+                'this;should,not=matter', [],
+            ],
+            [
                 "text/plain; charset=utf-8;param=\"this;should,not=matter\";\tfootnotes=true",
-                'text/plain', array('charset' => 'utf-8', 'param' => 'this;should,not=matter', 'footnotes' => 'true'),
-            ),
-            array(
+                'text/plain', ['charset' => 'utf-8', 'param' => 'this;should,not=matter', 'footnotes' => 'true'],
+            ],
+            [
                 '"this;should,not=matter";charset=utf-8',
-                'this;should,not=matter', array('charset' => 'utf-8'),
-            ),
-        );
+                'this;should,not=matter', ['charset' => 'utf-8'],
+            ],
+        ];
     }
 
     /**
@@ -59,21 +59,21 @@ class AcceptHeaderItemTest extends TestCase
 
     public function provideToStringData()
     {
-        return array(
-            array(
-                'text/html', array(),
+        return [
+            [
+                'text/html', [],
                 'text/html',
-            ),
-            array(
-                'text/plain', array('charset' => 'utf-8', 'param' => 'this;should,not=matter', 'footnotes' => 'true'),
+            ],
+            [
+                'text/plain', ['charset' => 'utf-8', 'param' => 'this;should,not=matter', 'footnotes' => 'true'],
                 'text/plain;charset=utf-8;param="this;should,not=matter";footnotes=true',
-            ),
-        );
+            ],
+        ];
     }
 
     public function testValue()
     {
-        $item = new AcceptHeaderItem('value', array());
+        $item = new AcceptHeaderItem('value', []);
         $this->assertEquals('value', $item->getValue());
 
         $item->setValue('new value');
@@ -85,7 +85,7 @@ class AcceptHeaderItemTest extends TestCase
 
     public function testQuality()
     {
-        $item = new AcceptHeaderItem('value', array());
+        $item = new AcceptHeaderItem('value', []);
         $this->assertEquals(1.0, $item->getQuality());
 
         $item->setQuality(0.5);
@@ -98,14 +98,14 @@ class AcceptHeaderItemTest extends TestCase
 
     public function testAttribute()
     {
-        $item = new AcceptHeaderItem('value', array());
-        $this->assertEquals(array(), $item->getAttributes());
+        $item = new AcceptHeaderItem('value', []);
+        $this->assertEquals([], $item->getAttributes());
         $this->assertFalse($item->hasAttribute('test'));
         $this->assertNull($item->getAttribute('test'));
         $this->assertEquals('default', $item->getAttribute('test', 'default'));
 
         $item->setAttribute('test', 'value');
-        $this->assertEquals(array('test' => 'value'), $item->getAttributes());
+        $this->assertEquals(['test' => 'value'], $item->getAttributes());
         $this->assertTrue($item->hasAttribute('test'));
         $this->assertEquals('value', $item->getAttribute('test'));
         $this->assertEquals('value', $item->getAttribute('test', 'default'));
diff --git a/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php b/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php
index 9929eac2..31998696 100644
--- a/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php
+++ b/vendor/symfony/http-foundation/Tests/AcceptHeaderTest.php
@@ -39,13 +39,13 @@ class AcceptHeaderTest extends TestCase
 
     public function provideFromStringData()
     {
-        return array(
-            array('', array()),
-            array('gzip', array(new AcceptHeaderItem('gzip'))),
-            array('gzip,deflate,sdch', array(new AcceptHeaderItem('gzip'), new AcceptHeaderItem('deflate'), new AcceptHeaderItem('sdch'))),
-            array("gzip, deflate\t,sdch", array(new AcceptHeaderItem('gzip'), new AcceptHeaderItem('deflate'), new AcceptHeaderItem('sdch'))),
-            array('"this;should,not=matter"', array(new AcceptHeaderItem('this;should,not=matter'))),
-        );
+        return [
+            ['', []],
+            ['gzip', [new AcceptHeaderItem('gzip')]],
+            ['gzip,deflate,sdch', [new AcceptHeaderItem('gzip'), new AcceptHeaderItem('deflate'), new AcceptHeaderItem('sdch')]],
+            ["gzip, deflate\t,sdch", [new AcceptHeaderItem('gzip'), new AcceptHeaderItem('deflate'), new AcceptHeaderItem('sdch')]],
+            ['"this;should,not=matter"', [new AcceptHeaderItem('this;should,not=matter')]],
+        ];
     }
 
     /**
@@ -59,12 +59,12 @@ class AcceptHeaderTest extends TestCase
 
     public function provideToStringData()
     {
-        return array(
-            array(array(), ''),
-            array(array(new AcceptHeaderItem('gzip')), 'gzip'),
-            array(array(new AcceptHeaderItem('gzip'), new AcceptHeaderItem('deflate'), new AcceptHeaderItem('sdch')), 'gzip,deflate,sdch'),
-            array(array(new AcceptHeaderItem('this;should,not=matter')), 'this;should,not=matter'),
-        );
+        return [
+            [[], ''],
+            [[new AcceptHeaderItem('gzip')], 'gzip'],
+            [[new AcceptHeaderItem('gzip'), new AcceptHeaderItem('deflate'), new AcceptHeaderItem('sdch')], 'gzip,deflate,sdch'],
+            [[new AcceptHeaderItem('this;should,not=matter')], 'this;should,not=matter'],
+        ];
     }
 
     /**
@@ -78,9 +78,9 @@ class AcceptHeaderTest extends TestCase
 
     public function provideFilterData()
     {
-        return array(
-            array('fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4', '/fr.*/', array('fr-FR', 'fr')),
-        );
+        return [
+            ['fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4', '/fr.*/', ['fr-FR', 'fr']],
+        ];
     }
 
     /**
@@ -94,10 +94,10 @@ class AcceptHeaderTest extends TestCase
 
     public function provideSortingData()
     {
-        return array(
-            'quality has priority' => array('*;q=0.3,ISO-8859-1,utf-8;q=0.7',  array('ISO-8859-1', 'utf-8', '*')),
-            'order matters when q is equal' => array('*;q=0.3,ISO-8859-1;q=0.7,utf-8;q=0.7',  array('ISO-8859-1', 'utf-8', '*')),
-            'order matters when q is equal2' => array('*;q=0.3,utf-8;q=0.7,ISO-8859-1;q=0.7',  array('utf-8', 'ISO-8859-1', '*')),
-        );
+        return [
+            'quality has priority' => ['*;q=0.3,ISO-8859-1,utf-8;q=0.7', ['ISO-8859-1', 'utf-8', '*']],
+            'order matters when q is equal' => ['*;q=0.3,ISO-8859-1;q=0.7,utf-8;q=0.7', ['ISO-8859-1', 'utf-8', '*']],
+            'order matters when q is equal2' => ['*;q=0.3,utf-8;q=0.7,ISO-8859-1;q=0.7', ['utf-8', 'ISO-8859-1', '*']],
+        ];
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/ApacheRequestTest.php b/vendor/symfony/http-foundation/Tests/ApacheRequestTest.php
index 157ab90e..6fa3b889 100644
--- a/vendor/symfony/http-foundation/Tests/ApacheRequestTest.php
+++ b/vendor/symfony/http-foundation/Tests/ApacheRequestTest.php
@@ -31,63 +31,63 @@ class ApacheRequestTest extends TestCase
 
     public function provideServerVars()
     {
-        return array(
-            array(
-                array(
+        return [
+            [
+                [
                     'REQUEST_URI' => '/foo/app_dev.php/bar',
                     'SCRIPT_NAME' => '/foo/app_dev.php',
                     'PATH_INFO' => '/bar',
-                ),
+                ],
                 '/foo/app_dev.php/bar',
                 '/foo/app_dev.php',
                 '/bar',
-            ),
-            array(
-                array(
+            ],
+            [
+                [
                     'REQUEST_URI' => '/foo/bar',
                     'SCRIPT_NAME' => '/foo/app_dev.php',
-                ),
+                ],
                 '/foo/bar',
                 '/foo',
                 '/bar',
-            ),
-            array(
-                array(
+            ],
+            [
+                [
                     'REQUEST_URI' => '/app_dev.php/foo/bar',
                     'SCRIPT_NAME' => '/app_dev.php',
                     'PATH_INFO' => '/foo/bar',
-                ),
+                ],
                 '/app_dev.php/foo/bar',
                 '/app_dev.php',
                 '/foo/bar',
-            ),
-            array(
-                array(
+            ],
+            [
+                [
                     'REQUEST_URI' => '/foo/bar',
                     'SCRIPT_NAME' => '/app_dev.php',
-                ),
+                ],
                 '/foo/bar',
                 '',
                 '/foo/bar',
-            ),
-            array(
-                array(
+            ],
+            [
+                [
                     'REQUEST_URI' => '/app_dev.php',
                     'SCRIPT_NAME' => '/app_dev.php',
-                ),
+                ],
                 '/app_dev.php',
                 '/app_dev.php',
                 '/',
-            ),
-            array(
-                array(
+            ],
+            [
+                [
                     'REQUEST_URI' => '/',
                     'SCRIPT_NAME' => '/app_dev.php',
-                ),
+                ],
                 '/',
                 '',
                 '/',
-            ),
-        );
+            ],
+        ];
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php b/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php
index 1b9e5899..c89f20d0 100644
--- a/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/BinaryFileResponseTest.php
@@ -22,14 +22,14 @@ class BinaryFileResponseTest extends ResponseTestCase
     public function testConstruction()
     {
         $file = __DIR__.'/../README.md';
-        $response = new BinaryFileResponse($file, 404, array('X-Header' => 'Foo'), true, null, true, true);
+        $response = new BinaryFileResponse($file, 404, ['X-Header' => 'Foo'], true, null, true, true);
         $this->assertEquals(404, $response->getStatusCode());
         $this->assertEquals('Foo', $response->headers->get('X-Header'));
         $this->assertTrue($response->headers->has('ETag'));
         $this->assertTrue($response->headers->has('Last-Modified'));
         $this->assertFalse($response->headers->has('Content-Disposition'));
 
-        $response = BinaryFileResponse::create($file, 404, array(), true, ResponseHeaderBag::DISPOSITION_INLINE);
+        $response = BinaryFileResponse::create($file, 404, [], true, ResponseHeaderBag::DISPOSITION_INLINE);
         $this->assertEquals(404, $response->getStatusCode());
         $this->assertFalse($response->headers->has('ETag'));
         $this->assertEquals('inline; filename="README.md"', $response->headers->get('Content-Disposition'));
@@ -39,7 +39,7 @@ class BinaryFileResponseTest extends ResponseTestCase
     {
         touch(sys_get_temp_dir().'/fööö.html');
 
-        $response = new BinaryFileResponse(sys_get_temp_dir().'/fööö.html', 200, array(), true, 'attachment');
+        $response = new BinaryFileResponse(sys_get_temp_dir().'/fööö.html', 200, [], true, 'attachment');
 
         @unlink(sys_get_temp_dir().'/fööö.html');
 
@@ -85,7 +85,7 @@ class BinaryFileResponseTest extends ResponseTestCase
      */
     public function testRequests($requestRange, $offset, $length, $responseRange)
     {
-        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'))->setAutoEtag();
+        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, ['Content-Type' => 'application/octet-stream'])->setAutoEtag();
 
         // do a request to get the ETag
         $request = Request::create('/');
@@ -117,7 +117,7 @@ class BinaryFileResponseTest extends ResponseTestCase
      */
     public function testRequestsWithoutEtag($requestRange, $offset, $length, $responseRange)
     {
-        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'));
+        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, ['Content-Type' => 'application/octet-stream']);
 
         // do a request to get the LastModified
         $request = Request::create('/');
@@ -145,19 +145,19 @@ class BinaryFileResponseTest extends ResponseTestCase
 
     public function provideRanges()
     {
-        return array(
-            array('bytes=1-4', 1, 4, 'bytes 1-4/35'),
-            array('bytes=-5', 30, 5, 'bytes 30-34/35'),
-            array('bytes=30-', 30, 5, 'bytes 30-34/35'),
-            array('bytes=30-30', 30, 1, 'bytes 30-30/35'),
-            array('bytes=30-34', 30, 5, 'bytes 30-34/35'),
-        );
+        return [
+            ['bytes=1-4', 1, 4, 'bytes 1-4/35'],
+            ['bytes=-5', 30, 5, 'bytes 30-34/35'],
+            ['bytes=30-', 30, 5, 'bytes 30-34/35'],
+            ['bytes=30-30', 30, 1, 'bytes 30-30/35'],
+            ['bytes=30-34', 30, 5, 'bytes 30-34/35'],
+        ];
     }
 
     public function testRangeRequestsWithoutLastModifiedDate()
     {
         // prevent auto last modified
-        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'), true, null, false, false);
+        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, ['Content-Type' => 'application/octet-stream'], true, null, false, false);
 
         // prepare a request for a range of the testing file
         $request = Request::create('/');
@@ -178,7 +178,7 @@ class BinaryFileResponseTest extends ResponseTestCase
      */
     public function testFullFileRequests($requestRange)
     {
-        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'))->setAutoEtag();
+        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, ['Content-Type' => 'application/octet-stream'])->setAutoEtag();
 
         // prepare a request for a range of the testing file
         $request = Request::create('/');
@@ -198,14 +198,27 @@ class BinaryFileResponseTest extends ResponseTestCase
 
     public function provideFullFileRanges()
     {
-        return array(
-            array('bytes=0-'),
-            array('bytes=0-34'),
-            array('bytes=-35'),
+        return [
+            ['bytes=0-'],
+            ['bytes=0-34'],
+            ['bytes=-35'],
             // Syntactical invalid range-request should also return the full resource
-            array('bytes=20-10'),
-            array('bytes=50-40'),
-        );
+            ['bytes=20-10'],
+            ['bytes=50-40'],
+        ];
+    }
+
+    public function testUnpreparedResponseSendsFullFile()
+    {
+        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200);
+
+        $data = file_get_contents(__DIR__.'/File/Fixtures/test.gif');
+
+        $this->expectOutputString($data);
+        $response = clone $response;
+        $response->sendContent();
+
+        $this->assertEquals(200, $response->getStatusCode());
     }
 
     /**
@@ -213,7 +226,7 @@ class BinaryFileResponseTest extends ResponseTestCase
      */
     public function testInvalidRequests($requestRange)
     {
-        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'))->setAutoEtag();
+        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, ['Content-Type' => 'application/octet-stream'])->setAutoEtag();
 
         // prepare a request for a range of the testing file
         $request = Request::create('/');
@@ -229,10 +242,10 @@ class BinaryFileResponseTest extends ResponseTestCase
 
     public function provideInvalidRanges()
     {
-        return array(
-            array('bytes=-40'),
-            array('bytes=30-40'),
-        );
+        return [
+            ['bytes=-40'],
+            ['bytes=30-40'],
+        ];
     }
 
     /**
@@ -244,7 +257,7 @@ class BinaryFileResponseTest extends ResponseTestCase
         $request->headers->set('X-Sendfile-Type', 'X-Sendfile');
 
         BinaryFileResponse::trustXSendfileTypeHeader();
-        $response = BinaryFileResponse::create($file, 200, array('Content-Type' => 'application/octet-stream'));
+        $response = BinaryFileResponse::create($file, 200, ['Content-Type' => 'application/octet-stream']);
         $response->prepare($request);
 
         $this->expectOutputString('');
@@ -255,10 +268,10 @@ class BinaryFileResponseTest extends ResponseTestCase
 
     public function provideXSendfileFiles()
     {
-        return array(
-            array(__DIR__.'/../README.md'),
-            array('file://'.__DIR__.'/../README.md'),
-        );
+        return [
+            [__DIR__.'/../README.md'],
+            ['file://'.__DIR__.'/../README.md'],
+        ];
     }
 
     /**
@@ -273,7 +286,7 @@ class BinaryFileResponseTest extends ResponseTestCase
         $file = new FakeFile($realpath, __DIR__.'/File/Fixtures/test');
 
         BinaryFileResponse::trustXSendfileTypeHeader();
-        $response = new BinaryFileResponse($file, 200, array('Content-Type' => 'application/octet-stream'));
+        $response = new BinaryFileResponse($file, 200, ['Content-Type' => 'application/octet-stream']);
         $reflection = new \ReflectionObject($response);
         $property = $reflection->getProperty('file');
         $property->setAccessible(true);
@@ -292,7 +305,7 @@ class BinaryFileResponseTest extends ResponseTestCase
         $realPath = realpath($path);
         $this->assertFileExists($realPath);
 
-        $response = new BinaryFileResponse($realPath, 200, array('Content-Type' => 'application/octet-stream'));
+        $response = new BinaryFileResponse($realPath, 200, ['Content-Type' => 'application/octet-stream']);
         $response->deleteFileAfterSend(true);
 
         $response->prepare($request);
@@ -304,7 +317,7 @@ class BinaryFileResponseTest extends ResponseTestCase
     public function testAcceptRangeOnUnsafeMethods()
     {
         $request = Request::create('/', 'POST');
-        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'));
+        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, ['Content-Type' => 'application/octet-stream']);
         $response->prepare($request);
 
         $this->assertEquals('none', $response->headers->get('Accept-Ranges'));
@@ -313,7 +326,7 @@ class BinaryFileResponseTest extends ResponseTestCase
     public function testAcceptRangeNotOverriden()
     {
         $request = Request::create('/', 'POST');
-        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, array('Content-Type' => 'application/octet-stream'));
+        $response = BinaryFileResponse::create(__DIR__.'/File/Fixtures/test.gif', 200, ['Content-Type' => 'application/octet-stream']);
         $response->headers->set('Accept-Ranges', 'foo');
         $response->prepare($request);
 
@@ -322,16 +335,16 @@ class BinaryFileResponseTest extends ResponseTestCase
 
     public function getSampleXAccelMappings()
     {
-        return array(
-            array('/var/www/var/www/files/foo.txt', '/var/www/=/files/', '/files/var/www/files/foo.txt'),
-            array('/home/foo/bar.txt', '/var/www/=/files/,/home/foo/=/baz/', '/baz/bar.txt'),
-        );
+        return [
+            ['/var/www/var/www/files/foo.txt', '/var/www/=/files/', '/files/var/www/files/foo.txt'],
+            ['/home/foo/bar.txt', '/var/www/=/files/,/home/foo/=/baz/', '/baz/bar.txt'],
+        ];
     }
 
     public function testStream()
     {
         $request = Request::create('/');
-        $response = new BinaryFileResponse(new Stream(__DIR__.'/../README.md'), 200, array('Content-Type' => 'text/plain'));
+        $response = new BinaryFileResponse(new Stream(__DIR__.'/../README.md'), 200, ['Content-Type' => 'text/plain']);
         $response->prepare($request);
 
         $this->assertNull($response->headers->get('Content-Length'));
@@ -339,7 +352,7 @@ class BinaryFileResponseTest extends ResponseTestCase
 
     protected function provideResponse()
     {
-        return new BinaryFileResponse(__DIR__.'/../README.md', 200, array('Content-Type' => 'application/octet-stream'));
+        return new BinaryFileResponse(__DIR__.'/../README.md', 200, ['Content-Type' => 'application/octet-stream']);
     }
 
     public static function tearDownAfterClass()
diff --git a/vendor/symfony/http-foundation/Tests/CookieTest.php b/vendor/symfony/http-foundation/Tests/CookieTest.php
index 070b7dd4..aaf2edb3 100644
--- a/vendor/symfony/http-foundation/Tests/CookieTest.php
+++ b/vendor/symfony/http-foundation/Tests/CookieTest.php
@@ -26,17 +26,17 @@ class CookieTest extends TestCase
 {
     public function invalidNames()
     {
-        return array(
-            array(''),
-            array(',MyName'),
-            array(';MyName'),
-            array(' MyName'),
-            array("\tMyName"),
-            array("\rMyName"),
-            array("\nMyName"),
-            array("\013MyName"),
-            array("\014MyName"),
-        );
+        return [
+            [''],
+            [',MyName'],
+            [';MyName'],
+            [' MyName'],
+            ["\tMyName"],
+            ["\rMyName"],
+            ["\nMyName"],
+            ["\013MyName"],
+            ["\014MyName"],
+        ];
     }
 
     /**
@@ -157,18 +157,30 @@ class CookieTest extends TestCase
         $cookie = new Cookie('foo', 'bar', time() - 20);
 
         $this->assertTrue($cookie->isCleared(), '->isCleared() returns true if the cookie has expired');
+
+        $cookie = new Cookie('foo', 'bar');
+
+        $this->assertFalse($cookie->isCleared());
+
+        $cookie = new Cookie('foo', 'bar', 0);
+
+        $this->assertFalse($cookie->isCleared());
+
+        $cookie = new Cookie('foo', 'bar', -1);
+
+        $this->assertFalse($cookie->isCleared());
     }
 
     public function testToString()
     {
         $cookie = new Cookie('foo', 'bar', $expire = strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true);
-        $this->assertEquals('foo=bar; expires=Fri, 20-May-2011 15:25:52 GMT; max-age='.($expire - time()).'; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() returns string representation of the cookie');
+        $this->assertEquals('foo=bar; expires=Fri, 20-May-2011 15:25:52 GMT; Max-Age=0; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() returns string representation of the cookie');
 
         $cookie = new Cookie('foo', 'bar with white spaces', strtotime('Fri, 20-May-2011 15:25:52 GMT'), '/', '.myfoodomain.com', true);
-        $this->assertEquals('foo=bar%20with%20white%20spaces; expires=Fri, 20-May-2011 15:25:52 GMT; max-age='.($expire - time()).'; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() encodes the value of the cookie according to RFC 3986 (white space = %20)');
+        $this->assertEquals('foo=bar%20with%20white%20spaces; expires=Fri, 20-May-2011 15:25:52 GMT; Max-Age=0; path=/; domain=.myfoodomain.com; secure; httponly', (string) $cookie, '->__toString() encodes the value of the cookie according to RFC 3986 (white space = %20)');
 
         $cookie = new Cookie('foo', null, 1, '/admin/', '.myfoodomain.com');
-        $this->assertEquals('foo=deleted; expires='.gmdate('D, d-M-Y H:i:s T', $expire = time() - 31536001).'; max-age='.($expire - time()).'; path=/admin/; domain=.myfoodomain.com; httponly', (string) $cookie, '->__toString() returns string representation of a cleared cookie if value is NULL');
+        $this->assertEquals('foo=deleted; expires='.gmdate('D, d-M-Y H:i:s T', $expire = time() - 31536001).'; Max-Age=0; path=/admin/; domain=.myfoodomain.com; httponly', (string) $cookie, '->__toString() returns string representation of a cleared cookie if value is NULL');
 
         $cookie = new Cookie('foo', 'bar', 0, '/', '');
         $this->assertEquals('foo=bar; path=/; httponly', (string) $cookie);
@@ -194,7 +206,7 @@ class CookieTest extends TestCase
         $this->assertEquals($expire - time(), $cookie->getMaxAge());
 
         $cookie = new Cookie('foo', 'bar', $expire = time() - 100);
-        $this->assertEquals($expire - time(), $cookie->getMaxAge());
+        $this->assertEquals(0, $cookie->getMaxAge());
     }
 
     public function testFromString()
diff --git a/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php b/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php
index 1152e46c..2afdade6 100644
--- a/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php
+++ b/vendor/symfony/http-foundation/Tests/ExpressionRequestMatcherTest.php
@@ -55,15 +55,15 @@ class ExpressionRequestMatcherTest extends TestCase
 
     public function provideExpressions()
     {
-        return array(
-            array('request.getMethod() == method', true),
-            array('request.getPathInfo() == path', true),
-            array('request.getHost() == host', true),
-            array('request.getClientIp() == ip', true),
-            array('request.attributes.all() == attributes', true),
-            array('request.getMethod() == method && request.getPathInfo() == path && request.getHost() == host && request.getClientIp() == ip &&  request.attributes.all() == attributes', true),
-            array('request.getMethod() != method', false),
-            array('request.getMethod() != method && request.getPathInfo() == path && request.getHost() == host && request.getClientIp() == ip &&  request.attributes.all() == attributes', false),
-        );
+        return [
+            ['request.getMethod() == method', true],
+            ['request.getPathInfo() == path', true],
+            ['request.getHost() == host', true],
+            ['request.getClientIp() == ip', true],
+            ['request.attributes.all() == attributes', true],
+            ['request.getMethod() == method && request.getPathInfo() == path && request.getHost() == host && request.getClientIp() == ip &&  request.attributes.all() == attributes', true],
+            ['request.getMethod() != method', false],
+            ['request.getMethod() != method && request.getPathInfo() == path && request.getHost() == host && request.getClientIp() == ip &&  request.attributes.all() == attributes', false],
+        ];
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/File/FileTest.php b/vendor/symfony/http-foundation/Tests/File/FileTest.php
index dbd9c44b..fb82dae7 100644
--- a/vendor/symfony/http-foundation/Tests/File/FileTest.php
+++ b/vendor/symfony/http-foundation/Tests/File/FileTest.php
@@ -110,14 +110,14 @@ class FileTest extends TestCase
 
     public function getFilenameFixtures()
     {
-        return array(
-            array('original.gif', 'original.gif'),
-            array('..\\..\\original.gif', 'original.gif'),
-            array('../../original.gif', 'original.gif'),
-            array('Ñ?айлfile.gif', 'Ñ?айлfile.gif'),
-            array('..\\..\\Ñ?айлfile.gif', 'Ñ?айлfile.gif'),
-            array('../../Ñ?айлfile.gif', 'Ñ?айлfile.gif'),
-        );
+        return [
+            ['original.gif', 'original.gif'],
+            ['..\\..\\original.gif', 'original.gif'],
+            ['../../original.gif', 'original.gif'],
+            ['Ñ?айлfile.gif', 'Ñ?айлfile.gif'],
+            ['..\\..\\Ñ?айлfile.gif', 'Ñ?айлfile.gif'],
+            ['../../Ñ?айлfile.gif', 'Ñ?айлfile.gif'],
+        ];
     }
 
     /**
diff --git a/vendor/symfony/http-foundation/Tests/File/Fixtures/case-sensitive-mime-type.xlsm b/vendor/symfony/http-foundation/Tests/File/Fixtures/case-sensitive-mime-type.xlsm
new file mode 100644
index 00000000..94d85e61
Binary files /dev/null and b/vendor/symfony/http-foundation/Tests/File/Fixtures/case-sensitive-mime-type.xlsm differ
diff --git a/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php b/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php
index 5a2b7a21..bb88807a 100644
--- a/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php
+++ b/vendor/symfony/http-foundation/Tests/File/MimeType/MimeTypeTest.php
@@ -12,8 +12,8 @@
 namespace Symfony\Component\HttpFoundation\Tests\File\MimeType;
 
 use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
 use Symfony\Component\HttpFoundation\File\MimeType\FileBinaryMimeTypeGuesser;
+use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser;
 
 /**
  * @requires extension fileinfo
@@ -59,7 +59,7 @@ class MimeTypeTest extends TestCase
 
     public function testGuessWithNonReadablePath()
     {
-        if ('\\' === DIRECTORY_SEPARATOR) {
+        if ('\\' === \DIRECTORY_SEPARATOR) {
             $this->markTestSkipped('Can not verify chmod operations on Windows');
         }
 
@@ -71,7 +71,7 @@ class MimeTypeTest extends TestCase
         touch($path);
         @chmod($path, 0333);
 
-        if (substr(sprintf('%o', fileperms($path)), -4) == '0333') {
+        if ('0333' == substr(sprintf('%o', fileperms($path)), -4)) {
             $this->{method_exists($this, $_ = 'expectException') ? $_ : 'setExpectedException'}('Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException');
             MimeTypeGuesser::getInstance()->guess($path);
         } else {
diff --git a/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php b/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php
index 36f122fe..5a37cda3 100644
--- a/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php
+++ b/vendor/symfony/http-foundation/Tests/File/UploadedFileTest.php
@@ -46,7 +46,7 @@ class UploadedFileTest extends TestCase
 
         $this->assertEquals('application/octet-stream', $file->getClientMimeType());
 
-        if (extension_loaded('fileinfo')) {
+        if (\extension_loaded('fileinfo')) {
             $this->assertEquals('image/gif', $file->getMimeType());
         }
     }
@@ -90,6 +90,19 @@ class UploadedFileTest extends TestCase
         $this->assertEquals('jpeg', $file->guessClientExtension());
     }
 
+    public function testCaseSensitiveMimeType()
+    {
+        $file = new UploadedFile(
+            __DIR__.'/Fixtures/case-sensitive-mime-type.xlsm',
+            'test.xlsm',
+            'application/vnd.ms-excel.sheet.macroEnabled.12',
+            filesize(__DIR__.'/Fixtures/case-sensitive-mime-type.xlsm'),
+            null
+        );
+
+        $this->assertEquals('xlsm', $file->guessClientExtension());
+    }
+
     public function testErrorIsOkByDefault()
     {
         $file = new UploadedFile(
@@ -249,13 +262,13 @@ class UploadedFileTest extends TestCase
 
     public function uploadedFileErrorProvider()
     {
-        return array(
-            array(UPLOAD_ERR_INI_SIZE),
-            array(UPLOAD_ERR_FORM_SIZE),
-            array(UPLOAD_ERR_PARTIAL),
-            array(UPLOAD_ERR_NO_TMP_DIR),
-            array(UPLOAD_ERR_EXTENSION),
-        );
+        return [
+            [UPLOAD_ERR_INI_SIZE],
+            [UPLOAD_ERR_FORM_SIZE],
+            [UPLOAD_ERR_PARTIAL],
+            [UPLOAD_ERR_NO_TMP_DIR],
+            [UPLOAD_ERR_EXTENSION],
+        ];
     }
 
     public function testIsInvalidIfNotHttpUpload()
diff --git a/vendor/symfony/http-foundation/Tests/FileBagTest.php b/vendor/symfony/http-foundation/Tests/FileBagTest.php
index e7defa67..0b6d6604 100644
--- a/vendor/symfony/http-foundation/Tests/FileBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/FileBagTest.php
@@ -28,7 +28,7 @@ class FileBagTest extends TestCase
      */
     public function testFileMustBeAnArrayOrUploadedFile()
     {
-        new FileBag(array('file' => 'foo'));
+        new FileBag(['file' => 'foo']);
     }
 
     public function testShouldConvertsUploadedFiles()
@@ -36,54 +36,80 @@ class FileBagTest extends TestCase
         $tmpFile = $this->createTempFile();
         $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
 
-        $bag = new FileBag(array('file' => array(
+        $bag = new FileBag(['file' => [
             'name' => basename($tmpFile),
             'type' => 'text/plain',
             'tmp_name' => $tmpFile,
             'error' => 0,
             'size' => 100,
-        )));
+        ]]);
 
         $this->assertEquals($file, $bag->get('file'));
     }
 
     public function testShouldSetEmptyUploadedFilesToNull()
     {
-        $bag = new FileBag(array('file' => array(
+        $bag = new FileBag(['file' => [
             'name' => '',
             'type' => '',
             'tmp_name' => '',
             'error' => UPLOAD_ERR_NO_FILE,
             'size' => 0,
-        )));
+        ]]);
 
         $this->assertNull($bag->get('file'));
     }
 
+    public function testShouldRemoveEmptyUploadedFilesForMultiUpload()
+    {
+        $bag = new FileBag(['files' => [
+            'name' => [''],
+            'type' => [''],
+            'tmp_name' => [''],
+            'error' => [UPLOAD_ERR_NO_FILE],
+            'size' => [0],
+        ]]);
+
+        $this->assertSame([], $bag->get('files'));
+    }
+
+    public function testShouldNotRemoveEmptyUploadedFilesForAssociativeArray()
+    {
+        $bag = new FileBag(['files' => [
+            'name' => ['file1' => ''],
+            'type' => ['file1' => ''],
+            'tmp_name' => ['file1' => ''],
+            'error' => ['file1' => UPLOAD_ERR_NO_FILE],
+            'size' => ['file1' => 0],
+        ]]);
+
+        $this->assertSame(['file1' => null], $bag->get('files'));
+    }
+
     public function testShouldConvertUploadedFilesWithPhpBug()
     {
         $tmpFile = $this->createTempFile();
         $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
 
-        $bag = new FileBag(array(
-            'child' => array(
-                'name' => array(
+        $bag = new FileBag([
+            'child' => [
+                'name' => [
                     'file' => basename($tmpFile),
-                ),
-                'type' => array(
+                ],
+                'type' => [
                     'file' => 'text/plain',
-                ),
-                'tmp_name' => array(
+                ],
+                'tmp_name' => [
                     'file' => $tmpFile,
-                ),
-                'error' => array(
+                ],
+                'error' => [
                     'file' => 0,
-                ),
-                'size' => array(
+                ],
+                'size' => [
                     'file' => 100,
-                ),
-            ),
-        ));
+                ],
+            ],
+        ]);
 
         $files = $bag->all();
         $this->assertEquals($file, $files['child']['file']);
@@ -94,25 +120,25 @@ class FileBagTest extends TestCase
         $tmpFile = $this->createTempFile();
         $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
 
-        $bag = new FileBag(array(
-            'child' => array(
-                'name' => array(
-                    'sub' => array('file' => basename($tmpFile)),
-                ),
-                'type' => array(
-                    'sub' => array('file' => 'text/plain'),
-                ),
-                'tmp_name' => array(
-                    'sub' => array('file' => $tmpFile),
-                ),
-                'error' => array(
-                    'sub' => array('file' => 0),
-                ),
-                'size' => array(
-                    'sub' => array('file' => 100),
-                ),
-            ),
-        ));
+        $bag = new FileBag([
+            'child' => [
+                'name' => [
+                    'sub' => ['file' => basename($tmpFile)],
+                ],
+                'type' => [
+                    'sub' => ['file' => 'text/plain'],
+                ],
+                'tmp_name' => [
+                    'sub' => ['file' => $tmpFile],
+                ],
+                'error' => [
+                    'sub' => ['file' => 0],
+                ],
+                'size' => [
+                    'sub' => ['file' => 100],
+                ],
+            ],
+        ]);
 
         $files = $bag->all();
         $this->assertEquals($file, $files['child']['sub']['file']);
@@ -122,7 +148,7 @@ class FileBagTest extends TestCase
     {
         $tmpFile = $this->createTempFile();
         $file = new UploadedFile($tmpFile, basename($tmpFile), 'text/plain', 100, 0);
-        $bag = new FileBag(array('image' => array('file' => $file)));
+        $bag = new FileBag(['image' => ['file' => $file]]);
 
         $files = $bag->all();
         $this->assertEquals($file, $files['image']['file']);
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/common.inc b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/common.inc
new file mode 100644
index 00000000..0bdf9e4b
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/common.inc
@@ -0,0 +1,43 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Response;
+
+$parent = __DIR__;
+while (!@file_exists($parent.'/vendor/autoload.php')) {
+    if (!@file_exists($parent)) {
+        // open_basedir restriction in effect
+        break;
+    }
+    if ($parent === dirname($parent)) {
+        echo "vendor/autoload.php not found\n";
+        exit(1);
+    }
+
+    $parent = dirname($parent);
+}
+
+require $parent.'/vendor/autoload.php';
+
+error_reporting(-1);
+ini_set('html_errors', 0);
+ini_set('display_errors', 1);
+
+if (filter_var(ini_get('xdebug.default_enable'), FILTER_VALIDATE_BOOLEAN)) {
+    xdebug_disable();
+}
+
+header_remove('X-Powered-By');
+header('Content-Type: text/plain; charset=utf-8');
+
+register_shutdown_function(function () {
+    echo "\n";
+    session_write_close();
+    print_r(headers_list());
+    echo "shutdown\n";
+});
+ob_start();
+
+$r = new Response();
+$r->headers->set('Date', 'Sat, 12 Nov 1955 20:04:00 GMT');
+
+return $r;
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.expected b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.expected
new file mode 100644
index 00000000..bdb9d023
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.expected
@@ -0,0 +1,11 @@
+
+Warning: Expiry date cannot have a year greater than 9999 in %scookie_max_age.php on line 10
+
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: no-cache, private
+    [2] => Date: Sat, 12 Nov 1955 20:04:00 GMT
+    [3] => Set-Cookie: foo=bar; expires=Sat, 01-Jan-10000 02:46:40 GMT; Max-Age=%d; path=/
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php
new file mode 100644
index 00000000..8775a5cc
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_max_age.php
@@ -0,0 +1,10 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Cookie;
+
+$r = require __DIR__.'/common.inc';
+
+$r->headers->setCookie(new Cookie('foo', 'bar', 253402310800, '', null, false, false));
+$r->sendHeaders();
+
+setcookie('foo2', 'bar', 253402310800, '/');
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.expected b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.expected
new file mode 100644
index 00000000..0c097972
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.expected
@@ -0,0 +1,10 @@
+
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: no-cache, private
+    [2] => Date: Sat, 12 Nov 1955 20:04:00 GMT
+    [3] => Set-Cookie: ?*():@&+$/%#[]=?*():@&+$/%#[]; path=/
+    [4] => Set-Cookie: ?*():@&+$/%#[]=?*():@&+$/%#[]; path=/
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php
new file mode 100644
index 00000000..2ca5b59f
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_raw_urlencode.php
@@ -0,0 +1,12 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Cookie;
+
+$r = require __DIR__.'/common.inc';
+
+$str = '?*():@&+$/%#[]';
+
+$r->headers->setCookie(new Cookie($str, $str, 0, '/', null, false, false, true));
+$r->sendHeaders();
+
+setrawcookie($str, $str, 0, '/', null, false, false);
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_lax.expected b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_lax.expected
new file mode 100644
index 00000000..cbde2cbf
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_lax.expected
@@ -0,0 +1,9 @@
+
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: no-cache, private
+    [2] => Date: Sat, 12 Nov 1955 20:04:00 GMT
+    [3] => Set-Cookie: CookieSamesiteLaxTest=LaxValue; path=/; httponly; samesite=lax
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_lax.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_lax.php
new file mode 100644
index 00000000..9a476f1d
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_lax.php
@@ -0,0 +1,8 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Cookie;
+
+$r = require __DIR__.'/common.inc';
+
+$r->headers->setCookie(new Cookie('CookieSamesiteLaxTest', 'LaxValue', 0, '/', null, false, true, false, Cookie::SAMESITE_LAX));
+$r->sendHeaders();
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_strict.expected b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_strict.expected
new file mode 100644
index 00000000..adc491fd
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_strict.expected
@@ -0,0 +1,9 @@
+
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: no-cache, private
+    [2] => Date: Sat, 12 Nov 1955 20:04:00 GMT
+    [3] => Set-Cookie: CookieSamesiteStrictTest=StrictValue; path=/; httponly; samesite=strict
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_strict.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_strict.php
new file mode 100644
index 00000000..3bcb41f8
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_samesite_strict.php
@@ -0,0 +1,8 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Cookie;
+
+$r = require __DIR__.'/common.inc';
+
+$r->headers->setCookie(new Cookie('CookieSamesiteStrictTest', 'StrictValue', 0, '/', null, false, true, false, Cookie::SAMESITE_STRICT));
+$r->sendHeaders();
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.expected b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.expected
new file mode 100644
index 00000000..14e44a39
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.expected
@@ -0,0 +1,10 @@
+
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: no-cache, private
+    [2] => Date: Sat, 12 Nov 1955 20:04:00 GMT
+    [3] => Set-Cookie: ?*():@&+$/%#[]=%3F%2A%28%29%3A%40%26%2B%24%2F%25%23%5B%5D; path=/
+    [4] => Set-Cookie: ?*():@&+$/%#[]=%3F%2A%28%29%3A%40%26%2B%24%2F%25%23%5B%5D; path=/
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php
new file mode 100644
index 00000000..05b9af30
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/cookie_urlencode.php
@@ -0,0 +1,12 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Cookie;
+
+$r = require __DIR__.'/common.inc';
+
+$str = '?*():@&+$/%#[]';
+
+$r->headers->setCookie(new Cookie($str, $str, 0, '', null, false, false));
+$r->sendHeaders();
+
+setcookie($str, $str, 0, '/');
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.expected b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.expected
new file mode 100644
index 00000000..2b560f0b
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.expected
@@ -0,0 +1,6 @@
+The cookie name "Hello + world" contains invalid characters.
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php
new file mode 100644
index 00000000..3fe15718
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Fixtures/response-functional/invalid_cookie_name.php
@@ -0,0 +1,11 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Cookie;
+
+$r = require __DIR__.'/common.inc';
+
+try {
+    $r->headers->setCookie(new Cookie('Hello + world', 'hodor'));
+} catch (\InvalidArgumentException $e) {
+    echo $e->getMessage();
+}
diff --git a/vendor/symfony/http-foundation/Tests/HeaderBagTest.php b/vendor/symfony/http-foundation/Tests/HeaderBagTest.php
index 1acf5930..6c4915f2 100644
--- a/vendor/symfony/http-foundation/Tests/HeaderBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/HeaderBagTest.php
@@ -18,7 +18,7 @@ class HeaderBagTest extends TestCase
 {
     public function testConstructor()
     {
-        $bag = new HeaderBag(array('foo' => 'bar'));
+        $bag = new HeaderBag(['foo' => 'bar']);
         $this->assertTrue($bag->has('foo'));
     }
 
@@ -30,20 +30,20 @@ class HeaderBagTest extends TestCase
 
     public function testToStringNotNull()
     {
-        $bag = new HeaderBag(array('foo' => 'bar'));
+        $bag = new HeaderBag(['foo' => 'bar']);
         $this->assertEquals("Foo: bar\r\n", $bag->__toString());
     }
 
     public function testKeys()
     {
-        $bag = new HeaderBag(array('foo' => 'bar'));
+        $bag = new HeaderBag(['foo' => 'bar']);
         $keys = $bag->keys();
         $this->assertEquals('foo', $keys[0]);
     }
 
     public function testGetDate()
     {
-        $bag = new HeaderBag(array('foo' => 'Tue, 4 Sep 2012 20:00:00 +0200'));
+        $bag = new HeaderBag(['foo' => 'Tue, 4 Sep 2012 20:00:00 +0200']);
         $headerDate = $bag->getDate('foo');
         $this->assertInstanceOf('DateTime', $headerDate);
     }
@@ -53,7 +53,7 @@ class HeaderBagTest extends TestCase
      */
     public function testGetDateException()
     {
-        $bag = new HeaderBag(array('foo' => 'Tue'));
+        $bag = new HeaderBag(['foo' => 'Tue']);
         $headerDate = $bag->getDate('foo');
     }
 
@@ -67,50 +67,50 @@ class HeaderBagTest extends TestCase
 
     public function testAll()
     {
-        $bag = new HeaderBag(array('foo' => 'bar'));
-        $this->assertEquals(array('foo' => array('bar')), $bag->all(), '->all() gets all the input');
+        $bag = new HeaderBag(['foo' => 'bar']);
+        $this->assertEquals(['foo' => ['bar']], $bag->all(), '->all() gets all the input');
 
-        $bag = new HeaderBag(array('FOO' => 'BAR'));
-        $this->assertEquals(array('foo' => array('BAR')), $bag->all(), '->all() gets all the input key are lower case');
+        $bag = new HeaderBag(['FOO' => 'BAR']);
+        $this->assertEquals(['foo' => ['BAR']], $bag->all(), '->all() gets all the input key are lower case');
     }
 
     public function testReplace()
     {
-        $bag = new HeaderBag(array('foo' => 'bar'));
+        $bag = new HeaderBag(['foo' => 'bar']);
 
-        $bag->replace(array('NOPE' => 'BAR'));
-        $this->assertEquals(array('nope' => array('BAR')), $bag->all(), '->replace() replaces the input with the argument');
+        $bag->replace(['NOPE' => 'BAR']);
+        $this->assertEquals(['nope' => ['BAR']], $bag->all(), '->replace() replaces the input with the argument');
         $this->assertFalse($bag->has('foo'), '->replace() overrides previously set the input');
     }
 
     public function testGet()
     {
-        $bag = new HeaderBag(array('foo' => 'bar', 'fuzz' => 'bizz'));
+        $bag = new HeaderBag(['foo' => 'bar', 'fuzz' => 'bizz']);
         $this->assertEquals('bar', $bag->get('foo'), '->get return current value');
         $this->assertEquals('bar', $bag->get('FoO'), '->get key in case insensitive');
-        $this->assertEquals(array('bar'), $bag->get('foo', 'nope', false), '->get return the value as array');
+        $this->assertEquals(['bar'], $bag->get('foo', 'nope', false), '->get return the value as array');
 
         // defaults
         $this->assertNull($bag->get('none'), '->get unknown values returns null');
         $this->assertEquals('default', $bag->get('none', 'default'), '->get unknown values returns default');
-        $this->assertEquals(array('default'), $bag->get('none', 'default', false), '->get unknown values returns default as array');
+        $this->assertEquals(['default'], $bag->get('none', 'default', false), '->get unknown values returns default as array');
 
         $bag->set('foo', 'bor', false);
         $this->assertEquals('bar', $bag->get('foo'), '->get return first value');
-        $this->assertEquals(array('bar', 'bor'), $bag->get('foo', 'nope', false), '->get return all values as array');
+        $this->assertEquals(['bar', 'bor'], $bag->get('foo', 'nope', false), '->get return all values as array');
     }
 
     public function testSetAssociativeArray()
     {
         $bag = new HeaderBag();
-        $bag->set('foo', array('bad-assoc-index' => 'value'));
+        $bag->set('foo', ['bad-assoc-index' => 'value']);
         $this->assertSame('value', $bag->get('foo'));
-        $this->assertEquals(array('value'), $bag->get('foo', 'nope', false), 'assoc indices of multi-valued headers are ignored');
+        $this->assertEquals(['value'], $bag->get('foo', 'nope', false), 'assoc indices of multi-valued headers are ignored');
     }
 
     public function testContains()
     {
-        $bag = new HeaderBag(array('foo' => 'bar', 'fuzz' => 'bizz'));
+        $bag = new HeaderBag(['foo' => 'bar', 'fuzz' => 'bizz']);
         $this->assertTrue($bag->contains('foo', 'bar'), '->contains first value');
         $this->assertTrue($bag->contains('fuzz', 'bizz'), '->contains second value');
         $this->assertFalse($bag->contains('nope', 'nope'), '->contains unknown value');
@@ -143,7 +143,7 @@ class HeaderBagTest extends TestCase
 
     public function testCacheControlDirectiveParsing()
     {
-        $bag = new HeaderBag(array('cache-control' => 'public, max-age=10'));
+        $bag = new HeaderBag(['cache-control' => 'public, max-age=10']);
         $this->assertTrue($bag->hasCacheControlDirective('public'));
         $this->assertTrue($bag->getCacheControlDirective('public'));
 
@@ -156,15 +156,15 @@ class HeaderBagTest extends TestCase
 
     public function testCacheControlDirectiveParsingQuotedZero()
     {
-        $bag = new HeaderBag(array('cache-control' => 'max-age="0"'));
+        $bag = new HeaderBag(['cache-control' => 'max-age="0"']);
         $this->assertTrue($bag->hasCacheControlDirective('max-age'));
         $this->assertEquals(0, $bag->getCacheControlDirective('max-age'));
     }
 
     public function testCacheControlDirectiveOverrideWithReplace()
     {
-        $bag = new HeaderBag(array('cache-control' => 'private, max-age=100'));
-        $bag->replace(array('cache-control' => 'public, max-age=10'));
+        $bag = new HeaderBag(['cache-control' => 'private, max-age=100']);
+        $bag->replace(['cache-control' => 'public, max-age=10']);
         $this->assertTrue($bag->hasCacheControlDirective('public'));
         $this->assertTrue($bag->getCacheControlDirective('public'));
 
@@ -174,7 +174,7 @@ class HeaderBagTest extends TestCase
 
     public function testCacheControlClone()
     {
-        $headers = array('foo' => 'bar');
+        $headers = ['foo' => 'bar'];
         $bag1 = new HeaderBag($headers);
         $bag2 = new HeaderBag($bag1->all());
 
@@ -183,23 +183,23 @@ class HeaderBagTest extends TestCase
 
     public function testGetIterator()
     {
-        $headers = array('foo' => 'bar', 'hello' => 'world', 'third' => 'charm');
+        $headers = ['foo' => 'bar', 'hello' => 'world', 'third' => 'charm'];
         $headerBag = new HeaderBag($headers);
 
         $i = 0;
         foreach ($headerBag as $key => $val) {
             ++$i;
-            $this->assertEquals(array($headers[$key]), $val);
+            $this->assertEquals([$headers[$key]], $val);
         }
 
-        $this->assertEquals(count($headers), $i);
+        $this->assertEquals(\count($headers), $i);
     }
 
     public function testCount()
     {
-        $headers = array('foo' => 'bar', 'HELLO' => 'WORLD');
+        $headers = ['foo' => 'bar', 'HELLO' => 'WORLD'];
         $headerBag = new HeaderBag($headers);
 
-        $this->assertEquals(count($headers), count($headerBag));
+        $this->assertCount(\count($headers), $headerBag);
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/IpUtilsTest.php b/vendor/symfony/http-foundation/Tests/IpUtilsTest.php
index 297ee3d8..c7f76b5d 100644
--- a/vendor/symfony/http-foundation/Tests/IpUtilsTest.php
+++ b/vendor/symfony/http-foundation/Tests/IpUtilsTest.php
@@ -26,20 +26,20 @@ class IpUtilsTest extends TestCase
 
     public function getIpv4Data()
     {
-        return array(
-            array(true, '192.168.1.1', '192.168.1.1'),
-            array(true, '192.168.1.1', '192.168.1.1/1'),
-            array(true, '192.168.1.1', '192.168.1.0/24'),
-            array(false, '192.168.1.1', '1.2.3.4/1'),
-            array(false, '192.168.1.1', '192.168.1.1/33'), // invalid subnet
-            array(true, '192.168.1.1', array('1.2.3.4/1', '192.168.1.0/24')),
-            array(true, '192.168.1.1', array('192.168.1.0/24', '1.2.3.4/1')),
-            array(false, '192.168.1.1', array('1.2.3.4/1', '4.3.2.1/1')),
-            array(true, '1.2.3.4', '0.0.0.0/0'),
-            array(true, '1.2.3.4', '192.168.1.0/0'),
-            array(false, '1.2.3.4', '256.256.256/0'), // invalid CIDR notation
-            array(false, 'an_invalid_ip', '192.168.1.0/24'),
-        );
+        return [
+            [true, '192.168.1.1', '192.168.1.1'],
+            [true, '192.168.1.1', '192.168.1.1/1'],
+            [true, '192.168.1.1', '192.168.1.0/24'],
+            [false, '192.168.1.1', '1.2.3.4/1'],
+            [false, '192.168.1.1', '192.168.1.1/33'], // invalid subnet
+            [true, '192.168.1.1', ['1.2.3.4/1', '192.168.1.0/24']],
+            [true, '192.168.1.1', ['192.168.1.0/24', '1.2.3.4/1']],
+            [false, '192.168.1.1', ['1.2.3.4/1', '4.3.2.1/1']],
+            [true, '1.2.3.4', '0.0.0.0/0'],
+            [true, '1.2.3.4', '192.168.1.0/0'],
+            [false, '1.2.3.4', '256.256.256/0'], // invalid CIDR notation
+            [false, 'an_invalid_ip', '192.168.1.0/24'],
+        ];
     }
 
     /**
@@ -47,7 +47,7 @@ class IpUtilsTest extends TestCase
      */
     public function testIpv6($matches, $remoteAddr, $cidr)
     {
-        if (!defined('AF_INET6')) {
+        if (!\defined('AF_INET6')) {
             $this->markTestSkipped('Only works when PHP is compiled without the option "disable-ipv6".');
         }
 
@@ -56,18 +56,20 @@ class IpUtilsTest extends TestCase
 
     public function getIpv6Data()
     {
-        return array(
-            array(true, '2a01:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'),
-            array(false, '2a00:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'),
-            array(false, '2a01:198:603:0:396e:4789:8e99:890f', '::1'),
-            array(true, '0:0:0:0:0:0:0:1', '::1'),
-            array(false, '0:0:603:0:396e:4789:8e99:0001', '::1'),
-            array(true, '2a01:198:603:0:396e:4789:8e99:890f', array('::1', '2a01:198:603:0::/65')),
-            array(true, '2a01:198:603:0:396e:4789:8e99:890f', array('2a01:198:603:0::/65', '::1')),
-            array(false, '2a01:198:603:0:396e:4789:8e99:890f', array('::1', '1a01:198:603:0::/65')),
-            array(false, '}__test|O:21:&quot;JDatabaseDriverMysqli&quot;:3:{s:2', '::1'),
-            array(false, '2a01:198:603:0:396e:4789:8e99:890f', 'unknown'),
-        );
+        return [
+            [true, '2a01:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'],
+            [false, '2a00:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65'],
+            [false, '2a01:198:603:0:396e:4789:8e99:890f', '::1'],
+            [true, '0:0:0:0:0:0:0:1', '::1'],
+            [false, '0:0:603:0:396e:4789:8e99:0001', '::1'],
+            [true, '0:0:603:0:396e:4789:8e99:0001', '::/0'],
+            [true, '0:0:603:0:396e:4789:8e99:0001', '2a01:198:603:0::/0'],
+            [true, '2a01:198:603:0:396e:4789:8e99:890f', ['::1', '2a01:198:603:0::/65']],
+            [true, '2a01:198:603:0:396e:4789:8e99:890f', ['2a01:198:603:0::/65', '::1']],
+            [false, '2a01:198:603:0:396e:4789:8e99:890f', ['::1', '1a01:198:603:0::/65']],
+            [false, '}__test|O:21:&quot;JDatabaseDriverMysqli&quot;:3:{s:2', '::1'],
+            [false, '2a01:198:603:0:396e:4789:8e99:890f', 'unknown'],
+        ];
     }
 
     /**
@@ -76,10 +78,27 @@ class IpUtilsTest extends TestCase
      */
     public function testAnIpv6WithOptionDisabledIpv6()
     {
-        if (defined('AF_INET6')) {
+        if (\defined('AF_INET6')) {
             $this->markTestSkipped('Only works when PHP is compiled with the option "disable-ipv6".');
         }
 
         IpUtils::checkIp('2a01:198:603:0:396e:4789:8e99:890f', '2a01:198:603:0::/65');
     }
+
+    /**
+     * @dataProvider invalidIpAddressData
+     */
+    public function testInvalidIpAddressesDoNotMatch($requestIp, $proxyIp)
+    {
+        $this->assertFalse(IpUtils::checkIp4($requestIp, $proxyIp));
+    }
+
+    public function invalidIpAddressData()
+    {
+        return [
+            'invalid proxy wildcard' => ['192.168.20.13', '*'],
+            'invalid proxy missing netmask' => ['192.168.20.13', '0.0.0.0'],
+            'invalid request IP with invalid proxy wildcard' => ['0.0.0.0', '*'],
+        ];
+    }
 }
diff --git a/vendor/symfony/http-foundation/Tests/JsonResponseTest.php b/vendor/symfony/http-foundation/Tests/JsonResponseTest.php
index 201839f8..5425896d 100644
--- a/vendor/symfony/http-foundation/Tests/JsonResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/JsonResponseTest.php
@@ -16,6 +16,15 @@ use Symfony\Component\HttpFoundation\JsonResponse;
 
 class JsonResponseTest extends TestCase
 {
+    protected function setUp()
+    {
+        parent::setUp();
+
+        if (!\defined('HHVM_VERSION')) {
+            $this->iniSet('serialize_precision', 14);
+        }
+    }
+
     public function testConstructorEmptyCreatesJsonObject()
     {
         $response = new JsonResponse();
@@ -24,13 +33,13 @@ class JsonResponseTest extends TestCase
 
     public function testConstructorWithArrayCreatesJsonArray()
     {
-        $response = new JsonResponse(array(0, 1, 2, 3));
+        $response = new JsonResponse([0, 1, 2, 3]);
         $this->assertSame('[0,1,2,3]', $response->getContent());
     }
 
     public function testConstructorWithAssocArrayCreatesJsonObject()
     {
-        $response = new JsonResponse(array('foo' => 'bar'));
+        $response = new JsonResponse(['foo' => 'bar']);
         $this->assertSame('{"foo":"bar"}', $response->getContent());
     }
 
@@ -51,7 +60,7 @@ class JsonResponseTest extends TestCase
 
     public function testConstructorWithCustomStatus()
     {
-        $response = new JsonResponse(array(), 202);
+        $response = new JsonResponse([], 202);
         $this->assertSame(202, $response->getStatusCode());
     }
 
@@ -63,35 +72,35 @@ class JsonResponseTest extends TestCase
 
     public function testConstructorWithCustomHeaders()
     {
-        $response = new JsonResponse(array(), 200, array('ETag' => 'foo'));
+        $response = new JsonResponse([], 200, ['ETag' => 'foo']);
         $this->assertSame('application/json', $response->headers->get('Content-Type'));
         $this->assertSame('foo', $response->headers->get('ETag'));
     }
 
     public function testConstructorWithCustomContentType()
     {
-        $headers = array('Content-Type' => 'application/vnd.acme.blog-v1+json');
+        $headers = ['Content-Type' => 'application/vnd.acme.blog-v1+json'];
 
-        $response = new JsonResponse(array(), 200, $headers);
+        $response = new JsonResponse([], 200, $headers);
         $this->assertSame('application/vnd.acme.blog-v1+json', $response->headers->get('Content-Type'));
     }
 
     public function testSetJson()
     {
-        $response = new JsonResponse('1', 200, array(), true);
+        $response = new JsonResponse('1', 200, [], true);
         $this->assertEquals('1', $response->getContent());
 
-        $response = new JsonResponse('[1]', 200, array(), true);
+        $response = new JsonResponse('[1]', 200, [], true);
         $this->assertEquals('[1]', $response->getContent());
 
-        $response = new JsonResponse(null, 200, array());
+        $response = new JsonResponse(null, 200, []);
         $response->setJson('true');
         $this->assertEquals('true', $response->getContent());
     }
 
     public function testCreate()
     {
-        $response = JsonResponse::create(array('foo' => 'bar'), 204);
+        $response = JsonResponse::create(['foo' => 'bar'], 204);
 
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response);
         $this->assertEquals('{"foo":"bar"}', $response->getContent());
@@ -107,14 +116,14 @@ class JsonResponseTest extends TestCase
 
     public function testStaticCreateJsonArray()
     {
-        $response = JsonResponse::create(array(0, 1, 2, 3));
+        $response = JsonResponse::create([0, 1, 2, 3]);
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response);
         $this->assertSame('[0,1,2,3]', $response->getContent());
     }
 
     public function testStaticCreateJsonObject()
     {
-        $response = JsonResponse::create(array('foo' => 'bar'));
+        $response = JsonResponse::create(['foo' => 'bar']);
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\JsonResponse', $response);
         $this->assertSame('{"foo":"bar"}', $response->getContent());
     }
@@ -140,7 +149,7 @@ class JsonResponseTest extends TestCase
 
     public function testStaticCreateWithCustomStatus()
     {
-        $response = JsonResponse::create(array(), 202);
+        $response = JsonResponse::create([], 202);
         $this->assertSame(202, $response->getStatusCode());
     }
 
@@ -152,22 +161,22 @@ class JsonResponseTest extends TestCase
 
     public function testStaticCreateWithCustomHeaders()
     {
-        $response = JsonResponse::create(array(), 200, array('ETag' => 'foo'));
+        $response = JsonResponse::create([], 200, ['ETag' => 'foo']);
         $this->assertSame('application/json', $response->headers->get('Content-Type'));
         $this->assertSame('foo', $response->headers->get('ETag'));
     }
 
     public function testStaticCreateWithCustomContentType()
     {
-        $headers = array('Content-Type' => 'application/vnd.acme.blog-v1+json');
+        $headers = ['Content-Type' => 'application/vnd.acme.blog-v1+json'];
 
-        $response = JsonResponse::create(array(), 200, $headers);
+        $response = JsonResponse::create([], 200, $headers);
         $this->assertSame('application/vnd.acme.blog-v1+json', $response->headers->get('Content-Type'));
     }
 
     public function testSetCallback()
     {
-        $response = JsonResponse::create(array('foo' => 'bar'))->setCallback('callback');
+        $response = JsonResponse::create(['foo' => 'bar'])->setCallback('callback');
 
         $this->assertEquals('/**/callback({"foo":"bar"});', $response->getContent());
         $this->assertEquals('text/javascript', $response->headers->get('Content-Type'));
@@ -190,7 +199,7 @@ class JsonResponseTest extends TestCase
     public function testSetEncodingOptions()
     {
         $response = new JsonResponse();
-        $response->setData(array(array(1, 2, 3)));
+        $response->setData([[1, 2, 3]]);
 
         $this->assertEquals('[[1,2,3]]', $response->getContent());
 
@@ -239,7 +248,7 @@ class JsonResponseTest extends TestCase
 
     public function testSetComplexCallback()
     {
-        $response = JsonResponse::create(array('foo' => 'bar'));
+        $response = JsonResponse::create(['foo' => 'bar']);
         $response->setCallback('ಠ_ಠ["foo"].bar[0]');
 
         $this->assertEquals('/**/ಠ_ಠ["foo"].bar[0]({"foo":"bar"});', $response->getContent());
diff --git a/vendor/symfony/http-foundation/Tests/ParameterBagTest.php b/vendor/symfony/http-foundation/Tests/ParameterBagTest.php
index 5311a0d8..d2a5c991 100644
--- a/vendor/symfony/http-foundation/Tests/ParameterBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/ParameterBagTest.php
@@ -23,44 +23,44 @@ class ParameterBagTest extends TestCase
 
     public function testAll()
     {
-        $bag = new ParameterBag(array('foo' => 'bar'));
-        $this->assertEquals(array('foo' => 'bar'), $bag->all(), '->all() gets all the input');
+        $bag = new ParameterBag(['foo' => 'bar']);
+        $this->assertEquals(['foo' => 'bar'], $bag->all(), '->all() gets all the input');
     }
 
     public function testKeys()
     {
-        $bag = new ParameterBag(array('foo' => 'bar'));
-        $this->assertEquals(array('foo'), $bag->keys());
+        $bag = new ParameterBag(['foo' => 'bar']);
+        $this->assertEquals(['foo'], $bag->keys());
     }
 
     public function testAdd()
     {
-        $bag = new ParameterBag(array('foo' => 'bar'));
-        $bag->add(array('bar' => 'bas'));
-        $this->assertEquals(array('foo' => 'bar', 'bar' => 'bas'), $bag->all());
+        $bag = new ParameterBag(['foo' => 'bar']);
+        $bag->add(['bar' => 'bas']);
+        $this->assertEquals(['foo' => 'bar', 'bar' => 'bas'], $bag->all());
     }
 
     public function testRemove()
     {
-        $bag = new ParameterBag(array('foo' => 'bar'));
-        $bag->add(array('bar' => 'bas'));
-        $this->assertEquals(array('foo' => 'bar', 'bar' => 'bas'), $bag->all());
+        $bag = new ParameterBag(['foo' => 'bar']);
+        $bag->add(['bar' => 'bas']);
+        $this->assertEquals(['foo' => 'bar', 'bar' => 'bas'], $bag->all());
         $bag->remove('bar');
-        $this->assertEquals(array('foo' => 'bar'), $bag->all());
+        $this->assertEquals(['foo' => 'bar'], $bag->all());
     }
 
     public function testReplace()
     {
-        $bag = new ParameterBag(array('foo' => 'bar'));
+        $bag = new ParameterBag(['foo' => 'bar']);
 
-        $bag->replace(array('FOO' => 'BAR'));
-        $this->assertEquals(array('FOO' => 'BAR'), $bag->all(), '->replace() replaces the input with the argument');
+        $bag->replace(['FOO' => 'BAR']);
+        $this->assertEquals(['FOO' => 'BAR'], $bag->all(), '->replace() replaces the input with the argument');
         $this->assertFalse($bag->has('foo'), '->replace() overrides previously set the input');
     }
 
     public function testGet()
     {
-        $bag = new ParameterBag(array('foo' => 'bar', 'null' => null));
+        $bag = new ParameterBag(['foo' => 'bar', 'null' => null]);
 
         $this->assertEquals('bar', $bag->get('foo'), '->get() gets the value of a parameter');
         $this->assertEquals('default', $bag->get('unknown', 'default'), '->get() returns second argument as default if a parameter is not defined');
@@ -69,14 +69,14 @@ class ParameterBagTest extends TestCase
 
     public function testGetDoesNotUseDeepByDefault()
     {
-        $bag = new ParameterBag(array('foo' => array('bar' => 'moo')));
+        $bag = new ParameterBag(['foo' => ['bar' => 'moo']]);
 
         $this->assertNull($bag->get('foo[bar]'));
     }
 
     public function testSet()
     {
-        $bag = new ParameterBag(array());
+        $bag = new ParameterBag([]);
 
         $bag->set('foo', 'bar');
         $this->assertEquals('bar', $bag->get('foo'), '->set() sets the value of parameter');
@@ -87,7 +87,7 @@ class ParameterBagTest extends TestCase
 
     public function testHas()
     {
-        $bag = new ParameterBag(array('foo' => 'bar'));
+        $bag = new ParameterBag(['foo' => 'bar']);
 
         $this->assertTrue($bag->has('foo'), '->has() returns true if a parameter is defined');
         $this->assertFalse($bag->has('unknown'), '->has() return false if a parameter is not defined');
@@ -95,7 +95,7 @@ class ParameterBagTest extends TestCase
 
     public function testGetAlpha()
     {
-        $bag = new ParameterBag(array('word' => 'foo_BAR_012'));
+        $bag = new ParameterBag(['word' => 'foo_BAR_012']);
 
         $this->assertEquals('fooBAR', $bag->getAlpha('word'), '->getAlpha() gets only alphabetic characters');
         $this->assertEquals('', $bag->getAlpha('unknown'), '->getAlpha() returns empty string if a parameter is not defined');
@@ -103,7 +103,7 @@ class ParameterBagTest extends TestCase
 
     public function testGetAlnum()
     {
-        $bag = new ParameterBag(array('word' => 'foo_BAR_012'));
+        $bag = new ParameterBag(['word' => 'foo_BAR_012']);
 
         $this->assertEquals('fooBAR012', $bag->getAlnum('word'), '->getAlnum() gets only alphanumeric characters');
         $this->assertEquals('', $bag->getAlnum('unknown'), '->getAlnum() returns empty string if a parameter is not defined');
@@ -111,7 +111,7 @@ class ParameterBagTest extends TestCase
 
     public function testGetDigits()
     {
-        $bag = new ParameterBag(array('word' => 'foo_BAR_012'));
+        $bag = new ParameterBag(['word' => 'foo_BAR_012']);
 
         $this->assertEquals('012', $bag->getDigits('word'), '->getDigits() gets only digits as string');
         $this->assertEquals('', $bag->getDigits('unknown'), '->getDigits() returns empty string if a parameter is not defined');
@@ -119,7 +119,7 @@ class ParameterBagTest extends TestCase
 
     public function testGetInt()
     {
-        $bag = new ParameterBag(array('digits' => '0123'));
+        $bag = new ParameterBag(['digits' => '0123']);
 
         $this->assertEquals(123, $bag->getInt('digits'), '->getInt() gets a value of parameter as integer');
         $this->assertEquals(0, $bag->getInt('unknown'), '->getInt() returns zero if a parameter is not defined');
@@ -127,14 +127,14 @@ class ParameterBagTest extends TestCase
 
     public function testFilter()
     {
-        $bag = new ParameterBag(array(
+        $bag = new ParameterBag([
             'digits' => '0123ab',
             'email' => 'example@xxxxxxxxxxx',
             'url' => 'http://example.com/foo',
             'dec' => '256',
             'hex' => '0x100',
-            'array' => array('bang'),
-            ));
+            'array' => ['bang'],
+            ]);
 
         $this->assertEmpty($bag->filter('nokey'), '->filter() should return empty by default if no key is found');
 
@@ -142,27 +142,27 @@ class ParameterBagTest extends TestCase
 
         $this->assertEquals('example@xxxxxxxxxxx', $bag->filter('email', '', FILTER_VALIDATE_EMAIL), '->filter() gets a value of parameter as email');
 
-        $this->assertEquals('http://example.com/foo', $bag->filter('url', '', FILTER_VALIDATE_URL, array('flags' => FILTER_FLAG_PATH_REQUIRED)), '->filter() gets a value of parameter as URL with a path');
+        $this->assertEquals('http://example.com/foo', $bag->filter('url', '', FILTER_VALIDATE_URL, ['flags' => FILTER_FLAG_PATH_REQUIRED]), '->filter() gets a value of parameter as URL with a path');
 
         // This test is repeated for code-coverage
         $this->assertEquals('http://example.com/foo', $bag->filter('url', '', FILTER_VALIDATE_URL, FILTER_FLAG_PATH_REQUIRED), '->filter() gets a value of parameter as URL with a path');
 
-        $this->assertFalse($bag->filter('dec', '', FILTER_VALIDATE_INT, array(
+        $this->assertFalse($bag->filter('dec', '', FILTER_VALIDATE_INT, [
             'flags' => FILTER_FLAG_ALLOW_HEX,
-            'options' => array('min_range' => 1, 'max_range' => 0xff),
-        )), '->filter() gets a value of parameter as integer between boundaries');
+            'options' => ['min_range' => 1, 'max_range' => 0xff],
+        ]), '->filter() gets a value of parameter as integer between boundaries');
 
-        $this->assertFalse($bag->filter('hex', '', FILTER_VALIDATE_INT, array(
+        $this->assertFalse($bag->filter('hex', '', FILTER_VALIDATE_INT, [
             'flags' => FILTER_FLAG_ALLOW_HEX,
-            'options' => array('min_range' => 1, 'max_range' => 0xff),
-        )), '->filter() gets a value of parameter as integer between boundaries');
+            'options' => ['min_range' => 1, 'max_range' => 0xff],
+        ]), '->filter() gets a value of parameter as integer between boundaries');
 
-        $this->assertEquals(array('bang'), $bag->filter('array', ''), '->filter() gets a value of parameter as an array');
+        $this->assertEquals(['bang'], $bag->filter('array', ''), '->filter() gets a value of parameter as an array');
     }
 
     public function testGetIterator()
     {
-        $parameters = array('foo' => 'bar', 'hello' => 'world');
+        $parameters = ['foo' => 'bar', 'hello' => 'world'];
         $bag = new ParameterBag($parameters);
 
         $i = 0;
@@ -171,20 +171,20 @@ class ParameterBagTest extends TestCase
             $this->assertEquals($parameters[$key], $val);
         }
 
-        $this->assertEquals(count($parameters), $i);
+        $this->assertEquals(\count($parameters), $i);
     }
 
     public function testCount()
     {
-        $parameters = array('foo' => 'bar', 'hello' => 'world');
+        $parameters = ['foo' => 'bar', 'hello' => 'world'];
         $bag = new ParameterBag($parameters);
 
-        $this->assertEquals(count($parameters), count($bag));
+        $this->assertCount(\count($parameters), $bag);
     }
 
     public function testGetBoolean()
     {
-        $parameters = array('string_true' => 'true', 'string_false' => 'false');
+        $parameters = ['string_true' => 'true', 'string_false' => 'false'];
         $bag = new ParameterBag($parameters);
 
         $this->assertTrue($bag->getBoolean('string_true'), '->getBoolean() gets the string true as boolean true');
diff --git a/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php b/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php
index d389e83d..64c3e73e 100644
--- a/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/RedirectResponseTest.php
@@ -22,7 +22,7 @@ class RedirectResponseTest extends TestCase
 
         $this->assertEquals(1, preg_match(
             '#<meta http-equiv="refresh" content="\d+;url=foo\.bar" />#',
-            preg_replace(array('/\s+/', '/\'/'), array(' ', '"'), $response->getContent())
+            preg_replace(['/\s+/', '/\'/'], [' ', '"'], $response->getContent())
         ));
     }
 
@@ -87,7 +87,7 @@ class RedirectResponseTest extends TestCase
         $response = new RedirectResponse('foo.bar', 301);
         $this->assertFalse($response->headers->hasCacheControlDirective('no-cache'));
 
-        $response = new RedirectResponse('foo.bar', 301, array('cache-control' => 'max-age=86400'));
+        $response = new RedirectResponse('foo.bar', 301, ['cache-control' => 'max-age=86400']);
         $this->assertFalse($response->headers->hasCacheControlDirective('no-cache'));
         $this->assertTrue($response->headers->hasCacheControlDirective('max-age'));
 
diff --git a/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php b/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php
index b5d80048..7fb6925b 100644
--- a/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php
+++ b/vendor/symfony/http-foundation/Tests/RequestMatcherTest.php
@@ -12,8 +12,8 @@
 namespace Symfony\Component\HttpFoundation\Tests;
 
 use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\RequestMatcher;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\RequestMatcher;
 
 class RequestMatcherTest extends TestCase
 {
@@ -34,20 +34,20 @@ class RequestMatcherTest extends TestCase
 
     public function getMethodData()
     {
-        return array(
-            array('get', 'get', true),
-            array('get', array('get', 'post'), true),
-            array('get', 'post', false),
-            array('get', 'GET', true),
-            array('get', array('GET', 'POST'), true),
-            array('get', 'POST', false),
-        );
+        return [
+            ['get', 'get', true],
+            ['get', ['get', 'post'], true],
+            ['get', 'post', false],
+            ['get', 'GET', true],
+            ['get', ['GET', 'POST'], true],
+            ['get', 'POST', false],
+        ];
     }
 
     public function testScheme()
     {
         $httpRequest = $request = $request = Request::create('');
-        $httpsRequest = $request = $request = Request::create('', 'get', array(), array(), array(), array('HTTPS' => 'on'));
+        $httpsRequest = $request = $request = Request::create('', 'get', [], [], [], ['HTTPS' => 'on']);
 
         $matcher = new RequestMatcher();
         $matcher->matchScheme('https');
@@ -69,7 +69,7 @@ class RequestMatcherTest extends TestCase
     public function testHost($pattern, $isMatch)
     {
         $matcher = new RequestMatcher();
-        $request = Request::create('', 'get', array(), array(), array(), array('HTTP_HOST' => 'foo.example.com'));
+        $request = Request::create('', 'get', [], [], [], ['HTTP_HOST' => 'foo.example.com']);
 
         $matcher->matchHost($pattern);
         $this->assertSame($isMatch, $matcher->matches($request));
@@ -80,16 +80,16 @@ class RequestMatcherTest extends TestCase
 
     public function getHostData()
     {
-        return array(
-            array('.*\.example\.com', true),
-            array('\.example\.com$', true),
-            array('^.*\.example\.com$', true),
-            array('.*\.sensio\.com', false),
-            array('.*\.example\.COM', true),
-            array('\.example\.COM$', true),
-            array('^.*\.example\.COM$', true),
-            array('.*\.sensio\.COM', false),
-        );
+        return [
+            ['.*\.example\.com', true],
+            ['\.example\.com$', true],
+            ['^.*\.example\.com$', true],
+            ['.*\.sensio\.com', false],
+            ['.*\.example\.COM', true],
+            ['\.example\.COM$', true],
+            ['^.*\.example\.COM$', true],
+            ['.*\.sensio\.COM', false],
+        ];
     }
 
     public function testPath()
diff --git a/vendor/symfony/http-foundation/Tests/RequestTest.php b/vendor/symfony/http-foundation/Tests/RequestTest.php
index b36fbb7e..d266e1f6 100644
--- a/vendor/symfony/http-foundation/Tests/RequestTest.php
+++ b/vendor/symfony/http-foundation/Tests/RequestTest.php
@@ -13,32 +13,32 @@ namespace Symfony\Component\HttpFoundation\Tests;
 
 use PHPUnit\Framework\TestCase;
 use Symfony\Component\HttpFoundation\Exception\SuspiciousOperationException;
-use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
-use Symfony\Component\HttpFoundation\Session\Session;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Session\Session;
+use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
 
 class RequestTest extends TestCase
 {
     protected function tearDown()
     {
-        // reset
-        Request::setTrustedProxies(array(), -1);
+        Request::setTrustedProxies([], -1);
+        Request::setTrustedHosts([]);
     }
 
     public function testInitialize()
     {
         $request = new Request();
 
-        $request->initialize(array('foo' => 'bar'));
+        $request->initialize(['foo' => 'bar']);
         $this->assertEquals('bar', $request->query->get('foo'), '->initialize() takes an array of query parameters as its first argument');
 
-        $request->initialize(array(), array('foo' => 'bar'));
+        $request->initialize([], ['foo' => 'bar']);
         $this->assertEquals('bar', $request->request->get('foo'), '->initialize() takes an array of request parameters as its second argument');
 
-        $request->initialize(array(), array(), array('foo' => 'bar'));
+        $request->initialize([], [], ['foo' => 'bar']);
         $this->assertEquals('bar', $request->attributes->get('foo'), '->initialize() takes an array of attributes as its third argument');
 
-        $request->initialize(array(), array(), array(), array(), array(), array('HTTP_FOO' => 'bar'));
+        $request->initialize([], [], [], [], [], ['HTTP_FOO' => 'bar']);
         $this->assertEquals('bar', $request->headers->get('FOO'), '->initialize() takes an array of HTTP headers as its sixth argument');
     }
 
@@ -52,18 +52,18 @@ class RequestTest extends TestCase
 
     public function testGetUser()
     {
-        $request = Request::create('http://user_test:password_test@xxxxxxxx/');
+        $request = Request::create('http://user:password@xxxxxxxx');
         $user = $request->getUser();
 
-        $this->assertEquals('user_test', $user);
+        $this->assertEquals('user', $user);
     }
 
     public function testGetPassword()
     {
-        $request = Request::create('http://user_test:password_test@xxxxxxxx/');
+        $request = Request::create('http://user:password@xxxxxxxx');
         $password = $request->getPassword();
 
-        $this->assertEquals('password_test', $password);
+        $this->assertEquals('password', $password);
     }
 
     public function testIsNoCache()
@@ -101,7 +101,7 @@ class RequestTest extends TestCase
         $this->assertEquals('test.com', $request->getHttpHost());
         $this->assertFalse($request->isSecure());
 
-        $request = Request::create('http://test.com/foo', 'GET', array('bar' => 'baz'));
+        $request = Request::create('http://test.com/foo', 'GET', ['bar' => 'baz']);
         $this->assertEquals('http://test.com/foo?bar=baz', $request->getUri());
         $this->assertEquals('/foo', $request->getPathInfo());
         $this->assertEquals('bar=baz', $request->getQueryString());
@@ -109,7 +109,7 @@ class RequestTest extends TestCase
         $this->assertEquals('test.com', $request->getHttpHost());
         $this->assertFalse($request->isSecure());
 
-        $request = Request::create('http://test.com/foo?bar=foo', 'GET', array('bar' => 'baz'));
+        $request = Request::create('http://test.com/foo?bar=foo', 'GET', ['bar' => 'baz']);
         $this->assertEquals('http://test.com/foo?bar=baz', $request->getUri());
         $this->assertEquals('/foo', $request->getPathInfo());
         $this->assertEquals('bar=baz', $request->getQueryString());
@@ -166,7 +166,7 @@ class RequestTest extends TestCase
         $this->assertTrue($request->isSecure());
 
         $json = '{"jsonrpc":"2.0","method":"echo","id":7,"params":["Hello World"]}';
-        $request = Request::create('http://example.com/jsonrpc', 'POST', array(), array(), array(), array(), $json);
+        $request = Request::create('http://example.com/jsonrpc', 'POST', [], [], [], [], $json);
         $this->assertEquals($json, $request->getContent());
         $this->assertFalse($request->isSecure());
 
@@ -216,28 +216,126 @@ class RequestTest extends TestCase
 
         $request = Request::create('http://test.com/?foo');
         $this->assertEquals('/?foo', $request->getRequestUri());
-        $this->assertEquals(array('foo' => ''), $request->query->all());
+        $this->assertEquals(['foo' => ''], $request->query->all());
 
         // assume rewrite rule: (.*) --> app/app.php; app/ is a symlink to a symfony web/ directory
-        $request = Request::create('http://test.com/apparthotel-1234', 'GET', array(), array(), array(),
-            array(
+        $request = Request::create('http://test.com/apparthotel-1234', 'GET', [], [], [],
+            [
                 'DOCUMENT_ROOT' => '/var/www/www.test.com',
                 'SCRIPT_FILENAME' => '/var/www/www.test.com/app/app.php',
                 'SCRIPT_NAME' => '/app/app.php',
                 'PHP_SELF' => '/app/app.php/apparthotel-1234',
-            ));
+            ]);
         $this->assertEquals('http://test.com/apparthotel-1234', $request->getUri());
         $this->assertEquals('/apparthotel-1234', $request->getPathInfo());
         $this->assertEquals('', $request->getQueryString());
         $this->assertEquals(80, $request->getPort());
         $this->assertEquals('test.com', $request->getHttpHost());
         $this->assertFalse($request->isSecure());
+
+        // Fragment should not be included in the URI
+        $request = Request::create('http://test.com/foo#bar');
+        $this->assertEquals('http://test.com/foo', $request->getUri());
+    }
+
+    public function testCreateWithRequestUri()
+    {
+        $request = Request::create('http://test.com:80/foo');
+        $request->server->set('REQUEST_URI', 'http://test.com:80/foo');
+        $this->assertEquals('http://test.com/foo', $request->getUri());
+        $this->assertEquals('/foo', $request->getPathInfo());
+        $this->assertEquals('test.com', $request->getHost());
+        $this->assertEquals('test.com', $request->getHttpHost());
+        $this->assertEquals(80, $request->getPort());
+        $this->assertFalse($request->isSecure());
+
+        $request = Request::create('http://test.com:8080/foo');
+        $request->server->set('REQUEST_URI', 'http://test.com:8080/foo');
+        $this->assertEquals('http://test.com:8080/foo', $request->getUri());
+        $this->assertEquals('/foo', $request->getPathInfo());
+        $this->assertEquals('test.com', $request->getHost());
+        $this->assertEquals('test.com:8080', $request->getHttpHost());
+        $this->assertEquals(8080, $request->getPort());
+        $this->assertFalse($request->isSecure());
+
+        $request = Request::create('http://test.com/foo?bar=foo', 'GET', ['bar' => 'baz']);
+        $request->server->set('REQUEST_URI', 'http://test.com/foo?bar=foo');
+        $this->assertEquals('http://test.com/foo?bar=baz', $request->getUri());
+        $this->assertEquals('/foo', $request->getPathInfo());
+        $this->assertEquals('bar=baz', $request->getQueryString());
+        $this->assertEquals('test.com', $request->getHost());
+        $this->assertEquals('test.com', $request->getHttpHost());
+        $this->assertEquals(80, $request->getPort());
+        $this->assertFalse($request->isSecure());
+
+        $request = Request::create('https://test.com:443/foo');
+        $request->server->set('REQUEST_URI', 'https://test.com:443/foo');
+        $this->assertEquals('https://test.com/foo', $request->getUri());
+        $this->assertEquals('/foo', $request->getPathInfo());
+        $this->assertEquals('test.com', $request->getHost());
+        $this->assertEquals('test.com', $request->getHttpHost());
+        $this->assertEquals(443, $request->getPort());
+        $this->assertTrue($request->isSecure());
+
+        // Fragment should not be included in the URI
+        $request = Request::create('http://test.com/foo#bar');
+        $request->server->set('REQUEST_URI', 'http://test.com/foo#bar');
+        $this->assertEquals('http://test.com/foo', $request->getUri());
+    }
+
+    /**
+     * @dataProvider getRequestUriData
+     */
+    public function testGetRequestUri($serverRequestUri, $expected, $message)
+    {
+        $request = new Request();
+        $request->server->add([
+            'REQUEST_URI' => $serverRequestUri,
+
+            // For having http://test.com
+            'SERVER_NAME' => 'test.com',
+            'SERVER_PORT' => 80,
+        ]);
+
+        $this->assertSame($expected, $request->getRequestUri(), $message);
+        $this->assertSame($expected, $request->server->get('REQUEST_URI'), 'Normalize the request URI.');
+    }
+
+    public function getRequestUriData()
+    {
+        $message = 'Do not modify the path.';
+        yield ['/foo', '/foo', $message];
+        yield ['//bar/foo', '//bar/foo', $message];
+        yield ['///bar/foo', '///bar/foo', $message];
+
+        $message = 'Handle when the scheme, host are on REQUEST_URI.';
+        yield ['http://test.com/foo?bar=baz', '/foo?bar=baz', $message];
+
+        $message = 'Handle when the scheme, host and port are on REQUEST_URI.';
+        yield ['http://test.com:80/foo', '/foo', $message];
+        yield ['https://test.com:8080/foo', '/foo', $message];
+        yield ['https://test.com:443/foo', '/foo', $message];
+
+        $message = 'Fragment should not be included in the URI';
+        yield ['http://test.com/foo#bar', '/foo', $message];
+        yield ['/foo#bar', '/foo', $message];
+    }
+
+    public function testGetRequestUriWithoutRequiredHeader()
+    {
+        $expected = '';
+
+        $request = new Request();
+
+        $message = 'Fallback to empty URI when headers are missing.';
+        $this->assertSame($expected, $request->getRequestUri(), $message);
+        $this->assertSame($expected, $request->server->get('REQUEST_URI'), 'Normalize the request URI.');
     }
 
     public function testCreateCheckPrecedence()
     {
         // server is used by default
-        $request = Request::create('/', 'DELETE', array(), array(), array(), array(
+        $request = Request::create('/', 'DELETE', [], [], [], [
             'HTTP_HOST' => 'example.com',
             'HTTPS' => 'on',
             'SERVER_PORT' => 443,
@@ -245,7 +343,7 @@ class RequestTest extends TestCase
             'PHP_AUTH_PW' => 'pa$$',
             'QUERY_STRING' => 'foo=bar',
             'CONTENT_TYPE' => 'application/json',
-        ));
+        ]);
         $this->assertEquals('example.com', $request->getHost());
         $this->assertEquals(443, $request->getPort());
         $this->assertTrue($request->isSecure());
@@ -255,11 +353,11 @@ class RequestTest extends TestCase
         $this->assertEquals('application/json', $request->headers->get('CONTENT_TYPE'));
 
         // URI has precedence over server
-        $request = Request::create('http://thomas:pokemon@xxxxxxxxxxx:8080/?foo=bar', 'GET', array(), array(), array(), array(
+        $request = Request::create('http://thomas:pokemon@xxxxxxxxxxx:8080/?foo=bar', 'GET', [], [], [], [
             'HTTP_HOST' => 'example.com',
             'HTTPS' => 'on',
             'SERVER_PORT' => 443,
-        ));
+        ]);
         $this->assertEquals('example.net', $request->getHost());
         $this->assertEquals(8080, $request->getPort());
         $this->assertFalse($request->isSecure());
@@ -270,7 +368,7 @@ class RequestTest extends TestCase
 
     public function testDuplicate()
     {
-        $request = new Request(array('foo' => 'bar'), array('foo' => 'bar'), array('foo' => 'bar'), array(), array(), array('HTTP_FOO' => 'bar'));
+        $request = new Request(['foo' => 'bar'], ['foo' => 'bar'], ['foo' => 'bar'], [], [], ['HTTP_FOO' => 'bar']);
         $dup = $request->duplicate();
 
         $this->assertEquals($request->query->all(), $dup->query->all(), '->duplicate() duplicates a request an copy the current query parameters');
@@ -278,17 +376,17 @@ class RequestTest extends TestCase
         $this->assertEquals($request->attributes->all(), $dup->attributes->all(), '->duplicate() duplicates a request an copy the current attributes');
         $this->assertEquals($request->headers->all(), $dup->headers->all(), '->duplicate() duplicates a request an copy the current HTTP headers');
 
-        $dup = $request->duplicate(array('foo' => 'foobar'), array('foo' => 'foobar'), array('foo' => 'foobar'), array(), array(), array('HTTP_FOO' => 'foobar'));
+        $dup = $request->duplicate(['foo' => 'foobar'], ['foo' => 'foobar'], ['foo' => 'foobar'], [], [], ['HTTP_FOO' => 'foobar']);
 
-        $this->assertEquals(array('foo' => 'foobar'), $dup->query->all(), '->duplicate() overrides the query parameters if provided');
-        $this->assertEquals(array('foo' => 'foobar'), $dup->request->all(), '->duplicate() overrides the request parameters if provided');
-        $this->assertEquals(array('foo' => 'foobar'), $dup->attributes->all(), '->duplicate() overrides the attributes if provided');
-        $this->assertEquals(array('foo' => array('foobar')), $dup->headers->all(), '->duplicate() overrides the HTTP header if provided');
+        $this->assertEquals(['foo' => 'foobar'], $dup->query->all(), '->duplicate() overrides the query parameters if provided');
+        $this->assertEquals(['foo' => 'foobar'], $dup->request->all(), '->duplicate() overrides the request parameters if provided');
+        $this->assertEquals(['foo' => 'foobar'], $dup->attributes->all(), '->duplicate() overrides the attributes if provided');
+        $this->assertEquals(['foo' => ['foobar']], $dup->headers->all(), '->duplicate() overrides the HTTP header if provided');
     }
 
     public function testDuplicateWithFormat()
     {
-        $request = new Request(array(), array(), array('_format' => 'json'));
+        $request = new Request([], [], ['_format' => 'json']);
         $dup = $request->duplicate();
 
         $this->assertEquals('json', $dup->getRequestFormat());
@@ -323,7 +421,7 @@ class RequestTest extends TestCase
     public function getFormatToMimeTypeMapProviderWithAdditionalNullFormat()
     {
         return array_merge(
-            array(array(null, array(null, 'unexistent-mime-type'))),
+            [[null, [null, 'unexistent-mime-type']]],
             $this->getFormatToMimeTypeMapProvider()
         );
     }
@@ -332,6 +430,9 @@ class RequestTest extends TestCase
     {
         $request = new Request();
         $this->assertEquals('json', $request->getFormat('application/json; charset=utf-8'));
+        $this->assertEquals('json', $request->getFormat('application/json;charset=utf-8'));
+        $this->assertEquals('json', $request->getFormat('application/json ; charset=utf-8'));
+        $this->assertEquals('json', $request->getFormat('application/json ;charset=utf-8'));
     }
 
     /**
@@ -355,7 +456,7 @@ class RequestTest extends TestCase
     {
         $request = new Request();
         $this->assertNull($request->getMimeType('foo'));
-        $this->assertEquals(array(), Request::getMimeTypes('foo'));
+        $this->assertEquals([], Request::getMimeTypes('foo'));
     }
 
     public function testGetFormatWithCustomMimeType()
@@ -367,20 +468,21 @@ class RequestTest extends TestCase
 
     public function getFormatToMimeTypeMapProvider()
     {
-        return array(
-            array('txt', array('text/plain')),
-            array('js', array('application/javascript', 'application/x-javascript', 'text/javascript')),
-            array('css', array('text/css')),
-            array('json', array('application/json', 'application/x-json')),
-            array('xml', array('text/xml', 'application/xml', 'application/x-xml')),
-            array('rdf', array('application/rdf+xml')),
-            array('atom', array('application/atom+xml')),
-        );
+        return [
+            ['txt', ['text/plain']],
+            ['js', ['application/javascript', 'application/x-javascript', 'text/javascript']],
+            ['css', ['text/css']],
+            ['json', ['application/json', 'application/x-json']],
+            ['jsonld', ['application/ld+json']],
+            ['xml', ['text/xml', 'application/xml', 'application/x-xml']],
+            ['rdf', ['application/rdf+xml']],
+            ['atom', ['application/atom+xml']],
+        ];
     }
 
     public function testGetUri()
     {
-        $server = array();
+        $server = [];
 
         // Standard Request on non default PORT
         // http://host:8080/index.php/path/info?query=string
@@ -399,7 +501,7 @@ class RequestTest extends TestCase
 
         $request = new Request();
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://host:8080/index.php/path/info?query=string', $request->getUri(), '->getUri() with non default port');
 
@@ -408,7 +510,7 @@ class RequestTest extends TestCase
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '80';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://host/index.php/path/info?query=string', $request->getUri(), '->getUri() with default port');
 
@@ -417,7 +519,7 @@ class RequestTest extends TestCase
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '80';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://servername/index.php/path/info?query=string', $request->getUri(), '->getUri() with default port without HOST_HEADER');
 
@@ -425,7 +527,7 @@ class RequestTest extends TestCase
         //   RewriteCond %{REQUEST_FILENAME} !-f
         //   RewriteRule ^(.*)$ index.php [QSA,L]
         // http://host:8080/path/info?query=string
-        $server = array();
+        $server = [];
         $server['HTTP_HOST'] = 'host:8080';
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '8080';
@@ -439,7 +541,7 @@ class RequestTest extends TestCase
         $server['PHP_SELF'] = '/index.php';
         $server['SCRIPT_FILENAME'] = '/some/where/index.php';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://host:8080/path/info?query=string', $request->getUri(), '->getUri() with rewrite');
 
         // Use std port number
@@ -448,7 +550,7 @@ class RequestTest extends TestCase
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '80';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://host/path/info?query=string', $request->getUri(), '->getUri() with rewrite and default port');
 
@@ -457,13 +559,13 @@ class RequestTest extends TestCase
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '80';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://servername/path/info?query=string', $request->getUri(), '->getUri() with rewrite, default port without HOST_HEADER');
 
         // With encoded characters
 
-        $server = array(
+        $server = [
             'HTTP_HOST' => 'host:8080',
             'SERVER_NAME' => 'servername',
             'SERVER_PORT' => '8080',
@@ -473,9 +575,9 @@ class RequestTest extends TestCase
             'PATH_TRANSLATED' => 'redirect:/index.php/foo bar/in+fo',
             'PHP_SELF' => '/ba se/index_dev.php/path/info',
             'SCRIPT_FILENAME' => '/some/where/ba se/index_dev.php',
-        );
+        ];
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals(
             'http://host:8080/ba%20se/index_dev.php/foo%20bar/in+fo?query=string',
@@ -485,11 +587,11 @@ class RequestTest extends TestCase
         // with user info
 
         $server['PHP_AUTH_USER'] = 'fabien';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://host:8080/ba%20se/index_dev.php/foo%20bar/in+fo?query=string', $request->getUri());
 
         $server['PHP_AUTH_PW'] = 'symfony';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://host:8080/ba%20se/index_dev.php/foo%20bar/in+fo?query=string', $request->getUri());
     }
 
@@ -507,7 +609,7 @@ class RequestTest extends TestCase
         $request = Request::create('https://test.com:90/foo?bar=baz');
         $this->assertEquals('https://test.com:90/some/path', $request->getUriForPath('/some/path'));
 
-        $server = array();
+        $server = [];
 
         // Standard Request on non default PORT
         // http://host:8080/index.php/path/info?query=string
@@ -526,7 +628,7 @@ class RequestTest extends TestCase
 
         $request = new Request();
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://host:8080/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with non default port');
 
@@ -535,7 +637,7 @@ class RequestTest extends TestCase
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '80';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://host/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with default port');
 
@@ -544,7 +646,7 @@ class RequestTest extends TestCase
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '80';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://servername/index.php/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with default port without HOST_HEADER');
 
@@ -552,7 +654,7 @@ class RequestTest extends TestCase
         //   RewriteCond %{REQUEST_FILENAME} !-f
         //   RewriteRule ^(.*)$ index.php [QSA,L]
         // http://host:8080/path/info?query=string
-        $server = array();
+        $server = [];
         $server['HTTP_HOST'] = 'host:8080';
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '8080';
@@ -566,7 +668,7 @@ class RequestTest extends TestCase
         $server['PHP_SELF'] = '/index.php';
         $server['SCRIPT_FILENAME'] = '/some/where/index.php';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://host:8080/some/path', $request->getUriForPath('/some/path'), '->getUri() with rewrite');
 
         // Use std port number
@@ -575,7 +677,7 @@ class RequestTest extends TestCase
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '80';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://host/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with rewrite and default port');
 
@@ -584,7 +686,7 @@ class RequestTest extends TestCase
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '80';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('http://servername/some/path', $request->getUriForPath('/some/path'), '->getUriForPath() with rewrite, default port without HOST_HEADER');
         $this->assertEquals('servername', $request->getHttpHost());
@@ -592,11 +694,11 @@ class RequestTest extends TestCase
         // with user info
 
         $server['PHP_AUTH_USER'] = 'fabien';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://servername/some/path', $request->getUriForPath('/some/path'));
 
         $server['PHP_AUTH_PW'] = 'symfony';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://servername/some/path', $request->getUriForPath('/some/path'));
     }
 
@@ -610,30 +712,30 @@ class RequestTest extends TestCase
 
     public function getRelativeUriForPathData()
     {
-        return array(
-            array('me.png', '/foo', '/me.png'),
-            array('../me.png', '/foo/bar', '/me.png'),
-            array('me.png', '/foo/bar', '/foo/me.png'),
-            array('../baz/me.png', '/foo/bar/b', '/foo/baz/me.png'),
-            array('../../fooz/baz/me.png', '/foo/bar/b', '/fooz/baz/me.png'),
-            array('baz/me.png', '/foo/bar/b', 'baz/me.png'),
-        );
+        return [
+            ['me.png', '/foo', '/me.png'],
+            ['../me.png', '/foo/bar', '/me.png'],
+            ['me.png', '/foo/bar', '/foo/me.png'],
+            ['../baz/me.png', '/foo/bar/b', '/foo/baz/me.png'],
+            ['../../fooz/baz/me.png', '/foo/bar/b', '/fooz/baz/me.png'],
+            ['baz/me.png', '/foo/bar/b', 'baz/me.png'],
+        ];
     }
 
     public function testGetUserInfo()
     {
         $request = new Request();
 
-        $server = array('PHP_AUTH_USER' => 'fabien');
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $server = ['PHP_AUTH_USER' => 'fabien'];
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('fabien', $request->getUserInfo());
 
         $server['PHP_AUTH_USER'] = '0';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('0', $request->getUserInfo());
 
         $server['PHP_AUTH_PW'] = '0';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('0:0', $request->getUserInfo());
     }
 
@@ -641,22 +743,22 @@ class RequestTest extends TestCase
     {
         $request = new Request();
 
-        $server = array();
+        $server = [];
         $server['SERVER_NAME'] = 'servername';
         $server['SERVER_PORT'] = '90';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://servername:90', $request->getSchemeAndHttpHost());
 
         $server['PHP_AUTH_USER'] = 'fabien';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://servername:90', $request->getSchemeAndHttpHost());
 
         $server['PHP_AUTH_USER'] = '0';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://servername:90', $request->getSchemeAndHttpHost());
 
         $server['PHP_AUTH_PW'] = '0';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('http://servername:90', $request->getSchemeAndHttpHost());
     }
 
@@ -673,29 +775,29 @@ class RequestTest extends TestCase
 
     public function getQueryStringNormalizationData()
     {
-        return array(
-            array('foo', 'foo', 'works with valueless parameters'),
-            array('foo=', 'foo=', 'includes a dangling equal sign'),
-            array('bar=&foo=bar', 'bar=&foo=bar', '->works with empty parameters'),
-            array('foo=bar&bar=', 'bar=&foo=bar', 'sorts keys alphabetically'),
+        return [
+            ['foo', 'foo', 'works with valueless parameters'],
+            ['foo=', 'foo=', 'includes a dangling equal sign'],
+            ['bar=&foo=bar', 'bar=&foo=bar', '->works with empty parameters'],
+            ['foo=bar&bar=', 'bar=&foo=bar', 'sorts keys alphabetically'],
 
             // GET parameters, that are submitted from a HTML form, encode spaces as "+" by default (as defined in enctype application/x-www-form-urlencoded).
             // PHP also converts "+" to spaces when filling the global _GET or when using the function parse_str.
-            array('him=John%20Doe&her=Jane+Doe', 'her=Jane%20Doe&him=John%20Doe', 'normalizes spaces in both encodings "%20" and "+"'),
+            ['baz=Foo%20Baz&bar=Foo+Bar', 'bar=Foo%20Bar&baz=Foo%20Baz', 'normalizes spaces in both encodings "%20" and "+"'],
 
-            array('foo[]=1&foo[]=2', 'foo%5B%5D=1&foo%5B%5D=2', 'allows array notation'),
-            array('foo=1&foo=2', 'foo=1&foo=2', 'allows repeated parameters'),
-            array('pa%3Dram=foo%26bar%3Dbaz&test=test', 'pa%3Dram=foo%26bar%3Dbaz&test=test', 'works with encoded delimiters'),
-            array('0', '0', 'allows "0"'),
-            array('Jane Doe&John%20Doe', 'Jane%20Doe&John%20Doe', 'normalizes encoding in keys'),
-            array('her=Jane Doe&him=John%20Doe', 'her=Jane%20Doe&him=John%20Doe', 'normalizes encoding in values'),
-            array('foo=bar&&&test&&', 'foo=bar&test', 'removes unneeded delimiters'),
-            array('formula=e=m*c^2', 'formula=e%3Dm%2Ac%5E2', 'correctly treats only the first "=" as delimiter and the next as value'),
+            ['foo[]=1&foo[]=2', 'foo%5B%5D=1&foo%5B%5D=2', 'allows array notation'],
+            ['foo=1&foo=2', 'foo=1&foo=2', 'allows repeated parameters'],
+            ['pa%3Dram=foo%26bar%3Dbaz&test=test', 'pa%3Dram=foo%26bar%3Dbaz&test=test', 'works with encoded delimiters'],
+            ['0', '0', 'allows "0"'],
+            ['Foo Bar&Foo%20Baz', 'Foo%20Bar&Foo%20Baz', 'normalizes encoding in keys'],
+            ['bar=Foo Bar&baz=Foo%20Baz', 'bar=Foo%20Bar&baz=Foo%20Baz', 'normalizes encoding in values'],
+            ['foo=bar&&&test&&', 'foo=bar&test', 'removes unneeded delimiters'],
+            ['formula=e=m*c^2', 'formula=e%3Dm%2Ac%5E2', 'correctly treats only the first "=" as delimiter and the next as value'],
 
             // Ignore pairs with empty key, even if there was a value, e.g. "=value", as such nameless values cannot be retrieved anyway.
             // PHP also does not include them when building _GET.
-            array('foo=bar&=a=b&=x=y', 'foo=bar', 'removes params with empty key'),
-        );
+            ['foo=bar&=a=b&=x=y', 'foo=bar', 'removes params with empty key'],
+        ];
     }
 
     public function testGetQueryStringReturnsNull()
@@ -712,74 +814,74 @@ class RequestTest extends TestCase
     {
         $request = new Request();
 
-        $request->initialize(array('foo' => 'bar'));
+        $request->initialize(['foo' => 'bar']);
         $this->assertEquals('', $request->getHost(), '->getHost() return empty string if not initialized');
 
-        $request->initialize(array(), array(), array(), array(), array(), array('HTTP_HOST' => 'www.example.com'));
+        $request->initialize([], [], [], [], [], ['HTTP_HOST' => 'www.example.com']);
         $this->assertEquals('www.example.com', $request->getHost(), '->getHost() from Host Header');
 
         // Host header with port number
-        $request->initialize(array(), array(), array(), array(), array(), array('HTTP_HOST' => 'www.example.com:8080'));
+        $request->initialize([], [], [], [], [], ['HTTP_HOST' => 'www.example.com:8080']);
         $this->assertEquals('www.example.com', $request->getHost(), '->getHost() from Host Header with port number');
 
         // Server values
-        $request->initialize(array(), array(), array(), array(), array(), array('SERVER_NAME' => 'www.example.com'));
+        $request->initialize([], [], [], [], [], ['SERVER_NAME' => 'www.example.com']);
         $this->assertEquals('www.example.com', $request->getHost(), '->getHost() from server name');
 
-        $request->initialize(array(), array(), array(), array(), array(), array('SERVER_NAME' => 'www.example.com', 'HTTP_HOST' => 'www.host.com'));
+        $request->initialize([], [], [], [], [], ['SERVER_NAME' => 'www.example.com', 'HTTP_HOST' => 'www.host.com']);
         $this->assertEquals('www.host.com', $request->getHost(), '->getHost() value from Host header has priority over SERVER_NAME ');
     }
 
     public function testGetPort()
     {
-        $request = Request::create('http://example.com', 'GET', array(), array(), array(), array(
+        $request = Request::create('http://example.com', 'GET', [], [], [], [
             'HTTP_X_FORWARDED_PROTO' => 'https',
             'HTTP_X_FORWARDED_PORT' => '443',
-        ));
+        ]);
         $port = $request->getPort();
 
         $this->assertEquals(80, $port, 'Without trusted proxies FORWARDED_PROTO and FORWARDED_PORT are ignored.');
 
-        Request::setTrustedProxies(array('1.1.1.1'), Request::HEADER_X_FORWARDED_ALL);
-        $request = Request::create('http://example.com', 'GET', array(), array(), array(), array(
+        Request::setTrustedProxies(['1.1.1.1'], Request::HEADER_X_FORWARDED_ALL);
+        $request = Request::create('http://example.com', 'GET', [], [], [], [
             'HTTP_X_FORWARDED_PROTO' => 'https',
             'HTTP_X_FORWARDED_PORT' => '8443',
-        ));
+        ]);
         $this->assertEquals(80, $request->getPort(), 'With PROTO and PORT on untrusted connection server value takes precedence.');
         $request->server->set('REMOTE_ADDR', '1.1.1.1');
         $this->assertEquals(8443, $request->getPort(), 'With PROTO and PORT set PORT takes precedence.');
 
-        $request = Request::create('http://example.com', 'GET', array(), array(), array(), array(
+        $request = Request::create('http://example.com', 'GET', [], [], [], [
             'HTTP_X_FORWARDED_PROTO' => 'https',
-        ));
+        ]);
         $this->assertEquals(80, $request->getPort(), 'With only PROTO set getPort() ignores trusted headers on untrusted connection.');
         $request->server->set('REMOTE_ADDR', '1.1.1.1');
         $this->assertEquals(443, $request->getPort(), 'With only PROTO set getPort() defaults to 443.');
 
-        $request = Request::create('http://example.com', 'GET', array(), array(), array(), array(
+        $request = Request::create('http://example.com', 'GET', [], [], [], [
             'HTTP_X_FORWARDED_PROTO' => 'http',
-        ));
+        ]);
         $this->assertEquals(80, $request->getPort(), 'If X_FORWARDED_PROTO is set to HTTP getPort() ignores trusted headers on untrusted connection.');
         $request->server->set('REMOTE_ADDR', '1.1.1.1');
         $this->assertEquals(80, $request->getPort(), 'If X_FORWARDED_PROTO is set to HTTP getPort() returns port of the original request.');
 
-        $request = Request::create('http://example.com', 'GET', array(), array(), array(), array(
+        $request = Request::create('http://example.com', 'GET', [], [], [], [
             'HTTP_X_FORWARDED_PROTO' => 'On',
-        ));
+        ]);
         $this->assertEquals(80, $request->getPort(), 'With only PROTO set and value is On, getPort() ignores trusted headers on untrusted connection.');
         $request->server->set('REMOTE_ADDR', '1.1.1.1');
         $this->assertEquals(443, $request->getPort(), 'With only PROTO set and value is On, getPort() defaults to 443.');
 
-        $request = Request::create('http://example.com', 'GET', array(), array(), array(), array(
+        $request = Request::create('http://example.com', 'GET', [], [], [], [
             'HTTP_X_FORWARDED_PROTO' => '1',
-        ));
+        ]);
         $this->assertEquals(80, $request->getPort(), 'With only PROTO set and value is 1, getPort() ignores trusted headers on untrusted connection.');
         $request->server->set('REMOTE_ADDR', '1.1.1.1');
         $this->assertEquals(443, $request->getPort(), 'With only PROTO set and value is 1, getPort() defaults to 443.');
 
-        $request = Request::create('http://example.com', 'GET', array(), array(), array(), array(
+        $request = Request::create('http://example.com', 'GET', [], [], [], [
             'HTTP_X_FORWARDED_PROTO' => 'something-else',
-        ));
+        ]);
         $port = $request->getPort();
         $this->assertEquals(80, $port, 'With only PROTO set and value is not recognized, getPort() defaults to 80.');
     }
@@ -790,7 +892,7 @@ class RequestTest extends TestCase
     public function testGetHostWithFakeHttpHostValue()
     {
         $request = new Request();
-        $request->initialize(array(), array(), array(), array(), array(), array('HTTP_HOST' => 'www.host.com?query=string'));
+        $request->initialize([], [], [], [], [], ['HTTP_HOST' => 'www.host.com?query=string']);
         $request->getHost();
     }
 
@@ -847,6 +949,11 @@ class RequestTest extends TestCase
         $request->setMethod('POST');
         $request->headers->set('X-HTTP-METHOD-OVERRIDE', 'delete');
         $this->assertEquals('DELETE', $request->getMethod(), '->getMethod() returns the method from X-HTTP-Method-Override if defined and POST');
+
+        $request = new Request();
+        $request->setMethod('POST');
+        $request->query->set('_method', ['delete', 'patch']);
+        $this->assertSame('POST', $request->getMethod(), '->getMethod() returns the request method if invalid type is defined in query');
     }
 
     /**
@@ -882,69 +989,69 @@ class RequestTest extends TestCase
     public function getClientIpsForwardedProvider()
     {
         //              $expected                                  $remoteAddr  $httpForwarded                                       $trustedProxies
-        return array(
-            array(array('127.0.0.1'),                              '127.0.0.1', 'for="_gazonk"',                                      null),
-            array(array('127.0.0.1'),                              '127.0.0.1', 'for="_gazonk"',                                      array('127.0.0.1')),
-            array(array('88.88.88.88'),                            '127.0.0.1', 'for="88.88.88.88:80"',                               array('127.0.0.1')),
-            array(array('192.0.2.60'),                             '::1',       'for=192.0.2.60;proto=http;by=203.0.113.43',          array('::1')),
-            array(array('2620:0:1cfe:face:b00c::3', '192.0.2.43'), '::1',       'for=192.0.2.43, for=2620:0:1cfe:face:b00c::3',       array('::1')),
-            array(array('2001:db8:cafe::17'),                      '::1',       'for="[2001:db8:cafe::17]:4711',                      array('::1')),
-        );
+        return [
+            [['127.0.0.1'],                              '127.0.0.1', 'for="_gazonk"',                                      null],
+            [['127.0.0.1'],                              '127.0.0.1', 'for="_gazonk"',                                      ['127.0.0.1']],
+            [['88.88.88.88'],                            '127.0.0.1', 'for="88.88.88.88:80"',                               ['127.0.0.1']],
+            [['192.0.2.60'],                             '::1',       'for=192.0.2.60;proto=http;by=203.0.113.43',          ['::1']],
+            [['2620:0:1cfe:face:b00c::3', '192.0.2.43'], '::1',       'for=192.0.2.43, for=2620:0:1cfe:face:b00c::3',       ['::1']],
+            [['2001:db8:cafe::17'],                      '::1',       'for="[2001:db8:cafe::17]:4711',                      ['::1']],
+        ];
     }
 
     public function getClientIpsProvider()
     {
-        //        $expected                   $remoteAddr                $httpForwardedFor            $trustedProxies
-        return array(
+        //        $expected                          $remoteAddr                 $httpForwardedFor            $trustedProxies
+        return [
             // simple IPv4
-            array(array('88.88.88.88'),              '88.88.88.88',              null,                        null),
+            [['88.88.88.88'],              '88.88.88.88',              null,                        null],
             // trust the IPv4 remote addr
-            array(array('88.88.88.88'),              '88.88.88.88',              null,                        array('88.88.88.88')),
+            [['88.88.88.88'],              '88.88.88.88',              null,                        ['88.88.88.88']],
 
             // simple IPv6
-            array(array('::1'),                      '::1',                      null,                        null),
+            [['::1'],                      '::1',                      null,                        null],
             // trust the IPv6 remote addr
-            array(array('::1'),                      '::1',                      null,                        array('::1')),
+            [['::1'],                      '::1',                      null,                        ['::1']],
 
             // forwarded for with remote IPv4 addr not trusted
-            array(array('127.0.0.1'),                '127.0.0.1',                '88.88.88.88',               null),
-            // forwarded for with remote IPv4 addr trusted
-            array(array('88.88.88.88'),              '127.0.0.1',                '88.88.88.88',               array('127.0.0.1')),
+            [['127.0.0.1'],                '127.0.0.1',                '88.88.88.88',               null],
+            // forwarded for with remote IPv4 addr trusted + comma
+            [['88.88.88.88'],              '127.0.0.1',                '88.88.88.88,',              ['127.0.0.1']],
             // forwarded for with remote IPv4 and all FF addrs trusted
-            array(array('88.88.88.88'),              '127.0.0.1',                '88.88.88.88',               array('127.0.0.1', '88.88.88.88')),
+            [['88.88.88.88'],              '127.0.0.1',                '88.88.88.88',               ['127.0.0.1', '88.88.88.88']],
             // forwarded for with remote IPv4 range trusted
-            array(array('88.88.88.88'),              '123.45.67.89',             '88.88.88.88',               array('123.45.67.0/24')),
+            [['88.88.88.88'],              '123.45.67.89',             '88.88.88.88',               ['123.45.67.0/24']],
 
             // forwarded for with remote IPv6 addr not trusted
-            array(array('1620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3',  null),
+            [['1620:0:1cfe:face:b00c::3'], '1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3',  null],
             // forwarded for with remote IPv6 addr trusted
-            array(array('2620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3',  array('1620:0:1cfe:face:b00c::3')),
+            [['2620:0:1cfe:face:b00c::3'], '1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3', ['1620:0:1cfe:face:b00c::3']],
             // forwarded for with remote IPv6 range trusted
-            array(array('88.88.88.88'),              '2a01:198:603:0:396e:4789:8e99:890f', '88.88.88.88',     array('2a01:198:603:0::/65')),
+            [['88.88.88.88'],              '2a01:198:603:0:396e:4789:8e99:890f', '88.88.88.88',     ['2a01:198:603:0::/65']],
 
             // multiple forwarded for with remote IPv4 addr trusted
-            array(array('88.88.88.88', '87.65.43.21', '127.0.0.1'), '123.45.67.89', '127.0.0.1, 87.65.43.21, 88.88.88.88', array('123.45.67.89')),
+            [['88.88.88.88', '87.65.43.21', '127.0.0.1'], '123.45.67.89', '127.0.0.1, 87.65.43.21, 88.88.88.88', ['123.45.67.89']],
             // multiple forwarded for with remote IPv4 addr and some reverse proxies trusted
-            array(array('87.65.43.21', '127.0.0.1'), '123.45.67.89',             '127.0.0.1, 87.65.43.21, 88.88.88.88', array('123.45.67.89', '88.88.88.88')),
+            [['87.65.43.21', '127.0.0.1'], '123.45.67.89',             '127.0.0.1, 87.65.43.21, 88.88.88.88', ['123.45.67.89', '88.88.88.88']],
             // multiple forwarded for with remote IPv4 addr and some reverse proxies trusted but in the middle
-            array(array('88.88.88.88', '127.0.0.1'), '123.45.67.89',             '127.0.0.1, 87.65.43.21, 88.88.88.88', array('123.45.67.89', '87.65.43.21')),
+            [['88.88.88.88', '127.0.0.1'], '123.45.67.89',             '127.0.0.1, 87.65.43.21, 88.88.88.88', ['123.45.67.89', '87.65.43.21']],
             // multiple forwarded for with remote IPv4 addr and all reverse proxies trusted
-            array(array('127.0.0.1'),                '123.45.67.89',             '127.0.0.1, 87.65.43.21, 88.88.88.88', array('123.45.67.89', '87.65.43.21', '88.88.88.88', '127.0.0.1')),
+            [['127.0.0.1'],                '123.45.67.89',             '127.0.0.1, 87.65.43.21, 88.88.88.88', ['123.45.67.89', '87.65.43.21', '88.88.88.88', '127.0.0.1']],
 
             // multiple forwarded for with remote IPv6 addr trusted
-            array(array('2620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3,2620:0:1cfe:face:b00c::3', array('1620:0:1cfe:face:b00c::3')),
+            [['2620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3'], '1620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3,2620:0:1cfe:face:b00c::3', ['1620:0:1cfe:face:b00c::3']],
             // multiple forwarded for with remote IPv6 addr and some reverse proxies trusted
-            array(array('3620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3,2620:0:1cfe:face:b00c::3', array('1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3')),
+            [['3620:0:1cfe:face:b00c::3'], '1620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3,2620:0:1cfe:face:b00c::3', ['1620:0:1cfe:face:b00c::3', '2620:0:1cfe:face:b00c::3']],
             // multiple forwarded for with remote IPv4 addr and some reverse proxies trusted but in the middle
-            array(array('2620:0:1cfe:face:b00c::3', '4620:0:1cfe:face:b00c::3'), '1620:0:1cfe:face:b00c::3', '4620:0:1cfe:face:b00c::3,3620:0:1cfe:face:b00c::3,2620:0:1cfe:face:b00c::3', array('1620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3')),
+            [['2620:0:1cfe:face:b00c::3', '4620:0:1cfe:face:b00c::3'], '1620:0:1cfe:face:b00c::3', '4620:0:1cfe:face:b00c::3,3620:0:1cfe:face:b00c::3,2620:0:1cfe:face:b00c::3', ['1620:0:1cfe:face:b00c::3', '3620:0:1cfe:face:b00c::3']],
 
             // client IP with port
-            array(array('88.88.88.88'), '127.0.0.1', '88.88.88.88:12345, 127.0.0.1', array('127.0.0.1')),
+            [['88.88.88.88'], '127.0.0.1', '88.88.88.88:12345, 127.0.0.1', ['127.0.0.1']],
 
             // invalid forwarded IP is ignored
-            array(array('88.88.88.88'), '127.0.0.1', 'unknown,88.88.88.88', array('127.0.0.1')),
-            array(array('88.88.88.88'), '127.0.0.1', '}__test|O:21:&quot;JDatabaseDriverMysqli&quot;:3:{s:2,88.88.88.88', array('127.0.0.1')),
-        );
+            [['88.88.88.88'], '127.0.0.1', 'unknown,88.88.88.88', ['127.0.0.1']],
+            [['88.88.88.88'], '127.0.0.1', '}__test|O:21:&quot;JDatabaseDriverMysqli&quot;:3:{s:2,88.88.88.88', ['127.0.0.1']],
+        ];
     }
 
     /**
@@ -955,29 +1062,49 @@ class RequestTest extends TestCase
     {
         $request = new Request();
 
-        $server = array(
+        $server = [
             'REMOTE_ADDR' => '88.88.88.88',
             'HTTP_FORWARDED' => $httpForwarded,
             'HTTP_X_FORWARDED_FOR' => $httpXForwardedFor,
-        );
+        ];
 
-        Request::setTrustedProxies(array('88.88.88.88'), Request::HEADER_X_FORWARDED_ALL | Request::HEADER_FORWARDED);
+        Request::setTrustedProxies(['88.88.88.88'], Request::HEADER_X_FORWARDED_ALL | Request::HEADER_FORWARDED);
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $request->getClientIps();
     }
 
+    /**
+     * @dataProvider getClientIpsWithConflictingHeadersProvider
+     */
+    public function testGetClientIpsOnlyXHttpForwardedForTrusted($httpForwarded, $httpXForwardedFor)
+    {
+        $request = new Request();
+
+        $server = [
+            'REMOTE_ADDR' => '88.88.88.88',
+            'HTTP_FORWARDED' => $httpForwarded,
+            'HTTP_X_FORWARDED_FOR' => $httpXForwardedFor,
+        ];
+
+        Request::setTrustedProxies(['88.88.88.88'], Request::HEADER_X_FORWARDED_FOR);
+
+        $request->initialize([], [], [], [], [], $server);
+
+        $this->assertSame(array_reverse(explode(',', $httpXForwardedFor)), $request->getClientIps());
+    }
+
     public function getClientIpsWithConflictingHeadersProvider()
     {
         //        $httpForwarded                   $httpXForwardedFor
-        return array(
-            array('for=87.65.43.21',                 '192.0.2.60'),
-            array('for=87.65.43.21, for=192.0.2.60', '192.0.2.60'),
-            array('for=192.0.2.60',                  '192.0.2.60,87.65.43.21'),
-            array('for="::face", for=192.0.2.60',    '192.0.2.60,192.0.2.43'),
-            array('for=87.65.43.21, for=192.0.2.60', '192.0.2.60,87.65.43.21'),
-        );
+        return [
+            ['for=87.65.43.21',                 '192.0.2.60'],
+            ['for=87.65.43.21, for=192.0.2.60', '192.0.2.60'],
+            ['for=192.0.2.60',                  '192.0.2.60,87.65.43.21'],
+            ['for="::face", for=192.0.2.60',    '192.0.2.60,192.0.2.43'],
+            ['for=87.65.43.21, for=192.0.2.60', '192.0.2.60,87.65.43.21'],
+        ];
     }
 
     /**
@@ -987,15 +1114,15 @@ class RequestTest extends TestCase
     {
         $request = new Request();
 
-        $server = array(
+        $server = [
             'REMOTE_ADDR' => '88.88.88.88',
             'HTTP_FORWARDED' => $httpForwarded,
             'HTTP_X_FORWARDED_FOR' => $httpXForwardedFor,
-        );
+        ];
 
-        Request::setTrustedProxies(array('88.88.88.88'), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies(['88.88.88.88'], -1);
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $clientIps = $request->getClientIps();
 
@@ -1005,14 +1132,14 @@ class RequestTest extends TestCase
     public function getClientIpsWithAgreeingHeadersProvider()
     {
         //        $httpForwarded                               $httpXForwardedFor
-        return array(
-            array('for="192.0.2.60"',                          '192.0.2.60',             array('192.0.2.60')),
-            array('for=192.0.2.60, for=87.65.43.21',           '192.0.2.60,87.65.43.21', array('87.65.43.21', '192.0.2.60')),
-            array('for="[::face]", for=192.0.2.60',            '::face,192.0.2.60',      array('192.0.2.60', '::face')),
-            array('for="192.0.2.60:80"',                       '192.0.2.60',             array('192.0.2.60')),
-            array('for=192.0.2.60;proto=http;by=203.0.113.43', '192.0.2.60',             array('192.0.2.60')),
-            array('for="[2001:db8:cafe::17]:4711"',            '2001:db8:cafe::17',      array('2001:db8:cafe::17')),
-        );
+        return [
+            ['for="192.0.2.60"',                          '192.0.2.60',             ['192.0.2.60']],
+            ['for=192.0.2.60, for=87.65.43.21',           '192.0.2.60,87.65.43.21', ['87.65.43.21', '192.0.2.60']],
+            ['for="[::face]", for=192.0.2.60',            '::face,192.0.2.60',      ['192.0.2.60', '::face']],
+            ['for="192.0.2.60:80"',                       '192.0.2.60',             ['192.0.2.60']],
+            ['for=192.0.2.60;proto=http;by=203.0.113.43', '192.0.2.60',             ['192.0.2.60']],
+            ['for="[2001:db8:cafe::17]:4711"',            '2001:db8:cafe::17',      ['2001:db8:cafe::17']],
+        ];
     }
 
     public function testGetContentWorksTwiceInDefaultMode()
@@ -1033,7 +1160,7 @@ class RequestTest extends TestCase
 
     public function testGetContentReturnsResourceWhenContentSetInConstructor()
     {
-        $req = new Request(array(), array(), array(), array(), array(), array(), 'MyContent');
+        $req = new Request([], [], [], [], [], [], 'MyContent');
         $resource = $req->getContent(true);
 
         $this->assertInternalType('resource', $resource);
@@ -1046,7 +1173,7 @@ class RequestTest extends TestCase
         fwrite($resource, 'My other content');
         rewind($resource);
 
-        $req = new Request(array(), array(), array(), array(), array(), array(), $resource);
+        $req = new Request([], [], [], [], [], [], $resource);
         $this->assertEquals('My other content', stream_get_contents($req->getContent(true)));
         $this->assertEquals('My other content', $req->getContent());
     }
@@ -1068,10 +1195,10 @@ class RequestTest extends TestCase
 
     public function getContentCantBeCalledTwiceWithResourcesProvider()
     {
-        return array(
-            'Resource then fetch' => array(true, false),
-            'Resource then resource' => array(true, true),
-        );
+        return [
+            'Resource then fetch' => [true, false],
+            'Resource then resource' => [true, true],
+        ];
     }
 
     /**
@@ -1097,24 +1224,24 @@ class RequestTest extends TestCase
 
     public function getContentCanBeCalledTwiceWithResourcesProvider()
     {
-        return array(
-            'Fetch then fetch' => array(false, false),
-            'Fetch then resource' => array(false, true),
-            'Resource then fetch' => array(true, false),
-            'Resource then resource' => array(true, true),
-        );
+        return [
+            'Fetch then fetch' => [false, false],
+            'Fetch then resource' => [false, true],
+            'Resource then fetch' => [true, false],
+            'Resource then resource' => [true, true],
+        ];
     }
 
     public function provideOverloadedMethods()
     {
-        return array(
-            array('PUT'),
-            array('DELETE'),
-            array('PATCH'),
-            array('put'),
-            array('delete'),
-            array('patch'),
-        );
+        return [
+            ['PUT'],
+            ['DELETE'],
+            ['PATCH'],
+            ['put'],
+            ['delete'],
+            ['patch'],
+        ];
     }
 
     /**
@@ -1127,14 +1254,14 @@ class RequestTest extends TestCase
         $_GET['foo1'] = 'bar1';
         $_POST['foo2'] = 'bar2';
         $_COOKIE['foo3'] = 'bar3';
-        $_FILES['foo4'] = array('bar4');
+        $_FILES['foo4'] = ['bar4'];
         $_SERVER['foo5'] = 'bar5';
 
         $request = Request::createFromGlobals();
         $this->assertEquals('bar1', $request->query->get('foo1'), '::fromGlobals() uses values from $_GET');
         $this->assertEquals('bar2', $request->request->get('foo2'), '::fromGlobals() uses values from $_POST');
         $this->assertEquals('bar3', $request->cookies->get('foo3'), '::fromGlobals() uses values from $_COOKIE');
-        $this->assertEquals(array('bar4'), $request->files->get('foo4'), '::fromGlobals() uses values from $_FILES');
+        $this->assertEquals(['bar4'], $request->files->get('foo4'), '::fromGlobals() uses values from $_FILES');
         $this->assertEquals('bar5', $request->server->get('foo5'), '::fromGlobals() uses values from $_SERVER');
 
         unset($_GET['foo1'], $_POST['foo2'], $_COOKIE['foo3'], $_FILES['foo4'], $_SERVER['foo5']);
@@ -1164,25 +1291,25 @@ class RequestTest extends TestCase
     public function testOverrideGlobals()
     {
         $request = new Request();
-        $request->initialize(array('foo' => 'bar'));
+        $request->initialize(['foo' => 'bar']);
 
         // as the Request::overrideGlobals really work, it erase $_SERVER, so we must backup it
         $server = $_SERVER;
 
         $request->overrideGlobals();
 
-        $this->assertEquals(array('foo' => 'bar'), $_GET);
+        $this->assertEquals(['foo' => 'bar'], $_GET);
 
-        $request->initialize(array(), array('foo' => 'bar'));
+        $request->initialize([], ['foo' => 'bar']);
         $request->overrideGlobals();
 
-        $this->assertEquals(array('foo' => 'bar'), $_POST);
+        $this->assertEquals(['foo' => 'bar'], $_POST);
 
         $this->assertArrayNotHasKey('HTTP_X_FORWARDED_PROTO', $_SERVER);
 
         $request->headers->set('X_FORWARDED_PROTO', 'https');
 
-        Request::setTrustedProxies(array('1.1.1.1'), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies(['1.1.1.1'], Request::HEADER_X_FORWARDED_ALL);
         $this->assertFalse($request->isSecure());
         $request->server->set('REMOTE_ADDR', '1.1.1.1');
         $this->assertTrue($request->isSecure());
@@ -1199,12 +1326,12 @@ class RequestTest extends TestCase
         $this->assertArrayHasKey('CONTENT_TYPE', $_SERVER);
         $this->assertArrayHasKey('CONTENT_LENGTH', $_SERVER);
 
-        $request->initialize(array('foo' => 'bar', 'baz' => 'foo'));
+        $request->initialize(['foo' => 'bar', 'baz' => 'foo']);
         $request->query->remove('baz');
 
         $request->overrideGlobals();
 
-        $this->assertEquals(array('foo' => 'bar'), $_GET);
+        $this->assertEquals(['foo' => 'bar'], $_GET);
         $this->assertEquals('foo=bar', $_SERVER['QUERY_STRING']);
         $this->assertEquals('foo=bar', $request->server->get('QUERY_STRING'));
 
@@ -1217,23 +1344,23 @@ class RequestTest extends TestCase
         $request = new Request();
         $this->assertEquals('', $request->getScriptName());
 
-        $server = array();
+        $server = [];
         $server['SCRIPT_NAME'] = '/index.php';
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('/index.php', $request->getScriptName());
 
-        $server = array();
+        $server = [];
         $server['ORIG_SCRIPT_NAME'] = '/frontend.php';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('/frontend.php', $request->getScriptName());
 
-        $server = array();
+        $server = [];
         $server['SCRIPT_NAME'] = '/index.php';
         $server['ORIG_SCRIPT_NAME'] = '/frontend.php';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('/index.php', $request->getScriptName());
     }
@@ -1243,29 +1370,29 @@ class RequestTest extends TestCase
         $request = new Request();
         $this->assertEquals('', $request->getBasePath());
 
-        $server = array();
+        $server = [];
         $server['SCRIPT_FILENAME'] = '/some/where/index.php';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
         $this->assertEquals('', $request->getBasePath());
 
-        $server = array();
+        $server = [];
         $server['SCRIPT_FILENAME'] = '/some/where/index.php';
         $server['SCRIPT_NAME'] = '/index.php';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('', $request->getBasePath());
 
-        $server = array();
+        $server = [];
         $server['SCRIPT_FILENAME'] = '/some/where/index.php';
         $server['PHP_SELF'] = '/index.php';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('', $request->getBasePath());
 
-        $server = array();
+        $server = [];
         $server['SCRIPT_FILENAME'] = '/some/where/index.php';
         $server['ORIG_SCRIPT_NAME'] = '/index.php';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('', $request->getBasePath());
     }
@@ -1275,17 +1402,23 @@ class RequestTest extends TestCase
         $request = new Request();
         $this->assertEquals('/', $request->getPathInfo());
 
-        $server = array();
+        $server = [];
         $server['REQUEST_URI'] = '/path/info';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('/path/info', $request->getPathInfo());
 
-        $server = array();
+        $server = [];
         $server['REQUEST_URI'] = '/path%20test/info';
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         $this->assertEquals('/path%20test/info', $request->getPathInfo());
+
+        $server = [];
+        $server['REQUEST_URI'] = '?a=b';
+        $request->initialize([], [], [], [], [], $server);
+
+        $this->assertEquals('/', $request->getPathInfo());
     }
 
     public function testGetParameterPrecedence()
@@ -1311,27 +1444,27 @@ class RequestTest extends TestCase
     {
         $request = new Request();
         $this->assertNull($request->getPreferredLanguage());
-        $this->assertNull($request->getPreferredLanguage(array()));
-        $this->assertEquals('fr', $request->getPreferredLanguage(array('fr')));
-        $this->assertEquals('fr', $request->getPreferredLanguage(array('fr', 'en')));
-        $this->assertEquals('en', $request->getPreferredLanguage(array('en', 'fr')));
-        $this->assertEquals('fr-ch', $request->getPreferredLanguage(array('fr-ch', 'fr-fr')));
+        $this->assertNull($request->getPreferredLanguage([]));
+        $this->assertEquals('fr', $request->getPreferredLanguage(['fr']));
+        $this->assertEquals('fr', $request->getPreferredLanguage(['fr', 'en']));
+        $this->assertEquals('en', $request->getPreferredLanguage(['en', 'fr']));
+        $this->assertEquals('fr-ch', $request->getPreferredLanguage(['fr-ch', 'fr-fr']));
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
-        $this->assertEquals('en', $request->getPreferredLanguage(array('en', 'en-us')));
+        $this->assertEquals('en', $request->getPreferredLanguage(['en', 'en-us']));
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
-        $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en')));
+        $this->assertEquals('en', $request->getPreferredLanguage(['fr', 'en']));
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, en-us; q=0.8');
-        $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en')));
+        $this->assertEquals('en', $request->getPreferredLanguage(['fr', 'en']));
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, en-us; q=0.8, fr-fr; q=0.6, fr; q=0.5');
-        $this->assertEquals('en', $request->getPreferredLanguage(array('fr', 'en')));
+        $this->assertEquals('en', $request->getPreferredLanguage(['fr', 'en']));
     }
 
     public function testIsXmlHttpRequest()
@@ -1369,72 +1502,72 @@ class RequestTest extends TestCase
     public function testGetCharsets()
     {
         $request = new Request();
-        $this->assertEquals(array(), $request->getCharsets());
+        $this->assertEquals([], $request->getCharsets());
         $request->headers->set('Accept-Charset', 'ISO-8859-1, US-ASCII, UTF-8; q=0.8, ISO-10646-UCS-2; q=0.6');
-        $this->assertEquals(array(), $request->getCharsets()); // testing caching
+        $this->assertEquals([], $request->getCharsets()); // testing caching
 
         $request = new Request();
         $request->headers->set('Accept-Charset', 'ISO-8859-1, US-ASCII, UTF-8; q=0.8, ISO-10646-UCS-2; q=0.6');
-        $this->assertEquals(array('ISO-8859-1', 'US-ASCII', 'UTF-8', 'ISO-10646-UCS-2'), $request->getCharsets());
+        $this->assertEquals(['ISO-8859-1', 'US-ASCII', 'UTF-8', 'ISO-10646-UCS-2'], $request->getCharsets());
 
         $request = new Request();
         $request->headers->set('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.7');
-        $this->assertEquals(array('ISO-8859-1', 'utf-8', '*'), $request->getCharsets());
+        $this->assertEquals(['ISO-8859-1', 'utf-8', '*'], $request->getCharsets());
     }
 
     public function testGetEncodings()
     {
         $request = new Request();
-        $this->assertEquals(array(), $request->getEncodings());
+        $this->assertEquals([], $request->getEncodings());
         $request->headers->set('Accept-Encoding', 'gzip,deflate,sdch');
-        $this->assertEquals(array(), $request->getEncodings()); // testing caching
+        $this->assertEquals([], $request->getEncodings()); // testing caching
 
         $request = new Request();
         $request->headers->set('Accept-Encoding', 'gzip,deflate,sdch');
-        $this->assertEquals(array('gzip', 'deflate', 'sdch'), $request->getEncodings());
+        $this->assertEquals(['gzip', 'deflate', 'sdch'], $request->getEncodings());
 
         $request = new Request();
         $request->headers->set('Accept-Encoding', 'gzip;q=0.4,deflate;q=0.9,compress;q=0.7');
-        $this->assertEquals(array('deflate', 'compress', 'gzip'), $request->getEncodings());
+        $this->assertEquals(['deflate', 'compress', 'gzip'], $request->getEncodings());
     }
 
     public function testGetAcceptableContentTypes()
     {
         $request = new Request();
-        $this->assertEquals(array(), $request->getAcceptableContentTypes());
+        $this->assertEquals([], $request->getAcceptableContentTypes());
         $request->headers->set('Accept', 'application/vnd.wap.wmlscriptc, text/vnd.wap.wml, application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html, multipart/mixed, */*');
-        $this->assertEquals(array(), $request->getAcceptableContentTypes()); // testing caching
+        $this->assertEquals([], $request->getAcceptableContentTypes()); // testing caching
 
         $request = new Request();
         $request->headers->set('Accept', 'application/vnd.wap.wmlscriptc, text/vnd.wap.wml, application/vnd.wap.xhtml+xml, application/xhtml+xml, text/html, multipart/mixed, */*');
-        $this->assertEquals(array('application/vnd.wap.wmlscriptc', 'text/vnd.wap.wml', 'application/vnd.wap.xhtml+xml', 'application/xhtml+xml', 'text/html', 'multipart/mixed', '*/*'), $request->getAcceptableContentTypes());
+        $this->assertEquals(['application/vnd.wap.wmlscriptc', 'text/vnd.wap.wml', 'application/vnd.wap.xhtml+xml', 'application/xhtml+xml', 'text/html', 'multipart/mixed', '*/*'], $request->getAcceptableContentTypes());
     }
 
     public function testGetLanguages()
     {
         $request = new Request();
-        $this->assertEquals(array(), $request->getLanguages());
+        $this->assertEquals([], $request->getLanguages());
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
-        $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages());
-        $this->assertEquals(array('zh', 'en_US', 'en'), $request->getLanguages());
+        $this->assertEquals(['zh', 'en_US', 'en'], $request->getLanguages());
+        $this->assertEquals(['zh', 'en_US', 'en'], $request->getLanguages());
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, en-us; q=0.6, en; q=0.8');
-        $this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages()); // Test out of order qvalues
+        $this->assertEquals(['zh', 'en', 'en_US'], $request->getLanguages()); // Test out of order qvalues
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, en, en-us');
-        $this->assertEquals(array('zh', 'en', 'en_US'), $request->getLanguages()); // Test equal weighting without qvalues
+        $this->assertEquals(['zh', 'en', 'en_US'], $request->getLanguages()); // Test equal weighting without qvalues
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh; q=0.6, en, en-us; q=0.6');
-        $this->assertEquals(array('en', 'zh', 'en_US'), $request->getLanguages()); // Test equal weighting with qvalues
+        $this->assertEquals(['en', 'zh', 'en_US'], $request->getLanguages()); // Test equal weighting with qvalues
 
         $request = new Request();
         $request->headers->set('Accept-language', 'zh, i-cherokee; q=0.6');
-        $this->assertEquals(array('zh', 'cherokee'), $request->getLanguages());
+        $this->assertEquals(['zh', 'cherokee'], $request->getLanguages());
     }
 
     public function testGetRequestFormat()
@@ -1454,7 +1587,7 @@ class RequestTest extends TestCase
         $this->assertNull($request->setRequestFormat('foo'));
         $this->assertEquals('foo', $request->getRequestFormat(null));
 
-        $request = new Request(array('_format' => 'foo'));
+        $request = new Request(['_format' => 'foo']);
         $this->assertEquals('html', $request->getRequestFormat());
     }
 
@@ -1496,8 +1629,18 @@ class RequestTest extends TestCase
         $request = new Request();
 
         $request->headers->set('Accept-language', 'zh, en-us; q=0.8, en; q=0.6');
+        $request->cookies->set('Foo', 'Bar');
+
+        $asString = (string) $request;
+
+        $this->assertContains('Accept-Language: zh, en-us; q=0.8, en; q=0.6', $asString);
+        $this->assertContains('Cookie: Foo=Bar', $asString);
 
-        $this->assertContains('Accept-Language: zh, en-us; q=0.8, en; q=0.6', $request->__toString());
+        $request->cookies->set('Another', 'Cookie');
+
+        $asString = (string) $request;
+
+        $this->assertContains('Cookie: Foo=Bar; Another=Cookie', $asString);
     }
 
     public function testIsMethod()
@@ -1521,7 +1664,7 @@ class RequestTest extends TestCase
      */
     public function testGetBaseUrl($uri, $server, $expectedBaseUrl, $expectedPathInfo)
     {
-        $request = Request::create($uri, 'GET', array(), array(), array(), $server);
+        $request = Request::create($uri, 'GET', [], [], [], $server);
 
         $this->assertSame($expectedBaseUrl, $request->getBaseUrl(), 'baseUrl');
         $this->assertSame($expectedPathInfo, $request->getPathInfo(), 'pathInfo');
@@ -1529,78 +1672,78 @@ class RequestTest extends TestCase
 
     public function getBaseUrlData()
     {
-        return array(
-            array(
+        return [
+            [
                 '/fruit/strawberry/1234index.php/blah',
-                array(
+                [
                     'SCRIPT_FILENAME' => 'E:/Sites/cc-new/public_html/fruit/index.php',
                     'SCRIPT_NAME' => '/fruit/index.php',
                     'PHP_SELF' => '/fruit/index.php',
-                ),
+                ],
                 '/fruit',
                 '/strawberry/1234index.php/blah',
-            ),
-            array(
+            ],
+            [
                 '/fruit/strawberry/1234index.php/blah',
-                array(
+                [
                     'SCRIPT_FILENAME' => 'E:/Sites/cc-new/public_html/index.php',
                     'SCRIPT_NAME' => '/index.php',
                     'PHP_SELF' => '/index.php',
-                ),
+                ],
                 '',
                 '/fruit/strawberry/1234index.php/blah',
-            ),
-            array(
+            ],
+            [
                 '/foo%20bar/',
-                array(
+                [
                     'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo bar/app.php',
                     'SCRIPT_NAME' => '/foo bar/app.php',
                     'PHP_SELF' => '/foo bar/app.php',
-                ),
+                ],
                 '/foo%20bar',
                 '/',
-            ),
-            array(
+            ],
+            [
                 '/foo%20bar/home',
-                array(
+                [
                     'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo bar/app.php',
                     'SCRIPT_NAME' => '/foo bar/app.php',
                     'PHP_SELF' => '/foo bar/app.php',
-                ),
+                ],
                 '/foo%20bar',
                 '/home',
-            ),
-            array(
+            ],
+            [
                 '/foo%20bar/app.php/home',
-                array(
+                [
                     'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo bar/app.php',
                     'SCRIPT_NAME' => '/foo bar/app.php',
                     'PHP_SELF' => '/foo bar/app.php',
-                ),
+                ],
                 '/foo%20bar/app.php',
                 '/home',
-            ),
-            array(
+            ],
+            [
                 '/foo%20bar/app.php/home%3Dbaz',
-                array(
+                [
                     'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo bar/app.php',
                     'SCRIPT_NAME' => '/foo bar/app.php',
                     'PHP_SELF' => '/foo bar/app.php',
-                ),
+                ],
                 '/foo%20bar/app.php',
                 '/home%3Dbaz',
-            ),
-            array(
+            ],
+            [
                 '/foo/bar+baz',
-                array(
+                [
                     'SCRIPT_FILENAME' => '/home/John Doe/public_html/foo/app.php',
                     'SCRIPT_NAME' => '/foo/app.php',
                     'PHP_SELF' => '/foo/app.php',
-                ),
+                ],
                 '/foo',
                 '/bar+baz',
-            ),
-        );
+            ],
+        ];
     }
 
     /**
@@ -1618,16 +1761,16 @@ class RequestTest extends TestCase
 
     public function urlencodedStringPrefixData()
     {
-        return array(
-            array('foo', 'foo', 'foo'),
-            array('fo%6f', 'foo', 'fo%6f'),
-            array('foo/bar', 'foo', 'foo'),
-            array('fo%6f/bar', 'foo', 'fo%6f'),
-            array('f%6f%6f/bar', 'foo', 'f%6f%6f'),
-            array('%66%6F%6F/bar', 'foo', '%66%6F%6F'),
-            array('fo+o/bar', 'fo+o', 'fo+o'),
-            array('fo%2Bo/bar', 'fo+o', 'fo%2Bo'),
-        );
+        return [
+            ['foo', 'foo', 'foo'],
+            ['fo%6f', 'foo', 'fo%6f'],
+            ['foo/bar', 'foo', 'foo'],
+            ['fo%6f/bar', 'foo', 'fo%6f'],
+            ['f%6f%6f/bar', 'foo', 'f%6f%6f'],
+            ['%66%6F%6F/bar', 'foo', '%66%6F%6F'],
+            ['fo+o/bar', 'fo+o', 'fo+o'],
+            ['fo%2Bo/bar', 'fo+o', 'fo%2Bo'],
+        ];
     }
 
     private function disableHttpMethodParameterOverride()
@@ -1642,7 +1785,7 @@ class RequestTest extends TestCase
     {
         $request = new Request();
 
-        $server = array('REMOTE_ADDR' => $remoteAddr);
+        $server = ['REMOTE_ADDR' => $remoteAddr];
         if (null !== $httpForwardedFor) {
             $server['HTTP_X_FORWARDED_FOR'] = $httpForwardedFor;
         }
@@ -1651,7 +1794,7 @@ class RequestTest extends TestCase
             Request::setTrustedProxies($trustedProxies, Request::HEADER_X_FORWARDED_ALL);
         }
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         return $request;
     }
@@ -1660,7 +1803,7 @@ class RequestTest extends TestCase
     {
         $request = new Request();
 
-        $server = array('REMOTE_ADDR' => $remoteAddr);
+        $server = ['REMOTE_ADDR' => $remoteAddr];
 
         if (null !== $httpForwarded) {
             $server['HTTP_FORWARDED'] = $httpForwarded;
@@ -1670,7 +1813,7 @@ class RequestTest extends TestCase
             Request::setTrustedProxies($trustedProxies, Request::HEADER_FORWARDED);
         }
 
-        $request->initialize(array(), array(), array(), array(), array(), $server);
+        $request->initialize([], [], [], [], [], $server);
 
         return $request;
     }
@@ -1691,35 +1834,35 @@ class RequestTest extends TestCase
         $this->assertFalse($request->isSecure());
 
         // disabling proxy trusting
-        Request::setTrustedProxies(array(), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies([], Request::HEADER_X_FORWARDED_ALL);
         $this->assertEquals('3.3.3.3', $request->getClientIp());
         $this->assertEquals('example.com', $request->getHost());
         $this->assertEquals(80, $request->getPort());
         $this->assertFalse($request->isSecure());
 
         // request is forwarded by a non-trusted proxy
-        Request::setTrustedProxies(array('2.2.2.2'), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies(['2.2.2.2'], Request::HEADER_X_FORWARDED_ALL);
         $this->assertEquals('3.3.3.3', $request->getClientIp());
         $this->assertEquals('example.com', $request->getHost());
         $this->assertEquals(80, $request->getPort());
         $this->assertFalse($request->isSecure());
 
         // trusted proxy via setTrustedProxies()
-        Request::setTrustedProxies(array('3.3.3.3', '2.2.2.2'), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies(['3.3.3.3', '2.2.2.2'], Request::HEADER_X_FORWARDED_ALL);
         $this->assertEquals('1.1.1.1', $request->getClientIp());
         $this->assertEquals('foo.example.com', $request->getHost());
         $this->assertEquals(443, $request->getPort());
         $this->assertTrue($request->isSecure());
 
         // trusted proxy via setTrustedProxies()
-        Request::setTrustedProxies(array('3.3.3.4', '2.2.2.2'), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies(['3.3.3.4', '2.2.2.2'], Request::HEADER_X_FORWARDED_ALL);
         $this->assertEquals('3.3.3.3', $request->getClientIp());
         $this->assertEquals('example.com', $request->getHost());
         $this->assertEquals(80, $request->getPort());
         $this->assertFalse($request->isSecure());
 
         // check various X_FORWARDED_PROTO header values
-        Request::setTrustedProxies(array('3.3.3.3', '2.2.2.2'), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies(['3.3.3.3', '2.2.2.2'], Request::HEADER_X_FORWARDED_ALL);
         $request->headers->set('X_FORWARDED_PROTO', 'ssl');
         $this->assertTrue($request->isSecure());
 
@@ -1729,7 +1872,7 @@ class RequestTest extends TestCase
 
     /**
      * @group legacy
-     * @expectedDeprecation The "Symfony\Component\HttpFoundation\Request::setTrustedHeaderName()" method is deprecated since version 3.3 and will be removed in 4.0. Use the $trustedHeaderSet argument of the Request::setTrustedProxies() method instead.
+     * @expectedDeprecation The "Symfony\Component\HttpFoundation\Request::setTrustedHeaderName()" method is deprecated since Symfony 3.3 and will be removed in 4.0. Use the $trustedHeaderSet argument of the Request::setTrustedProxies() method instead.
      */
     public function testLegacyTrustedProxies()
     {
@@ -1744,7 +1887,7 @@ class RequestTest extends TestCase
         $request->headers->set('X_MY_PROTO', 'http');
         $request->headers->set('X_MY_PORT', 81);
 
-        Request::setTrustedProxies(array('3.3.3.3', '2.2.2.2'), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies(['3.3.3.3', '2.2.2.2'], Request::HEADER_X_FORWARDED_ALL);
 
         // custom header names
         Request::setTrustedHeaderName(Request::HEADER_CLIENT_IP, 'X_MY_FOR');
@@ -1787,35 +1930,35 @@ class RequestTest extends TestCase
         $this->assertFalse($request->isSecure());
 
         // disabling proxy trusting
-        Request::setTrustedProxies(array(), Request::HEADER_FORWARDED);
+        Request::setTrustedProxies([], Request::HEADER_FORWARDED);
         $this->assertEquals('3.3.3.3', $request->getClientIp());
         $this->assertEquals('example.com', $request->getHost());
         $this->assertEquals(80, $request->getPort());
         $this->assertFalse($request->isSecure());
 
         // request is forwarded by a non-trusted proxy
-        Request::setTrustedProxies(array('2.2.2.2'), Request::HEADER_FORWARDED);
+        Request::setTrustedProxies(['2.2.2.2'], Request::HEADER_FORWARDED);
         $this->assertEquals('3.3.3.3', $request->getClientIp());
         $this->assertEquals('example.com', $request->getHost());
         $this->assertEquals(80, $request->getPort());
         $this->assertFalse($request->isSecure());
 
         // trusted proxy via setTrustedProxies()
-        Request::setTrustedProxies(array('3.3.3.3', '2.2.2.2'), Request::HEADER_FORWARDED);
+        Request::setTrustedProxies(['3.3.3.3', '2.2.2.2'], Request::HEADER_FORWARDED);
         $this->assertEquals('1.1.1.1', $request->getClientIp());
         $this->assertEquals('foo.example.com', $request->getHost());
         $this->assertEquals(8080, $request->getPort());
         $this->assertTrue($request->isSecure());
 
         // trusted proxy via setTrustedProxies()
-        Request::setTrustedProxies(array('3.3.3.4', '2.2.2.2'), Request::HEADER_FORWARDED);
+        Request::setTrustedProxies(['3.3.3.4', '2.2.2.2'], Request::HEADER_FORWARDED);
         $this->assertEquals('3.3.3.3', $request->getClientIp());
         $this->assertEquals('example.com', $request->getHost());
         $this->assertEquals(80, $request->getPort());
         $this->assertFalse($request->isSecure());
 
         // check various X_FORWARDED_PROTO header values
-        Request::setTrustedProxies(array('3.3.3.3', '2.2.2.2'), Request::HEADER_FORWARDED);
+        Request::setTrustedProxies(['3.3.3.3', '2.2.2.2'], Request::HEADER_FORWARDED);
         $request->headers->set('FORWARDED', 'proto=ssl');
         $this->assertTrue($request->isSecure());
 
@@ -1855,81 +1998,37 @@ class RequestTest extends TestCase
         $this->assertEquals($expectedRequestUri, $request->getRequestUri(), '->getRequestUri() is correct');
 
         $subRequestUri = '/bar/foo';
-        $subRequest = Request::create($subRequestUri, 'get', array(), array(), array(), $request->server->all());
+        $subRequest = Request::create($subRequestUri, 'get', [], [], [], $request->server->all());
         $this->assertEquals($subRequestUri, $subRequest->getRequestUri(), '->getRequestUri() is correct in sub request');
     }
 
     public function iisRequestUriProvider()
     {
-        return array(
-            array(
-                array(
-                    'X_ORIGINAL_URL' => '/foo/bar',
-                ),
-                array(),
-                '/foo/bar',
-            ),
-            array(
-                array(
-                    'X_REWRITE_URL' => '/foo/bar',
-                ),
-                array(),
-                '/foo/bar',
-            ),
-            array(
-                array(),
-                array(
-                    'IIS_WasUrlRewritten' => '1',
-                    'UNENCODED_URL' => '/foo/bar',
-                ),
-                '/foo/bar',
-            ),
-            array(
-                array(
-                    'X_ORIGINAL_URL' => '/foo/bar',
-                ),
-                array(
-                    'HTTP_X_ORIGINAL_URL' => '/foo/bar',
-                ),
-                '/foo/bar',
-            ),
-            array(
-                array(
-                    'X_ORIGINAL_URL' => '/foo/bar',
-                ),
-                array(
-                    'IIS_WasUrlRewritten' => '1',
-                    'UNENCODED_URL' => '/foo/bar',
-                ),
-                '/foo/bar',
-            ),
-            array(
-                array(
-                    'X_ORIGINAL_URL' => '/foo/bar',
-                ),
-                array(
-                    'HTTP_X_ORIGINAL_URL' => '/foo/bar',
+        return [
+            [
+                [],
+                [
                     'IIS_WasUrlRewritten' => '1',
                     'UNENCODED_URL' => '/foo/bar',
-                ),
+                ],
                 '/foo/bar',
-            ),
-            array(
-                array(),
-                array(
+            ],
+            [
+                [],
+                [
                     'ORIG_PATH_INFO' => '/foo/bar',
-                ),
+                ],
                 '/foo/bar',
-            ),
-            array(
-                array(),
-                array(
+            ],
+            [
+                [],
+                [
                     'ORIG_PATH_INFO' => '/foo/bar',
                     'QUERY_STRING' => 'foo=bar',
-                ),
+                ],
                 '/foo/bar?foo=bar',
-            ),
-        );
+            ],
+        ];
     }
 
     public function testTrustedHosts()
@@ -1942,7 +2041,7 @@ class RequestTest extends TestCase
         $this->assertEquals('evil.com', $request->getHost());
 
         // add a trusted domain and all its subdomains
-        Request::setTrustedHosts(array('^([a-z]{9}\.)?trusted\.com$'));
+        Request::setTrustedHosts(['^([a-z]{9}\.)?trusted\.com$']);
 
         // untrusted host
         $request->headers->set('host', 'evil.com');
@@ -1970,14 +2069,20 @@ class RequestTest extends TestCase
 
         $request->headers->set('host', 'subdomain.trusted.com');
         $this->assertEquals('subdomain.trusted.com', $request->getHost());
+    }
+
+    public function testSetTrustedHostsDoesNotBreakOnSpecialCharacters()
+    {
+        Request::setTrustedHosts(['localhost(\.local){0,1}#,example.com', 'localhost']);
 
-        // reset request for following tests
-        Request::setTrustedHosts(array());
+        $request = Request::create('/');
+        $request->headers->set('host', 'localhost');
+        $this->assertSame('localhost', $request->getHost());
     }
 
     public function testFactory()
     {
-        Request::setFactory(function (array $query = array(), array $request = array(), array $attributes = array(), array $cookies = array(), array $files = array(), array $server = array(), $content = null) {
+        Request::setFactory(function (array $query = [], array $request = [], array $attributes = [], array $cookies = [], array $files = [], array $server = [], $content = null) {
             return new NewRequest();
         });
 
@@ -2026,23 +2131,23 @@ class RequestTest extends TestCase
 
     public function getHostValidities()
     {
-        return array(
-            array('.a', false),
-            array('a..', false),
-            array('a.', true),
-            array("\xE9", false),
-            array('[::1]', true),
-            array('[::1]:80', true, '[::1]', 80),
-            array(str_repeat('.', 101), false),
-        );
+        return [
+            ['.a', false],
+            ['a..', false],
+            ['a.', true],
+            ["\xE9", false],
+            ['[::1]', true],
+            ['[::1]:80', true, '[::1]', 80],
+            [str_repeat('.', 101), false],
+        ];
     }
 
     public function getLongHostNames()
     {
-        return array(
-            array('a'.str_repeat('.a', 40000)),
-            array(str_repeat(':', 101)),
-        );
+        return [
+            ['a'.str_repeat('.a', 40000)],
+            [str_repeat(':', 101)],
+        ];
     }
 
     /**
@@ -2057,18 +2162,18 @@ class RequestTest extends TestCase
 
     public function methodIdempotentProvider()
     {
-        return array(
-            array('HEAD', true),
-            array('GET', true),
-            array('POST', false),
-            array('PUT', true),
-            array('PATCH', false),
-            array('DELETE', true),
-            array('PURGE', true),
-            array('OPTIONS', true),
-            array('TRACE', true),
-            array('CONNECT', false),
-        );
+        return [
+            ['HEAD', true],
+            ['GET', true],
+            ['POST', false],
+            ['PUT', true],
+            ['PATCH', false],
+            ['DELETE', true],
+            ['PURGE', true],
+            ['OPTIONS', true],
+            ['TRACE', true],
+            ['CONNECT', false],
+        ];
     }
 
     /**
@@ -2083,23 +2188,23 @@ class RequestTest extends TestCase
 
     public function methodSafeProvider()
     {
-        return array(
-            array('HEAD', true),
-            array('GET', true),
-            array('POST', false),
-            array('PUT', false),
-            array('PATCH', false),
-            array('DELETE', false),
-            array('PURGE', false),
-            array('OPTIONS', true),
-            array('TRACE', true),
-            array('CONNECT', false),
-        );
+        return [
+            ['HEAD', true],
+            ['GET', true],
+            ['POST', false],
+            ['PUT', false],
+            ['PATCH', false],
+            ['DELETE', false],
+            ['PURGE', false],
+            ['OPTIONS', true],
+            ['TRACE', true],
+            ['CONNECT', false],
+        ];
     }
 
     /**
      * @group legacy
-     * @expectedDeprecation Checking only for cacheable HTTP methods with Symfony\Component\HttpFoundation\Request::isMethodSafe() is deprecated since version 3.2 and will throw an exception in 4.0. Disable checking only for cacheable methods by calling the method with `false` as first argument or use the Request::isMethodCacheable() instead.
+     * @expectedDeprecation Checking only for cacheable HTTP methods with Symfony\Component\HttpFoundation\Request::isMethodSafe() is deprecated since Symfony 3.2 and will throw an exception in 4.0. Disable checking only for cacheable methods by calling the method with `false` as first argument or use the Request::isMethodCacheable() instead.
      */
     public function testMethodSafeChecksCacheable()
     {
@@ -2111,27 +2216,27 @@ class RequestTest extends TestCase
     /**
      * @dataProvider methodCacheableProvider
      */
-    public function testMethodCacheable($method, $chacheable)
+    public function testMethodCacheable($method, $cacheable)
     {
         $request = new Request();
         $request->setMethod($method);
-        $this->assertEquals($chacheable, $request->isMethodCacheable());
+        $this->assertEquals($cacheable, $request->isMethodCacheable());
     }
 
     public function methodCacheableProvider()
     {
-        return array(
-            array('HEAD', true),
-            array('GET', true),
-            array('POST', false),
-            array('PUT', false),
-            array('PATCH', false),
-            array('DELETE', false),
-            array('PURGE', false),
-            array('OPTIONS', false),
-            array('TRACE', false),
-            array('CONNECT', false),
-        );
+        return [
+            ['HEAD', true],
+            ['GET', true],
+            ['POST', false],
+            ['PUT', false],
+            ['PATCH', false],
+            ['DELETE', false],
+            ['PURGE', false],
+            ['OPTIONS', false],
+            ['TRACE', false],
+            ['CONNECT', false],
+        ];
     }
 
     /**
@@ -2139,7 +2244,7 @@ class RequestTest extends TestCase
      */
     public function testGetTrustedHeaderName()
     {
-        Request::setTrustedProxies(array('8.8.8.8'), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_X_FORWARDED_ALL);
 
         $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
         $this->assertSame('X_FORWARDED_FOR', Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP));
@@ -2147,7 +2252,7 @@ class RequestTest extends TestCase
         $this->assertSame('X_FORWARDED_PORT', Request::getTrustedHeaderName(Request::HEADER_CLIENT_PORT));
         $this->assertSame('X_FORWARDED_PROTO', Request::getTrustedHeaderName(Request::HEADER_CLIENT_PROTO));
 
-        Request::setTrustedProxies(array('8.8.8.8'), Request::HEADER_FORWARDED);
+        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_FORWARDED);
 
         $this->assertSame('FORWARDED', Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
         $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP));
@@ -2161,7 +2266,7 @@ class RequestTest extends TestCase
         Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'D');
         Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'E');
 
-        Request::setTrustedProxies(array('8.8.8.8'), Request::HEADER_FORWARDED);
+        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_FORWARDED);
 
         $this->assertSame('A', Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
         $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP));
@@ -2169,7 +2274,7 @@ class RequestTest extends TestCase
         $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_PORT));
         $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_CLIENT_PROTO));
 
-        Request::setTrustedProxies(array('8.8.8.8'), Request::HEADER_X_FORWARDED_ALL);
+        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_X_FORWARDED_ALL);
 
         $this->assertNull(Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
         $this->assertSame('B', Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP));
@@ -2177,7 +2282,7 @@ class RequestTest extends TestCase
         $this->assertSame('D', Request::getTrustedHeaderName(Request::HEADER_CLIENT_PORT));
         $this->assertSame('E', Request::getTrustedHeaderName(Request::HEADER_CLIENT_PROTO));
 
-        Request::setTrustedProxies(array('8.8.8.8'), Request::HEADER_FORWARDED);
+        Request::setTrustedProxies(['8.8.8.8'], Request::HEADER_FORWARDED);
 
         $this->assertSame('A', Request::getTrustedHeaderName(Request::HEADER_FORWARDED));
 
@@ -2188,13 +2293,147 @@ class RequestTest extends TestCase
         Request::setTrustedHeaderName(Request::HEADER_CLIENT_PORT, 'X_FORWARDED_PORT');
         Request::setTrustedHeaderName(Request::HEADER_CLIENT_PROTO, 'X_FORWARDED_PROTO');
     }
+
+    /**
+     * @dataProvider protocolVersionProvider
+     */
+    public function testProtocolVersion($serverProtocol, $trustedProxy, $via, $expected)
+    {
+        if ($trustedProxy) {
+            Request::setTrustedProxies(['1.1.1.1'], -1);
+        }
+
+        $request = new Request();
+        $request->server->set('SERVER_PROTOCOL', $serverProtocol);
+        $request->server->set('REMOTE_ADDR', '1.1.1.1');
+        $request->headers->set('Via', $via);
+
+        $this->assertSame($expected, $request->getProtocolVersion());
+    }
+
+    public function protocolVersionProvider()
+    {
+        return [
+            'untrusted without via' => ['HTTP/2.0', false, '', 'HTTP/2.0'],
+            'untrusted with via' => ['HTTP/2.0', false, '1.0 fred, 1.1 nowhere.com (Apache/1.1)', 'HTTP/2.0'],
+            'trusted without via' => ['HTTP/2.0', true, '', 'HTTP/2.0'],
+            'trusted with via' => ['HTTP/2.0', true, '1.0 fred, 1.1 nowhere.com (Apache/1.1)', 'HTTP/1.0'],
+            'trusted with via and protocol name' => ['HTTP/2.0', true, 'HTTP/1.0 fred, HTTP/1.1 nowhere.com (Apache/1.1)', 'HTTP/1.0'],
+            'trusted with broken via' => ['HTTP/2.0', true, 'HTTP/1^0 foo', 'HTTP/2.0'],
+            'trusted with partially-broken via' => ['HTTP/2.0', true, '1.0 fred, foo', 'HTTP/1.0'],
+        ];
+    }
+
+    public function nonstandardRequestsData()
+    {
+        return [
+            ['',  '', '/', 'http://host:8080/', ''],
+            ['/', '', '/', 'http://host:8080/', ''],
+
+            ['hello/app.php/x',  '', '/x', 'http://host:8080/hello/app.php/x', '/hello', '/hello/app.php'],
+            ['/hello/app.php/x', '', '/x', 'http://host:8080/hello/app.php/x', '/hello', '/hello/app.php'],
+
+            ['',      'a=b', '/', 'http://host:8080/?a=b'],
+            ['?a=b',  'a=b', '/', 'http://host:8080/?a=b'],
+            ['/?a=b', 'a=b', '/', 'http://host:8080/?a=b'],
+
+            ['x',      'a=b', '/x', 'http://host:8080/x?a=b'],
+            ['x?a=b',  'a=b', '/x', 'http://host:8080/x?a=b'],
+            ['/x?a=b', 'a=b', '/x', 'http://host:8080/x?a=b'],
+
+            ['hello/x',  '', '/x', 'http://host:8080/hello/x', '/hello'],
+            ['/hello/x', '', '/x', 'http://host:8080/hello/x', '/hello'],
+
+            ['hello/app.php/x',      'a=b', '/x', 'http://host:8080/hello/app.php/x?a=b', '/hello', '/hello/app.php'],
+            ['hello/app.php/x?a=b',  'a=b', '/x', 'http://host:8080/hello/app.php/x?a=b', '/hello', '/hello/app.php'],
+            ['/hello/app.php/x?a=b', 'a=b', '/x', 'http://host:8080/hello/app.php/x?a=b', '/hello', '/hello/app.php'],
+        ];
+    }
+
+    /**
+     * @dataProvider nonstandardRequestsData
+     */
+    public function testNonstandardRequests($requestUri, $queryString, $expectedPathInfo, $expectedUri, $expectedBasePath = '', $expectedBaseUrl = null)
+    {
+        if (null === $expectedBaseUrl) {
+            $expectedBaseUrl = $expectedBasePath;
+        }
+
+        $server = [
+            'HTTP_HOST' => 'host:8080',
+            'SERVER_PORT' => '8080',
+            'QUERY_STRING' => $queryString,
+            'PHP_SELF' => '/hello/app.php',
+            'SCRIPT_FILENAME' => '/some/path/app.php',
+            'REQUEST_URI' => $requestUri,
+        ];
+
+        $request = new Request([], [], [], [], [], $server);
+
+        $this->assertEquals($expectedPathInfo, $request->getPathInfo());
+        $this->assertEquals($expectedUri, $request->getUri());
+        $this->assertEquals($queryString, $request->getQueryString());
+        $this->assertEquals(8080, $request->getPort());
+        $this->assertEquals('host:8080', $request->getHttpHost());
+        $this->assertEquals($expectedBaseUrl, $request->getBaseUrl());
+        $this->assertEquals($expectedBasePath, $request->getBasePath());
+    }
+
+    public function testTrustedHost()
+    {
+        Request::setTrustedProxies(['1.1.1.1'], -1);
+
+        $request = Request::create('/');
+        $request->server->set('REMOTE_ADDR', '1.1.1.1');
+        $request->headers->set('Forwarded', 'host=localhost:8080');
+        $request->headers->set('X-Forwarded-Host', 'localhost:8080');
+
+        $this->assertSame('localhost:8080', $request->getHttpHost());
+        $this->assertSame(8080, $request->getPort());
+
+        $request = Request::create('/');
+        $request->server->set('REMOTE_ADDR', '1.1.1.1');
+        $request->headers->set('Forwarded', 'host="[::1]:443"');
+        $request->headers->set('X-Forwarded-Host', '[::1]:443');
+        $request->headers->set('X-Forwarded-Port', 443);
+
+        $this->assertSame('[::1]:443', $request->getHttpHost());
+        $this->assertSame(443, $request->getPort());
+    }
+
+    public function testTrustedPort()
+    {
+        Request::setTrustedProxies(['1.1.1.1'], -1);
+
+        $request = Request::create('/');
+        $request->server->set('REMOTE_ADDR', '1.1.1.1');
+        $request->headers->set('Forwarded', 'host=localhost:8080');
+        $request->headers->set('X-Forwarded-Port', 8080);
+
+        $this->assertSame(8080, $request->getPort());
+
+        $request = Request::create('/');
+        $request->server->set('REMOTE_ADDR', '1.1.1.1');
+        $request->headers->set('Forwarded', 'host=localhost');
+        $request->headers->set('X-Forwarded-Port', 80);
+
+        $this->assertSame(80, $request->getPort());
+
+        $request = Request::create('/');
+        $request->server->set('REMOTE_ADDR', '1.1.1.1');
+        $request->headers->set('Forwarded', 'host="[::1]"');
+        $request->headers->set('X-Forwarded-Proto', 'https');
+        $request->headers->set('X-Forwarded-Port', 443);
+
+        $this->assertSame(443, $request->getPort());
+    }
 }
 
 class RequestContentProxy extends Request
 {
     public function getContent($asResource = false)
     {
-        return http_build_query(array('_method' => 'PUT', 'content' => 'mycontent'));
+        return http_build_query(['_method' => 'PUT', 'content' => 'mycontent'], '', '&');
     }
 }
 
diff --git a/vendor/symfony/http-foundation/Tests/ResponseFunctionalTest.php b/vendor/symfony/http-foundation/Tests/ResponseFunctionalTest.php
new file mode 100644
index 00000000..3d3e696c
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/ResponseFunctionalTest.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Tests;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @requires PHP 7.0
+ */
+class ResponseFunctionalTest extends TestCase
+{
+    private static $server;
+
+    public static function setUpBeforeClass()
+    {
+        $spec = [
+            1 => ['file', '/dev/null', 'w'],
+            2 => ['file', '/dev/null', 'w'],
+        ];
+        if (!self::$server = @proc_open('exec php -S localhost:8054', $spec, $pipes, __DIR__.'/Fixtures/response-functional')) {
+            self::markTestSkipped('PHP server unable to start.');
+        }
+        sleep(1);
+    }
+
+    public static function tearDownAfterClass()
+    {
+        if (self::$server) {
+            proc_terminate(self::$server);
+            proc_close(self::$server);
+        }
+    }
+
+    /**
+     * @dataProvider provideCookie
+     */
+    public function testCookie($fixture)
+    {
+        $result = file_get_contents(sprintf('http://localhost:8054/%s.php', $fixture));
+        $this->assertStringMatchesFormatFile(__DIR__.sprintf('/Fixtures/response-functional/%s.expected', $fixture), $result);
+    }
+
+    public function provideCookie()
+    {
+        foreach (glob(__DIR__.'/Fixtures/response-functional/*.php') as $file) {
+            yield [pathinfo($file, PATHINFO_FILENAME)];
+        }
+    }
+}
diff --git a/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php b/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php
index 41365672..93aacf24 100644
--- a/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/ResponseHeaderBagTest.php
@@ -12,109 +12,96 @@
 namespace Symfony\Component\HttpFoundation\Tests;
 
 use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\ResponseHeaderBag;
 use Symfony\Component\HttpFoundation\Cookie;
+use Symfony\Component\HttpFoundation\ResponseHeaderBag;
 
 /**
  * @group time-sensitive
  */
 class ResponseHeaderBagTest extends TestCase
 {
-    /**
-     * @dataProvider provideAllPreserveCase
-     */
-    public function testAllPreserveCase($headers, $expected)
+    public function testAllPreserveCase()
     {
-        $bag = new ResponseHeaderBag($headers);
+        $headers = [
+            'fOo' => 'BAR',
+            'ETag' => 'xyzzy',
+            'Content-MD5' => 'Q2hlY2sgSW50ZWdyaXR5IQ==',
+            'P3P' => 'CP="CAO PSA OUR"',
+            'WWW-Authenticate' => 'Basic realm="WallyWorld"',
+            'X-UA-Compatible' => 'IE=edge,chrome=1',
+            'X-XSS-Protection' => '1; mode=block',
+        ];
 
-        $this->assertEquals($expected, $bag->allPreserveCase(), '->allPreserveCase() gets all input keys in original case');
-    }
+        $bag = new ResponseHeaderBag($headers);
+        $allPreservedCase = $bag->allPreserveCase();
 
-    public function provideAllPreserveCase()
-    {
-        return array(
-            array(
-                array('fOo' => 'BAR'),
-                array('fOo' => array('BAR'), 'Cache-Control' => array('no-cache, private')),
-            ),
-            array(
-                array('ETag' => 'xyzzy'),
-                array('ETag' => array('xyzzy'), 'Cache-Control' => array('private, must-revalidate')),
-            ),
-            array(
-                array('Content-MD5' => 'Q2hlY2sgSW50ZWdyaXR5IQ=='),
-                array('Content-MD5' => array('Q2hlY2sgSW50ZWdyaXR5IQ=='), 'Cache-Control' => array('no-cache, private')),
-            ),
-            array(
-                array('P3P' => 'CP="CAO PSA OUR"'),
-                array('P3P' => array('CP="CAO PSA OUR"'), 'Cache-Control' => array('no-cache, private')),
-            ),
-            array(
-                array('WWW-Authenticate' => 'Basic realm="WallyWorld"'),
-                array('WWW-Authenticate' => array('Basic realm="WallyWorld"'), 'Cache-Control' => array('no-cache, private')),
-            ),
-            array(
-                array('X-UA-Compatible' => 'IE=edge,chrome=1'),
-                array('X-UA-Compatible' => array('IE=edge,chrome=1'), 'Cache-Control' => array('no-cache, private')),
-            ),
-            array(
-                array('X-XSS-Protection' => '1; mode=block'),
-                array('X-XSS-Protection' => array('1; mode=block'), 'Cache-Control' => array('no-cache, private')),
-            ),
-        );
+        foreach (array_keys($headers) as $headerName) {
+            $this->assertArrayHasKey($headerName, $allPreservedCase, '->allPreserveCase() gets all input keys in original case');
+        }
     }
 
     public function testCacheControlHeader()
     {
-        $bag = new ResponseHeaderBag(array());
+        $bag = new ResponseHeaderBag([]);
         $this->assertEquals('no-cache, private', $bag->get('Cache-Control'));
         $this->assertTrue($bag->hasCacheControlDirective('no-cache'));
 
-        $bag = new ResponseHeaderBag(array('Cache-Control' => 'public'));
+        $bag = new ResponseHeaderBag(['Cache-Control' => 'public']);
         $this->assertEquals('public', $bag->get('Cache-Control'));
         $this->assertTrue($bag->hasCacheControlDirective('public'));
 
-        $bag = new ResponseHeaderBag(array('ETag' => 'abcde'));
+        $bag = new ResponseHeaderBag(['ETag' => 'abcde']);
         $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control'));
         $this->assertTrue($bag->hasCacheControlDirective('private'));
         $this->assertTrue($bag->hasCacheControlDirective('must-revalidate'));
         $this->assertFalse($bag->hasCacheControlDirective('max-age'));
 
-        $bag = new ResponseHeaderBag(array('Expires' => 'Wed, 16 Feb 2011 14:17:43 GMT'));
+        $bag = new ResponseHeaderBag(['Expires' => 'Wed, 16 Feb 2011 14:17:43 GMT']);
         $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control'));
 
-        $bag = new ResponseHeaderBag(array(
+        $bag = new ResponseHeaderBag([
             'Expires' => 'Wed, 16 Feb 2011 14:17:43 GMT',
             'Cache-Control' => 'max-age=3600',
-        ));
+        ]);
         $this->assertEquals('max-age=3600, private', $bag->get('Cache-Control'));
 
-        $bag = new ResponseHeaderBag(array('Last-Modified' => 'abcde'));
+        $bag = new ResponseHeaderBag(['Last-Modified' => 'abcde']);
         $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control'));
 
-        $bag = new ResponseHeaderBag(array('Etag' => 'abcde', 'Last-Modified' => 'abcde'));
+        $bag = new ResponseHeaderBag(['Etag' => 'abcde', 'Last-Modified' => 'abcde']);
         $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control'));
 
-        $bag = new ResponseHeaderBag(array('cache-control' => 'max-age=100'));
+        $bag = new ResponseHeaderBag(['cache-control' => 'max-age=100']);
         $this->assertEquals('max-age=100, private', $bag->get('Cache-Control'));
 
-        $bag = new ResponseHeaderBag(array('cache-control' => 's-maxage=100'));
+        $bag = new ResponseHeaderBag(['cache-control' => 's-maxage=100']);
         $this->assertEquals('s-maxage=100', $bag->get('Cache-Control'));
 
-        $bag = new ResponseHeaderBag(array('cache-control' => 'private, max-age=100'));
+        $bag = new ResponseHeaderBag(['cache-control' => 'private, max-age=100']);
         $this->assertEquals('max-age=100, private', $bag->get('Cache-Control'));
 
-        $bag = new ResponseHeaderBag(array('cache-control' => 'public, max-age=100'));
+        $bag = new ResponseHeaderBag(['cache-control' => 'public, max-age=100']);
         $this->assertEquals('max-age=100, public', $bag->get('Cache-Control'));
 
         $bag = new ResponseHeaderBag();
         $bag->set('Last-Modified', 'abcde');
         $this->assertEquals('private, must-revalidate', $bag->get('Cache-Control'));
+
+        $bag = new ResponseHeaderBag();
+        $bag->set('Cache-Control', ['public', 'must-revalidate']);
+        $this->assertCount(1, $bag->get('Cache-Control', null, false));
+        $this->assertEquals('must-revalidate, public', $bag->get('Cache-Control'));
+
+        $bag = new ResponseHeaderBag();
+        $bag->set('Cache-Control', 'public');
+        $bag->set('Cache-Control', 'must-revalidate', false);
+        $this->assertCount(1, $bag->get('Cache-Control', null, false));
+        $this->assertEquals('must-revalidate, public', $bag->get('Cache-Control'));
     }
 
     public function testCacheControlClone()
     {
-        $headers = array('foo' => 'bar');
+        $headers = ['foo' => 'bar'];
         $bag1 = new ResponseHeaderBag($headers);
         $bag2 = new ResponseHeaderBag($bag1->allPreserveCase());
         $this->assertEquals($bag1->allPreserveCase(), $bag2->allPreserveCase());
@@ -122,44 +109,44 @@ class ResponseHeaderBagTest extends TestCase
 
     public function testToStringIncludesCookieHeaders()
     {
-        $bag = new ResponseHeaderBag(array());
+        $bag = new ResponseHeaderBag([]);
         $bag->setCookie(new Cookie('foo', 'bar'));
 
         $this->assertSetCookieHeader('foo=bar; path=/; httponly', $bag);
 
         $bag->clearCookie('foo');
 
-        $this->assertSetCookieHeader('foo=deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; max-age=-31536001; path=/; httponly', $bag);
+        $this->assertSetCookieHeader('foo=deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; Max-Age=0; path=/; httponly', $bag);
     }
 
     public function testClearCookieSecureNotHttpOnly()
     {
-        $bag = new ResponseHeaderBag(array());
+        $bag = new ResponseHeaderBag([]);
 
         $bag->clearCookie('foo', '/', null, true, false);
 
-        $this->assertSetCookieHeader('foo=deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; max-age=-31536001; path=/; secure', $bag);
+        $this->assertSetCookieHeader('foo=deleted; expires='.gmdate('D, d-M-Y H:i:s T', time() - 31536001).'; Max-Age=0; path=/; secure', $bag);
     }
 
     public function testReplace()
     {
-        $bag = new ResponseHeaderBag(array());
+        $bag = new ResponseHeaderBag([]);
         $this->assertEquals('no-cache, private', $bag->get('Cache-Control'));
         $this->assertTrue($bag->hasCacheControlDirective('no-cache'));
 
-        $bag->replace(array('Cache-Control' => 'public'));
+        $bag->replace(['Cache-Control' => 'public']);
         $this->assertEquals('public', $bag->get('Cache-Control'));
         $this->assertTrue($bag->hasCacheControlDirective('public'));
     }
 
     public function testReplaceWithRemove()
     {
-        $bag = new ResponseHeaderBag(array());
+        $bag = new ResponseHeaderBag([]);
         $this->assertEquals('no-cache, private', $bag->get('Cache-Control'));
         $this->assertTrue($bag->hasCacheControlDirective('no-cache'));
 
         $bag->remove('Cache-Control');
-        $bag->replace(array());
+        $bag->replace([]);
         $this->assertEquals('no-cache, private', $bag->get('Cache-Control'));
         $this->assertTrue($bag->hasCacheControlDirective('no-cache'));
     }
@@ -174,12 +161,12 @@ class ResponseHeaderBagTest extends TestCase
 
         $this->assertCount(4, $bag->getCookies());
         $this->assertEquals('foo=bar; path=/path/foo; domain=foo.bar; httponly', $bag->get('set-cookie'));
-        $this->assertEquals(array(
+        $this->assertEquals([
             'foo=bar; path=/path/foo; domain=foo.bar; httponly',
             'foo=bar; path=/path/bar; domain=foo.bar; httponly',
             'foo=bar; path=/path/bar; domain=bar.foo; httponly',
             'foo=bar; path=/; httponly',
-        ), $bag->get('set-cookie', null, false));
+        ], $bag->get('set-cookie', null, false));
 
         $this->assertSetCookieHeader('foo=bar; path=/path/foo; domain=foo.bar; httponly', $bag);
         $this->assertSetCookieHeader('foo=bar; path=/path/bar; domain=foo.bar; httponly', $bag);
@@ -188,10 +175,10 @@ class ResponseHeaderBagTest extends TestCase
 
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
 
-        $this->assertTrue(isset($cookies['foo.bar']['/path/foo']['foo']));
-        $this->assertTrue(isset($cookies['foo.bar']['/path/bar']['foo']));
-        $this->assertTrue(isset($cookies['bar.foo']['/path/bar']['foo']));
-        $this->assertTrue(isset($cookies['']['/']['foo']));
+        $this->assertArrayHasKey('foo', $cookies['foo.bar']['/path/foo']);
+        $this->assertArrayHasKey('foo', $cookies['foo.bar']['/path/bar']);
+        $this->assertArrayHasKey('foo', $cookies['bar.foo']['/path/bar']);
+        $this->assertArrayHasKey('foo', $cookies['']['/']);
     }
 
     public function testRemoveCookie()
@@ -204,19 +191,19 @@ class ResponseHeaderBagTest extends TestCase
         $this->assertTrue($bag->has('set-cookie'));
 
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
-        $this->assertTrue(isset($cookies['foo.bar']['/path/foo']));
+        $this->assertArrayHasKey('/path/foo', $cookies['foo.bar']);
 
         $bag->removeCookie('foo', '/path/foo', 'foo.bar');
         $this->assertTrue($bag->has('set-cookie'));
 
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
-        $this->assertFalse(isset($cookies['foo.bar']['/path/foo']));
+        $this->assertArrayNotHasKey('/path/foo', $cookies['foo.bar']);
 
         $bag->removeCookie('bar', '/path/bar', 'foo.bar');
         $this->assertFalse($bag->has('set-cookie'));
 
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
-        $this->assertFalse(isset($cookies['foo.bar']));
+        $this->assertArrayNotHasKey('foo.bar', $cookies);
     }
 
     public function testRemoveCookieWithNullRemove()
@@ -226,11 +213,11 @@ class ResponseHeaderBagTest extends TestCase
         $bag->setCookie(new Cookie('bar', 'foo', 0));
 
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
-        $this->assertTrue(isset($cookies['']['/']));
+        $this->assertArrayHasKey('/', $cookies['']);
 
         $bag->removeCookie('foo', null);
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
-        $this->assertFalse(isset($cookies['']['/']['foo']));
+        $this->assertArrayNotHasKey('foo', $cookies['']['/']);
 
         $bag->removeCookie('bar', null);
         $cookies = $bag->getCookies(ResponseHeaderBag::COOKIES_ARRAY);
@@ -241,16 +228,16 @@ class ResponseHeaderBagTest extends TestCase
     {
         $bag = new ResponseHeaderBag();
         $bag->set('set-cookie', 'foo=bar');
-        $this->assertEquals(array(new Cookie('foo', 'bar', 0, '/', null, false, false, true)), $bag->getCookies());
+        $this->assertEquals([new Cookie('foo', 'bar', 0, '/', null, false, false, true)], $bag->getCookies());
 
         $bag->set('set-cookie', 'foo2=bar2', false);
-        $this->assertEquals(array(
+        $this->assertEquals([
             new Cookie('foo', 'bar', 0, '/', null, false, false, true),
             new Cookie('foo2', 'bar2', 0, '/', null, false, false, true),
-        ), $bag->getCookies());
+        ], $bag->getCookies());
 
         $bag->remove('set-cookie');
-        $this->assertEquals(array(), $bag->getCookies());
+        $this->assertEquals([], $bag->getCookies());
     }
 
     /**
@@ -293,20 +280,20 @@ class ResponseHeaderBagTest extends TestCase
         (string) $headers;
 
         $allHeaders = $headers->allPreserveCase();
-        $this->assertEquals(array('http://www.symfony.com'), $allHeaders['Location']);
-        $this->assertEquals(array('text/html'), $allHeaders['Content-type']);
+        $this->assertEquals(['http://www.symfony.com'], $allHeaders['Location']);
+        $this->assertEquals(['text/html'], $allHeaders['Content-type']);
     }
 
     public function provideMakeDisposition()
     {
-        return array(
-            array('attachment', 'foo.html', 'foo.html', 'attachment; filename="foo.html"'),
-            array('attachment', 'foo.html', '', 'attachment; filename="foo.html"'),
-            array('attachment', 'foo bar.html', '', 'attachment; filename="foo bar.html"'),
-            array('attachment', 'foo "bar".html', '', 'attachment; filename="foo \\"bar\\".html"'),
-            array('attachment', 'foo%20bar.html', 'foo bar.html', 'attachment; filename="foo bar.html"; filename*=utf-8\'\'foo%2520bar.html'),
-            array('attachment', 'föö.html', 'foo.html', 'attachment; filename="foo.html"; filename*=utf-8\'\'f%C3%B6%C3%B6.html'),
-        );
+        return [
+            ['attachment', 'foo.html', 'foo.html', 'attachment; filename="foo.html"'],
+            ['attachment', 'foo.html', '', 'attachment; filename="foo.html"'],
+            ['attachment', 'foo bar.html', '', 'attachment; filename="foo bar.html"'],
+            ['attachment', 'foo "bar".html', '', 'attachment; filename="foo \\"bar\\".html"'],
+            ['attachment', 'foo%20bar.html', 'foo bar.html', 'attachment; filename="foo bar.html"; filename*=utf-8\'\'foo%2520bar.html'],
+            ['attachment', 'föö.html', 'foo.html', 'attachment; filename="foo.html"; filename*=utf-8\'\'f%C3%B6%C3%B6.html'],
+        ];
     }
 
     /**
@@ -322,14 +309,51 @@ class ResponseHeaderBagTest extends TestCase
 
     public function provideMakeDispositionFail()
     {
-        return array(
-            array('attachment', 'foo%20bar.html'),
-            array('attachment', 'foo/bar.html'),
-            array('attachment', '/foo.html'),
-            array('attachment', 'foo\bar.html'),
-            array('attachment', '\foo.html'),
-            array('attachment', 'föö.html'),
-        );
+        return [
+            ['attachment', 'foo%20bar.html'],
+            ['attachment', 'foo/bar.html'],
+            ['attachment', '/foo.html'],
+            ['attachment', 'foo\bar.html'],
+            ['attachment', '\foo.html'],
+            ['attachment', 'föö.html'],
+        ];
+    }
+
+    public function testDateHeaderAddedOnCreation()
+    {
+        $now = time();
+
+        $bag = new ResponseHeaderBag();
+        $this->assertTrue($bag->has('Date'));
+
+        $this->assertEquals($now, $bag->getDate('Date')->getTimestamp());
+    }
+
+    public function testDateHeaderCanBeSetOnCreation()
+    {
+        $someDate = 'Thu, 23 Mar 2017 09:15:12 GMT';
+        $bag = new ResponseHeaderBag(['Date' => $someDate]);
+
+        $this->assertEquals($someDate, $bag->get('Date'));
+    }
+
+    public function testDateHeaderWillBeRecreatedWhenRemoved()
+    {
+        $someDate = 'Thu, 23 Mar 2017 09:15:12 GMT';
+        $bag = new ResponseHeaderBag(['Date' => $someDate]);
+        $bag->remove('Date');
+
+        // a (new) Date header is still present
+        $this->assertTrue($bag->has('Date'));
+        $this->assertNotEquals($someDate, $bag->get('Date'));
+    }
+
+    public function testDateHeaderWillBeRecreatedWhenHeadersAreReplaced()
+    {
+        $bag = new ResponseHeaderBag();
+        $bag->replace([]);
+
+        $this->assertTrue($bag->has('Date'));
     }
 
     private function assertSetCookieHeader($expected, ResponseHeaderBag $actual)
diff --git a/vendor/symfony/http-foundation/Tests/ResponseTest.php b/vendor/symfony/http-foundation/Tests/ResponseTest.php
index 62b8c652..fe6bc027 100644
--- a/vendor/symfony/http-foundation/Tests/ResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/ResponseTest.php
@@ -21,7 +21,7 @@ class ResponseTest extends ResponseTestCase
 {
     public function testCreate()
     {
-        $response = Response::create('foo', 301, array('Foo' => 'bar'));
+        $response = Response::create('foo', 301, ['Foo' => 'bar']);
 
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\Response', $response);
         $this->assertEquals(301, $response->getStatusCode());
@@ -126,7 +126,7 @@ class ResponseTest extends ResponseTestCase
 
     public function testSetNotModified()
     {
-        $response = new Response();
+        $response = new Response('foo');
         $modified = $response->setNotModified();
         $this->assertObjectHasAttribute('headers', $modified);
         $this->assertObjectHasAttribute('content', $modified);
@@ -135,6 +135,11 @@ class ResponseTest extends ResponseTestCase
         $this->assertObjectHasAttribute('statusText', $modified);
         $this->assertObjectHasAttribute('charset', $modified);
         $this->assertEquals(304, $modified->getStatusCode());
+
+        ob_start();
+        $modified->sendContent();
+        $string = ob_get_clean();
+        $this->assertEmpty($string);
     }
 
     public function testIsSuccessful()
@@ -248,10 +253,10 @@ class ResponseTest extends ResponseTestCase
 
     public function testIsValidateable()
     {
-        $response = new Response('', 200, array('Last-Modified' => $this->createDateTimeOneHourAgo()->format(DATE_RFC2822)));
+        $response = new Response('', 200, ['Last-Modified' => $this->createDateTimeOneHourAgo()->format(DATE_RFC2822)]);
         $this->assertTrue($response->isValidateable(), '->isValidateable() returns true if Last-Modified is present');
 
-        $response = new Response('', 200, array('ETag' => '"12345"'));
+        $response = new Response('', 200, ['ETag' => '"12345"']);
         $this->assertTrue($response->isValidateable(), '->isValidateable() returns true if ETag is present');
 
         $response = new Response();
@@ -261,7 +266,7 @@ class ResponseTest extends ResponseTestCase
     public function testGetDate()
     {
         $oneHourAgo = $this->createDateTimeOneHourAgo();
-        $response = new Response('', 200, array('Date' => $oneHourAgo->format(DATE_RFC2822)));
+        $response = new Response('', 200, ['Date' => $oneHourAgo->format(DATE_RFC2822)]);
         $date = $response->getDate();
         $this->assertEquals($oneHourAgo->getTimestamp(), $date->getTimestamp(), '->getDate() returns the Date header if present');
 
@@ -269,7 +274,7 @@ class ResponseTest extends ResponseTestCase
         $date = $response->getDate();
         $this->assertEquals(time(), $date->getTimestamp(), '->getDate() returns the current Date if no Date header present');
 
-        $response = new Response('', 200, array('Date' => $this->createDateTimeOneHourAgo()->format(DATE_RFC2822)));
+        $response = new Response('', 200, ['Date' => $this->createDateTimeOneHourAgo()->format(DATE_RFC2822)]);
         $now = $this->createDateTimeNow();
         $response->headers->set('Date', $now->format(DATE_RFC2822));
         $date = $response->getDate();
@@ -357,6 +362,11 @@ class ResponseTest extends ResponseTestCase
         $response->headers->set('Expires', -1);
         $response->expire();
         $this->assertNull($response->headers->get('Age'), '->expire() does not set the Age when the response is expired');
+
+        $response = new Response();
+        $response->headers->set('Expires', date(DATE_RFC2822, time() + 600));
+        $response->expire();
+        $this->assertNull($response->headers->get('Expires'), '->expire() removes the Expires header when the response is fresh');
     }
 
     public function testGetTtl()
@@ -404,21 +414,21 @@ class ResponseTest extends ResponseTestCase
     public function testGetVary()
     {
         $response = new Response();
-        $this->assertEquals(array(), $response->getVary(), '->getVary() returns an empty array if no Vary header is present');
+        $this->assertEquals([], $response->getVary(), '->getVary() returns an empty array if no Vary header is present');
 
         $response = new Response();
         $response->headers->set('Vary', 'Accept-Language');
-        $this->assertEquals(array('Accept-Language'), $response->getVary(), '->getVary() parses a single header name value');
+        $this->assertEquals(['Accept-Language'], $response->getVary(), '->getVary() parses a single header name value');
 
         $response = new Response();
         $response->headers->set('Vary', 'Accept-Language User-Agent    X-Foo');
-        $this->assertEquals(array('Accept-Language', 'User-Agent', 'X-Foo'), $response->getVary(), '->getVary() parses multiple header name values separated by spaces');
+        $this->assertEquals(['Accept-Language', 'User-Agent', 'X-Foo'], $response->getVary(), '->getVary() parses multiple header name values separated by spaces');
 
         $response = new Response();
         $response->headers->set('Vary', 'Accept-Language,User-Agent,    X-Foo');
-        $this->assertEquals(array('Accept-Language', 'User-Agent', 'X-Foo'), $response->getVary(), '->getVary() parses multiple header name values separated by commas');
+        $this->assertEquals(['Accept-Language', 'User-Agent', 'X-Foo'], $response->getVary(), '->getVary() parses multiple header name values separated by commas');
 
-        $vary = array('Accept-Language', 'User-Agent', 'X-foo');
+        $vary = ['Accept-Language', 'User-Agent', 'X-foo'];
 
         $response = new Response();
         $response->headers->set('Vary', $vary);
@@ -433,18 +443,18 @@ class ResponseTest extends ResponseTestCase
     {
         $response = new Response();
         $response->setVary('Accept-Language');
-        $this->assertEquals(array('Accept-Language'), $response->getVary());
+        $this->assertEquals(['Accept-Language'], $response->getVary());
 
         $response->setVary('Accept-Language, User-Agent');
-        $this->assertEquals(array('Accept-Language', 'User-Agent'), $response->getVary(), '->setVary() replace the vary header by default');
+        $this->assertEquals(['Accept-Language', 'User-Agent'], $response->getVary(), '->setVary() replace the vary header by default');
 
         $response->setVary('X-Foo', false);
-        $this->assertEquals(array('Accept-Language', 'User-Agent', 'X-Foo'), $response->getVary(), '->setVary() doesn\'t wipe out earlier Vary headers if replace is set to false');
+        $this->assertEquals(['Accept-Language', 'User-Agent', 'X-Foo'], $response->getVary(), '->setVary() doesn\'t wipe out earlier Vary headers if replace is set to false');
     }
 
     public function testDefaultContentType()
     {
-        $headerMock = $this->getMockBuilder('Symfony\Component\HttpFoundation\ResponseHeaderBag')->setMethods(array('set'))->getMock();
+        $headerMock = $this->getMockBuilder('Symfony\Component\HttpFoundation\ResponseHeaderBag')->setMethods(['set'])->getMock();
         $headerMock->expects($this->at(0))
             ->method('set')
             ->with('Content-Type', 'text/html');
@@ -566,50 +576,56 @@ class ResponseTest extends ResponseTestCase
     public function testSetCache()
     {
         $response = new Response();
-        //array('etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public')
+        // ['etag', 'last_modified', 'max_age', 's_maxage', 'private', 'public']
         try {
-            $response->setCache(array('wrong option' => 'value'));
+            $response->setCache(['wrong option' => 'value']);
             $this->fail('->setCache() throws an InvalidArgumentException if an option is not supported');
         } catch (\Exception $e) {
             $this->assertInstanceOf('InvalidArgumentException', $e, '->setCache() throws an InvalidArgumentException if an option is not supported');
             $this->assertContains('"wrong option"', $e->getMessage());
         }
 
-        $options = array('etag' => '"whatever"');
+        $options = ['etag' => '"whatever"'];
         $response->setCache($options);
         $this->assertEquals($response->getEtag(), '"whatever"');
 
         $now = $this->createDateTimeNow();
-        $options = array('last_modified' => $now);
+        $options = ['last_modified' => $now];
         $response->setCache($options);
         $this->assertEquals($response->getLastModified()->getTimestamp(), $now->getTimestamp());
 
-        $options = array('max_age' => 100);
+        $options = ['max_age' => 100];
         $response->setCache($options);
         $this->assertEquals($response->getMaxAge(), 100);
 
-        $options = array('s_maxage' => 200);
+        $options = ['s_maxage' => 200];
         $response->setCache($options);
         $this->assertEquals($response->getMaxAge(), 200);
 
         $this->assertTrue($response->headers->hasCacheControlDirective('public'));
         $this->assertFalse($response->headers->hasCacheControlDirective('private'));
 
-        $response->setCache(array('public' => true));
+        $response->setCache(['public' => true]);
         $this->assertTrue($response->headers->hasCacheControlDirective('public'));
         $this->assertFalse($response->headers->hasCacheControlDirective('private'));
 
-        $response->setCache(array('public' => false));
+        $response->setCache(['public' => false]);
         $this->assertFalse($response->headers->hasCacheControlDirective('public'));
         $this->assertTrue($response->headers->hasCacheControlDirective('private'));
 
-        $response->setCache(array('private' => true));
+        $response->setCache(['private' => true]);
         $this->assertFalse($response->headers->hasCacheControlDirective('public'));
         $this->assertTrue($response->headers->hasCacheControlDirective('private'));
 
-        $response->setCache(array('private' => false));
+        $response->setCache(['private' => false]);
         $this->assertTrue($response->headers->hasCacheControlDirective('public'));
         $this->assertFalse($response->headers->hasCacheControlDirective('private'));
+
+        $response->setCache(['immutable' => true]);
+        $this->assertTrue($response->headers->hasCacheControlDirective('immutable'));
+
+        $response->setCache(['immutable' => false]);
+        $this->assertFalse($response->headers->hasCacheControlDirective('immutable'));
     }
 
     public function testSendContent()
@@ -631,6 +647,22 @@ class ResponseTest extends ResponseTestCase
         $this->assertFalse($response->headers->hasCacheControlDirective('private'));
     }
 
+    public function testSetImmutable()
+    {
+        $response = new Response();
+        $response->setImmutable();
+
+        $this->assertTrue($response->headers->hasCacheControlDirective('immutable'));
+    }
+
+    public function testIsImmutable()
+    {
+        $response = new Response();
+        $response->setImmutable();
+
+        $this->assertTrue($response->isImmutable());
+    }
+
     public function testSetExpires()
     {
         $response = new Response();
@@ -693,14 +725,14 @@ class ResponseTest extends ResponseTestCase
 
     public function getStatusCodeFixtures()
     {
-        return array(
-            array('200', null, 'OK'),
-            array('200', false, ''),
-            array('200', 'foo', 'foo'),
-            array('199', null, 'unknown status'),
-            array('199', false, ''),
-            array('199', 'foo', 'foo'),
-        );
+        return [
+            ['200', null, 'OK'],
+            ['200', false, ''],
+            ['200', 'foo', 'foo'],
+            ['199', null, 'unknown status'],
+            ['199', false, ''],
+            ['199', 'foo', 'foo'],
+        ];
     }
 
     public function testIsInformational()
@@ -714,7 +746,7 @@ class ResponseTest extends ResponseTestCase
 
     public function testIsRedirectRedirection()
     {
-        foreach (array(301, 302, 303, 307) as $code) {
+        foreach ([301, 302, 303, 307] as $code) {
             $response = new Response('', $code);
             $this->assertTrue($response->isRedirection());
             $this->assertTrue($response->isRedirect());
@@ -732,7 +764,7 @@ class ResponseTest extends ResponseTestCase
         $this->assertFalse($response->isRedirection());
         $this->assertFalse($response->isRedirect());
 
-        $response = new Response('', 301, array('Location' => '/good-uri'));
+        $response = new Response('', 301, ['Location' => '/good-uri']);
         $this->assertFalse($response->isRedirect('/bad-uri'));
         $this->assertTrue($response->isRedirect('/good-uri'));
     }
@@ -748,7 +780,7 @@ class ResponseTest extends ResponseTestCase
 
     public function testIsEmpty()
     {
-        foreach (array(204, 304) as $code) {
+        foreach ([204, 304] as $code) {
             $response = new Response('', $code);
             $this->assertTrue($response->isEmpty());
         }
@@ -797,7 +829,7 @@ class ResponseTest extends ResponseTestCase
 
     public function testSetEtag()
     {
-        $response = new Response('', 200, array('ETag' => '"12345"'));
+        $response = new Response('', 200, ['ETag' => '"12345"']);
         $response->setEtag();
 
         $this->assertNull($response->headers->get('Etag'), '->setEtag() removes Etags when call with null');
@@ -827,7 +859,7 @@ class ResponseTest extends ResponseTestCase
     {
         $response = new Response();
 
-        $setters = array(
+        $setters = [
             'setProtocolVersion' => '1.0',
             'setCharset' => 'UTF-8',
             'setPublic' => null,
@@ -838,7 +870,7 @@ class ResponseTest extends ResponseTestCase
             'setSharedMaxAge' => 1,
             'setTtl' => 1,
             'setClientTtl' => 1,
-        );
+        ];
 
         foreach ($setters as $setter => $arg) {
             $this->assertEquals($response, $response->{$setter}($arg));
@@ -857,20 +889,20 @@ class ResponseTest extends ResponseTestCase
 
     public function validContentProvider()
     {
-        return array(
-            'obj' => array(new StringableObject()),
-            'string' => array('Foo'),
-            'int' => array(2),
-        );
+        return [
+            'obj' => [new StringableObject()],
+            'string' => ['Foo'],
+            'int' => [2],
+        ];
     }
 
     public function invalidContentProvider()
     {
-        return array(
-            'obj' => array(new \stdClass()),
-            'array' => array(array()),
-            'bool' => array(true, '1'),
-        );
+        return [
+            'obj' => [new \stdClass()],
+            'array' => [[]],
+            'bool' => [true, '1'],
+        ];
     }
 
     protected function createDateTimeOneHourAgo()
@@ -904,27 +936,28 @@ class ResponseTest extends ResponseTestCase
      */
     public function ianaCodesReasonPhrasesProvider()
     {
-        if (!in_array('https', stream_get_wrappers(), true)) {
+        if (!\in_array('https', stream_get_wrappers(), true)) {
             $this->markTestSkipped('The "https" wrapper is not available');
         }
 
         $ianaHttpStatusCodes = new \DOMDocument();
 
-        libxml_set_streams_context(stream_context_create(array(
-            'http' => array(
+        $context = stream_context_create([
+            'http' => [
                 'method' => 'GET',
                 'timeout' => 30,
-            ),
-        )));
+                'user_agent' => __METHOD__,
+            ],
+        ]);
 
-        $ianaHttpStatusCodes->load('https://www.iana.org/assignments/http-status-codes/http-status-codes.xml');
+        $ianaHttpStatusCodes->loadXML(file_get_contents('https://www.iana.org/assignments/http-status-codes/http-status-codes.xml', false, $context));
         if (!$ianaHttpStatusCodes->relaxNGValidate(__DIR__.'/schema/http-status-codes.rng')) {
             self::fail('Invalid IANA\'s HTTP status code list.');
         }
 
-        $ianaCodesReasonPhrases = array();
+        $ianaCodesReasonPhrases = [];
 
-        $xpath = new \DomXPath($ianaHttpStatusCodes);
+        $xpath = new \DOMXPath($ianaHttpStatusCodes);
         $xpath->registerNamespace('ns', 'http://www.iana.org/assignments');
 
         $records = $xpath->query('//ns:record');
@@ -932,16 +965,16 @@ class ResponseTest extends ResponseTestCase
             $value = $xpath->query('.//ns:value', $record)->item(0)->nodeValue;
             $description = $xpath->query('.//ns:description', $record)->item(0)->nodeValue;
 
-            if (in_array($description, array('Unassigned', '(Unused)'), true)) {
+            if (\in_array($description, ['Unassigned', '(Unused)'], true)) {
                 continue;
             }
 
             if (preg_match('/^([0-9]+)\s*\-\s*([0-9]+)$/', $value, $matches)) {
                 for ($value = $matches[1]; $value <= $matches[2]; ++$value) {
-                    $ianaCodesReasonPhrases[] = array($value, $description);
+                    $ianaCodesReasonPhrases[] = [$value, $description];
                 }
             } else {
-                $ianaCodesReasonPhrases[] = array($value, $description);
+                $ianaCodesReasonPhrases[] = [$value, $description];
             }
         }
 
diff --git a/vendor/symfony/http-foundation/Tests/ServerBagTest.php b/vendor/symfony/http-foundation/Tests/ServerBagTest.php
index c1d9d12a..0663b118 100644
--- a/vendor/symfony/http-foundation/Tests/ServerBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/ServerBagTest.php
@@ -23,7 +23,7 @@ class ServerBagTest extends TestCase
 {
     public function testShouldExtractHeadersFromServerArray()
     {
-        $server = array(
+        $server = [
             'SOME_SERVER_VARIABLE' => 'value',
             'SOME_SERVER_VARIABLE2' => 'value',
             'ROOT' => 'value',
@@ -32,125 +32,125 @@ class ServerBagTest extends TestCase
             'HTTP_ETAG' => 'asdf',
             'PHP_AUTH_USER' => 'foo',
             'PHP_AUTH_PW' => 'bar',
-        );
+        ];
 
         $bag = new ServerBag($server);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'CONTENT_TYPE' => 'text/html',
             'CONTENT_LENGTH' => '0',
             'ETAG' => 'asdf',
             'AUTHORIZATION' => 'Basic '.base64_encode('foo:bar'),
             'PHP_AUTH_USER' => 'foo',
             'PHP_AUTH_PW' => 'bar',
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 
     public function testHttpPasswordIsOptional()
     {
-        $bag = new ServerBag(array('PHP_AUTH_USER' => 'foo'));
+        $bag = new ServerBag(['PHP_AUTH_USER' => 'foo']);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'AUTHORIZATION' => 'Basic '.base64_encode('foo:'),
             'PHP_AUTH_USER' => 'foo',
             'PHP_AUTH_PW' => '',
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 
     public function testHttpBasicAuthWithPhpCgi()
     {
-        $bag = new ServerBag(array('HTTP_AUTHORIZATION' => 'Basic '.base64_encode('foo:bar')));
+        $bag = new ServerBag(['HTTP_AUTHORIZATION' => 'Basic '.base64_encode('foo:bar')]);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'AUTHORIZATION' => 'Basic '.base64_encode('foo:bar'),
             'PHP_AUTH_USER' => 'foo',
             'PHP_AUTH_PW' => 'bar',
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 
     public function testHttpBasicAuthWithPhpCgiBogus()
     {
-        $bag = new ServerBag(array('HTTP_AUTHORIZATION' => 'Basic_'.base64_encode('foo:bar')));
+        $bag = new ServerBag(['HTTP_AUTHORIZATION' => 'Basic_'.base64_encode('foo:bar')]);
 
         // Username and passwords should not be set as the header is bogus
         $headers = $bag->getHeaders();
-        $this->assertFalse(isset($headers['PHP_AUTH_USER']));
-        $this->assertFalse(isset($headers['PHP_AUTH_PW']));
+        $this->assertArrayNotHasKey('PHP_AUTH_USER', $headers);
+        $this->assertArrayNotHasKey('PHP_AUTH_PW', $headers);
     }
 
     public function testHttpBasicAuthWithPhpCgiRedirect()
     {
-        $bag = new ServerBag(array('REDIRECT_HTTP_AUTHORIZATION' => 'Basic '.base64_encode('username:pass:word')));
+        $bag = new ServerBag(['REDIRECT_HTTP_AUTHORIZATION' => 'Basic '.base64_encode('username:pass:word')]);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'AUTHORIZATION' => 'Basic '.base64_encode('username:pass:word'),
             'PHP_AUTH_USER' => 'username',
             'PHP_AUTH_PW' => 'pass:word',
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 
     public function testHttpBasicAuthWithPhpCgiEmptyPassword()
     {
-        $bag = new ServerBag(array('HTTP_AUTHORIZATION' => 'Basic '.base64_encode('foo:')));
+        $bag = new ServerBag(['HTTP_AUTHORIZATION' => 'Basic '.base64_encode('foo:')]);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'AUTHORIZATION' => 'Basic '.base64_encode('foo:'),
             'PHP_AUTH_USER' => 'foo',
             'PHP_AUTH_PW' => '',
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 
     public function testHttpDigestAuthWithPhpCgi()
     {
         $digest = 'Digest username="foo", realm="acme", nonce="'.md5('secret').'", uri="/protected, qop="auth"';
-        $bag = new ServerBag(array('HTTP_AUTHORIZATION' => $digest));
+        $bag = new ServerBag(['HTTP_AUTHORIZATION' => $digest]);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'AUTHORIZATION' => $digest,
             'PHP_AUTH_DIGEST' => $digest,
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 
     public function testHttpDigestAuthWithPhpCgiBogus()
     {
         $digest = 'Digest_username="foo", realm="acme", nonce="'.md5('secret').'", uri="/protected, qop="auth"';
-        $bag = new ServerBag(array('HTTP_AUTHORIZATION' => $digest));
+        $bag = new ServerBag(['HTTP_AUTHORIZATION' => $digest]);
 
         // Username and passwords should not be set as the header is bogus
         $headers = $bag->getHeaders();
-        $this->assertFalse(isset($headers['PHP_AUTH_USER']));
-        $this->assertFalse(isset($headers['PHP_AUTH_PW']));
+        $this->assertArrayNotHasKey('PHP_AUTH_USER', $headers);
+        $this->assertArrayNotHasKey('PHP_AUTH_PW', $headers);
     }
 
     public function testHttpDigestAuthWithPhpCgiRedirect()
     {
         $digest = 'Digest username="foo", realm="acme", nonce="'.md5('secret').'", uri="/protected, qop="auth"';
-        $bag = new ServerBag(array('REDIRECT_HTTP_AUTHORIZATION' => $digest));
+        $bag = new ServerBag(['REDIRECT_HTTP_AUTHORIZATION' => $digest]);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'AUTHORIZATION' => $digest,
             'PHP_AUTH_DIGEST' => $digest,
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 
     public function testOAuthBearerAuth()
     {
         $headerContent = 'Bearer L-yLEOr9zhmUYRkzN1jwwxwQ-PBNiKDc8dgfB4hTfvo';
-        $bag = new ServerBag(array('HTTP_AUTHORIZATION' => $headerContent));
+        $bag = new ServerBag(['HTTP_AUTHORIZATION' => $headerContent]);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'AUTHORIZATION' => $headerContent,
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 
     public function testOAuthBearerAuthWithRedirect()
     {
         $headerContent = 'Bearer L-yLEOr9zhmUYRkzN1jwwxwQ-PBNiKDc8dgfB4hTfvo';
-        $bag = new ServerBag(array('REDIRECT_HTTP_AUTHORIZATION' => $headerContent));
+        $bag = new ServerBag(['REDIRECT_HTTP_AUTHORIZATION' => $headerContent]);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'AUTHORIZATION' => $headerContent,
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 
     /**
@@ -159,12 +159,12 @@ class ServerBagTest extends TestCase
     public function testItDoesNotOverwriteTheAuthorizationHeaderIfItIsAlreadySet()
     {
         $headerContent = 'Bearer L-yLEOr9zhmUYRkzN1jwwxwQ-PBNiKDc8dgfB4hTfvo';
-        $bag = new ServerBag(array('PHP_AUTH_USER' => 'foo', 'HTTP_AUTHORIZATION' => $headerContent));
+        $bag = new ServerBag(['PHP_AUTH_USER' => 'foo', 'HTTP_AUTHORIZATION' => $headerContent]);
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'AUTHORIZATION' => $headerContent,
             'PHP_AUTH_USER' => 'foo',
             'PHP_AUTH_PW' => '',
-        ), $bag->getHeaders());
+        ], $bag->getHeaders());
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php
index 8c148b58..3f2f7b3c 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Attribute/AttributeBagTest.php
@@ -21,10 +21,7 @@ use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
  */
 class AttributeBagTest extends TestCase
 {
-    /**
-     * @var array
-     */
-    private $array;
+    private $array = [];
 
     /**
      * @var AttributeBag
@@ -33,21 +30,21 @@ class AttributeBagTest extends TestCase
 
     protected function setUp()
     {
-        $this->array = array(
+        $this->array = [
             'hello' => 'world',
             'always' => 'be happy',
             'user.login' => 'drak',
-            'csrf.token' => array(
+            'csrf.token' => [
                 'a' => '1234',
                 'b' => '4321',
-            ),
-            'category' => array(
-                'fishing' => array(
+            ],
+            'category' => [
+                'fishing' => [
                     'first' => 'cod',
                     'second' => 'sole',
-                ),
-            ),
-        );
+                ],
+            ],
+        ];
         $this->bag = new AttributeBag('_sf2');
         $this->bag->initialize($this->array);
     }
@@ -55,7 +52,7 @@ class AttributeBagTest extends TestCase
     protected function tearDown()
     {
         $this->bag = null;
-        $this->array = array();
+        $this->array = [];
     }
 
     public function testInitialize()
@@ -63,7 +60,7 @@ class AttributeBagTest extends TestCase
         $bag = new AttributeBag();
         $bag->initialize($this->array);
         $this->assertEquals($this->array, $bag->all());
-        $array = array('should' => 'change');
+        $array = ['should' => 'change'];
         $bag->initialize($array);
         $this->assertEquals($array, $bag->all());
     }
@@ -125,7 +122,7 @@ class AttributeBagTest extends TestCase
 
     public function testReplace()
     {
-        $array = array();
+        $array = [];
         $array['name'] = 'jack';
         $array['foo.bar'] = 'beep';
         $this->bag->replace($array);
@@ -153,22 +150,22 @@ class AttributeBagTest extends TestCase
     public function testClear()
     {
         $this->bag->clear();
-        $this->assertEquals(array(), $this->bag->all());
+        $this->assertEquals([], $this->bag->all());
     }
 
     public function attributesProvider()
     {
-        return array(
-            array('hello', 'world', true),
-            array('always', 'be happy', true),
-            array('user.login', 'drak', true),
-            array('csrf.token', array('a' => '1234', 'b' => '4321'), true),
-            array('category', array('fishing' => array('first' => 'cod', 'second' => 'sole')), true),
-            array('user2.login', null, false),
-            array('never', null, false),
-            array('bye', null, false),
-            array('bye/for/now', null, false),
-        );
+        return [
+            ['hello', 'world', true],
+            ['always', 'be happy', true],
+            ['user.login', 'drak', true],
+            ['csrf.token', ['a' => '1234', 'b' => '4321'], true],
+            ['category', ['fishing' => ['first' => 'cod', 'second' => 'sole']], true],
+            ['user2.login', null, false],
+            ['never', null, false],
+            ['bye', null, false],
+            ['bye/for/now', null, false],
+        ];
     }
 
     public function testGetIterator()
@@ -179,11 +176,11 @@ class AttributeBagTest extends TestCase
             ++$i;
         }
 
-        $this->assertEquals(count($this->array), $i);
+        $this->assertEquals(\count($this->array), $i);
     }
 
     public function testCount()
     {
-        $this->assertEquals(count($this->array), count($this->bag));
+        $this->assertCount(\count($this->array), $this->bag);
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php
index d9d9eb7f..6b4bb17d 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Attribute/NamespacedAttributeBagTest.php
@@ -21,10 +21,7 @@ use Symfony\Component\HttpFoundation\Session\Attribute\NamespacedAttributeBag;
  */
 class NamespacedAttributeBagTest extends TestCase
 {
-    /**
-     * @var array
-     */
-    private $array;
+    private $array = [];
 
     /**
      * @var NamespacedAttributeBag
@@ -33,21 +30,21 @@ class NamespacedAttributeBagTest extends TestCase
 
     protected function setUp()
     {
-        $this->array = array(
+        $this->array = [
             'hello' => 'world',
             'always' => 'be happy',
             'user.login' => 'drak',
-            'csrf.token' => array(
+            'csrf.token' => [
                 'a' => '1234',
                 'b' => '4321',
-            ),
-            'category' => array(
-                'fishing' => array(
+            ],
+            'category' => [
+                'fishing' => [
                     'first' => 'cod',
                     'second' => 'sole',
-                ),
-            ),
-        );
+                ],
+            ],
+        ];
         $this->bag = new NamespacedAttributeBag('_sf2', '/');
         $this->bag->initialize($this->array);
     }
@@ -55,7 +52,7 @@ class NamespacedAttributeBagTest extends TestCase
     protected function tearDown()
     {
         $this->bag = null;
-        $this->array = array();
+        $this->array = [];
     }
 
     public function testInitialize()
@@ -63,7 +60,7 @@ class NamespacedAttributeBagTest extends TestCase
         $bag = new NamespacedAttributeBag();
         $bag->initialize($this->array);
         $this->assertEquals($this->array, $this->bag->all());
-        $array = array('should' => 'not stick');
+        $array = ['should' => 'not stick'];
         $bag->initialize($array);
 
         // should have remained the same
@@ -88,6 +85,17 @@ class NamespacedAttributeBagTest extends TestCase
     /**
      * @dataProvider attributesProvider
      */
+    public function testHasNoSideEffect($key, $value, $expected)
+    {
+        $expected = json_encode($this->bag->all());
+        $this->bag->has($key);
+
+        $this->assertEquals($expected, json_encode($this->bag->all()));
+    }
+
+    /**
+     * @dataProvider attributesProvider
+     */
     public function testGet($key, $value, $expected)
     {
         $this->assertEquals($value, $this->bag->get($key));
@@ -102,6 +110,17 @@ class NamespacedAttributeBagTest extends TestCase
     /**
      * @dataProvider attributesProvider
      */
+    public function testGetNoSideEffect($key, $value, $expected)
+    {
+        $expected = json_encode($this->bag->all());
+        $this->bag->get($key);
+
+        $this->assertEquals($expected, json_encode($this->bag->all()));
+    }
+
+    /**
+     * @dataProvider attributesProvider
+     */
     public function testSet($key, $value, $expected)
     {
         $this->bag->set($key, $value);
@@ -120,7 +139,7 @@ class NamespacedAttributeBagTest extends TestCase
 
     public function testReplace()
     {
-        $array = array();
+        $array = [];
         $array['name'] = 'jack';
         $array['foo.bar'] = 'beep';
         $this->bag->replace($array);
@@ -158,28 +177,28 @@ class NamespacedAttributeBagTest extends TestCase
     public function testClear()
     {
         $this->bag->clear();
-        $this->assertEquals(array(), $this->bag->all());
+        $this->assertEquals([], $this->bag->all());
     }
 
     public function attributesProvider()
     {
-        return array(
-            array('hello', 'world', true),
-            array('always', 'be happy', true),
-            array('user.login', 'drak', true),
-            array('csrf.token', array('a' => '1234', 'b' => '4321'), true),
-            array('csrf.token/a', '1234', true),
-            array('csrf.token/b', '4321', true),
-            array('category', array('fishing' => array('first' => 'cod', 'second' => 'sole')), true),
-            array('category/fishing', array('first' => 'cod', 'second' => 'sole'), true),
-            array('category/fishing/missing/first', null, false),
-            array('category/fishing/first', 'cod', true),
-            array('category/fishing/second', 'sole', true),
-            array('category/fishing/missing/second', null, false),
-            array('user2.login', null, false),
-            array('never', null, false),
-            array('bye', null, false),
-            array('bye/for/now', null, false),
-        );
+        return [
+            ['hello', 'world', true],
+            ['always', 'be happy', true],
+            ['user.login', 'drak', true],
+            ['csrf.token', ['a' => '1234', 'b' => '4321'], true],
+            ['csrf.token/a', '1234', true],
+            ['csrf.token/b', '4321', true],
+            ['category', ['fishing' => ['first' => 'cod', 'second' => 'sole']], true],
+            ['category/fishing', ['first' => 'cod', 'second' => 'sole'], true],
+            ['category/fishing/missing/first', null, false],
+            ['category/fishing/first', 'cod', true],
+            ['category/fishing/second', 'sole', true],
+            ['category/fishing/missing/second', null, false],
+            ['user2.login', null, false],
+            ['never', null, false],
+            ['bye', null, false],
+            ['bye/for/now', null, false],
+        ];
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php
index 4eb200af..b4e2c3a5 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Flash/AutoExpireFlashBagTest.php
@@ -26,16 +26,13 @@ class AutoExpireFlashBagTest extends TestCase
      */
     private $bag;
 
-    /**
-     * @var array
-     */
-    protected $array = array();
+    protected $array = [];
 
     protected function setUp()
     {
         parent::setUp();
         $this->bag = new FlashBag();
-        $this->array = array('new' => array('notice' => array('A previous flash message')));
+        $this->array = ['new' => ['notice' => ['A previous flash message']]];
         $this->bag->initialize($this->array);
     }
 
@@ -48,21 +45,21 @@ class AutoExpireFlashBagTest extends TestCase
     public function testInitialize()
     {
         $bag = new FlashBag();
-        $array = array('new' => array('notice' => array('A previous flash message')));
+        $array = ['new' => ['notice' => ['A previous flash message']]];
         $bag->initialize($array);
-        $this->assertEquals(array('A previous flash message'), $bag->peek('notice'));
-        $array = array('new' => array(
-                'notice' => array('Something else'),
-                'error' => array('a'),
-            ));
+        $this->assertEquals(['A previous flash message'], $bag->peek('notice'));
+        $array = ['new' => [
+                'notice' => ['Something else'],
+                'error' => ['a'],
+            ]];
         $bag->initialize($array);
-        $this->assertEquals(array('Something else'), $bag->peek('notice'));
-        $this->assertEquals(array('a'), $bag->peek('error'));
+        $this->assertEquals(['Something else'], $bag->peek('notice'));
+        $this->assertEquals(['a'], $bag->peek('error'));
     }
 
     public function testGetStorageKey()
     {
-        $this->assertEquals('_sf2_flashes', $this->bag->getStorageKey());
+        $this->assertEquals('_symfony_flashes', $this->bag->getStorageKey());
         $attributeBag = new FlashBag('test');
         $this->assertEquals('test', $attributeBag->getStorageKey());
     }
@@ -76,16 +73,16 @@ class AutoExpireFlashBagTest extends TestCase
 
     public function testPeek()
     {
-        $this->assertEquals(array(), $this->bag->peek('non_existing'));
-        $this->assertEquals(array('default'), $this->bag->peek('non_existing', array('default')));
-        $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
-        $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
+        $this->assertEquals([], $this->bag->peek('non_existing'));
+        $this->assertEquals(['default'], $this->bag->peek('non_existing', ['default']));
+        $this->assertEquals(['A previous flash message'], $this->bag->peek('notice'));
+        $this->assertEquals(['A previous flash message'], $this->bag->peek('notice'));
     }
 
     public function testSet()
     {
         $this->bag->set('notice', 'Foo');
-        $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
+        $this->assertEquals(['A previous flash message'], $this->bag->peek('notice'));
     }
 
     public function testHas()
@@ -96,43 +93,43 @@ class AutoExpireFlashBagTest extends TestCase
 
     public function testKeys()
     {
-        $this->assertEquals(array('notice'), $this->bag->keys());
+        $this->assertEquals(['notice'], $this->bag->keys());
     }
 
     public function testPeekAll()
     {
-        $array = array(
-            'new' => array(
+        $array = [
+            'new' => [
                 'notice' => 'Foo',
                 'error' => 'Bar',
-            ),
-        );
+            ],
+        ];
 
         $this->bag->initialize($array);
-        $this->assertEquals(array(
+        $this->assertEquals([
             'notice' => 'Foo',
             'error' => 'Bar',
-            ), $this->bag->peekAll()
+            ], $this->bag->peekAll()
         );
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             'notice' => 'Foo',
             'error' => 'Bar',
-            ), $this->bag->peekAll()
+            ], $this->bag->peekAll()
         );
     }
 
     public function testGet()
     {
-        $this->assertEquals(array(), $this->bag->get('non_existing'));
-        $this->assertEquals(array('default'), $this->bag->get('non_existing', array('default')));
-        $this->assertEquals(array('A previous flash message'), $this->bag->get('notice'));
-        $this->assertEquals(array(), $this->bag->get('notice'));
+        $this->assertEquals([], $this->bag->get('non_existing'));
+        $this->assertEquals(['default'], $this->bag->get('non_existing', ['default']));
+        $this->assertEquals(['A previous flash message'], $this->bag->get('notice'));
+        $this->assertEquals([], $this->bag->get('notice'));
     }
 
     public function testSetAll()
     {
-        $this->bag->setAll(array('a' => 'first', 'b' => 'second'));
+        $this->bag->setAll(['a' => 'first', 'b' => 'second']);
         $this->assertFalse($this->bag->has('a'));
         $this->assertFalse($this->bag->has('b'));
     }
@@ -141,16 +138,24 @@ class AutoExpireFlashBagTest extends TestCase
     {
         $this->bag->set('notice', 'Foo');
         $this->bag->set('error', 'Bar');
-        $this->assertEquals(array(
-            'notice' => array('A previous flash message'),
-            ), $this->bag->all()
+        $this->assertEquals([
+            'notice' => ['A previous flash message'],
+            ], $this->bag->all()
         );
 
-        $this->assertEquals(array(), $this->bag->all());
+        $this->assertEquals([], $this->bag->all());
     }
 
     public function testClear()
     {
-        $this->assertEquals(array('notice' => array('A previous flash message')), $this->bag->clear());
+        $this->assertEquals(['notice' => ['A previous flash message']], $this->bag->clear());
+    }
+
+    public function testDoNotRemoveTheNewFlashesWhenDisplayingTheExistingOnes()
+    {
+        $this->bag->add('success', 'Something');
+        $this->bag->all();
+
+        $this->assertEquals(['new' => ['success' => ['Something']], 'display' => []], $this->array);
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php
index f0aa6a61..6d8619e0 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Flash/FlashBagTest.php
@@ -26,16 +26,13 @@ class FlashBagTest extends TestCase
      */
     private $bag;
 
-    /**
-     * @var array
-     */
-    protected $array = array();
+    protected $array = [];
 
     protected function setUp()
     {
         parent::setUp();
         $this->bag = new FlashBag();
-        $this->array = array('notice' => array('A previous flash message'));
+        $this->array = ['notice' => ['A previous flash message']];
         $this->bag->initialize($this->array);
     }
 
@@ -50,14 +47,14 @@ class FlashBagTest extends TestCase
         $bag = new FlashBag();
         $bag->initialize($this->array);
         $this->assertEquals($this->array, $bag->peekAll());
-        $array = array('should' => array('change'));
+        $array = ['should' => ['change']];
         $bag->initialize($array);
         $this->assertEquals($array, $bag->peekAll());
     }
 
     public function testGetStorageKey()
     {
-        $this->assertEquals('_sf2_flashes', $this->bag->getStorageKey());
+        $this->assertEquals('_symfony_flashes', $this->bag->getStorageKey());
         $attributeBag = new FlashBag('test');
         $this->assertEquals('test', $attributeBag->getStorageKey());
     }
@@ -71,37 +68,49 @@ class FlashBagTest extends TestCase
 
     public function testPeek()
     {
-        $this->assertEquals(array(), $this->bag->peek('non_existing'));
-        $this->assertEquals(array('default'), $this->bag->peek('not_existing', array('default')));
-        $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
-        $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
+        $this->assertEquals([], $this->bag->peek('non_existing'));
+        $this->assertEquals(['default'], $this->bag->peek('not_existing', ['default']));
+        $this->assertEquals(['A previous flash message'], $this->bag->peek('notice'));
+        $this->assertEquals(['A previous flash message'], $this->bag->peek('notice'));
+    }
+
+    public function testAdd()
+    {
+        $tab = ['bar' => 'baz'];
+        $this->bag->add('string_message', 'lorem');
+        $this->bag->add('object_message', new \stdClass());
+        $this->bag->add('array_message', $tab);
+
+        $this->assertEquals(['lorem'], $this->bag->get('string_message'));
+        $this->assertEquals([new \stdClass()], $this->bag->get('object_message'));
+        $this->assertEquals([$tab], $this->bag->get('array_message'));
     }
 
     public function testGet()
     {
-        $this->assertEquals(array(), $this->bag->get('non_existing'));
-        $this->assertEquals(array('default'), $this->bag->get('not_existing', array('default')));
-        $this->assertEquals(array('A previous flash message'), $this->bag->get('notice'));
-        $this->assertEquals(array(), $this->bag->get('notice'));
+        $this->assertEquals([], $this->bag->get('non_existing'));
+        $this->assertEquals(['default'], $this->bag->get('not_existing', ['default']));
+        $this->assertEquals(['A previous flash message'], $this->bag->get('notice'));
+        $this->assertEquals([], $this->bag->get('notice'));
     }
 
     public function testAll()
     {
         $this->bag->set('notice', 'Foo');
         $this->bag->set('error', 'Bar');
-        $this->assertEquals(array(
-            'notice' => array('Foo'),
-            'error' => array('Bar'), ), $this->bag->all()
+        $this->assertEquals([
+            'notice' => ['Foo'],
+            'error' => ['Bar'], ], $this->bag->all()
         );
 
-        $this->assertEquals(array(), $this->bag->all());
+        $this->assertEquals([], $this->bag->all());
     }
 
     public function testSet()
     {
         $this->bag->set('notice', 'Foo');
         $this->bag->set('notice', 'Bar');
-        $this->assertEquals(array('Bar'), $this->bag->peek('notice'));
+        $this->assertEquals(['Bar'], $this->bag->peek('notice'));
     }
 
     public function testHas()
@@ -112,24 +121,37 @@ class FlashBagTest extends TestCase
 
     public function testKeys()
     {
-        $this->assertEquals(array('notice'), $this->bag->keys());
+        $this->assertEquals(['notice'], $this->bag->keys());
+    }
+
+    public function testSetAll()
+    {
+        $this->bag->add('one_flash', 'Foo');
+        $this->bag->add('another_flash', 'Bar');
+        $this->assertTrue($this->bag->has('one_flash'));
+        $this->assertTrue($this->bag->has('another_flash'));
+        $this->bag->setAll(['unique_flash' => 'FooBar']);
+        $this->assertFalse($this->bag->has('one_flash'));
+        $this->assertFalse($this->bag->has('another_flash'));
+        $this->assertSame(['unique_flash' => 'FooBar'], $this->bag->all());
+        $this->assertSame([], $this->bag->all());
     }
 
     public function testPeekAll()
     {
         $this->bag->set('notice', 'Foo');
         $this->bag->set('error', 'Bar');
-        $this->assertEquals(array(
-            'notice' => array('Foo'),
-            'error' => array('Bar'),
-            ), $this->bag->peekAll()
+        $this->assertEquals([
+            'notice' => ['Foo'],
+            'error' => ['Bar'],
+            ], $this->bag->peekAll()
         );
         $this->assertTrue($this->bag->has('notice'));
         $this->assertTrue($this->bag->has('error'));
-        $this->assertEquals(array(
-            'notice' => array('Foo'),
-            'error' => array('Bar'),
-            ), $this->bag->peekAll()
+        $this->assertEquals([
+            'notice' => ['Foo'],
+            'error' => ['Bar'],
+            ], $this->bag->peekAll()
         );
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/SessionTest.php b/vendor/symfony/http-foundation/Tests/Session/SessionTest.php
index fa93507a..afa00fc7 100644
--- a/vendor/symfony/http-foundation/Tests/Session/SessionTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/SessionTest.php
@@ -12,9 +12,9 @@
 namespace Symfony\Component\HttpFoundation\Tests\Session;
 
 use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\Session\Session;
-use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
 use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
+use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
+use Symfony\Component\HttpFoundation\Session\Session;
 use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
 
 /**
@@ -70,6 +70,27 @@ class SessionTest extends TestCase
         $this->assertEquals('0123456789abcdef', $this->session->getId());
     }
 
+    public function testSetIdAfterStart()
+    {
+        $this->session->start();
+        $id = $this->session->getId();
+
+        $e = null;
+        try {
+            $this->session->setId($id);
+        } catch (\Exception $e) {
+        }
+
+        $this->assertNull($e);
+
+        try {
+            $this->session->setId('different');
+        } catch (\Exception $e) {
+        }
+
+        $this->assertInstanceOf('\LogicException', $e);
+    }
+
     public function testSetName()
     {
         $this->assertEquals('MOCKSESSID', $this->session->getName());
@@ -106,10 +127,10 @@ class SessionTest extends TestCase
 
     public function testReplace()
     {
-        $this->session->replace(array('happiness' => 'be good', 'symfony' => 'awesome'));
-        $this->assertEquals(array('happiness' => 'be good', 'symfony' => 'awesome'), $this->session->all());
-        $this->session->replace(array());
-        $this->assertEquals(array(), $this->session->all());
+        $this->session->replace(['happiness' => 'be good', 'symfony' => 'awesome']);
+        $this->assertEquals(['happiness' => 'be good', 'symfony' => 'awesome'], $this->session->all());
+        $this->session->replace([]);
+        $this->assertEquals([], $this->session->all());
     }
 
     /**
@@ -129,16 +150,16 @@ class SessionTest extends TestCase
         $this->session->set('hi', 'fabien');
         $this->session->set($key, $value);
         $this->session->clear();
-        $this->assertEquals(array(), $this->session->all());
+        $this->assertEquals([], $this->session->all());
     }
 
     public function setProvider()
     {
-        return array(
-            array('foo', 'bar', array('foo' => 'bar')),
-            array('foo.bar', 'too much beer', array('foo.bar' => 'too much beer')),
-            array('great', 'symfony is great', array('great' => 'symfony is great')),
-        );
+        return [
+            ['foo', 'bar', ['foo' => 'bar']],
+            ['foo.bar', 'too much beer', ['foo.bar' => 'too much beer']],
+            ['great', 'symfony is great', ['great' => 'symfony is great']],
+        ];
     }
 
     /**
@@ -149,14 +170,14 @@ class SessionTest extends TestCase
         $this->session->set('hi.world', 'have a nice day');
         $this->session->set($key, $value);
         $this->session->remove($key);
-        $this->assertEquals(array('hi.world' => 'have a nice day'), $this->session->all());
+        $this->assertEquals(['hi.world' => 'have a nice day'], $this->session->all());
     }
 
     public function testInvalidate()
     {
         $this->session->set('invalidate', 123);
         $this->session->invalidate();
-        $this->assertEquals(array(), $this->session->all());
+        $this->assertEquals([], $this->session->all());
     }
 
     public function testMigrate()
@@ -195,7 +216,7 @@ class SessionTest extends TestCase
 
     public function testGetIterator()
     {
-        $attributes = array('hello' => 'world', 'symfony' => 'rocks');
+        $attributes = ['hello' => 'world', 'symfony' => 'rocks'];
         foreach ($attributes as $key => $val) {
             $this->session->set($key, $val);
         }
@@ -206,7 +227,7 @@ class SessionTest extends TestCase
             ++$i;
         }
 
-        $this->assertEquals(count($attributes), $i);
+        $this->assertEquals(\count($attributes), $i);
     }
 
     public function testGetCount()
@@ -221,4 +242,22 @@ class SessionTest extends TestCase
     {
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\MetadataBag', $this->session->getMetadataBag());
     }
+
+    public function testIsEmpty()
+    {
+        $this->assertTrue($this->session->isEmpty());
+
+        $this->session->set('hello', 'world');
+        $this->assertFalse($this->session->isEmpty());
+
+        $this->session->remove('hello');
+        $this->assertTrue($this->session->isEmpty());
+
+        $flash = $this->session->getFlashBag();
+        $flash->set('hello', 'world');
+        $this->assertFalse($this->session->isEmpty());
+
+        $flash->get('hello');
+        $this->assertTrue($this->session->isEmpty());
+    }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/AbstractSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/AbstractSessionHandlerTest.php
new file mode 100644
index 00000000..98bc67bc
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/AbstractSessionHandlerTest.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler;
+
+use PHPUnit\Framework\TestCase;
+
+/**
+ * @requires PHP 7.0
+ */
+class AbstractSessionHandlerTest extends TestCase
+{
+    private static $server;
+
+    public static function setUpBeforeClass()
+    {
+        $spec = [
+            1 => ['file', '/dev/null', 'w'],
+            2 => ['file', '/dev/null', 'w'],
+        ];
+        if (!self::$server = @proc_open('exec php -S localhost:8053', $spec, $pipes, __DIR__.'/Fixtures')) {
+            self::markTestSkipped('PHP server unable to start.');
+        }
+        sleep(1);
+    }
+
+    public static function tearDownAfterClass()
+    {
+        if (self::$server) {
+            proc_terminate(self::$server);
+            proc_close(self::$server);
+        }
+    }
+
+    /**
+     * @dataProvider provideSession
+     */
+    public function testSession($fixture)
+    {
+        $context = ['http' => ['header' => "Cookie: sid=123abc\r\n"]];
+        $context = stream_context_create($context);
+        $result = file_get_contents(sprintf('http://localhost:8053/%s.php', $fixture), false, $context);
+
+        $this->assertStringEqualsFile(__DIR__.sprintf('/Fixtures/%s.expected', $fixture), $result);
+    }
+
+    public function provideSession()
+    {
+        foreach (glob(__DIR__.'/Fixtures/*.php') as $file) {
+            yield [pathinfo($file, PATHINFO_FILENAME)];
+        }
+    }
+}
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/common.inc b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/common.inc
new file mode 100644
index 00000000..7a064c7f
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/common.inc
@@ -0,0 +1,151 @@
+<?php
+
+use Symfony\Component\HttpFoundation\Session\Storage\Handler\AbstractSessionHandler;
+
+$parent = __DIR__;
+while (!@file_exists($parent.'/vendor/autoload.php')) {
+    if (!@file_exists($parent)) {
+        // open_basedir restriction in effect
+        break;
+    }
+    if ($parent === dirname($parent)) {
+        echo "vendor/autoload.php not found\n";
+        exit(1);
+    }
+
+    $parent = dirname($parent);
+}
+
+require $parent.'/vendor/autoload.php';
+
+error_reporting(-1);
+ini_set('html_errors', 0);
+ini_set('display_errors', 1);
+ini_set('session.gc_probability', 0);
+ini_set('session.serialize_handler', 'php');
+ini_set('session.cookie_lifetime', 0);
+ini_set('session.cookie_domain', '');
+ini_set('session.cookie_secure', '');
+ini_set('session.cookie_httponly', '');
+ini_set('session.use_cookies', 1);
+ini_set('session.use_only_cookies', 1);
+ini_set('session.cache_expire', 180);
+ini_set('session.cookie_path', '/');
+ini_set('session.cookie_domain', '');
+ini_set('session.cookie_secure', 1);
+ini_set('session.cookie_httponly', 1);
+ini_set('session.use_strict_mode', 1);
+ini_set('session.lazy_write', 1);
+ini_set('session.name', 'sid');
+ini_set('session.save_path', __DIR__);
+ini_set('session.cache_limiter', '');
+
+header_remove('X-Powered-By');
+header('Content-Type: text/plain; charset=utf-8');
+
+register_shutdown_function(function () {
+    echo "\n";
+    session_write_close();
+    print_r(headers_list());
+    echo "shutdown\n";
+});
+ob_start();
+
+class TestSessionHandler extends AbstractSessionHandler
+{
+    private $data;
+
+    public function __construct($data = '')
+    {
+        $this->data = $data;
+    }
+
+    public function open($path, $name)
+    {
+        echo __FUNCTION__, "\n";
+
+        return parent::open($path, $name);
+    }
+
+    public function validateId($sessionId)
+    {
+        echo __FUNCTION__, "\n";
+
+        return parent::validateId($sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function read($sessionId)
+    {
+        echo __FUNCTION__, "\n";
+
+        return parent::read($sessionId);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function updateTimestamp($sessionId, $data)
+    {
+        echo __FUNCTION__, "\n";
+
+        return true;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function write($sessionId, $data)
+    {
+        echo __FUNCTION__, "\n";
+
+        return parent::write($sessionId, $data);
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function destroy($sessionId)
+    {
+        echo __FUNCTION__, "\n";
+
+        return parent::destroy($sessionId);
+    }
+
+    public function close()
+    {
+        echo __FUNCTION__, "\n";
+
+        return true;
+    }
+
+    public function gc($maxLifetime)
+    {
+        echo __FUNCTION__, "\n";
+
+        return true;
+    }
+
+    protected function doRead($sessionId)
+    {
+        echo __FUNCTION__.': ', $this->data, "\n";
+
+        return $this->data;
+    }
+
+    protected function doWrite($sessionId, $data)
+    {
+        echo __FUNCTION__.': ', $data, "\n";
+
+        return true;
+    }
+
+    protected function doDestroy($sessionId)
+    {
+        echo __FUNCTION__, "\n";
+
+        return true;
+    }
+}
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/empty_destroys.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/empty_destroys.expected
new file mode 100644
index 00000000..82037147
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/empty_destroys.expected
@@ -0,0 +1,17 @@
+open
+validateId
+read
+doRead: abc|i:123;
+read
+
+write
+destroy
+doDestroy
+close
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: max-age=10800, private, must-revalidate
+    [2] => Set-Cookie: sid=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; secure; HttpOnly
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/empty_destroys.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/empty_destroys.php
new file mode 100644
index 00000000..3cfc1250
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/empty_destroys.php
@@ -0,0 +1,8 @@
+<?php
+
+require __DIR__.'/common.inc';
+
+session_set_save_handler(new TestSessionHandler('abc|i:123;'), false);
+session_start();
+
+unset($_SESSION['abc']);
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/read_only.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/read_only.expected
new file mode 100644
index 00000000..587adaf1
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/read_only.expected
@@ -0,0 +1,14 @@
+open
+validateId
+read
+doRead: abc|i:123;
+read
+123
+updateTimestamp
+close
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: max-age=10800, private, must-revalidate
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/read_only.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/read_only.php
new file mode 100644
index 00000000..3e62fb9e
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/read_only.php
@@ -0,0 +1,8 @@
+<?php
+
+require __DIR__.'/common.inc';
+
+session_set_save_handler(new TestSessionHandler('abc|i:123;'), false);
+session_start();
+
+echo $_SESSION['abc'];
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/regenerate.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/regenerate.expected
new file mode 100644
index 00000000..baa5f2f6
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/regenerate.expected
@@ -0,0 +1,24 @@
+open
+validateId
+read
+doRead: abc|i:123;
+read
+destroy
+doDestroy
+close
+open
+validateId
+read
+doRead: abc|i:123;
+read
+
+write
+doWrite: abc|i:123;
+close
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: max-age=10800, private, must-revalidate
+    [2] => Set-Cookie: sid=random_session_id; path=/; secure; HttpOnly
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/regenerate.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/regenerate.php
new file mode 100644
index 00000000..a0f635c8
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/regenerate.php
@@ -0,0 +1,10 @@
+<?php
+
+require __DIR__.'/common.inc';
+
+session_set_save_handler(new TestSessionHandler('abc|i:123;'), false);
+session_start();
+
+session_regenerate_id(true);
+
+ob_start(function ($buffer) { return str_replace(session_id(), 'random_session_id', $buffer); });
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.expected
new file mode 100644
index 00000000..4533a10a
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.expected
@@ -0,0 +1,20 @@
+open
+validateId
+read
+doRead: 
+read
+Array
+(
+    [0] => bar
+)
+$_SESSION is not empty
+write
+destroy
+close
+$_SESSION is not empty
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: max-age=0, private, must-revalidate
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.php
new file mode 100644
index 00000000..96dca3c2
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/storage.php
@@ -0,0 +1,24 @@
+<?php
+
+require __DIR__.'/common.inc';
+
+use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
+use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
+
+$storage = new NativeSessionStorage();
+$storage->setSaveHandler(new TestSessionHandler());
+$flash = new FlashBag();
+$storage->registerBag($flash);
+$storage->start();
+
+$flash->add('foo', 'bar');
+
+print_r($flash->get('foo'));
+echo empty($_SESSION) ? '$_SESSION is empty' : '$_SESSION is not empty';
+echo "\n";
+
+$storage->save();
+
+echo empty($_SESSION) ? '$_SESSION is empty' : '$_SESSION is not empty';
+
+ob_start(function ($buffer) { return str_replace(session_id(), 'random_session_id', $buffer); });
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.expected
new file mode 100644
index 00000000..33da0a5b
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.expected
@@ -0,0 +1,15 @@
+open
+validateId
+read
+doRead: abc|i:123;
+read
+
+updateTimestamp
+close
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: max-age=10800, private, must-revalidate
+    [2] => Set-Cookie: abc=def
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.php
new file mode 100644
index 00000000..ffb5b20a
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie.php
@@ -0,0 +1,8 @@
+<?php
+
+require __DIR__.'/common.inc';
+
+session_set_save_handler(new TestSessionHandler('abc|i:123;'), false);
+session_start();
+
+setcookie('abc', 'def');
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected
new file mode 100644
index 00000000..5de2d9e3
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.expected
@@ -0,0 +1,24 @@
+open
+validateId
+read
+doRead: abc|i:123;
+read
+updateTimestamp
+close
+open
+validateId
+read
+doRead: abc|i:123;
+read
+
+write
+destroy
+doDestroy
+close
+Array
+(
+    [0] => Content-Type: text/plain; charset=utf-8
+    [1] => Cache-Control: max-age=10800, private, must-revalidate
+    [2] => Set-Cookie: abc=def
+)
+shutdown
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.php
new file mode 100644
index 00000000..ec511932
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/Fixtures/with_cookie_and_session.php
@@ -0,0 +1,13 @@
+<?php
+
+require __DIR__.'/common.inc';
+
+setcookie('abc', 'def');
+
+session_set_save_handler(new TestSessionHandler('abc|i:123;'), false);
+session_start();
+session_write_close();
+session_start();
+
+$_SESSION['abc'] = 234;
+unset($_SESSION['abc']);
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php
index 06193c8b..68daa4e5 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcacheSessionHandlerTest.php
@@ -17,11 +17,13 @@ use Symfony\Component\HttpFoundation\Session\Storage\Handler\MemcacheSessionHand
 /**
  * @requires extension memcache
  * @group time-sensitive
+ * @group legacy
  */
 class MemcacheSessionHandlerTest extends TestCase
 {
     const PREFIX = 'prefix_';
     const TTL = 1000;
+
     /**
      * @var MemcacheSessionHandler
      */
@@ -31,7 +33,7 @@ class MemcacheSessionHandlerTest extends TestCase
 
     protected function setUp()
     {
-        if (defined('HHVM_VERSION')) {
+        if (\defined('HHVM_VERSION')) {
             $this->markTestSkipped('PHPUnit_MockObject cannot mock the Memcache class on HHVM. See https://github.com/sebastianbergmann/phpunit-mock-objects/pull/289');
         }
 
@@ -39,7 +41,7 @@ class MemcacheSessionHandlerTest extends TestCase
         $this->memcache = $this->getMockBuilder('Memcache')->getMock();
         $this->storage = new MemcacheSessionHandler(
             $this->memcache,
-            array('prefix' => self::PREFIX, 'expiretime' => self::TTL)
+            ['prefix' => self::PREFIX, 'expiretime' => self::TTL]
         );
     }
 
@@ -115,12 +117,12 @@ class MemcacheSessionHandlerTest extends TestCase
 
     public function getOptionFixtures()
     {
-        return array(
-            array(array('prefix' => 'session'), true),
-            array(array('expiretime' => 100), true),
-            array(array('prefix' => 'session', 'expiretime' => 200), true),
-            array(array('expiretime' => 100, 'foo' => 'bar'), false),
-        );
+        return [
+            [['prefix' => 'session'], true],
+            [['expiretime' => 100], true],
+            [['prefix' => 'session', 'expiretime' => 200], true],
+            [['expiretime' => 100, 'foo' => 'bar'], false],
+        ];
     }
 
     public function testGetConnection()
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php
index 2e7be359..81333734 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MemcachedSessionHandlerTest.php
@@ -32,7 +32,7 @@ class MemcachedSessionHandlerTest extends TestCase
 
     protected function setUp()
     {
-        if (defined('HHVM_VERSION')) {
+        if (\defined('HHVM_VERSION')) {
             $this->markTestSkipped('PHPUnit_MockObject cannot mock the Memcached class on HHVM. See https://github.com/sebastianbergmann/phpunit-mock-objects/pull/289');
         }
 
@@ -45,7 +45,7 @@ class MemcachedSessionHandlerTest extends TestCase
         $this->memcached = $this->getMockBuilder('Memcached')->getMock();
         $this->storage = new MemcachedSessionHandler(
             $this->memcached,
-            array('prefix' => self::PREFIX, 'expiretime' => self::TTL)
+            ['prefix' => self::PREFIX, 'expiretime' => self::TTL]
         );
     }
 
@@ -63,6 +63,12 @@ class MemcachedSessionHandlerTest extends TestCase
 
     public function testCloseSession()
     {
+        $this->memcached
+            ->expects($this->once())
+            ->method('quit')
+            ->will($this->returnValue(true))
+        ;
+
         $this->assertTrue($this->storage->close());
     }
 
@@ -121,12 +127,12 @@ class MemcachedSessionHandlerTest extends TestCase
 
     public function getOptionFixtures()
     {
-        return array(
-            array(array('prefix' => 'session'), true),
-            array(array('expiretime' => 100), true),
-            array(array('prefix' => 'session', 'expiretime' => 200), true),
-            array(array('expiretime' => 100, 'foo' => 'bar'), false),
-        );
+        return [
+            [['prefix' => 'session'], true],
+            [['expiretime' => 100], true],
+            [['prefix' => 'session', 'expiretime' => 200], true],
+            [['expiretime' => 100, 'foo' => 'bar'], false],
+        ];
     }
 
     public function testGetConnection()
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php
index 74366863..6f2742ca 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/MongoDbSessionHandlerTest.php
@@ -17,6 +17,7 @@ use Symfony\Component\HttpFoundation\Session\Storage\Handler\MongoDbSessionHandl
 /**
  * @author Markus Bachmann <markus.bachmann@xxxxxxxxx>
  * @group time-sensitive
+ * @group legacy
  */
 class MongoDbSessionHandlerTest extends TestCase
 {
@@ -31,11 +32,11 @@ class MongoDbSessionHandlerTest extends TestCase
     {
         parent::setUp();
 
-        if (extension_loaded('mongodb')) {
+        if (\extension_loaded('mongodb')) {
             if (!class_exists('MongoDB\Client')) {
                 $this->markTestSkipped('The mongodb/mongodb package is required.');
             }
-        } elseif (!extension_loaded('mongo')) {
+        } elseif (!\extension_loaded('mongo')) {
             $this->markTestSkipped('The Mongo or MongoDB extension is required.');
         }
 
@@ -49,14 +50,14 @@ class MongoDbSessionHandlerTest extends TestCase
             ->disableOriginalConstructor()
             ->getMock();
 
-        $this->options = array(
+        $this->options = [
             'id_field' => '_id',
             'data_field' => 'data',
             'time_field' => 'time',
             'expiry_field' => 'expires_at',
             'database' => 'sf2-test',
             'collection' => 'session-test',
-        );
+        ];
 
         $this->storage = new MongoDbSessionHandler($this->mongo, $this->options);
     }
@@ -74,7 +75,7 @@ class MongoDbSessionHandlerTest extends TestCase
      */
     public function testConstructorShouldThrowExceptionForMissingOptions()
     {
-        new MongoDbSessionHandler($this->mongo, array());
+        new MongoDbSessionHandler($this->mongo, []);
     }
 
     public function testOpenMethodAlwaysReturnTrue()
@@ -117,9 +118,9 @@ class MongoDbSessionHandlerTest extends TestCase
                     $this->assertGreaterThanOrEqual($criteria[$this->options['expiry_field']]['$gte']->sec, $testTimeout);
                 }
 
-                $fields = array(
+                $fields = [
                     $this->options['id_field'] => 'foo',
-                );
+                ];
 
                 if (phpversion('mongodb')) {
                     $fields[$this->options['data_field']] = new \MongoDB\BSON\Binary('bar', \MongoDB\BSON\Binary::TYPE_OLD_BINARY);
@@ -144,19 +145,19 @@ class MongoDbSessionHandlerTest extends TestCase
             ->with($this->options['database'], $this->options['collection'])
             ->will($this->returnValue($collection));
 
-        $data = array();
+        $data = [];
 
         $methodName = phpversion('mongodb') ? 'updateOne' : 'update';
 
         $collection->expects($this->once())
             ->method($methodName)
             ->will($this->returnCallback(function ($criteria, $updateData, $options) use (&$data) {
-                $this->assertEquals(array($this->options['id_field'] => 'foo'), $criteria);
+                $this->assertEquals([$this->options['id_field'] => 'foo'], $criteria);
 
                 if (phpversion('mongodb')) {
-                    $this->assertEquals(array('upsert' => true), $options);
+                    $this->assertEquals(['upsert' => true], $options);
                 } else {
-                    $this->assertEquals(array('upsert' => true, 'multiple' => false), $options);
+                    $this->assertEquals(['upsert' => true, 'multiple' => false], $options);
                 }
 
                 $data = $updateData['$set'];
@@ -180,14 +181,14 @@ class MongoDbSessionHandlerTest extends TestCase
 
     public function testWriteWhenUsingExpiresField()
     {
-        $this->options = array(
+        $this->options = [
             'id_field' => '_id',
             'data_field' => 'data',
             'time_field' => 'time',
             'database' => 'sf2-test',
             'collection' => 'session-test',
             'expiry_field' => 'expiresAt',
-        );
+        ];
 
         $this->storage = new MongoDbSessionHandler($this->mongo, $this->options);
 
@@ -198,19 +199,19 @@ class MongoDbSessionHandlerTest extends TestCase
             ->with($this->options['database'], $this->options['collection'])
             ->will($this->returnValue($collection));
 
-        $data = array();
+        $data = [];
 
         $methodName = phpversion('mongodb') ? 'updateOne' : 'update';
 
         $collection->expects($this->once())
             ->method($methodName)
             ->will($this->returnCallback(function ($criteria, $updateData, $options) use (&$data) {
-                $this->assertEquals(array($this->options['id_field'] => 'foo'), $criteria);
+                $this->assertEquals([$this->options['id_field'] => 'foo'], $criteria);
 
                 if (phpversion('mongodb')) {
-                    $this->assertEquals(array('upsert' => true), $options);
+                    $this->assertEquals(['upsert' => true], $options);
                 } else {
-                    $this->assertEquals(array('upsert' => true, 'multiple' => false), $options);
+                    $this->assertEquals(['upsert' => true, 'multiple' => false], $options);
                 }
 
                 $data = $updateData['$set'];
@@ -238,7 +239,7 @@ class MongoDbSessionHandlerTest extends TestCase
             ->with($this->options['database'], $this->options['collection'])
             ->will($this->returnValue($collection));
 
-        $data = array();
+        $data = [];
 
         $methodName = phpversion('mongodb') ? 'updateOne' : 'update';
 
@@ -271,7 +272,7 @@ class MongoDbSessionHandlerTest extends TestCase
 
         $collection->expects($this->once())
             ->method($methodName)
-            ->with(array($this->options['id_field'] => 'foo'));
+            ->with([$this->options['id_field'] => 'foo']);
 
         $this->assertTrue($this->storage->destroy('foo'));
     }
@@ -285,7 +286,7 @@ class MongoDbSessionHandlerTest extends TestCase
             ->with($this->options['database'], $this->options['collection'])
             ->will($this->returnValue($collection));
 
-        $methodName = phpversion('mongodb') ? 'deleteOne' : 'remove';
+        $methodName = phpversion('mongodb') ? 'deleteMany' : 'remove';
 
         $collection->expects($this->once())
             ->method($methodName)
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php
index a6264e51..dc827d8a 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeFileSessionHandlerTest.php
@@ -27,7 +27,7 @@ class NativeFileSessionHandlerTest extends TestCase
 {
     public function testConstruct()
     {
-        $storage = new NativeSessionStorage(array('name' => 'TESTING'), new NativeFileSessionHandler(sys_get_temp_dir()));
+        $storage = new NativeSessionStorage(['name' => 'TESTING'], new NativeFileSessionHandler(sys_get_temp_dir()));
 
         $this->assertEquals('files', $storage->getSaveHandler()->getSaveHandlerName());
         $this->assertEquals('user', ini_get('session.save_handler'));
@@ -52,11 +52,11 @@ class NativeFileSessionHandlerTest extends TestCase
     {
         $base = sys_get_temp_dir();
 
-        return array(
-            array("$base/foo", "$base/foo", "$base/foo"),
-            array("5;$base/foo", "5;$base/foo", "$base/foo"),
-            array("5;0600;$base/foo", "5;0600;$base/foo", "$base/foo"),
-        );
+        return [
+            ["$base/foo", "$base/foo", "$base/foo"],
+            ["5;$base/foo", "5;$base/foo", "$base/foo"],
+            ["5;0600;$base/foo", "5;0600;$base/foo", "$base/foo"],
+        ];
     }
 
     /**
@@ -70,7 +70,7 @@ class NativeFileSessionHandlerTest extends TestCase
     public function testConstructDefault()
     {
         $path = ini_get('session.save_path');
-        $storage = new NativeSessionStorage(array('name' => 'TESTING'), new NativeFileSessionHandler());
+        $storage = new NativeSessionStorage(['name' => 'TESTING'], new NativeFileSessionHandler());
 
         $this->assertEquals($path, ini_get('session.save_path'));
     }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php
index 5486b2d6..4a9fb600 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NativeSessionHandlerTest.php
@@ -21,14 +21,18 @@ use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandle
  *
  * @runTestsInSeparateProcesses
  * @preserveGlobalState disabled
+ * @group legacy
  */
 class NativeSessionHandlerTest extends TestCase
 {
+    /**
+     * @expectedDeprecation The Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler class is deprecated since Symfony 3.4 and will be removed in 4.0. Use the \SessionHandler class instead.
+     */
     public function testConstruct()
     {
         $handler = new NativeSessionHandler();
 
-        $this->assertTrue($handler instanceof \SessionHandler);
+        $this->assertInstanceOf('SessionHandler', $handler);
         $this->assertTrue($handler instanceof NativeSessionHandler);
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php
index 718fd0f8..0d246e1a 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/NullSessionHandlerTest.php
@@ -12,9 +12,9 @@
 namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler;
 
 use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Session\Session;
 use Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler;
 use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
-use Symfony\Component\HttpFoundation\Session\Session;
 
 /**
  * Test class for NullSessionHandler.
@@ -54,6 +54,6 @@ class NullSessionHandlerTest extends TestCase
 
     public function getStorage()
     {
-        return new NativeSessionStorage(array(), new NullSessionHandler());
+        return new NativeSessionStorage([], new NullSessionHandler());
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php
index a47120f1..90107847 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/PdoSessionHandlerTest.php
@@ -64,7 +64,7 @@ class PdoSessionHandlerTest extends TestCase
      */
     public function testInexistentTable()
     {
-        $storage = new PdoSessionHandler($this->getMemorySqlitePdo(), array('db_table' => 'inexistent_table'));
+        $storage = new PdoSessionHandler($this->getMemorySqlitePdo(), ['db_table' => 'inexistent_table']);
         $storage->open('', 'sid');
         $storage->read('id');
         $storage->write('id', 'data');
@@ -136,7 +136,7 @@ class PdoSessionHandlerTest extends TestCase
 
     public function testReadConvertsStreamToString()
     {
-        if (defined('HHVM_VERSION')) {
+        if (\defined('HHVM_VERSION')) {
             $this->markTestSkipped('PHPUnit_MockObject cannot mock the PDOStatement class on HHVM. See https://github.com/sebastianbergmann/phpunit-mock-objects/pull/289');
         }
 
@@ -147,7 +147,7 @@ class PdoSessionHandlerTest extends TestCase
         $stream = $this->createStream($content);
 
         $pdo->prepareResult->expects($this->once())->method('fetchAll')
-            ->will($this->returnValue(array(array($stream, 42, time()))));
+            ->will($this->returnValue([[$stream, 42, time()]]));
 
         $storage = new PdoSessionHandler($pdo);
         $result = $storage->read('foo');
@@ -157,9 +157,12 @@ class PdoSessionHandlerTest extends TestCase
 
     public function testReadLockedConvertsStreamToString()
     {
-        if (defined('HHVM_VERSION')) {
+        if (\defined('HHVM_VERSION')) {
             $this->markTestSkipped('PHPUnit_MockObject cannot mock the PDOStatement class on HHVM. See https://github.com/sebastianbergmann/phpunit-mock-objects/pull/289');
         }
+        if (filter_var(ini_get('session.use_strict_mode'), FILTER_VALIDATE_BOOLEAN)) {
+            $this->markTestSkipped('Strict mode needs no locking for new sessions.');
+        }
 
         $pdo = new MockPdo('pgsql');
         $selectStmt = $this->getMockBuilder('PDOStatement')->getMock();
@@ -175,7 +178,7 @@ class PdoSessionHandlerTest extends TestCase
 
         $selectStmt->expects($this->atLeast(2))->method('fetchAll')
             ->will($this->returnCallback(function () use (&$exception, $stream) {
-                return $exception ? array(array($stream, 42, time())) : array();
+                return $exception ? [[$stream, 42, time()]] : [];
             }));
 
         $insertStmt->expects($this->once())->method('execute')
@@ -269,6 +272,9 @@ class PdoSessionHandlerTest extends TestCase
         $this->assertSame('', $data, 'Destroyed session returns empty string');
     }
 
+    /**
+     * @runInSeparateProcess
+     */
     public function testSessionGC()
     {
         $previousLifeTime = ini_set('session.gc_maxlifetime', 1000);
@@ -318,6 +324,41 @@ class PdoSessionHandlerTest extends TestCase
         $this->assertInstanceOf('\PDO', $method->invoke($storage));
     }
 
+    /**
+     * @dataProvider provideUrlDsnPairs
+     */
+    public function testUrlDsn($url, $expectedDsn, $expectedUser = null, $expectedPassword = null)
+    {
+        $storage = new PdoSessionHandler($url);
+
+        $this->assertAttributeEquals($expectedDsn, 'dsn', $storage);
+
+        if (null !== $expectedUser) {
+            $this->assertAttributeEquals($expectedUser, 'username', $storage);
+        }
+
+        if (null !== $expectedPassword) {
+            $this->assertAttributeEquals($expectedPassword, 'password', $storage);
+        }
+    }
+
+    public function provideUrlDsnPairs()
+    {
+        yield ['mysql://localhost/test', 'mysql:host=localhost;dbname=test;'];
+        yield ['mysql://localhost:56/test', 'mysql:host=localhost;port=56;dbname=test;'];
+        yield ['mysql2://root:pwd@localhost/test', 'mysql:host=localhost;dbname=test;', 'root', 'pwd'];
+        yield ['postgres://localhost/test', 'pgsql:host=localhost;dbname=test;'];
+        yield ['postgresql://localhost:5634/test', 'pgsql:host=localhost;port=5634;dbname=test;'];
+        yield ['postgres://root:pwd@localhost/test', 'pgsql:host=localhost;dbname=test;', 'root', 'pwd'];
+        yield 'sqlite relative path' => ['sqlite://localhost/tmp/test', 'sqlite:tmp/test'];
+        yield 'sqlite absolute path' => ['sqlite://localhost//tmp/test', 'sqlite:/tmp/test'];
+        yield 'sqlite relative path without host' => ['sqlite:///tmp/test', 'sqlite:tmp/test'];
+        yield 'sqlite absolute path without host' => ['sqlite3:////tmp/test', 'sqlite:/tmp/test'];
+        yield ['sqlite://localhost/:memory:', 'sqlite::memory:'];
+        yield ['mssql://localhost/test', 'sqlsrv:server=localhost;Database=test'];
+        yield ['mssql://localhost:56/test', 'sqlsrv:server=localhost,56;Database=test'];
+    }
+
     private function createStream($content)
     {
         $stream = tmpfile();
@@ -353,10 +394,10 @@ class MockPdo extends \PDO
         return parent::getAttribute($attribute);
     }
 
-    public function prepare($statement, $driverOptions = array())
+    public function prepare($statement, $driverOptions = [])
     {
-        return is_callable($this->prepareResult)
-            ? call_user_func($this->prepareResult, $statement, $driverOptions)
+        return \is_callable($this->prepareResult)
+            ? \call_user_func($this->prepareResult, $statement, $driverOptions)
             : $this->prepareResult;
     }
 
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/StrictSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/StrictSessionHandlerTest.php
new file mode 100644
index 00000000..6a0d1687
--- /dev/null
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/StrictSessionHandlerTest.php
@@ -0,0 +1,189 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Handler;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Session\Storage\Handler\AbstractSessionHandler;
+use Symfony\Component\HttpFoundation\Session\Storage\Handler\StrictSessionHandler;
+
+class StrictSessionHandlerTest extends TestCase
+{
+    public function testOpen()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('open')
+            ->with('path', 'name')->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertInstanceOf('SessionUpdateTimestampHandlerInterface', $proxy);
+        $this->assertInstanceOf(AbstractSessionHandler::class, $proxy);
+        $this->assertTrue($proxy->open('path', 'name'));
+    }
+
+    public function testCloseSession()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('close')
+            ->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertTrue($proxy->close());
+    }
+
+    public function testValidateIdOK()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('read')
+            ->with('id')->willReturn('data');
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertTrue($proxy->validateId('id'));
+    }
+
+    public function testValidateIdKO()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('read')
+            ->with('id')->willReturn('');
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertFalse($proxy->validateId('id'));
+    }
+
+    public function testRead()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('read')
+            ->with('id')->willReturn('data');
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertSame('data', $proxy->read('id'));
+    }
+
+    public function testReadWithValidateIdOK()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('read')
+            ->with('id')->willReturn('data');
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertTrue($proxy->validateId('id'));
+        $this->assertSame('data', $proxy->read('id'));
+    }
+
+    public function testReadWithValidateIdMismatch()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->exactly(2))->method('read')
+            ->withConsecutive(['id1'], ['id2'])
+            ->will($this->onConsecutiveCalls('data1', 'data2'));
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertTrue($proxy->validateId('id1'));
+        $this->assertSame('data2', $proxy->read('id2'));
+    }
+
+    public function testUpdateTimestamp()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('write')
+            ->with('id', 'data')->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertTrue($proxy->updateTimestamp('id', 'data'));
+    }
+
+    public function testWrite()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('write')
+            ->with('id', 'data')->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertTrue($proxy->write('id', 'data'));
+    }
+
+    public function testWriteEmptyNewSession()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('read')
+            ->with('id')->willReturn('');
+        $handler->expects($this->never())->method('write');
+        $handler->expects($this->once())->method('destroy')->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertFalse($proxy->validateId('id'));
+        $this->assertSame('', $proxy->read('id'));
+        $this->assertTrue($proxy->write('id', ''));
+    }
+
+    public function testWriteEmptyExistingSession()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('read')
+            ->with('id')->willReturn('data');
+        $handler->expects($this->never())->method('write');
+        $handler->expects($this->once())->method('destroy')->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertSame('data', $proxy->read('id'));
+        $this->assertTrue($proxy->write('id', ''));
+    }
+
+    public function testDestroy()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('destroy')
+            ->with('id')->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertTrue($proxy->destroy('id'));
+    }
+
+    public function testDestroyNewSession()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('read')
+            ->with('id')->willReturn('');
+        $handler->expects($this->once())->method('destroy')->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertSame('', $proxy->read('id'));
+        $this->assertTrue($proxy->destroy('id'));
+    }
+
+    public function testDestroyNonEmptyNewSession()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('read')
+            ->with('id')->willReturn('');
+        $handler->expects($this->once())->method('write')
+            ->with('id', 'data')->willReturn(true);
+        $handler->expects($this->once())->method('destroy')
+            ->with('id')->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertSame('', $proxy->read('id'));
+        $this->assertTrue($proxy->write('id', 'data'));
+        $this->assertTrue($proxy->destroy('id'));
+    }
+
+    public function testGc()
+    {
+        $handler = $this->getMockBuilder('SessionHandlerInterface')->getMock();
+        $handler->expects($this->once())->method('gc')
+            ->with(123)->willReturn(true);
+        $proxy = new StrictSessionHandler($handler);
+
+        $this->assertTrue($proxy->gc(123));
+    }
+}
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php
index 5e41a474..898a7d11 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Handler/WriteCheckSessionHandlerTest.php
@@ -16,6 +16,8 @@ use Symfony\Component\HttpFoundation\Session\Storage\Handler\WriteCheckSessionHa
 
 /**
  * @author Adrien Brault <adrien.brault@xxxxxxxxx>
+ *
+ * @group legacy
  */
 class WriteCheckSessionHandlerTest extends TestCase
 {
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php
index 159e6211..2c4758b9 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/MetadataBagTest.php
@@ -26,29 +26,26 @@ class MetadataBagTest extends TestCase
      */
     protected $bag;
 
-    /**
-     * @var array
-     */
-    protected $array = array();
+    protected $array = [];
 
     protected function setUp()
     {
         parent::setUp();
         $this->bag = new MetadataBag();
-        $this->array = array(MetadataBag::CREATED => 1234567, MetadataBag::UPDATED => 12345678, MetadataBag::LIFETIME => 0);
+        $this->array = [MetadataBag::CREATED => 1234567, MetadataBag::UPDATED => 12345678, MetadataBag::LIFETIME => 0];
         $this->bag->initialize($this->array);
     }
 
     protected function tearDown()
     {
-        $this->array = array();
+        $this->array = [];
         $this->bag = null;
         parent::tearDown();
     }
 
     public function testInitialize()
     {
-        $sessionMetadata = array();
+        $sessionMetadata = [];
 
         $bag1 = new MetadataBag();
         $bag1->initialize($sessionMetadata);
@@ -85,7 +82,7 @@ class MetadataBagTest extends TestCase
     public function testGetLifetime()
     {
         $bag = new MetadataBag();
-        $array = array(MetadataBag::CREATED => 1234567, MetadataBag::UPDATED => 12345678, MetadataBag::LIFETIME => 1000);
+        $array = [MetadataBag::CREATED => 1234567, MetadataBag::UPDATED => 12345678, MetadataBag::LIFETIME => 1000];
         $bag->initialize($array);
         $this->assertEquals(1000, $bag->getLifetime());
     }
@@ -114,11 +111,11 @@ class MetadataBagTest extends TestCase
         $timeStamp = time();
 
         $created = $timeStamp - 15;
-        $sessionMetadata = array(
+        $sessionMetadata = [
             MetadataBag::CREATED => $created,
             MetadataBag::UPDATED => $created,
             MetadataBag::LIFETIME => 1000,
-        );
+        ];
         $bag->initialize($sessionMetadata);
 
         $this->assertEquals($created, $sessionMetadata[MetadataBag::UPDATED]);
@@ -130,11 +127,11 @@ class MetadataBagTest extends TestCase
         $timeStamp = time();
 
         $created = $timeStamp - 45;
-        $sessionMetadata = array(
+        $sessionMetadata = [
             MetadataBag::CREATED => $created,
             MetadataBag::UPDATED => $created,
             MetadataBag::LIFETIME => 1000,
-        );
+        ];
         $bag->initialize($sessionMetadata);
 
         $this->assertEquals($timeStamp, $sessionMetadata[MetadataBag::UPDATED]);
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php
index 82df5543..2e3024ef 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/MockArraySessionStorageTest.php
@@ -12,9 +12,9 @@
 namespace Symfony\Component\HttpFoundation\Tests\Session\Storage;
 
 use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
 use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
 use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
+use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage;
 
 /**
  * Test class for MockArraySessionStorage.
@@ -45,10 +45,10 @@ class MockArraySessionStorageTest extends TestCase
         $this->attributes = new AttributeBag();
         $this->flashes = new FlashBag();
 
-        $this->data = array(
-            $this->attributes->getStorageKey() => array('foo' => 'bar'),
-            $this->flashes->getStorageKey() => array('notice' => 'hello'),
-            );
+        $this->data = [
+            $this->attributes->getStorageKey() => ['foo' => 'bar'],
+            $this->flashes->getStorageKey() => ['notice' => 'hello'],
+        ];
 
         $this->storage = new MockArraySessionStorage();
         $this->storage->registerBag($this->flashes);
@@ -80,14 +80,14 @@ class MockArraySessionStorageTest extends TestCase
         $id = $this->storage->getId();
         $this->storage->regenerate();
         $this->assertNotEquals($id, $this->storage->getId());
-        $this->assertEquals(array('foo' => 'bar'), $this->storage->getBag('attributes')->all());
-        $this->assertEquals(array('notice' => 'hello'), $this->storage->getBag('flashes')->peekAll());
+        $this->assertEquals(['foo' => 'bar'], $this->storage->getBag('attributes')->all());
+        $this->assertEquals(['notice' => 'hello'], $this->storage->getBag('flashes')->peekAll());
 
         $id = $this->storage->getId();
         $this->storage->regenerate(true);
         $this->assertNotEquals($id, $this->storage->getId());
-        $this->assertEquals(array('foo' => 'bar'), $this->storage->getBag('attributes')->all());
-        $this->assertEquals(array('notice' => 'hello'), $this->storage->getBag('flashes')->peekAll());
+        $this->assertEquals(['foo' => 'bar'], $this->storage->getBag('attributes')->all());
+        $this->assertEquals(['notice' => 'hello'], $this->storage->getBag('flashes')->peekAll());
     }
 
     public function testGetId()
@@ -101,8 +101,8 @@ class MockArraySessionStorageTest extends TestCase
     {
         $this->storage->clear();
 
-        $this->assertSame(array(), $this->storage->getBag('attributes')->all());
-        $this->assertSame(array(), $this->storage->getBag('flashes')->peekAll());
+        $this->assertSame([], $this->storage->getBag('attributes')->all());
+        $this->assertSame([], $this->storage->getBag('flashes')->peekAll());
     }
 
     public function testClearStartsSession()
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php
index 53accd38..9e2692dc 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/MockFileSessionStorageTest.php
@@ -12,9 +12,9 @@
 namespace Symfony\Component\HttpFoundation\Tests\Session\Storage;
 
 use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage;
-use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
 use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
+use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
+use Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage;
 
 /**
  * Test class for MockFileSessionStorage.
@@ -91,7 +91,7 @@ class MockFileSessionStorageTest extends TestCase
         $storage->start();
         $this->assertEquals('108', $storage->getBag('attributes')->get('new'));
         $this->assertTrue($storage->getBag('flashes')->has('newkey'));
-        $this->assertEquals(array('test'), $storage->getBag('flashes')->peek('newkey'));
+        $this->assertEquals(['test'], $storage->getBag('flashes')->peek('newkey'));
     }
 
     public function testMultipleInstances()
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php
index 818c63a9..7cc2eb79 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/NativeSessionStorageTest.php
@@ -14,7 +14,7 @@ namespace Symfony\Component\HttpFoundation\Tests\Session\Storage;
 use PHPUnit\Framework\TestCase;
 use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
 use Symfony\Component\HttpFoundation\Session\Flash\FlashBag;
-use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeSessionHandler;
+use Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeFileSessionHandler;
 use Symfony\Component\HttpFoundation\Session\Storage\Handler\NullSessionHandler;
 use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
 use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
@@ -54,11 +54,9 @@ class NativeSessionStorageTest extends TestCase
     }
 
     /**
-     * @param array $options
-     *
      * @return NativeSessionStorage
      */
-    protected function getStorage(array $options = array())
+    protected function getStorage(array $options = [])
     {
         $storage = new NativeSessionStorage($options);
         $storage->registerBag(new AttributeBag());
@@ -159,31 +157,50 @@ class NativeSessionStorageTest extends TestCase
     {
         $this->iniSet('session.cache_limiter', 'nocache');
 
-        $storage = new NativeSessionStorage(array('cache_limiter' => 'public'));
+        $storage = new NativeSessionStorage(['cache_limiter' => 'public']);
         $this->assertEquals('public', ini_get('session.cache_limiter'));
     }
 
     public function testCookieOptions()
     {
-        $options = array(
+        $options = [
             'cookie_lifetime' => 123456,
             'cookie_path' => '/my/cookie/path',
             'cookie_domain' => 'symfony.example.com',
             'cookie_secure' => true,
             'cookie_httponly' => false,
-        );
+        ];
 
         $this->getStorage($options);
         $temp = session_get_cookie_params();
-        $gco = array();
+        $gco = [];
 
         foreach ($temp as $key => $value) {
             $gco['cookie_'.$key] = $value;
         }
 
+        unset($gco['cookie_samesite']);
+
         $this->assertEquals($options, $gco);
     }
 
+    public function testSessionOptions()
+    {
+        if (\defined('HHVM_VERSION')) {
+            $this->markTestSkipped('HHVM is not handled in this test case.');
+        }
+
+        $options = [
+            'url_rewriter.tags' => 'a=href',
+            'cache_expire' => '200',
+        ];
+
+        $this->getStorage($options);
+
+        $this->assertSame('a=href', ini_get('url_rewriter.tags'));
+        $this->assertSame('200', ini_get('session.cache_expire'));
+    }
+
     /**
      * @expectedException \InvalidArgumentException
      */
@@ -201,9 +218,9 @@ class NativeSessionStorageTest extends TestCase
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
         $storage->setSaveHandler(null);
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
-        $storage->setSaveHandler(new SessionHandlerProxy(new NativeSessionHandler()));
+        $storage->setSaveHandler(new SessionHandlerProxy(new NativeFileSessionHandler()));
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
-        $storage->setSaveHandler(new NativeSessionHandler());
+        $storage->setSaveHandler(new NativeFileSessionHandler());
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
         $storage->setSaveHandler(new SessionHandlerProxy(new NullSessionHandler()));
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy', $storage->getSaveHandler());
@@ -229,7 +246,7 @@ class NativeSessionStorageTest extends TestCase
         $this->assertFalse($storage->isStarted());
 
         $key = $storage->getMetadataBag()->getStorageKey();
-        $this->assertFalse(isset($_SESSION[$key]));
+        $this->assertArrayNotHasKey($key, $_SESSION);
         $storage->start();
     }
 
@@ -244,4 +261,36 @@ class NativeSessionStorageTest extends TestCase
         $this->assertSame($id, $storage->getId(), 'Same session ID after restarting');
         $this->assertSame(7, $storage->getBag('attributes')->get('lucky'), 'Data still available');
     }
+
+    public function testCanCreateNativeSessionStorageWhenSessionAlreadyStarted()
+    {
+        session_start();
+        $this->getStorage();
+
+        // Assert no exception has been thrown by `getStorage()`
+        $this->addToAssertionCount(1);
+    }
+
+    public function testSetSessionOptionsOnceSessionStartedIsIgnored()
+    {
+        session_start();
+        $this->getStorage([
+            'name' => 'something-else',
+        ]);
+
+        // Assert no exception has been thrown by `getStorage()`
+        $this->addToAssertionCount(1);
+    }
+
+    public function testGetBagsOnceSessionStartedIsIgnored()
+    {
+        session_start();
+        $bag = new AttributeBag();
+        $bag->setName('flashes');
+
+        $storage = $this->getStorage();
+        $storage->registerBag($bag);
+
+        $this->assertEquals($storage->getBag('flashes'), $bag);
+    }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php
index b8b98386..752be618 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/PhpBridgeSessionStorageTest.php
@@ -12,8 +12,8 @@
 namespace Symfony\Component\HttpFoundation\Tests\Session\Storage;
 
 use PHPUnit\Framework\TestCase;
-use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage;
 use Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag;
+use Symfony\Component\HttpFoundation\Session\Storage\PhpBridgeSessionStorage;
 
 /**
  * Test class for PhpSessionStorage.
@@ -75,9 +75,9 @@ class PhpBridgeSessionStorageTest extends TestCase
         $this->assertFalse($storage->isStarted());
 
         $key = $storage->getMetadataBag()->getStorageKey();
-        $this->assertFalse(isset($_SESSION[$key]));
+        $this->assertArrayNotHasKey($key, $_SESSION);
         $storage->start();
-        $this->assertTrue(isset($_SESSION[$key]));
+        $this->assertArrayHasKey($key, $_SESSION);
     }
 
     public function testClear()
@@ -87,10 +87,10 @@ class PhpBridgeSessionStorageTest extends TestCase
         $_SESSION['drak'] = 'loves symfony';
         $storage->getBag('attributes')->set('symfony', 'greatness');
         $key = $storage->getBag('attributes')->getStorageKey();
-        $this->assertEquals($_SESSION[$key], array('symfony' => 'greatness'));
+        $this->assertEquals($_SESSION[$key], ['symfony' => 'greatness']);
         $this->assertEquals($_SESSION['drak'], 'loves symfony');
         $storage->clear();
-        $this->assertEquals($_SESSION[$key], array());
+        $this->assertEquals($_SESSION[$key], []);
         $this->assertEquals($_SESSION['drak'], 'loves symfony');
     }
 }
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php
index ef1da130..cbb291f1 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/AbstractProxyTest.php
@@ -13,39 +13,7 @@ namespace Symfony\Component\HttpFoundation\Tests\Session\Storage\Proxy;
 
 use PHPUnit\Framework\TestCase;
 use Symfony\Component\HttpFoundation\Session\Storage\Proxy\AbstractProxy;
-
-// Note until PHPUnit_Mock_Objects 1.2 is released you cannot mock abstracts due to
-// https://github.com/sebastianbergmann/phpunit-mock-objects/issues/73
-class ConcreteProxy extends AbstractProxy
-{
-}
-
-class ConcreteSessionHandlerInterfaceProxy extends AbstractProxy implements \SessionHandlerInterface
-{
-    public function open($savePath, $sessionName)
-    {
-    }
-
-    public function close()
-    {
-    }
-
-    public function read($id)
-    {
-    }
-
-    public function write($id, $data)
-    {
-    }
-
-    public function destroy($id)
-    {
-    }
-
-    public function gc($maxlifetime)
-    {
-    }
-}
+use Symfony\Component\HttpFoundation\Session\Storage\Proxy\SessionHandlerProxy;
 
 /**
  * Test class for AbstractProxy.
@@ -61,7 +29,7 @@ class AbstractProxyTest extends TestCase
 
     protected function setUp()
     {
-        $this->proxy = new ConcreteProxy();
+        $this->proxy = $this->getMockForAbstractClass(AbstractProxy::class);
     }
 
     protected function tearDown()
@@ -77,7 +45,7 @@ class AbstractProxyTest extends TestCase
     public function testIsSessionHandlerInterface()
     {
         $this->assertFalse($this->proxy->isSessionHandlerInterface());
-        $sh = new ConcreteSessionHandlerInterfaceProxy();
+        $sh = new SessionHandlerProxy(new \SessionHandler());
         $this->assertTrue($sh->isSessionHandlerInterface());
     }
 
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php
index 8ec30534..ed4fee6b 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/NativeProxyTest.php
@@ -17,6 +17,8 @@ use Symfony\Component\HttpFoundation\Session\Storage\Proxy\NativeProxy;
 /**
  * Test class for NativeProxy.
  *
+ * @group legacy
+ *
  * @author Drak <drak@xxxxxxxxxx>
  */
 class NativeProxyTest extends TestCase
diff --git a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php
index 68282535..0459a8ce 100644
--- a/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php
+++ b/vendor/symfony/http-foundation/Tests/Session/Storage/Proxy/SessionHandlerProxyTest.php
@@ -121,4 +121,37 @@ class SessionHandlerProxyTest extends TestCase
 
         $this->proxy->gc(86400);
     }
+
+    /**
+     * @requires PHPUnit 5.1
+     */
+    public function testValidateId()
+    {
+        $mock = $this->getMockBuilder(['SessionHandlerInterface', 'SessionUpdateTimestampHandlerInterface'])->getMock();
+        $mock->expects($this->once())
+            ->method('validateId');
+
+        $proxy = new SessionHandlerProxy($mock);
+        $proxy->validateId('id');
+
+        $this->assertTrue($this->proxy->validateId('id'));
+    }
+
+    /**
+     * @requires PHPUnit 5.1
+     */
+    public function testUpdateTimestamp()
+    {
+        $mock = $this->getMockBuilder(['SessionHandlerInterface', 'SessionUpdateTimestampHandlerInterface'])->getMock();
+        $mock->expects($this->once())
+            ->method('updateTimestamp');
+
+        $proxy = new SessionHandlerProxy($mock);
+        $proxy->updateTimestamp('id', 'data');
+
+        $this->mock->expects($this->once())
+            ->method('write');
+
+        $this->proxy->updateTimestamp('id', 'data');
+    }
 }
diff --git a/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php b/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php
index 1e35eb88..62dfc9bc 100644
--- a/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php
+++ b/vendor/symfony/http-foundation/Tests/StreamedResponseTest.php
@@ -19,7 +19,7 @@ class StreamedResponseTest extends TestCase
 {
     public function testConstructor()
     {
-        $response = new StreamedResponse(function () { echo 'foo'; }, 404, array('Content-Type' => 'text/plain'));
+        $response = new StreamedResponse(function () { echo 'foo'; }, 404, ['Content-Type' => 'text/plain']);
 
         $this->assertEquals(404, $response->getStatusCode());
         $this->assertEquals('text/plain', $response->headers->get('Content-Type'));
@@ -51,7 +51,7 @@ class StreamedResponseTest extends TestCase
 
     public function testPrepareWithHeadRequest()
     {
-        $response = new StreamedResponse(function () { echo 'foo'; }, 200, array('Content-Length' => '123'));
+        $response = new StreamedResponse(function () { echo 'foo'; }, 200, ['Content-Length' => '123']);
         $request = Request::create('/', 'HEAD');
 
         $response->prepare($request);
@@ -61,7 +61,7 @@ class StreamedResponseTest extends TestCase
 
     public function testPrepareWithCacheHeaders()
     {
-        $response = new StreamedResponse(function () { echo 'foo'; }, 200, array('Cache-Control' => 'max-age=600, public'));
+        $response = new StreamedResponse(function () { echo 'foo'; }, 200, ['Cache-Control' => 'max-age=600, public']);
         $request = Request::create('/', 'GET');
 
         $response->prepare($request);
@@ -112,4 +112,33 @@ class StreamedResponseTest extends TestCase
         $this->assertInstanceOf('Symfony\Component\HttpFoundation\StreamedResponse', $response);
         $this->assertEquals(204, $response->getStatusCode());
     }
+
+    public function testReturnThis()
+    {
+        $response = new StreamedResponse(function () {});
+        $this->assertInstanceOf('Symfony\Component\HttpFoundation\StreamedResponse', $response->sendContent());
+        $this->assertInstanceOf('Symfony\Component\HttpFoundation\StreamedResponse', $response->sendContent());
+
+        $response = new StreamedResponse(function () {});
+        $this->assertInstanceOf('Symfony\Component\HttpFoundation\StreamedResponse', $response->sendHeaders());
+        $this->assertInstanceOf('Symfony\Component\HttpFoundation\StreamedResponse', $response->sendHeaders());
+    }
+
+    public function testSetNotModified()
+    {
+        $response = new StreamedResponse(function () { echo 'foo'; });
+        $modified = $response->setNotModified();
+        $this->assertObjectHasAttribute('headers', $modified);
+        $this->assertObjectHasAttribute('content', $modified);
+        $this->assertObjectHasAttribute('version', $modified);
+        $this->assertObjectHasAttribute('statusCode', $modified);
+        $this->assertObjectHasAttribute('statusText', $modified);
+        $this->assertObjectHasAttribute('charset', $modified);
+        $this->assertEquals(304, $modified->getStatusCode());
+
+        ob_start();
+        $modified->sendContent();
+        $string = ob_get_clean();
+        $this->assertEmpty($string);
+    }
 }
diff --git a/vendor/symfony/http-foundation/composer.json b/vendor/symfony/http-foundation/composer.json
index a964975e..f6c6f2e6 100644
--- a/vendor/symfony/http-foundation/composer.json
+++ b/vendor/symfony/http-foundation/composer.json
@@ -17,10 +17,11 @@
     ],
     "require": {
         "php": "^5.5.9|>=7.0.8",
-        "symfony/polyfill-mbstring": "~1.1"
+        "symfony/polyfill-mbstring": "~1.1",
+        "symfony/polyfill-php70": "~1.6"
     },
     "require-dev": {
-        "symfony/expression-language": "~2.8|~3.0"
+        "symfony/expression-language": "~2.8|~3.0|~4.0"
     },
     "autoload": {
         "psr-4": { "Symfony\\Component\\HttpFoundation\\": "" },
@@ -31,7 +32,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "3.3-dev"
+            "dev-master": "3.4-dev"
         }
     }
 }
diff --git a/vendor/symfony/http-foundation/phpunit.xml.dist b/vendor/symfony/http-foundation/phpunit.xml.dist
index c1d61f8b..f57bc9e6 100644
--- a/vendor/symfony/http-foundation/phpunit.xml.dist
+++ b/vendor/symfony/http-foundation/phpunit.xml.dist
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd";
+         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.2/phpunit.xsd";
          backupGlobals="false"
          colors="true"
          bootstrap="vendor/autoload.php"
diff --git a/vendor/symfony/polyfill-ctype/Ctype.php b/vendor/symfony/polyfill-ctype/Ctype.php
new file mode 100644
index 00000000..58414dc7
--- /dev/null
+++ b/vendor/symfony/polyfill-ctype/Ctype.php
@@ -0,0 +1,227 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Polyfill\Ctype;
+
+/**
+ * Ctype implementation through regex.
+ *
+ * @internal
+ *
+ * @author Gert de Pagter <BackEndTea@xxxxxxxxx>
+ */
+final class Ctype
+{
+    /**
+     * Returns TRUE if every character in text is either a letter or a digit, FALSE otherwise.
+     *
+     * @see https://php.net/ctype-alnum
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_alnum($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z0-9]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in text is a letter, FALSE otherwise.
+     *
+     * @see https://php.net/ctype-alpha
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_alpha($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^A-Za-z]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in text is a control character from the current locale, FALSE otherwise.
+     *
+     * @see https://php.net/ctype-cntrl
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_cntrl($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^\x00-\x1f\x7f]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in the string text is a decimal digit, FALSE otherwise.
+     *
+     * @see https://php.net/ctype-digit
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_digit($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^0-9]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in text is printable and actually creates visible output (no white space), FALSE otherwise.
+     *
+     * @see https://php.net/ctype-graph
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_graph($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^!-~]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in text is a lowercase letter.
+     *
+     * @see https://php.net/ctype-lower
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_lower($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^a-z]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in text will actually create output (including blanks). Returns FALSE if text contains control characters or characters that do not have any output or control function at all.
+     *
+     * @see https://php.net/ctype-print
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_print($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^ -~]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in text is printable, but neither letter, digit or blank, FALSE otherwise.
+     *
+     * @see https://php.net/ctype-punct
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_punct($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^!-\/\:-@\[-`\{-~]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in text creates some sort of white space, FALSE otherwise. Besides the blank character this also includes tab, vertical tab, line feed, carriage return and form feed characters.
+     *
+     * @see https://php.net/ctype-space
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_space($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^\s]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in text is an uppercase letter.
+     *
+     * @see https://php.net/ctype-upper
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_upper($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^A-Z]/', $text);
+    }
+
+    /**
+     * Returns TRUE if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f] , FALSE otherwise.
+     *
+     * @see https://php.net/ctype-xdigit
+     *
+     * @param string|int $text
+     *
+     * @return bool
+     */
+    public static function ctype_xdigit($text)
+    {
+        $text = self::convert_int_to_char_for_ctype($text);
+
+        return \is_string($text) && '' !== $text && !preg_match('/[^A-Fa-f0-9]/', $text);
+    }
+
+    /**
+     * Converts integers to their char versions according to normal ctype behaviour, if needed.
+     *
+     * If an integer between -128 and 255 inclusive is provided,
+     * it is interpreted as the ASCII value of a single character
+     * (negative values have 256 added in order to allow characters in the Extended ASCII range).
+     * Any other integer is interpreted as a string containing the decimal digits of the integer.
+     *
+     * @param string|int $int
+     *
+     * @return mixed
+     */
+    private static function convert_int_to_char_for_ctype($int)
+    {
+        if (!\is_int($int)) {
+            return $int;
+        }
+
+        if ($int < -128 || $int > 255) {
+            return (string) $int;
+        }
+
+        if ($int < 0) {
+            $int += 256;
+        }
+
+        return \chr($int);
+    }
+}
diff --git a/vendor/symfony/polyfill-ctype/LICENSE b/vendor/symfony/polyfill-ctype/LICENSE
new file mode 100644
index 00000000..3f853aaf
--- /dev/null
+++ b/vendor/symfony/polyfill-ctype/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2018-2019 Fabien Potencier
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/symfony/polyfill-ctype/README.md b/vendor/symfony/polyfill-ctype/README.md
new file mode 100644
index 00000000..8add1ab0
--- /dev/null
+++ b/vendor/symfony/polyfill-ctype/README.md
@@ -0,0 +1,12 @@
+Symfony Polyfill / Ctype
+========================
+
+This component provides `ctype_*` functions to users who run php versions without the ctype extension.
+
+More information can be found in the
+[main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
+
+License
+=======
+
+This library is released under the [MIT license](LICENSE).
diff --git a/vendor/symfony/polyfill-ctype/bootstrap.php b/vendor/symfony/polyfill-ctype/bootstrap.php
new file mode 100644
index 00000000..14d1d0fa
--- /dev/null
+++ b/vendor/symfony/polyfill-ctype/bootstrap.php
@@ -0,0 +1,26 @@
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Symfony\Polyfill\Ctype as p;
+
+if (!function_exists('ctype_alnum')) {
+    function ctype_alnum($text) { return p\Ctype::ctype_alnum($text); }
+    function ctype_alpha($text) { return p\Ctype::ctype_alpha($text); }
+    function ctype_cntrl($text) { return p\Ctype::ctype_cntrl($text); }
+    function ctype_digit($text) { return p\Ctype::ctype_digit($text); }
+    function ctype_graph($text) { return p\Ctype::ctype_graph($text); }
+    function ctype_lower($text) { return p\Ctype::ctype_lower($text); }
+    function ctype_print($text) { return p\Ctype::ctype_print($text); }
+    function ctype_punct($text) { return p\Ctype::ctype_punct($text); }
+    function ctype_space($text) { return p\Ctype::ctype_space($text); }
+    function ctype_upper($text) { return p\Ctype::ctype_upper($text); }
+    function ctype_xdigit($text) { return p\Ctype::ctype_xdigit($text); }
+}
diff --git a/vendor/symfony/polyfill-ctype/composer.json b/vendor/symfony/polyfill-ctype/composer.json
new file mode 100644
index 00000000..c24e20ca
--- /dev/null
+++ b/vendor/symfony/polyfill-ctype/composer.json
@@ -0,0 +1,34 @@
+{
+    "name": "symfony/polyfill-ctype",
+    "type": "library",
+    "description": "Symfony polyfill for ctype functions",
+    "keywords": ["polyfill", "compatibility", "portable", "ctype"],
+    "homepage": "https://symfony.com";,
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Gert de Pagter",
+            "email": "BackEndTea@xxxxxxxxx"
+        },
+        {
+            "name": "Symfony Community",
+            "homepage": "https://symfony.com/contributors";
+        }
+    ],
+    "require": {
+        "php": ">=5.3.3"
+    },
+    "autoload": {
+        "psr-4": { "Symfony\\Polyfill\\Ctype\\": "" },
+        "files": [ "bootstrap.php" ]
+    },
+    "suggest": {
+        "ext-ctype": "For best performance"
+    },
+    "minimum-stability": "dev",
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.11-dev"
+        }
+    }
+}
diff --git a/vendor/symfony/polyfill-mbstring/LICENSE b/vendor/symfony/polyfill-mbstring/LICENSE
index 39fa189d..4cd8bdd3 100644
--- a/vendor/symfony/polyfill-mbstring/LICENSE
+++ b/vendor/symfony/polyfill-mbstring/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2014-2016 Fabien Potencier
+Copyright (c) 2015-2019 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/polyfill-mbstring/Mbstring.php b/vendor/symfony/polyfill-mbstring/Mbstring.php
index 97e8c9b4..a5e4a8fd 100644
--- a/vendor/symfony/polyfill-mbstring/Mbstring.php
+++ b/vendor/symfony/polyfill-mbstring/Mbstring.php
@@ -20,7 +20,10 @@ namespace Symfony\Polyfill\Mbstring;
  * - mb_convert_variables    - Convert character code in variable(s)
  * - mb_decode_mimeheader    - Decode string in MIME header field
  * - mb_encode_mimeheader    - Encode string for MIME header XXX NATIVE IMPLEMENTATION IS REALLY BUGGED
+ * - mb_decode_numericentity - Decode HTML numeric string reference to character
+ * - mb_encode_numericentity - Encode character to HTML numeric string reference
  * - mb_convert_case         - Perform case folding on a string
+ * - mb_detect_encoding      - Detect character encoding
  * - mb_get_info             - Get internal settings of mbstring
  * - mb_http_input           - Detect HTTP input character encoding
  * - mb_http_output          - Set/Get HTTP output character encoding
@@ -41,14 +44,12 @@ namespace Symfony\Polyfill\Mbstring;
  * - mb_strrchr              - Finds the last occurrence of a character in a string within another
  * - mb_strrichr             - Finds the last occurrence of a character in a string within another, case insensitive
  * - mb_strripos             - Finds position of last occurrence of a string within another, case insensitive
- * - mb_strstr               - Finds first occurrence of a string within anothers
+ * - mb_strstr               - Finds first occurrence of a string within another
  * - mb_strwidth             - Return width of string
  * - mb_substr_count         - Count the number of substring occurrences
  *
  * Not implemented:
  * - mb_convert_kana         - Convert "kana" one from another ("zen-kaku", "han-kaku" and more)
- * - mb_decode_numericentity - Decode HTML numeric string reference to character
- * - mb_encode_numericentity - Encode character to HTML numeric string reference
  * - mb_ereg_*               - Regular expression with multibyte support
  * - mb_parse_str            - Parse GET/POST/COOKIE data and set global variable
  * - mb_preferred_mime_name  - Get MIME charset string
@@ -71,13 +72,13 @@ final class Mbstring
     private static $language = 'neutral';
     private static $internalEncoding = 'UTF-8';
     private static $caseFold = array(
-        array('µ','Å¿',"\xCD\x85",'Ï?',"\xCF\x90","\xCF\x91","\xCF\x95","\xCF\x96","\xCF\xB0","\xCF\xB1","\xCF\xB5","\xE1\xBA\x9B","\xE1\xBE\xBE"),
-        array('μ','s','ι',       'Ï?','β',       'θ',       'Ï?',       'Ï?',       'κ',       'Ï?',       'ε',       "\xE1\xB9\xA1",'ι'),
+        array('µ', 'Å¿', "\xCD\x85", 'Ï?', "\xCF\x90", "\xCF\x91", "\xCF\x95", "\xCF\x96", "\xCF\xB0", "\xCF\xB1", "\xCF\xB5", "\xE1\xBA\x9B", "\xE1\xBE\xBE"),
+        array('μ', 's', 'ι',        'Ï?', 'β',        'θ',        'Ï?',        'Ï?',        'κ',        'Ï?',        'ε',        "\xE1\xB9\xA1", 'ι'),
     );
 
     public static function mb_convert_encoding($s, $toEncoding, $fromEncoding = null)
     {
-        if (is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
+        if (\is_array($fromEncoding) || false !== strpos($fromEncoding, ',')) {
             $fromEncoding = self::mb_detect_encoding($s, $fromEncoding);
         } else {
             $fromEncoding = self::getEncoding($fromEncoding);
@@ -137,9 +138,140 @@ final class Mbstring
         trigger_error('mb_encode_mimeheader() is bugged. Please use iconv_mime_encode() instead', E_USER_WARNING);
     }
 
+    public static function mb_decode_numericentity($s, $convmap, $encoding = null)
+    {
+        if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
+            trigger_error('mb_decode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+            return null;
+        }
+
+        if (!\is_array($convmap) || !$convmap) {
+            return false;
+        }
+
+        if (null !== $encoding && !\is_scalar($encoding)) {
+            trigger_error('mb_decode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+            return '';  // Instead of null (cf. mb_encode_numericentity).
+        }
+
+        $s = (string) $s;
+        if ('' === $s) {
+            return '';
+        }
+
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' === $encoding) {
+            $encoding = null;
+            if (!preg_match('//u', $s)) {
+                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
+            }
+        } else {
+            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+        }
+
+        $cnt = floor(\count($convmap) / 4) * 4;
+
+        for ($i = 0; $i < $cnt; $i += 4) {
+            // collector_decode_htmlnumericentity ignores $convmap[$i + 3]
+            $convmap[$i] += $convmap[$i + 2];
+            $convmap[$i + 1] += $convmap[$i + 2];
+        }
+
+        $s = preg_replace_callback('/&#(?:0*([0-9]+)|x0*([0-9a-fA-F]+))(?!&);?/', function (array $m) use ($cnt, $convmap) {
+            $c = isset($m[2]) ? (int) hexdec($m[2]) : $m[1];
+            for ($i = 0; $i < $cnt; $i += 4) {
+                if ($c >= $convmap[$i] && $c <= $convmap[$i + 1]) {
+                    return Mbstring::mb_chr($c - $convmap[$i + 2]);
+                }
+            }
+
+            return $m[0];
+        }, $s);
+
+        if (null === $encoding) {
+            return $s;
+        }
+
+        return iconv('UTF-8', $encoding.'//IGNORE', $s);
+    }
+
+    public static function mb_encode_numericentity($s, $convmap, $encoding = null, $is_hex = false)
+    {
+        if (null !== $s && !\is_scalar($s) && !(\is_object($s) && \method_exists($s, '__toString'))) {
+            trigger_error('mb_encode_numericentity() expects parameter 1 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+            return null;
+        }
+
+        if (!\is_array($convmap) || !$convmap) {
+            return false;
+        }
+
+        if (null !== $encoding && !\is_scalar($encoding)) {
+            trigger_error('mb_encode_numericentity() expects parameter 3 to be string, '.\gettype($s).' given', E_USER_WARNING);
+
+            return null;  // Instead of '' (cf. mb_decode_numericentity).
+        }
+
+        if (null !== $is_hex && !\is_scalar($is_hex)) {
+            trigger_error('mb_encode_numericentity() expects parameter 4 to be boolean, '.\gettype($s).' given', E_USER_WARNING);
+
+            return null;
+        }
+
+        $s = (string) $s;
+        if ('' === $s) {
+            return '';
+        }
+
+        $encoding = self::getEncoding($encoding);
+
+        if ('UTF-8' === $encoding) {
+            $encoding = null;
+            if (!preg_match('//u', $s)) {
+                $s = @iconv('UTF-8', 'UTF-8//IGNORE', $s);
+            }
+        } else {
+            $s = iconv($encoding, 'UTF-8//IGNORE', $s);
+        }
+
+        static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
+
+        $cnt = floor(\count($convmap) / 4) * 4;
+        $i = 0;
+        $len = \strlen($s);
+        $result = '';
+
+        while ($i < $len) {
+            $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
+            $uchr = substr($s, $i, $ulen);
+            $i += $ulen;
+            $c = self::mb_ord($uchr);
+
+            for ($j = 0; $j < $cnt; $j += 4) {
+                if ($c >= $convmap[$j] && $c <= $convmap[$j + 1]) {
+                    $cOffset = ($c + $convmap[$j + 2]) & $convmap[$j + 3];
+                    $result .= $is_hex ? sprintf('&#x%X;', $cOffset) : '&#'.$cOffset.';';
+                    continue 2;
+                }
+            }
+            $result .= $uchr;
+        }
+
+        if (null === $encoding) {
+            return $result;
+        }
+
+        return iconv('UTF-8', $encoding.'//IGNORE', $result);
+    }
+
     public static function mb_convert_case($s, $mode, $encoding = null)
     {
-        if ('' === $s .= '') {
+        $s = (string) $s;
+        if ('' === $s) {
             return '';
         }
 
@@ -155,8 +287,11 @@ final class Mbstring
         }
 
         if (MB_CASE_TITLE == $mode) {
-            $s = preg_replace_callback('/\b\p{Ll}/u', array(__CLASS__, 'title_case_upper'), $s);
-            $s = preg_replace_callback('/\B[\p{Lu}\p{Lt}]+/u', array(__CLASS__, 'title_case_lower'), $s);
+            static $titleRegexp = null;
+            if (null === $titleRegexp) {
+                $titleRegexp = self::getData('titleCaseRegexp');
+            }
+            $s = preg_replace_callback($titleRegexp, array(__CLASS__, 'title_case'), $s);
         } else {
             if (MB_CASE_UPPER == $mode) {
                 static $upper = null;
@@ -179,7 +314,7 @@ final class Mbstring
             static $ulenMask = array("\xC0" => 2, "\xD0" => 2, "\xE0" => 3, "\xF0" => 4);
 
             $i = 0;
-            $len = strlen($s);
+            $len = \strlen($s);
 
             while ($i < $len) {
                 $ulen = $s[$i] < "\x80" ? 1 : $ulenMask[$s[$i] & "\xF0"];
@@ -188,7 +323,7 @@ final class Mbstring
 
                 if (isset($map[$uchr])) {
                     $uchr = $map[$uchr];
-                    $nlen = strlen($uchr);
+                    $nlen = \strlen($uchr);
 
                     if ($nlen == $ulen) {
                         $nlen = $i;
@@ -198,7 +333,7 @@ final class Mbstring
                     } else {
                         $s = substr_replace($s, $uchr, $i - $ulen, $ulen);
                         $len += $nlen - $ulen;
-                        $i   += $nlen - $ulen;
+                        $i += $nlen - $ulen;
                     }
                 }
             }
@@ -278,7 +413,7 @@ final class Mbstring
         if (null === $encodingList) {
             $encodingList = self::$encodingList;
         } else {
-            if (!is_array($encodingList)) {
+            if (!\is_array($encodingList)) {
                 $encodingList = array_map('trim', explode(',', $encodingList));
             }
             $encodingList = array_map('strtoupper', $encodingList);
@@ -315,7 +450,7 @@ final class Mbstring
             return self::$encodingList;
         }
 
-        if (!is_array($encodingList)) {
+        if (!\is_array($encodingList)) {
             $encodingList = array_map('trim', explode(',', $encodingList));
         }
         $encodingList = array_map('strtoupper', $encodingList);
@@ -326,6 +461,7 @@ final class Mbstring
                     if (strncmp($enc, 'ISO-8859-', 9)) {
                         return false;
                     }
+                    // no break
                 case 'ASCII':
                 case 'UTF8':
                 case 'UTF-8':
@@ -341,7 +477,7 @@ final class Mbstring
     {
         $encoding = self::getEncoding($encoding);
         if ('CP850' === $encoding || 'ASCII' === $encoding) {
-            return strlen($s);
+            return \strlen($s);
         }
 
         return @iconv_strlen($s, $encoding);
@@ -354,7 +490,8 @@ final class Mbstring
             return strpos($haystack, $needle, $offset);
         }
 
-        if ('' === $needle .= '') {
+        $needle = (string) $needle;
+        if ('' === $needle) {
             trigger_error(__METHOD__.': Empty delimiter', E_USER_WARNING);
 
             return false;
@@ -428,7 +565,7 @@ final class Mbstring
             }
         }
 
-        return iconv_substr($s, $start, $length, $encoding).'';
+        return (string) iconv_substr($s, $start, $length, $encoding);
     }
 
     public static function mb_stripos($haystack, $needle, $offset = 0, $encoding = null)
@@ -552,13 +689,13 @@ final class Mbstring
     public static function mb_chr($code, $encoding = null)
     {
         if (0x80 > $code %= 0x200000) {
-            $s = chr($code);
+            $s = \chr($code);
         } elseif (0x800 > $code) {
-            $s = chr(0xC0 | $code >> 6).chr(0x80 | $code & 0x3F);
+            $s = \chr(0xC0 | $code >> 6).\chr(0x80 | $code & 0x3F);
         } elseif (0x10000 > $code) {
-            $s = chr(0xE0 | $code >> 12).chr(0x80 | $code >> 6 & 0x3F).chr(0x80 | $code & 0x3F);
+            $s = \chr(0xE0 | $code >> 12).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
         } else {
-            $s = chr(0xF0 | $code >> 18).chr(0x80 | $code >> 12 & 0x3F).chr(0x80 | $code >> 6 & 0x3F).chr(0x80 | $code & 0x3F);
+            $s = \chr(0xF0 | $code >> 18).\chr(0x80 | $code >> 12 & 0x3F).\chr(0x80 | $code >> 6 & 0x3F).\chr(0x80 | $code & 0x3F);
         }
 
         if ('UTF-8' !== $encoding = self::getEncoding($encoding)) {
@@ -574,6 +711,10 @@ final class Mbstring
             $s = mb_convert_encoding($s, 'UTF-8', $encoding);
         }
 
+        if (1 === \strlen($s)) {
+            return \ord($s);
+        }
+
         $code = ($s = unpack('C*', substr($s, 0, 4))) ? $s[1] : 0;
         if (0xF0 <= $code) {
             return (($code - 0xF0) << 18) + (($s[2] - 0x80) << 12) + (($s[3] - 0x80) << 6) + $s[4] - 0x80;
@@ -600,7 +741,7 @@ final class Mbstring
         return self::mb_substr($haystack, $pos, null, $encoding);
     }
 
-    private static function html_encoding_callback($m)
+    private static function html_encoding_callback(array $m)
     {
         $i = 1;
         $entities = '';
@@ -608,7 +749,7 @@ final class Mbstring
 
         while (isset($m[$i])) {
             if (0x80 > $m[$i]) {
-                $entities .= chr($m[$i++]);
+                $entities .= \chr($m[$i++]);
                 continue;
             }
             if (0xF0 <= $m[$i]) {
@@ -625,14 +766,9 @@ final class Mbstring
         return $entities;
     }
 
-    private static function title_case_lower($s)
-    {
-        return self::mb_convert_case($s[0], MB_CASE_LOWER, 'UTF-8');
-    }
-
-    private static function title_case_upper($s)
+    private static function title_case(array $s)
     {
-        return self::mb_convert_case($s[0], MB_CASE_UPPER, 'UTF-8');
+        return self::mb_convert_case($s[1], MB_CASE_UPPER, 'UTF-8').self::mb_convert_case($s[2], MB_CASE_LOWER, 'UTF-8');
     }
 
     private static function getData($file)
diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php
index 3ca16416..e6fbfa64 100644
--- a/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php
+++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/lowerCase.php
@@ -1,6 +1,6 @@
 <?php
 
-static $data = array (
+return array(
   'A' => 'a',
   'B' => 'b',
   'C' => 'c',
@@ -1094,8 +1094,3 @@ static $data = array (
   'ð?¢¾' => 'ð?£?',
   'ð?¢¿' => 'ð?£?',
 );
-
-$result =& $data;
-unset($data);
-
-return $result;
diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php
new file mode 100644
index 00000000..2a8f6e73
--- /dev/null
+++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/titleCaseRegexp.php
@@ -0,0 +1,5 @@
+<?php
+
+// from Case_Ignorable in https://unicode.org/Public/UNIDATA/DerivedCoreProperties.txt
+
+return '/(?<![\x{0027}\x{002E}\x{003A}\x{005E}\x{0060}\x{00A8}\x{00AD}\x{00AF}\x{00B4}\x{00B7}\x{00B8}\x{02B0}-\x{02C1}\x{02C2}-\x{02C5}\x{02C6}-\x{02D1}\x{02D2}-\x{02DF}\x{02E0}-\x{02E4}\x{02E5}-\x{02EB}\x{02EC}\x{02ED}\x{02EE}\x{02EF}-\x{02FF}\x{0300}-\x{036F}\x{0374}\x{0375}\x{037A}\x{0384}-\x{0385}\x{0387}\x{0483}-\x{0487}\x{0488}-\x{0489}\x{0559}\x{0591}-\x{05BD}\x{05BF}\x{05C1}-\x{05C2}\x{05C4}-\x{05C5}\x{05C7}\x{05F4}\x{0600}-\x{0605}\x{0610}-\x{061A}\x{061C}\x{0640}\x{064B}-\x{065F}\x{0670}\x{06D6}-\x{06DC}\x{06DD}\x{06DF}-\x{06E4}\x{06E5}-\x{06E6}\x{06E7}-\x{06E8}\x{06EA}-\x{06ED}\x{070F}\x{0711}\x{0730}-\x{074A}\x{07A6}-\x{07B0}\x{07EB}-\x{07F3}\x{07F4}-\x{07F5}\x{07FA}\x{07FD}\x{0816}-\x{0819}\x{081A}\x{081B}-\x{0823}\x{0824}\x{0825}-\x{0827}\x{0828}\x{0829}-\x{082D}\x{0859}-\x{085B}\x{08D3}-\x{08E1}\x{08E2}\x{08E3}-\x{0902}\x{093A}\x{093C}\x{0941}-\x{0948}\x{094D}\x{0951}-\x{0957}\x{0962}-\x{0963}\x{0971}\x{0981}\x{09BC}\x{09C1}-\x{09C4}\x{09CD}\x{09E2}-\x{09E3}\x{09FE}\
 x{0A01}-\x{0A02}\x{0A3C}\x{0A41}-\x{0A42}\x{0A47}-\x{0A48}\x{0A4B}-\x{0A4D}\x{0A51}\x{0A70}-\x{0A71}\x{0A75}\x{0A81}-\x{0A82}\x{0ABC}\x{0AC1}-\x{0AC5}\x{0AC7}-\x{0AC8}\x{0ACD}\x{0AE2}-\x{0AE3}\x{0AFA}-\x{0AFF}\x{0B01}\x{0B3C}\x{0B3F}\x{0B41}-\x{0B44}\x{0B4D}\x{0B56}\x{0B62}-\x{0B63}\x{0B82}\x{0BC0}\x{0BCD}\x{0C00}\x{0C04}\x{0C3E}-\x{0C40}\x{0C46}-\x{0C48}\x{0C4A}-\x{0C4D}\x{0C55}-\x{0C56}\x{0C62}-\x{0C63}\x{0C81}\x{0CBC}\x{0CBF}\x{0CC6}\x{0CCC}-\x{0CCD}\x{0CE2}-\x{0CE3}\x{0D00}-\x{0D01}\x{0D3B}-\x{0D3C}\x{0D41}-\x{0D44}\x{0D4D}\x{0D62}-\x{0D63}\x{0DCA}\x{0DD2}-\x{0DD4}\x{0DD6}\x{0E31}\x{0E34}-\x{0E3A}\x{0E46}\x{0E47}-\x{0E4E}\x{0EB1}\x{0EB4}-\x{0EB9}\x{0EBB}-\x{0EBC}\x{0EC6}\x{0EC8}-\x{0ECD}\x{0F18}-\x{0F19}\x{0F35}\x{0F37}\x{0F39}\x{0F71}-\x{0F7E}\x{0F80}-\x{0F84}\x{0F86}-\x{0F87}\x{0F8D}-\x{0F97}\x{0F99}-\x{0FBC}\x{0FC6}\x{102D}-\x{1030}\x{1032}-\x{1037}\x{1039}-\x{103A}\x{103D}-\x{103E}\x{1058}-\x{1059}\x{105E}-\x{1060}\x{1071}-\x{1074}\x{1082}\x{1085}-\x{1086}\x{108D}\x{109D}\x{
 10FC}\x{135D}-\x{135F}\x{1712}-\x{1714}\x{1732}-\x{1734}\x{1752}-\x{1753}\x{1772}-\x{1773}\x{17B4}-\x{17B5}\x{17B7}-\x{17BD}\x{17C6}\x{17C9}-\x{17D3}\x{17D7}\x{17DD}\x{180B}-\x{180D}\x{180E}\x{1843}\x{1885}-\x{1886}\x{18A9}\x{1920}-\x{1922}\x{1927}-\x{1928}\x{1932}\x{1939}-\x{193B}\x{1A17}-\x{1A18}\x{1A1B}\x{1A56}\x{1A58}-\x{1A5E}\x{1A60}\x{1A62}\x{1A65}-\x{1A6C}\x{1A73}-\x{1A7C}\x{1A7F}\x{1AA7}\x{1AB0}-\x{1ABD}\x{1ABE}\x{1B00}-\x{1B03}\x{1B34}\x{1B36}-\x{1B3A}\x{1B3C}\x{1B42}\x{1B6B}-\x{1B73}\x{1B80}-\x{1B81}\x{1BA2}-\x{1BA5}\x{1BA8}-\x{1BA9}\x{1BAB}-\x{1BAD}\x{1BE6}\x{1BE8}-\x{1BE9}\x{1BED}\x{1BEF}-\x{1BF1}\x{1C2C}-\x{1C33}\x{1C36}-\x{1C37}\x{1C78}-\x{1C7D}\x{1CD0}-\x{1CD2}\x{1CD4}-\x{1CE0}\x{1CE2}-\x{1CE8}\x{1CED}\x{1CF4}\x{1CF8}-\x{1CF9}\x{1D2C}-\x{1D6A}\x{1D78}\x{1D9B}-\x{1DBF}\x{1DC0}-\x{1DF9}\x{1DFB}-\x{1DFF}\x{1FBD}\x{1FBF}-\x{1FC1}\x{1FCD}-\x{1FCF}\x{1FDD}-\x{1FDF}\x{1FED}-\x{1FEF}\x{1FFD}-\x{1FFE}\x{200B}-\x{200F}\x{2018}\x{2019}\x{2024}\x{2027}\x{202A}-\x{202E}\x{2060}-\x
 {2064}\x{2066}-\x{206F}\x{2071}\x{207F}\x{2090}-\x{209C}\x{20D0}-\x{20DC}\x{20DD}-\x{20E0}\x{20E1}\x{20E2}-\x{20E4}\x{20E5}-\x{20F0}\x{2C7C}-\x{2C7D}\x{2CEF}-\x{2CF1}\x{2D6F}\x{2D7F}\x{2DE0}-\x{2DFF}\x{2E2F}\x{3005}\x{302A}-\x{302D}\x{3031}-\x{3035}\x{303B}\x{3099}-\x{309A}\x{309B}-\x{309C}\x{309D}-\x{309E}\x{30FC}-\x{30FE}\x{A015}\x{A4F8}-\x{A4FD}\x{A60C}\x{A66F}\x{A670}-\x{A672}\x{A674}-\x{A67D}\x{A67F}\x{A69C}-\x{A69D}\x{A69E}-\x{A69F}\x{A6F0}-\x{A6F1}\x{A700}-\x{A716}\x{A717}-\x{A71F}\x{A720}-\x{A721}\x{A770}\x{A788}\x{A789}-\x{A78A}\x{A7F8}-\x{A7F9}\x{A802}\x{A806}\x{A80B}\x{A825}-\x{A826}\x{A8C4}-\x{A8C5}\x{A8E0}-\x{A8F1}\x{A8FF}\x{A926}-\x{A92D}\x{A947}-\x{A951}\x{A980}-\x{A982}\x{A9B3}\x{A9B6}-\x{A9B9}\x{A9BC}\x{A9CF}\x{A9E5}\x{A9E6}\x{AA29}-\x{AA2E}\x{AA31}-\x{AA32}\x{AA35}-\x{AA36}\x{AA43}\x{AA4C}\x{AA70}\x{AA7C}\x{AAB0}\x{AAB2}-\x{AAB4}\x{AAB7}-\x{AAB8}\x{AABE}-\x{AABF}\x{AAC1}\x{AADD}\x{AAEC}-\x{AAED}\x{AAF3}-\x{AAF4}\x{AAF6}\x{AB5B}\x{AB5C}-\x{AB5F}\x{ABE5}\x{ABE8}\x{AB
 ED}\x{FB1E}\x{FBB2}-\x{FBC1}\x{FE00}-\x{FE0F}\x{FE13}\x{FE20}-\x{FE2F}\x{FE52}\x{FE55}\x{FEFF}\x{FF07}\x{FF0E}\x{FF1A}\x{FF3E}\x{FF40}\x{FF70}\x{FF9E}-\x{FF9F}\x{FFE3}\x{FFF9}-\x{FFFB}\x{101FD}\x{102E0}\x{10376}-\x{1037A}\x{10A01}-\x{10A03}\x{10A05}-\x{10A06}\x{10A0C}-\x{10A0F}\x{10A38}-\x{10A3A}\x{10A3F}\x{10AE5}-\x{10AE6}\x{10D24}-\x{10D27}\x{10F46}-\x{10F50}\x{11001}\x{11038}-\x{11046}\x{1107F}-\x{11081}\x{110B3}-\x{110B6}\x{110B9}-\x{110BA}\x{110BD}\x{110CD}\x{11100}-\x{11102}\x{11127}-\x{1112B}\x{1112D}-\x{11134}\x{11173}\x{11180}-\x{11181}\x{111B6}-\x{111BE}\x{111C9}-\x{111CC}\x{1122F}-\x{11231}\x{11234}\x{11236}-\x{11237}\x{1123E}\x{112DF}\x{112E3}-\x{112EA}\x{11300}-\x{11301}\x{1133B}-\x{1133C}\x{11340}\x{11366}-\x{1136C}\x{11370}-\x{11374}\x{11438}-\x{1143F}\x{11442}-\x{11444}\x{11446}\x{1145E}\x{114B3}-\x{114B8}\x{114BA}\x{114BF}-\x{114C0}\x{114C2}-\x{114C3}\x{115B2}-\x{115B5}\x{115BC}-\x{115BD}\x{115BF}-\x{115C0}\x{115DC}-\x{115DD}\x{11633}-\x{1163A}\x{1163D}\x{1163F}-\x{
 11640}\x{116AB}\x{116AD}\x{116B0}-\x{116B5}\x{116B7}\x{1171D}-\x{1171F}\x{11722}-\x{11725}\x{11727}-\x{1172B}\x{1182F}-\x{11837}\x{11839}-\x{1183A}\x{11A01}-\x{11A0A}\x{11A33}-\x{11A38}\x{11A3B}-\x{11A3E}\x{11A47}\x{11A51}-\x{11A56}\x{11A59}-\x{11A5B}\x{11A8A}-\x{11A96}\x{11A98}-\x{11A99}\x{11C30}-\x{11C36}\x{11C38}-\x{11C3D}\x{11C3F}\x{11C92}-\x{11CA7}\x{11CAA}-\x{11CB0}\x{11CB2}-\x{11CB3}\x{11CB5}-\x{11CB6}\x{11D31}-\x{11D36}\x{11D3A}\x{11D3C}-\x{11D3D}\x{11D3F}-\x{11D45}\x{11D47}\x{11D90}-\x{11D91}\x{11D95}\x{11D97}\x{11EF3}-\x{11EF4}\x{16AF0}-\x{16AF4}\x{16B30}-\x{16B36}\x{16B40}-\x{16B43}\x{16F8F}-\x{16F92}\x{16F93}-\x{16F9F}\x{16FE0}-\x{16FE1}\x{1BC9D}-\x{1BC9E}\x{1BCA0}-\x{1BCA3}\x{1D167}-\x{1D169}\x{1D173}-\x{1D17A}\x{1D17B}-\x{1D182}\x{1D185}-\x{1D18B}\x{1D1AA}-\x{1D1AD}\x{1D242}-\x{1D244}\x{1DA00}-\x{1DA36}\x{1DA3B}-\x{1DA6C}\x{1DA75}\x{1DA84}\x{1DA9B}-\x{1DA9F}\x{1DAA1}-\x{1DAAF}\x{1E000}-\x{1E006}\x{1E008}-\x{1E018}\x{1E01B}-\x{1E021}\x{1E023}-\x{1E024}\x{1E026}-\x{1E02A
 }\x{1E8D0}-\x{1E8D6}\x{1E944}-\x{1E94A}\x{1F3FB}-\x{1F3FF}\x{E0001}\x{E0020}-\x{E007F}\x{E0100}-\x{E01EF}])(\pL)(\pL*+)/u';
diff --git a/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php b/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php
index ec942212..b8103b2e 100644
--- a/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php
+++ b/vendor/symfony/polyfill-mbstring/Resources/unidata/upperCase.php
@@ -1,6 +1,6 @@
 <?php
 
-static $data = array (
+return array(
   'a' => 'A',
   'b' => 'B',
   'c' => 'C',
@@ -1102,8 +1102,3 @@ static $data = array (
   'ð?£?' => 'ð?¢¾',
   'ð?£?' => 'ð?¢¿',
 );
-
-$result =& $data;
-unset($data);
-
-return $result;
diff --git a/vendor/symfony/polyfill-mbstring/bootstrap.php b/vendor/symfony/polyfill-mbstring/bootstrap.php
index 33722910..2fdcc5a6 100644
--- a/vendor/symfony/polyfill-mbstring/bootstrap.php
+++ b/vendor/symfony/polyfill-mbstring/bootstrap.php
@@ -19,6 +19,8 @@ if (!function_exists('mb_strlen')) {
     function mb_convert_encoding($s, $to, $from = null) { return p\Mbstring::mb_convert_encoding($s, $to, $from); }
     function mb_decode_mimeheader($s) { return p\Mbstring::mb_decode_mimeheader($s); }
     function mb_encode_mimeheader($s, $charset = null, $transferEnc = null, $lf = null, $indent = null) { return p\Mbstring::mb_encode_mimeheader($s, $charset, $transferEnc, $lf, $indent); }
+    function mb_decode_numericentity($s, $convmap, $enc = null) { return p\Mbstring::mb_decode_numericentity($s, $convmap, $enc); }
+    function mb_encode_numericentity($s, $convmap, $enc = null, $is_hex = false) { return p\Mbstring::mb_encode_numericentity($s, $convmap, $enc, $is_hex); }
     function mb_convert_case($s, $mode, $enc = null) { return p\Mbstring::mb_convert_case($s, $mode, $enc); }
     function mb_internal_encoding($enc = null) { return p\Mbstring::mb_internal_encoding($enc); }
     function mb_language($lang = null) { return p\Mbstring::mb_language($lang); }
diff --git a/vendor/symfony/polyfill-mbstring/composer.json b/vendor/symfony/polyfill-mbstring/composer.json
index e184b210..0bce0878 100644
--- a/vendor/symfony/polyfill-mbstring/composer.json
+++ b/vendor/symfony/polyfill-mbstring/composer.json
@@ -28,7 +28,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "1.5-dev"
+            "dev-master": "1.11-dev"
         }
     }
 }
diff --git a/vendor/symfony/polyfill-php70/LICENSE b/vendor/symfony/polyfill-php70/LICENSE
index 39fa189d..4cd8bdd3 100644
--- a/vendor/symfony/polyfill-php70/LICENSE
+++ b/vendor/symfony/polyfill-php70/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2014-2016 Fabien Potencier
+Copyright (c) 2015-2019 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/polyfill-php70/Php70.php b/vendor/symfony/polyfill-php70/Php70.php
index e7ff0b26..7f1ad08a 100644
--- a/vendor/symfony/polyfill-php70/Php70.php
+++ b/vendor/symfony/polyfill-php70/Php70.php
@@ -36,7 +36,7 @@ final class Php70
     public static function preg_replace_callback_array(array $patterns, $subject, $limit = -1, &$count = 0)
     {
         $count = 0;
-        $result = ''.$subject;
+        $result = (string) $subject;
         if (0 === $limit = self::intArg($limit, __FUNCTION__, 3)) {
             return $result;
         }
@@ -53,20 +53,20 @@ final class Php70
     {
         static $handler;
         if (!$handler) {
-             $handler = function() { return false; };
+            $handler = function () { return false; };
         }
         set_error_handler($handler);
         @trigger_error('');
         restore_error_handler();
     }
 
-    public static function intArg($value, $caller, $pos)
+    private static function intArg($value, $caller, $pos)
     {
-        if (is_int($value)) {
+        if (\is_int($value)) {
             return $value;
         }
-        if (!is_numeric($value) || PHP_INT_MAX <= ($value += 0) || ~PHP_INT_MAX >= $value) {
-            throw new \TypeError(sprintf('%s() expects parameter %d to be integer, %s given', $caller, $pos, gettype($value)));
+        if (!\is_numeric($value) || PHP_INT_MAX <= ($value += 0) || ~PHP_INT_MAX >= $value) {
+            throw new \TypeError(sprintf('%s() expects parameter %d to be integer, %s given', $caller, $pos, \gettype($value)));
         }
 
         return (int) $value;
diff --git a/vendor/symfony/polyfill-php70/README.md b/vendor/symfony/polyfill-php70/README.md
index d3a3a532..04988c6f 100644
--- a/vendor/symfony/polyfill-php70/README.md
+++ b/vendor/symfony/polyfill-php70/README.md
@@ -1,13 +1,15 @@
 Symfony Polyfill / Php70
 ========================
 
-This component provides functions unavailable in releases prior to PHP 7.0:
+This component provides features unavailable in releases prior to PHP 7.0:
 
 - [`intdiv`](http://php.net/intdiv)
 - [`preg_replace_callback_array`](http://php.net/preg_replace_callback_array)
 - [`error_clear_last`](http://php.net/error_clear_last)
 - `random_bytes` and `random_int` (from [paragonie/random_compat](https://github.com/paragonie/random_compat))
 - [`*Error` throwable classes](http://php.net/Error)
+- [`PHP_INT_MIN`](http://php.net/manual/en/reserved.constants.php#constant.php-int-min)
+- `SessionUpdateTimestampHandlerInterface`
 
 More information can be found in the
 [main Polyfill README](https://github.com/symfony/polyfill/blob/master/README.md).
@@ -18,7 +20,7 @@ Compatibility notes
 To write portable code between PHP5 and PHP7, some care must be taken:
 - `\*Error` exceptions must be caught before `\Exception`;
 - after calling `error_clear_last()`, the result of `$e = error_get_last()` must be
-  verified using `isset($e['message'][0])` instead of `null === $e`.
+  verified using `isset($e['message'][0])` instead of `null !== $e`.
 
 License
 =======
diff --git a/vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php b/vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php
new file mode 100644
index 00000000..0cc02c8f
--- /dev/null
+++ b/vendor/symfony/polyfill-php70/Resources/stubs/SessionUpdateTimestampHandlerInterface.php
@@ -0,0 +1,23 @@
+<?php
+
+interface SessionUpdateTimestampHandlerInterface
+{
+    /**
+     * Checks if a session identifier already exists or not.
+     *
+     * @param string $key
+     *
+     * @return bool
+     */
+    public function validateId($key);
+
+    /**
+     * Updates the timestamp of a session when its data didn't change.
+     *
+     * @param string $key
+     * @param string $val
+     *
+     * @return bool
+     */
+    public function updateTimestamp($key, $val);
+}
diff --git a/vendor/symfony/polyfill-php70/composer.json b/vendor/symfony/polyfill-php70/composer.json
index 3ce13ad1..923f3095 100644
--- a/vendor/symfony/polyfill-php70/composer.json
+++ b/vendor/symfony/polyfill-php70/composer.json
@@ -17,7 +17,7 @@
     ],
     "require": {
         "php": ">=5.3.3",
-        "paragonie/random_compat": "~1.0|~2.0"
+        "paragonie/random_compat": "~1.0|~2.0|~9.99"
     },
     "autoload": {
         "psr-4": { "Symfony\\Polyfill\\Php70\\": "" },
@@ -27,7 +27,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "1.4-dev"
+            "dev-master": "1.11-dev"
         }
     }
 }
diff --git a/vendor/symfony/yaml/CHANGELOG.md b/vendor/symfony/yaml/CHANGELOG.md
index 77438a67..1bc5561b 100644
--- a/vendor/symfony/yaml/CHANGELOG.md
+++ b/vendor/symfony/yaml/CHANGELOG.md
@@ -1,6 +1,64 @@
 CHANGELOG
 =========
 
+4.3.0
+-----
+
+ * Using a mapping inside a multi-line string is deprecated and will throw a `ParseException` in 5.0.
+
+4.2.0
+-----
+
+ * added support for multiple files or directories in `LintCommand`
+
+4.0.0
+-----
+
+ * The behavior of the non-specific tag `!` is changed and now forces
+   non-evaluating your values.
+ * complex mappings will throw a `ParseException`
+ * support for the comma as a group separator for floats has been dropped, use
+   the underscore instead
+ * support for the `!!php/object` tag has been dropped, use the `!php/object`
+   tag instead
+ * duplicate mapping keys throw a `ParseException`
+ * non-string mapping keys throw a `ParseException`, use the `Yaml::PARSE_KEYS_AS_STRINGS`
+   flag to cast them to strings
+ * `%` at the beginning of an unquoted string throw a `ParseException`
+ * mappings with a colon (`:`) that is not followed by a whitespace throw a
+   `ParseException`
+ * the `Dumper::setIndentation()` method has been removed
+ * being able to pass boolean options to the `Yaml::parse()`, `Yaml::dump()`,
+   `Parser::parse()`, and `Dumper::dump()` methods to configure the behavior of
+   the parser and dumper is no longer supported, pass bitmask flags instead
+ * the constructor arguments of the `Parser` class have been removed
+ * the `Inline` class is internal and no longer part of the BC promise
+ * removed support for the `!str` tag, use the `!!str` tag instead
+ * added support for tagged scalars.
+
+   ```yml
+   Yaml::parse('!foo bar', Yaml::PARSE_CUSTOM_TAGS);
+   // returns TaggedValue('foo', 'bar');
+   ```
+
+3.4.0
+-----
+
+ * added support for parsing YAML files using the `Yaml::parseFile()` or `Parser::parseFile()` method
+
+ * the `Dumper`, `Parser`, and `Yaml` classes are marked as final
+
+ * Deprecated the `!php/object:` tag which will be replaced by the
+   `!php/object` tag (without the colon) in 4.0.
+
+ * Deprecated the `!php/const:` tag which will be replaced by the
+   `!php/const` tag (without the colon) in 4.0.
+
+ * Support for the `!str` tag is deprecated, use the `!!str` tag instead.
+
+ * Deprecated using the non-specific tag `!` as its behavior will change in 4.0.
+   It will force non-evaluating your values in 4.0. Use plain integers or `!!float` instead.
+
 3.3.0
 -----
 
@@ -95,7 +153,7 @@ CHANGELOG
  * Added support for customizing the dumped YAML string through an optional bit field:
 
    ```php
-   Yaml::dump(array('foo' => new A(), 'bar' => 1), 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE | Yaml::DUMP_OBJECT);
+   Yaml::dump(['foo' => new A(), 'bar' => 1], 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE | Yaml::DUMP_OBJECT);
    ```
 
 3.0.0
diff --git a/vendor/symfony/yaml/Command/LintCommand.php b/vendor/symfony/yaml/Command/LintCommand.php
index 271f2d84..77d449cb 100644
--- a/vendor/symfony/yaml/Command/LintCommand.php
+++ b/vendor/symfony/yaml/Command/LintCommand.php
@@ -12,6 +12,9 @@
 namespace Symfony\Component\Yaml\Command;
 
 use Symfony\Component\Console\Command\Command;
+use Symfony\Component\Console\Exception\InvalidArgumentException;
+use Symfony\Component\Console\Exception\RuntimeException;
+use Symfony\Component\Console\Input\InputArgument;
 use Symfony\Component\Console\Input\InputInterface;
 use Symfony\Component\Console\Input\InputOption;
 use Symfony\Component\Console\Output\OutputInterface;
@@ -28,13 +31,15 @@ use Symfony\Component\Yaml\Yaml;
  */
 class LintCommand extends Command
 {
+    protected static $defaultName = 'lint:yaml';
+
     private $parser;
     private $format;
     private $displayCorrectFiles;
     private $directoryIteratorProvider;
     private $isReadableProvider;
 
-    public function __construct($name = null, $directoryIteratorProvider = null, $isReadableProvider = null)
+    public function __construct(string $name = null, callable $directoryIteratorProvider = null, callable $isReadableProvider = null)
     {
         parent::__construct($name);
 
@@ -48,10 +53,10 @@ class LintCommand extends Command
     protected function configure()
     {
         $this
-            ->setName('lint:yaml')
             ->setDescription('Lints a file and outputs encountered errors')
-            ->addArgument('filename', null, 'A file or a directory or STDIN')
+            ->addArgument('filename', InputArgument::IS_ARRAY, 'A file or a directory or STDIN')
             ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt')
+            ->addOption('parse-tags', null, InputOption::VALUE_NONE, 'Parse custom tags')
             ->setHelp(<<<EOF
 The <info>%command.name%</info> command lints a YAML file and outputs to STDOUT
 the first encountered syntax error.
@@ -77,49 +82,52 @@ EOF
     protected function execute(InputInterface $input, OutputInterface $output)
     {
         $io = new SymfonyStyle($input, $output);
-        $filename = $input->getArgument('filename');
+        $filenames = (array) $input->getArgument('filename');
         $this->format = $input->getOption('format');
         $this->displayCorrectFiles = $output->isVerbose();
+        $flags = $input->getOption('parse-tags') ? Yaml::PARSE_CUSTOM_TAGS : 0;
 
-        if (!$filename) {
+        if (0 === \count($filenames)) {
             if (!$stdin = $this->getStdin()) {
-                throw new \RuntimeException('Please provide a filename or pipe file content to STDIN.');
+                throw new RuntimeException('Please provide a filename or pipe file content to STDIN.');
             }
 
-            return $this->display($io, array($this->validate($stdin)));
+            return $this->display($io, [$this->validate($stdin, $flags)]);
         }
 
-        if (!$this->isReadable($filename)) {
-            throw new \RuntimeException(sprintf('File or directory "%s" is not readable.', $filename));
-        }
+        $filesInfo = [];
+        foreach ($filenames as $filename) {
+            if (!$this->isReadable($filename)) {
+                throw new RuntimeException(sprintf('File or directory "%s" is not readable.', $filename));
+            }
 
-        $filesInfo = array();
-        foreach ($this->getFiles($filename) as $file) {
-            $filesInfo[] = $this->validate(file_get_contents($file), $file);
+            foreach ($this->getFiles($filename) as $file) {
+                $filesInfo[] = $this->validate(file_get_contents($file), $flags, $file);
+            }
         }
 
         return $this->display($io, $filesInfo);
     }
 
-    private function validate($content, $file = null)
+    private function validate($content, $flags, $file = null)
     {
         $prevErrorHandler = set_error_handler(function ($level, $message, $file, $line) use (&$prevErrorHandler) {
             if (E_USER_DEPRECATED === $level) {
-                throw new ParseException($message);
+                throw new ParseException($message, $this->getParser()->getRealCurrentLineNb() + 1);
             }
 
             return $prevErrorHandler ? $prevErrorHandler($level, $message, $file, $line) : false;
         });
 
         try {
-            $this->getParser()->parse($content, Yaml::PARSE_CONSTANT);
+            $this->getParser()->parse($content, Yaml::PARSE_CONSTANT | $flags);
         } catch (ParseException $e) {
-            return array('file' => $file, 'valid' => false, 'message' => $e->getMessage());
+            return ['file' => $file, 'line' => $e->getParsedLine(), 'valid' => false, 'message' => $e->getMessage()];
         } finally {
             restore_error_handler();
         }
 
-        return array('file' => $file, 'valid' => true);
+        return ['file' => $file, 'valid' => true];
     }
 
     private function display(SymfonyStyle $io, array $files)
@@ -130,13 +138,13 @@ EOF
             case 'json':
                 return $this->displayJson($io, $files);
             default:
-                throw new \InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format));
+                throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $this->format));
         }
     }
 
     private function displayTxt(SymfonyStyle $io, array $filesInfo)
     {
-        $countFiles = count($filesInfo);
+        $countFiles = \count($filesInfo);
         $erroredFiles = 0;
 
         foreach ($filesInfo as $info) {
@@ -149,7 +157,7 @@ EOF
             }
         }
 
-        if ($erroredFiles === 0) {
+        if (0 === $erroredFiles) {
             $io->success(sprintf('All %d YAML files contain valid syntax.', $countFiles));
         } else {
             $io->warning(sprintf('%d YAML files have valid syntax and %d contain errors.', $countFiles - $erroredFiles, $erroredFiles));
@@ -183,7 +191,7 @@ EOF
         }
 
         foreach ($this->getDirectoryIterator($fileOrDirectory) as $file) {
-            if (!in_array($file->getExtension(), array('yml', 'yaml'))) {
+            if (!\in_array($file->getExtension(), ['yml', 'yaml'])) {
                 continue;
             }
 
@@ -224,7 +232,7 @@ EOF
         };
 
         if (null !== $this->directoryIteratorProvider) {
-            return call_user_func($this->directoryIteratorProvider, $directory, $default);
+            return ($this->directoryIteratorProvider)($directory, $default);
         }
 
         return $default($directory);
@@ -237,7 +245,7 @@ EOF
         };
 
         if (null !== $this->isReadableProvider) {
-            return call_user_func($this->isReadableProvider, $fileOrDirectory, $default);
+            return ($this->isReadableProvider)($fileOrDirectory, $default);
         }
 
         return $default($fileOrDirectory);
diff --git a/vendor/symfony/yaml/Dumper.php b/vendor/symfony/yaml/Dumper.php
index e26a65a5..fdd34b61 100644
--- a/vendor/symfony/yaml/Dumper.php
+++ b/vendor/symfony/yaml/Dumper.php
@@ -15,6 +15,8 @@ namespace Symfony\Component\Yaml;
  * Dumper dumps PHP variables to YAML strings.
  *
  * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @final
  */
 class Dumper
 {
@@ -25,10 +27,7 @@ class Dumper
      */
     protected $indentation;
 
-    /**
-     * @param int $indentation
-     */
-    public function __construct($indentation = 4)
+    public function __construct(int $indentation = 4)
     {
         if ($indentation < 1) {
             throw new \InvalidArgumentException('The indentation must be greater than zero.');
@@ -38,20 +37,6 @@ class Dumper
     }
 
     /**
-     * Sets the indentation.
-     *
-     * @param int $num The amount of spaces to use for indentation of nested nodes
-     *
-     * @deprecated since version 3.1, to be removed in 4.0. Pass the indentation to the constructor instead.
-     */
-    public function setIndentation($num)
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 3.1 and will be removed in 4.0. Pass the indentation to the constructor instead.', E_USER_DEPRECATED);
-
-        $this->indentation = (int) $num;
-    }
-
-    /**
      * Dumps a PHP value to YAML.
      *
      * @param mixed $input  The PHP value
@@ -61,26 +46,8 @@ class Dumper
      *
      * @return string The YAML representation of the PHP value
      */
-    public function dump($input, $inline = 0, $indent = 0, $flags = 0)
+    public function dump($input, int $inline = 0, int $indent = 0, int $flags = 0): string
     {
-        if (is_bool($flags)) {
-            @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED);
-
-            if ($flags) {
-                $flags = Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE;
-            } else {
-                $flags = 0;
-            }
-        }
-
-        if (func_num_args() >= 5) {
-            @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::DUMP_OBJECT flag instead.', E_USER_DEPRECATED);
-
-            if (func_get_arg(4)) {
-                $flags |= Yaml::DUMP_OBJECT;
-            }
-        }
-
         $output = '';
         $prefix = $indent ? str_repeat(' ', $indent) : '';
         $dumpObjectAsInlineMap = true;
@@ -89,14 +56,17 @@ class Dumper
             $dumpObjectAsInlineMap = empty((array) $input);
         }
 
-        if ($inline <= 0 || (!is_array($input) && $dumpObjectAsInlineMap) || empty($input)) {
+        if ($inline <= 0 || (!\is_array($input) && $dumpObjectAsInlineMap) || empty($input)) {
             $output .= $prefix.Inline::dump($input, $flags);
         } else {
             $dumpAsMap = Inline::isHash($input);
 
             foreach ($input as $key => $value) {
-                if ($inline >= 1 && Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && is_string($value) && false !== strpos($value, "\n")) {
-                    $output .= sprintf("%s%s%s |\n", $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', '');
+                if ($inline >= 1 && Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK & $flags && \is_string($value) && false !== strpos($value, "\n") && false === strpos($value, "\r\n")) {
+                    // If the first line starts with a space character, the spec requires a blockIndicationIndicator
+                    // http://www.yaml.org/spec/1.2/spec.html#id2793979
+                    $blockIndentationIndicator = (' ' === substr($value, 0, 1)) ? (string) $this->indentation : '';
+                    $output .= sprintf("%s%s%s |%s\n", $prefix, $dumpAsMap ? Inline::dump($key, $flags).':' : '-', '', $blockIndentationIndicator);
 
                     foreach (preg_split('/\n|\r\n/', $value) as $row) {
                         $output .= sprintf("%s%s%s\n", $prefix, str_repeat(' ', $this->indentation), $row);
@@ -111,7 +81,7 @@ class Dumper
                     $dumpObjectAsInlineMap = empty((array) $value);
                 }
 
-                $willBeInlined = $inline - 1 <= 0 || !is_array($value) && $dumpObjectAsInlineMap || empty($value);
+                $willBeInlined = $inline - 1 <= 0 || !\is_array($value) && $dumpObjectAsInlineMap || empty($value);
 
                 $output .= sprintf('%s%s%s%s',
                     $prefix,
diff --git a/vendor/symfony/yaml/Escaper.php b/vendor/symfony/yaml/Escaper.php
index 94bb3924..afff1683 100644
--- a/vendor/symfony/yaml/Escaper.php
+++ b/vendor/symfony/yaml/Escaper.php
@@ -28,20 +28,20 @@ class Escaper
     // first to ensure proper escaping because str_replace operates iteratively
     // on the input arrays. This ordering of the characters avoids the use of strtr,
     // which performs more slowly.
-    private static $escapees = array('\\', '\\\\', '\\"', '"',
+    private static $escapees = ['\\', '\\\\', '\\"', '"',
                                      "\x00",  "\x01",  "\x02",  "\x03",  "\x04",  "\x05",  "\x06",  "\x07",
                                      "\x08",  "\x09",  "\x0a",  "\x0b",  "\x0c",  "\x0d",  "\x0e",  "\x0f",
                                      "\x10",  "\x11",  "\x12",  "\x13",  "\x14",  "\x15",  "\x16",  "\x17",
                                      "\x18",  "\x19",  "\x1a",  "\x1b",  "\x1c",  "\x1d",  "\x1e",  "\x1f",
                                      "\xc2\x85", "\xc2\xa0", "\xe2\x80\xa8", "\xe2\x80\xa9",
-                               );
-    private static $escaped = array('\\\\', '\\"', '\\\\', '\\"',
+                               ];
+    private static $escaped = ['\\\\', '\\"', '\\\\', '\\"',
                                      '\\0',   '\\x01', '\\x02', '\\x03', '\\x04', '\\x05', '\\x06', '\\a',
                                      '\\b',   '\\t',   '\\n',   '\\v',   '\\f',   '\\r',   '\\x0e', '\\x0f',
                                      '\\x10', '\\x11', '\\x12', '\\x13', '\\x14', '\\x15', '\\x16', '\\x17',
                                      '\\x18', '\\x19', '\\x1a', '\\e',   '\\x1c', '\\x1d', '\\x1e', '\\x1f',
                                      '\\N', '\\_', '\\L', '\\P',
-                              );
+                              ];
 
     /**
      * Determines if a PHP value would require double quoting in YAML.
@@ -50,7 +50,7 @@ class Escaper
      *
      * @return bool True if the value would require double quotes
      */
-    public static function requiresDoubleQuoting($value)
+    public static function requiresDoubleQuoting(string $value): bool
     {
         return 0 < preg_match('/'.self::REGEX_CHARACTER_TO_ESCAPE.'/u', $value);
     }
@@ -62,7 +62,7 @@ class Escaper
      *
      * @return string The quoted, escaped string
      */
-    public static function escapeWithDoubleQuotes($value)
+    public static function escapeWithDoubleQuotes(string $value): string
     {
         return sprintf('"%s"', str_replace(self::$escapees, self::$escaped, $value));
     }
@@ -74,11 +74,11 @@ class Escaper
      *
      * @return bool True if the value would require single quotes
      */
-    public static function requiresSingleQuoting($value)
+    public static function requiresSingleQuoting(string $value): bool
     {
         // Determines if a PHP value is entirely composed of a value that would
         // require single quoting in YAML.
-        if (in_array(strtolower($value), array('null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'))) {
+        if (\in_array(strtolower($value), ['null', '~', 'true', 'false', 'y', 'n', 'yes', 'no', 'on', 'off'])) {
             return true;
         }
 
@@ -94,7 +94,7 @@ class Escaper
      *
      * @return string The quoted, escaped string
      */
-    public static function escapeWithSingleQuotes($value)
+    public static function escapeWithSingleQuotes(string $value): string
     {
         return sprintf("'%s'", str_replace('\'', '\'\'', $value));
     }
diff --git a/vendor/symfony/yaml/Exception/ExceptionInterface.php b/vendor/symfony/yaml/Exception/ExceptionInterface.php
index ad850eea..90913168 100644
--- a/vendor/symfony/yaml/Exception/ExceptionInterface.php
+++ b/vendor/symfony/yaml/Exception/ExceptionInterface.php
@@ -16,6 +16,6 @@ namespace Symfony\Component\Yaml\Exception;
  *
  * @author Fabien Potencier <fabien@xxxxxxxxxxx>
  */
-interface ExceptionInterface
+interface ExceptionInterface extends \Throwable
 {
 }
diff --git a/vendor/symfony/yaml/Exception/ParseException.php b/vendor/symfony/yaml/Exception/ParseException.php
index 3b38b643..95efe68f 100644
--- a/vendor/symfony/yaml/Exception/ParseException.php
+++ b/vendor/symfony/yaml/Exception/ParseException.php
@@ -24,15 +24,13 @@ class ParseException extends RuntimeException
     private $rawMessage;
 
     /**
-     * Constructor.
-     *
      * @param string          $message    The error message
      * @param int             $parsedLine The line where the error occurred
      * @param string|null     $snippet    The snippet of code near the problem
      * @param string|null     $parsedFile The file name where the error occurred
      * @param \Exception|null $previous   The previous exception
      */
-    public function __construct($message, $parsedLine = -1, $snippet = null, $parsedFile = null, \Exception $previous = null)
+    public function __construct(string $message, int $parsedLine = -1, string $snippet = null, string $parsedFile = null, \Exception $previous = null)
     {
         $this->parsedFile = $parsedFile;
         $this->parsedLine = $parsedLine;
diff --git a/vendor/symfony/yaml/Inline.php b/vendor/symfony/yaml/Inline.php
index 51242bbf..4b12b9b1 100644
--- a/vendor/symfony/yaml/Inline.php
+++ b/vendor/symfony/yaml/Inline.php
@@ -11,8 +11,8 @@
 
 namespace Symfony\Component\Yaml;
 
-use Symfony\Component\Yaml\Exception\ParseException;
 use Symfony\Component\Yaml\Exception\DumpException;
+use Symfony\Component\Yaml\Exception\ParseException;
 use Symfony\Component\Yaml\Tag\TaggedValue;
 
 /**
@@ -26,7 +26,8 @@ class Inline
 {
     const REGEX_QUOTED_STRING = '(?:"([^"\\\\]*+(?:\\\\.[^"\\\\]*+)*+)"|\'([^\']*+(?:\'\'[^\']*+)*+)\')';
 
-    public static $parsedLineNumber;
+    public static $parsedLineNumber = -1;
+    public static $parsedFilename;
 
     private static $exceptionOnInvalidType = false;
     private static $objectSupport = false;
@@ -34,6 +35,24 @@ class Inline
     private static $constantSupport = false;
 
     /**
+     * @param int         $flags
+     * @param int|null    $parsedLineNumber
+     * @param string|null $parsedFilename
+     */
+    public static function initialize($flags, $parsedLineNumber = null, $parsedFilename = null)
+    {
+        self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags);
+        self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags);
+        self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags);
+        self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags);
+        self::$parsedFilename = $parsedFilename;
+
+        if (null !== $parsedLineNumber) {
+            self::$parsedLineNumber = $parsedLineNumber;
+        }
+    }
+
+    /**
      * Converts a YAML string to a PHP value.
      *
      * @param string $value      A YAML string
@@ -44,44 +63,9 @@ class Inline
      *
      * @throws ParseException
      */
-    public static function parse($value, $flags = 0, $references = array())
+    public static function parse(string $value = null, int $flags = 0, array $references = [])
     {
-        if (is_bool($flags)) {
-            @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED);
-
-            if ($flags) {
-                $flags = Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE;
-            } else {
-                $flags = 0;
-            }
-        }
-
-        if (func_num_args() >= 3 && !is_array($references)) {
-            @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT flag instead.', E_USER_DEPRECATED);
-
-            if ($references) {
-                $flags |= Yaml::PARSE_OBJECT;
-            }
-
-            if (func_num_args() >= 4) {
-                @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', E_USER_DEPRECATED);
-
-                if (func_get_arg(3)) {
-                    $flags |= Yaml::PARSE_OBJECT_FOR_MAP;
-                }
-            }
-
-            if (func_num_args() >= 5) {
-                $references = func_get_arg(4);
-            } else {
-                $references = array();
-            }
-        }
-
-        self::$exceptionOnInvalidType = (bool) (Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE & $flags);
-        self::$objectSupport = (bool) (Yaml::PARSE_OBJECT & $flags);
-        self::$objectForMap = (bool) (Yaml::PARSE_OBJECT_FOR_MAP & $flags);
-        self::$constantSupport = (bool) (Yaml::PARSE_CONSTANT & $flags);
+        self::initialize($flags);
 
         $value = trim($value);
 
@@ -94,35 +78,37 @@ class Inline
             mb_internal_encoding('ASCII');
         }
 
-        $i = 0;
-        $tag = self::parseTag($value, $i, $flags);
-        switch ($value[$i]) {
-            case '[':
-                $result = self::parseSequence($value, $flags, $i, $references);
-                ++$i;
-                break;
-            case '{':
-                $result = self::parseMapping($value, $flags, $i, $references);
-                ++$i;
-                break;
-            default:
-                $result = self::parseScalar($value, $flags, null, $i, null === $tag, $references);
-        }
+        try {
+            $i = 0;
+            $tag = self::parseTag($value, $i, $flags);
+            switch ($value[$i]) {
+                case '[':
+                    $result = self::parseSequence($value, $flags, $i, $references);
+                    ++$i;
+                    break;
+                case '{':
+                    $result = self::parseMapping($value, $flags, $i, $references);
+                    ++$i;
+                    break;
+                default:
+                    $result = self::parseScalar($value, $flags, null, $i, null === $tag, $references);
+            }
 
-        if (null !== $tag) {
-            return new TaggedValue($tag, $result);
-        }
+            if (null !== $tag && '' !== $tag) {
+                return new TaggedValue($tag, $result);
+            }
 
-        // some comments are allowed at the end
-        if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) {
-            throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)));
-        }
+            // some comments are allowed at the end
+            if (preg_replace('/\s+#.*$/A', '', substr($value, $i))) {
+                throw new ParseException(sprintf('Unexpected characters near "%s".', substr($value, $i)), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
+            }
 
-        if (isset($mbEncoding)) {
-            mb_internal_encoding($mbEncoding);
+            return $result;
+        } finally {
+            if (isset($mbEncoding)) {
+                mb_internal_encoding($mbEncoding);
+            }
         }
-
-        return $result;
     }
 
     /**
@@ -135,28 +121,10 @@ class Inline
      *
      * @throws DumpException When trying to dump PHP resource
      */
-    public static function dump($value, $flags = 0)
+    public static function dump($value, int $flags = 0): string
     {
-        if (is_bool($flags)) {
-            @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED);
-
-            if ($flags) {
-                $flags = Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE;
-            } else {
-                $flags = 0;
-            }
-        }
-
-        if (func_num_args() >= 3) {
-            @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::DUMP_OBJECT flag instead.', E_USER_DEPRECATED);
-
-            if (func_get_arg(2)) {
-                $flags |= Yaml::DUMP_OBJECT;
-            }
-        }
-
         switch (true) {
-            case is_resource($value):
+            case \is_resource($value):
                 if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
                     throw new DumpException(sprintf('Unable to dump PHP resources in a YAML file ("%s").', get_resource_type($value)));
                 }
@@ -164,17 +132,23 @@ class Inline
                 return 'null';
             case $value instanceof \DateTimeInterface:
                 return $value->format('c');
-            case is_object($value):
+            case \is_object($value):
                 if ($value instanceof TaggedValue) {
                     return '!'.$value->getTag().' '.self::dump($value->getValue(), $flags);
                 }
 
                 if (Yaml::DUMP_OBJECT & $flags) {
-                    return '!php/object:'.serialize($value);
+                    return '!php/object '.self::dump(serialize($value));
                 }
 
                 if (Yaml::DUMP_OBJECT_AS_MAP & $flags && ($value instanceof \stdClass || $value instanceof \ArrayObject)) {
-                    return self::dumpArray($value, $flags & ~Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
+                    $output = [];
+
+                    foreach ($value as $key => $val) {
+                        $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags));
+                    }
+
+                    return sprintf('{ %s }', implode(', ', $output));
                 }
 
                 if (Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE & $flags) {
@@ -182,7 +156,7 @@ class Inline
                 }
 
                 return 'null';
-            case is_array($value):
+            case \is_array($value):
                 return self::dumpArray($value, $flags);
             case null === $value:
                 return 'null';
@@ -191,13 +165,13 @@ class Inline
             case false === $value:
                 return 'false';
             case ctype_digit($value):
-                return is_string($value) ? "'$value'" : (int) $value;
+                return \is_string($value) ? "'$value'" : (int) $value;
             case is_numeric($value):
                 $locale = setlocale(LC_NUMERIC, 0);
                 if (false !== $locale) {
                     setlocale(LC_NUMERIC, 'C');
                 }
-                if (is_float($value)) {
+                if (\is_float($value)) {
                     $repr = (string) $value;
                     if (is_infinite($value)) {
                         $repr = str_ireplace('INF', '.Inf', $repr);
@@ -206,7 +180,7 @@ class Inline
                         $repr = '!!float '.$repr;
                     }
                 } else {
-                    $repr = is_string($value) ? "'$value'" : (string) $value;
+                    $repr = \is_string($value) ? "'$value'" : (string) $value;
                 }
                 if (false !== $locale) {
                     setlocale(LC_NUMERIC, $locale);
@@ -232,13 +206,11 @@ class Inline
     /**
      * Check if given array is hash or just normal indexed array.
      *
-     * @internal
-     *
      * @param array|\ArrayObject|\stdClass $value The PHP array or array-like object to check
      *
      * @return bool true if value is hash array, false otherwise
      */
-    public static function isHash($value)
+    public static function isHash($value): bool
     {
         if ($value instanceof \stdClass || $value instanceof \ArrayObject) {
             return true;
@@ -263,11 +235,11 @@ class Inline
      *
      * @return string The YAML string representing the PHP array
      */
-    private static function dumpArray($value, $flags)
+    private static function dumpArray(array $value, int $flags): string
     {
         // array
         if (($value || Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE & $flags) && !self::isHash($value)) {
-            $output = array();
+            $output = [];
             foreach ($value as $val) {
                 $output[] = self::dump($val, $flags);
             }
@@ -276,7 +248,7 @@ class Inline
         }
 
         // hash
-        $output = array();
+        $output = [];
         foreach ($value as $key => $val) {
             $output[] = sprintf('%s: %s', self::dump($key, $flags), self::dump($val, $flags));
         }
@@ -287,55 +259,46 @@ class Inline
     /**
      * Parses a YAML scalar.
      *
-     * @param string   $scalar
-     * @param int      $flags
-     * @param string[] $delimiters
-     * @param int      &$i
-     * @param bool     $evaluate
-     * @param array    $references
-     *
-     * @return string
+     * @return mixed
      *
      * @throws ParseException When malformed inline YAML string is parsed
-     *
-     * @internal
      */
-    public static function parseScalar($scalar, $flags = 0, $delimiters = null, &$i = 0, $evaluate = true, $references = array(), $legacyOmittedKeySupport = false)
+    public static function parseScalar(string $scalar, int $flags = 0, array $delimiters = null, int &$i = 0, bool $evaluate = true, array $references = [])
     {
-        if (in_array($scalar[$i], array('"', "'"))) {
+        if (\in_array($scalar[$i], ['"', "'"])) {
             // quoted scalar
             $output = self::parseQuotedScalar($scalar, $i);
 
             if (null !== $delimiters) {
                 $tmp = ltrim(substr($scalar, $i), ' ');
-                if (!in_array($tmp[0], $delimiters)) {
-                    throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)));
+                if ('' === $tmp) {
+                    throw new ParseException(sprintf('Unexpected end of line, expected one of "%s".', implode('', $delimiters)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
+                }
+                if (!\in_array($tmp[0], $delimiters)) {
+                    throw new ParseException(sprintf('Unexpected characters (%s).', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                 }
             }
         } else {
             // "normal" string
             if (!$delimiters) {
                 $output = substr($scalar, $i);
-                $i += strlen($output);
+                $i += \strlen($output);
 
                 // remove comments
                 if (Parser::preg_match('/[ \t]+#/', $output, $match, PREG_OFFSET_CAPTURE)) {
                     $output = substr($output, 0, $match[0][1]);
                 }
-            } elseif (Parser::preg_match('/^(.'.($legacyOmittedKeySupport ? '+' : '*').'?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
+            } elseif (Parser::preg_match('/^(.*?)('.implode('|', $delimiters).')/', substr($scalar, $i), $match)) {
                 $output = $match[1];
-                $i += strlen($output);
+                $i += \strlen($output);
+                $output = trim($output);
             } else {
-                throw new ParseException(sprintf('Malformed inline YAML string: %s.', $scalar));
+                throw new ParseException(sprintf('Malformed inline YAML string: %s.', $scalar), self::$parsedLineNumber + 1, null, self::$parsedFilename);
             }
 
             // a non-quoted string cannot start with @ or ` (reserved) nor with a scalar indicator (| or >)
-            if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0])) {
-                throw new ParseException(sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]));
-            }
-
-            if ($output && '%' === $output[0]) {
-                @trigger_error(sprintf('Not quoting the scalar "%s" starting with the "%%" indicator character is deprecated since Symfony 3.1 and will throw a ParseException in 4.0.', $output), E_USER_DEPRECATED);
+            if ($output && ('@' === $output[0] || '`' === $output[0] || '|' === $output[0] || '>' === $output[0] || '%' === $output[0])) {
+                throw new ParseException(sprintf('The reserved indicator "%s" cannot start a plain scalar; you need to quote the scalar.', $output[0]), self::$parsedLineNumber + 1, $output, self::$parsedFilename);
             }
 
             if ($evaluate) {
@@ -349,20 +312,15 @@ class Inline
     /**
      * Parses a YAML quoted scalar.
      *
-     * @param string $scalar
-     * @param int    &$i
-     *
-     * @return string
-     *
      * @throws ParseException When malformed inline YAML string is parsed
      */
-    private static function parseQuotedScalar($scalar, &$i)
+    private static function parseQuotedScalar(string $scalar, int &$i): string
     {
         if (!Parser::preg_match('/'.self::REGEX_QUOTED_STRING.'/Au', substr($scalar, $i), $match)) {
-            throw new ParseException(sprintf('Malformed inline YAML string: %s.', substr($scalar, $i)));
+            throw new ParseException(sprintf('Malformed inline YAML string: %s.', substr($scalar, $i)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
         }
 
-        $output = substr($match[0], 1, strlen($match[0]) - 2);
+        $output = substr($match[0], 1, \strlen($match[0]) - 2);
 
         $unescaper = new Unescaper();
         if ('"' == $scalar[$i]) {
@@ -371,7 +329,7 @@ class Inline
             $output = $unescaper->unescapeSingleQuotedString($output);
         }
 
-        $i += strlen($match[0]);
+        $i += \strlen($match[0]);
 
         return $output;
     }
@@ -379,19 +337,12 @@ class Inline
     /**
      * Parses a YAML sequence.
      *
-     * @param string $sequence
-     * @param int    $flags
-     * @param int    &$i
-     * @param array  $references
-     *
-     * @return array
-     *
      * @throws ParseException When malformed inline YAML string is parsed
      */
-    private static function parseSequence($sequence, $flags, &$i = 0, $references = array())
+    private static function parseSequence(string $sequence, int $flags, int &$i = 0, array $references = []): array
     {
-        $output = array();
-        $len = strlen($sequence);
+        $output = [];
+        $len = \strlen($sequence);
         ++$i;
 
         // [foo, bar, ...]
@@ -416,11 +367,11 @@ class Inline
                     $value = self::parseMapping($sequence, $flags, $i, $references);
                     break;
                 default:
-                    $isQuoted = in_array($sequence[$i], array('"', "'"));
-                    $value = self::parseScalar($sequence, $flags, array(',', ']'), $i, null === $tag, $references);
+                    $isQuoted = \in_array($sequence[$i], ['"', "'"]);
+                    $value = self::parseScalar($sequence, $flags, [',', ']'], $i, null === $tag, $references);
 
                     // the value can be an array if a reference has been resolved to an array var
-                    if (is_string($value) && !$isQuoted && false !== strpos($value, ': ')) {
+                    if (\is_string($value) && !$isQuoted && false !== strpos($value, ': ')) {
                         // embedded mapping?
                         try {
                             $pos = 0;
@@ -433,7 +384,7 @@ class Inline
                     --$i;
             }
 
-            if (null !== $tag) {
+            if (null !== $tag && '' !== $tag) {
                 $value = new TaggedValue($tag, $value);
             }
 
@@ -442,26 +393,22 @@ class Inline
             ++$i;
         }
 
-        throw new ParseException(sprintf('Malformed inline YAML string: %s.', $sequence));
+        throw new ParseException(sprintf('Malformed inline YAML string: %s.', $sequence), self::$parsedLineNumber + 1, null, self::$parsedFilename);
     }
 
     /**
      * Parses a YAML mapping.
      *
-     * @param string $mapping
-     * @param int    $flags
-     * @param int    &$i
-     * @param array  $references
-     *
      * @return array|\stdClass
      *
      * @throws ParseException When malformed inline YAML string is parsed
      */
-    private static function parseMapping($mapping, $flags, &$i = 0, $references = array())
+    private static function parseMapping(string $mapping, int $flags, int &$i = 0, array $references = [])
     {
-        $output = array();
-        $len = strlen($mapping);
+        $output = [];
+        $len = \strlen($mapping);
         ++$i;
+        $allowOverwrite = false;
 
         // {foo: bar, bar:foo, ...}
         while ($i < $len) {
@@ -479,27 +426,32 @@ class Inline
             }
 
             // key
-            $isKeyQuoted = in_array($mapping[$i], array('"', "'"), true);
-            $key = self::parseScalar($mapping, $flags, array(':', ' '), $i, false, array(), true);
+            $offsetBeforeKeyParsing = $i;
+            $isKeyQuoted = \in_array($mapping[$i], ['"', "'"], true);
+            $key = self::parseScalar($mapping, $flags, [':', ' '], $i, false, []);
 
-            if (':' !== $key && false === $i = strpos($mapping, ':', $i)) {
-                break;
+            if ($offsetBeforeKeyParsing === $i) {
+                throw new ParseException('Missing mapping key.', self::$parsedLineNumber + 1, $mapping);
             }
 
-            if (':' === $key) {
-                @trigger_error('Omitting the key of a mapping is deprecated and will throw a ParseException in 4.0.', E_USER_DEPRECATED);
+            if (false === $i = strpos($mapping, ':', $i)) {
+                break;
             }
 
-            if (!(Yaml::PARSE_KEYS_AS_STRINGS & $flags)) {
+            if (!$isKeyQuoted) {
                 $evaluatedKey = self::evaluateScalar($key, $flags, $references);
 
-                if ('' !== $key && $evaluatedKey !== $key && !is_string($evaluatedKey) && !is_int($evaluatedKey)) {
-                    @trigger_error('Implicit casting of incompatible mapping keys to strings is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead.', E_USER_DEPRECATED);
+                if ('' !== $key && $evaluatedKey !== $key && !\is_string($evaluatedKey) && !\is_int($evaluatedKey)) {
+                    throw new ParseException('Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead.', self::$parsedLineNumber + 1, $mapping);
                 }
             }
 
-            if (':' !== $key && !$isKeyQuoted && (!isset($mapping[$i + 1]) || !in_array($mapping[$i + 1], array(' ', ',', '[', ']', '{', '}'), true))) {
-                @trigger_error('Using a colon after an unquoted mapping key that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}") is deprecated since version 3.2 and will throw a ParseException in 4.0.', E_USER_DEPRECATED);
+            if (!$isKeyQuoted && (!isset($mapping[$i + 1]) || !\in_array($mapping[$i + 1], [' ', ',', '[', ']', '{', '}'], true))) {
+                throw new ParseException('Colons must be followed by a space or an indication character (i.e. " ", ",", "[", "]", "{", "}").', self::$parsedLineNumber + 1, $mapping);
+            }
+
+            if ('<<' === $key) {
+                $allowOverwrite = true;
             }
 
             while ($i < $len) {
@@ -510,7 +462,6 @@ class Inline
                 }
 
                 $tag = self::parseTag($mapping, $i, $flags);
-                $duplicate = false;
                 switch ($mapping[$i]) {
                     case '[':
                         // nested sequence
@@ -518,9 +469,19 @@ class Inline
                         // Spec: Keys MUST be unique; first one wins.
                         // Parser cannot abort this mapping earlier, since lines
                         // are processed sequentially.
-                        if (isset($output[$key])) {
-                            @trigger_error(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since version 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key), E_USER_DEPRECATED);
-                            $duplicate = true;
+                        // But overwriting is allowed when a merge node is used in current block.
+                        if ('<<' === $key) {
+                            foreach ($value as $parsedValue) {
+                                $output += $parsedValue;
+                            }
+                        } elseif ($allowOverwrite || !isset($output[$key])) {
+                            if (null !== $tag) {
+                                $output[$key] = new TaggedValue($tag, $value);
+                            } else {
+                                $output[$key] = $value;
+                            }
+                        } elseif (isset($output[$key])) {
+                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
                         }
                         break;
                     case '{':
@@ -529,51 +490,55 @@ class Inline
                         // Spec: Keys MUST be unique; first one wins.
                         // Parser cannot abort this mapping earlier, since lines
                         // are processed sequentially.
-                        if (isset($output[$key])) {
-                            @trigger_error(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since version 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key), E_USER_DEPRECATED);
-                            $duplicate = true;
+                        // But overwriting is allowed when a merge node is used in current block.
+                        if ('<<' === $key) {
+                            $output += $value;
+                        } elseif ($allowOverwrite || !isset($output[$key])) {
+                            if (null !== $tag) {
+                                $output[$key] = new TaggedValue($tag, $value);
+                            } else {
+                                $output[$key] = $value;
+                            }
+                        } elseif (isset($output[$key])) {
+                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
                         }
                         break;
                     default:
-                        $value = self::parseScalar($mapping, $flags, array(',', '}'), $i, null === $tag, $references);
+                        $value = self::parseScalar($mapping, $flags, [',', '}'], $i, null === $tag, $references);
                         // Spec: Keys MUST be unique; first one wins.
                         // Parser cannot abort this mapping earlier, since lines
                         // are processed sequentially.
-                        if (isset($output[$key])) {
-                            @trigger_error(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since version 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key), E_USER_DEPRECATED);
-                            $duplicate = true;
+                        // But overwriting is allowed when a merge node is used in current block.
+                        if ('<<' === $key) {
+                            $output += $value;
+                        } elseif ($allowOverwrite || !isset($output[$key])) {
+                            if (null !== $tag) {
+                                $output[$key] = new TaggedValue($tag, $value);
+                            } else {
+                                $output[$key] = $value;
+                            }
+                        } elseif (isset($output[$key])) {
+                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), self::$parsedLineNumber + 1, $mapping);
                         }
                         --$i;
                 }
-
-                if (!$duplicate) {
-                    if (null !== $tag) {
-                        $output[$key] = new TaggedValue($tag, $value);
-                    } else {
-                        $output[$key] = $value;
-                    }
-                }
                 ++$i;
 
                 continue 2;
             }
         }
 
-        throw new ParseException(sprintf('Malformed inline YAML string: %s.', $mapping));
+        throw new ParseException(sprintf('Malformed inline YAML string: %s.', $mapping), self::$parsedLineNumber + 1, null, self::$parsedFilename);
     }
 
     /**
      * Evaluates scalars and replaces magic values.
      *
-     * @param string $scalar
-     * @param int    $flags
-     * @param array  $references
-     *
      * @return mixed The evaluated YAML string
      *
      * @throws ParseException when object parsing support was disabled and the parser detected a PHP object or when a reference could not be resolved
      */
-    private static function evaluateScalar($scalar, $flags, $references = array())
+    private static function evaluateScalar(string $scalar, int $flags, array $references = [])
     {
         $scalar = trim($scalar);
         $scalarLower = strtolower($scalar);
@@ -587,11 +552,11 @@ class Inline
 
             // an unquoted *
             if (false === $value || '' === $value) {
-                throw new ParseException('A reference must contain at least one character.');
+                throw new ParseException('A reference must contain at least one character.', self::$parsedLineNumber + 1, $value, self::$parsedFilename);
             }
 
-            if (!array_key_exists($value, $references)) {
-                throw new ParseException(sprintf('Reference "%s" does not exist.', $value));
+            if (!\array_key_exists($value, $references)) {
+                throw new ParseException(sprintf('Reference "%s" does not exist.', $value), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
             }
 
             return $references[$value];
@@ -606,44 +571,33 @@ class Inline
                 return true;
             case 'false' === $scalarLower:
                 return false;
-            case $scalar[0] === '!':
+            case '!' === $scalar[0]:
                 switch (true) {
-                    case 0 === strpos($scalar, '!str'):
-                        return (string) substr($scalar, 5);
+                    case 0 === strpos($scalar, '!!str '):
+                        return (string) substr($scalar, 6);
                     case 0 === strpos($scalar, '! '):
-                        return (int) self::parseScalar(substr($scalar, 2), $flags);
-                    case 0 === strpos($scalar, '!php/object:'):
+                        return substr($scalar, 2);
+                    case 0 === strpos($scalar, '!php/object'):
                         if (self::$objectSupport) {
-                            return unserialize(substr($scalar, 12));
+                            return unserialize(self::parseScalar(substr($scalar, 12)));
                         }
 
                         if (self::$exceptionOnInvalidType) {
-                            throw new ParseException('Object support when parsing a YAML file has been disabled.');
+                            throw new ParseException('Object support when parsing a YAML file has been disabled.', self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                         }
 
                         return;
-                    case 0 === strpos($scalar, '!!php/object:'):
-                        if (self::$objectSupport) {
-                            @trigger_error('The !!php/object tag to indicate dumped PHP objects is deprecated since version 3.1 and will be removed in 4.0. Use the !php/object tag instead.', E_USER_DEPRECATED);
-
-                            return unserialize(substr($scalar, 13));
-                        }
-
-                        if (self::$exceptionOnInvalidType) {
-                            throw new ParseException('Object support when parsing a YAML file has been disabled.');
-                        }
-
-                        return;
-                    case 0 === strpos($scalar, '!php/const:'):
+                    case 0 === strpos($scalar, '!php/const'):
                         if (self::$constantSupport) {
-                            if (defined($const = substr($scalar, 11))) {
-                                return constant($const);
+                            $i = 0;
+                            if (\defined($const = self::parseScalar(substr($scalar, 11), 0, null, $i, false))) {
+                                return \constant($const);
                             }
 
-                            throw new ParseException(sprintf('The constant "%s" is not defined.', $const));
+                            throw new ParseException(sprintf('The constant "%s" is not defined.', $const), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                         }
                         if (self::$exceptionOnInvalidType) {
-                            throw new ParseException(sprintf('The string "%s" could not be parsed as a constant. Have you forgotten to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar));
+                            throw new ParseException(sprintf('The string "%s" could not be parsed as a constant. Have you forgotten to pass the "Yaml::PARSE_CONSTANT" flag to the parser?', $scalar), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
                         }
 
                         return;
@@ -652,15 +606,17 @@ class Inline
                     case 0 === strpos($scalar, '!!binary '):
                         return self::evaluateBinaryScalar(substr($scalar, 9));
                     default:
-                        @trigger_error(sprintf('Using the unquoted scalar value "%s" is deprecated since version 3.3 and will be considered as a tagged value in 4.0. You must quote it.', $scalar), E_USER_DEPRECATED);
+                        throw new ParseException(sprintf('The string "%s" could not be parsed as it uses an unsupported built-in tag.', $scalar), self::$parsedLineNumber, $scalar, self::$parsedFilename);
                 }
 
             // Optimize for returning strings.
-            case $scalar[0] === '+' || $scalar[0] === '-' || $scalar[0] === '.' || is_numeric($scalar[0]):
+            // no break
+            case '+' === $scalar[0] || '-' === $scalar[0] || '.' === $scalar[0] || is_numeric($scalar[0]):
                 switch (true) {
                     case Parser::preg_match('{^[+-]?[0-9][0-9_]*$}', $scalar):
                         $scalar = str_replace('_', '', (string) $scalar);
                         // omitting the break / return as integers are handled in the next case
+                        // no break
                     case ctype_digit($scalar):
                         $raw = $scalar;
                         $cast = (int) $scalar;
@@ -681,13 +637,8 @@ class Inline
                         return -log(0);
                     case '-.inf' === $scalarLower:
                         return log(0);
-                    case Parser::preg_match('/^(-|\+)?[0-9][0-9,]*(\.[0-9_]+)?$/', $scalar):
                     case Parser::preg_match('/^(-|\+)?[0-9][0-9_]*(\.[0-9_]+)?$/', $scalar):
-                        if (false !== strpos($scalar, ',')) {
-                            @trigger_error('Using the comma as a group separator for floats is deprecated since version 3.2 and will be removed in 4.0.', E_USER_DEPRECATED);
-                        }
-
-                        return (float) str_replace(array(',', '_'), '', $scalar);
+                        return (float) str_replace('_', '', $scalar);
                     case Parser::preg_match(self::getTimestampRegex(), $scalar):
                         if (Yaml::PARSE_DATETIME & $flags) {
                             // When no timezone is provided in the parsed date, YAML spec says we must assume UTC.
@@ -706,68 +657,54 @@ class Inline
         return (string) $scalar;
     }
 
-    /**
-     * @param string $value
-     * @param int    &$i
-     * @param int    $flags
-     *
-     * @return null|string
-     */
-    private static function parseTag($value, &$i, $flags)
+    private static function parseTag(string $value, int &$i, int $flags): ?string
     {
         if ('!' !== $value[$i]) {
-            return;
+            return null;
         }
 
-        $tagLength = strcspn($value, " \t\n", $i + 1);
+        $tagLength = strcspn($value, " \t\n[]{},", $i + 1);
         $tag = substr($value, $i + 1, $tagLength);
 
         $nextOffset = $i + $tagLength + 1;
         $nextOffset += strspn($value, ' ', $nextOffset);
 
-        // Is followed by a scalar
-        if (!isset($value[$nextOffset]) || !in_array($value[$nextOffset], array('[', '{'), true)) {
-            // Manage scalars in {@link self::evaluateScalar()}
-            return;
+        // Is followed by a scalar and is a built-in tag
+        if ($tag && (!isset($value[$nextOffset]) || !\in_array($value[$nextOffset], ['[', '{'], true)) && ('!' === $tag[0] || 'str' === $tag || 'php/const' === $tag || 'php/object' === $tag)) {
+            // Manage in {@link self::evaluateScalar()}
+            return null;
         }
 
+        $i = $nextOffset;
+
         // Built-in tags
         if ($tag && '!' === $tag[0]) {
-            throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag));
+            throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
         }
 
-        if (Yaml::PARSE_CUSTOM_TAGS & $flags) {
-            $i = $nextOffset;
-
+        if ('' === $tag || Yaml::PARSE_CUSTOM_TAGS & $flags) {
             return $tag;
         }
 
-        throw new ParseException(sprintf('Tags support is not enabled. Enable the `Yaml::PARSE_CUSTOM_TAGS` flag to use "!%s".', $tag));
+        throw new ParseException(sprintf('Tags support is not enabled. Enable the "Yaml::PARSE_CUSTOM_TAGS" flag to use "!%s".', $tag), self::$parsedLineNumber + 1, $value, self::$parsedFilename);
     }
 
-    /**
-     * @param string $scalar
-     *
-     * @return string
-     *
-     * @internal
-     */
-    public static function evaluateBinaryScalar($scalar)
+    public static function evaluateBinaryScalar(string $scalar): string
     {
         $parsedBinaryData = self::parseScalar(preg_replace('/\s/', '', $scalar));
 
-        if (0 !== (strlen($parsedBinaryData) % 4)) {
-            throw new ParseException(sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', strlen($parsedBinaryData)));
+        if (0 !== (\strlen($parsedBinaryData) % 4)) {
+            throw new ParseException(sprintf('The normalized base64 encoded data (data without whitespace characters) length must be a multiple of four (%d bytes given).', \strlen($parsedBinaryData)), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
         }
 
         if (!Parser::preg_match('#^[A-Z0-9+/]+={0,2}$#i', $parsedBinaryData)) {
-            throw new ParseException(sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData));
+            throw new ParseException(sprintf('The base64 encoded data (%s) contains invalid characters.', $parsedBinaryData), self::$parsedLineNumber + 1, $scalar, self::$parsedFilename);
         }
 
         return base64_decode($parsedBinaryData, true);
     }
 
-    private static function isBinaryString($value)
+    private static function isBinaryString(string $value)
     {
         return !preg_match('//u', $value) || preg_match('/[^\x00\x07-\x0d\x1B\x20-\xff]/', $value);
     }
@@ -779,7 +716,7 @@ class Inline
      *
      * @see http://www.yaml.org/spec/1.2/spec.html#id2761573
      */
-    private static function getTimestampRegex()
+    private static function getTimestampRegex(): string
     {
         return <<<EOF
         ~^
@@ -802,7 +739,7 @@ EOF;
      *
      * @return string
      */
-    private static function getHexRegex()
+    private static function getHexRegex(): string
     {
         return '~^0x[0-9a-f_]++$~i';
     }
diff --git a/vendor/symfony/yaml/LICENSE b/vendor/symfony/yaml/LICENSE
index 17d16a13..a677f437 100644
--- a/vendor/symfony/yaml/LICENSE
+++ b/vendor/symfony/yaml/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2004-2017 Fabien Potencier
+Copyright (c) 2004-2019 Fabien Potencier
 
 Permission is hereby granted, free of charge, to any person obtaining a copy
 of this software and associated documentation files (the "Software"), to deal
diff --git a/vendor/symfony/yaml/Parser.php b/vendor/symfony/yaml/Parser.php
index 3c03e746..4519edb8 100644
--- a/vendor/symfony/yaml/Parser.php
+++ b/vendor/symfony/yaml/Parser.php
@@ -18,33 +18,51 @@ use Symfony\Component\Yaml\Tag\TaggedValue;
  * Parser parses YAML strings to convert them to PHP arrays.
  *
  * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @final
  */
 class Parser
 {
     const TAG_PATTERN = '(?P<tag>![\w!.\/:-]+)';
     const BLOCK_SCALAR_HEADER_PATTERN = '(?P<separator>\||>)(?P<modifiers>\+|\-|\d+|\+\d+|\-\d+|\d+\+|\d+\-)?(?P<comments> +#.*)?';
 
+    private $filename;
     private $offset = 0;
     private $totalNumberOfLines;
-    private $lines = array();
+    private $lines = [];
     private $currentLineNb = -1;
     private $currentLine = '';
-    private $refs = array();
-    private $skippedLineNumbers = array();
-    private $locallySkippedLineNumbers = array();
+    private $refs = [];
+    private $skippedLineNumbers = [];
+    private $locallySkippedLineNumbers = [];
+    private $refsBeingParsed = [];
 
-    public function __construct()
+    /**
+     * Parses a YAML file into a PHP value.
+     *
+     * @param string $filename The path to the YAML file to be parsed
+     * @param int    $flags    A bit field of PARSE_* constants to customize the YAML parser behavior
+     *
+     * @return mixed The YAML converted to a PHP value
+     *
+     * @throws ParseException If the file could not be read or the YAML is not valid
+     */
+    public function parseFile(string $filename, int $flags = 0)
     {
-        if (func_num_args() > 0) {
-            @trigger_error(sprintf('The constructor arguments $offset, $totalNumberOfLines, $skippedLineNumbers of %s are deprecated and will be removed in 4.0', self::class), E_USER_DEPRECATED);
+        if (!is_file($filename)) {
+            throw new ParseException(sprintf('File "%s" does not exist.', $filename));
+        }
 
-            $this->offset = func_get_arg(0);
-            if (func_num_args() > 1) {
-                $this->totalNumberOfLines = func_get_arg(1);
-            }
-            if (func_num_args() > 2) {
-                $this->skippedLineNumbers = func_get_arg(2);
-            }
+        if (!is_readable($filename)) {
+            throw new ParseException(sprintf('File "%s" cannot be read.', $filename));
+        }
+
+        $this->filename = $filename;
+
+        try {
+            return $this->parse(file_get_contents($filename), $flags);
+        } finally {
+            $this->filename = null;
         }
     }
 
@@ -58,42 +76,15 @@ class Parser
      *
      * @throws ParseException If the YAML is not valid
      */
-    public function parse($value, $flags = 0)
+    public function parse(string $value, int $flags = 0)
     {
-        if (is_bool($flags)) {
-            @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED);
-
-            if ($flags) {
-                $flags = Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE;
-            } else {
-                $flags = 0;
-            }
-        }
-
-        if (func_num_args() >= 3) {
-            @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT flag instead.', E_USER_DEPRECATED);
-
-            if (func_get_arg(2)) {
-                $flags |= Yaml::PARSE_OBJECT;
-            }
-        }
-
-        if (func_num_args() >= 4) {
-            @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', E_USER_DEPRECATED);
-
-            if (func_get_arg(3)) {
-                $flags |= Yaml::PARSE_OBJECT_FOR_MAP;
-            }
-        }
-
         if (false === preg_match('//u', $value)) {
-            throw new ParseException('The YAML value does not appear to be valid UTF-8.');
+            throw new ParseException('The YAML value does not appear to be valid UTF-8.', -1, null, $this->filename);
         }
 
-        $this->refs = array();
+        $this->refs = [];
 
         $mbEncoding = null;
-        $e = null;
         $data = null;
 
         if (2 /* MB_OVERLOAD_STRING */ & (int) ini_get('mbstring.func_overload')) {
@@ -103,44 +94,47 @@ class Parser
 
         try {
             $data = $this->doParse($value, $flags);
-        } catch (\Exception $e) {
-        } catch (\Throwable $e) {
-        }
-
-        if (null !== $mbEncoding) {
-            mb_internal_encoding($mbEncoding);
-        }
-
-        $this->lines = array();
-        $this->currentLine = '';
-        $this->refs = array();
-        $this->skippedLineNumbers = array();
-        $this->locallySkippedLineNumbers = array();
-
-        if (null !== $e) {
-            throw $e;
+        } finally {
+            if (null !== $mbEncoding) {
+                mb_internal_encoding($mbEncoding);
+            }
+            $this->lines = [];
+            $this->currentLine = '';
+            $this->refs = [];
+            $this->skippedLineNumbers = [];
+            $this->locallySkippedLineNumbers = [];
         }
 
         return $data;
     }
 
-    private function doParse($value, $flags)
+    /**
+     * @internal
+     *
+     * @return int
+     */
+    public function getLastLineNumberBeforeDeprecation(): int
+    {
+        return $this->getRealCurrentLineNb();
+    }
+
+    private function doParse(string $value, int $flags)
     {
         $this->currentLineNb = -1;
         $this->currentLine = '';
         $value = $this->cleanup($value);
         $this->lines = explode("\n", $value);
-        $this->locallySkippedLineNumbers = array();
+        $this->locallySkippedLineNumbers = [];
 
         if (null === $this->totalNumberOfLines) {
-            $this->totalNumberOfLines = count($this->lines);
+            $this->totalNumberOfLines = \count($this->lines);
         }
 
         if (!$this->moveToNextLine()) {
             return null;
         }
 
-        $data = array();
+        $data = [];
         $context = null;
         $allowOverwrite = false;
 
@@ -162,28 +156,31 @@ class Parser
 
             // tab?
             if ("\t" === $this->currentLine[0]) {
-                throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                throw new ParseException('A YAML file cannot contain tabs as indentation.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
             }
 
+            Inline::initialize($flags, $this->getRealCurrentLineNb(), $this->filename);
+
             $isRef = $mergeNode = false;
-            if (self::preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+))?$#u', rtrim($this->currentLine), $values)) {
+            if ('-' === $this->currentLine[0] && self::preg_match('#^\-((?P<leadspaces>\s+)(?P<value>.+))?$#u', rtrim($this->currentLine), $values)) {
                 if ($context && 'mapping' == $context) {
-                    throw new ParseException('You cannot define a sequence item when in a mapping', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                    throw new ParseException('You cannot define a sequence item when in a mapping', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                 }
                 $context = 'sequence';
 
-                if (isset($values['value']) && self::preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
+                if (isset($values['value']) && '&' === $values['value'][0] && self::preg_match('#^&(?P<ref>[^ ]+) *(?P<value>.*)#u', $values['value'], $matches)) {
                     $isRef = $matches['ref'];
+                    $this->refsBeingParsed[] = $isRef;
                     $values['value'] = $matches['value'];
                 }
 
                 if (isset($values['value'][1]) && '?' === $values['value'][0] && ' ' === $values['value'][1]) {
-                    @trigger_error('Starting an unquoted string with a question mark followed by a space is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', E_USER_DEPRECATED);
+                    throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
                 }
 
                 // array
                 if (!isset($values['value']) || '' == trim($values['value'], ' ') || 0 === strpos(ltrim($values['value'], ' '), '#')) {
-                    $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true), $flags);
+                    $data[] = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(null, true) ?? '', $flags);
                 } elseif (null !== $subTag = $this->getLineTag(ltrim($values['value'], ' '), $flags)) {
                     $data[] = new TaggedValue(
                         $subTag,
@@ -196,7 +193,7 @@ class Parser
                         // this is a compact notation element, add to next block and parse
                         $block = $values['value'];
                         if ($this->isNextLineIndented()) {
-                            $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + strlen($values['leadspaces']) + 1);
+                            $block .= "\n".$this->getNextEmbedBlock($this->getCurrentLineIndentation() + \strlen($values['leadspaces']) + 1);
                         }
 
                         $data[] = $this->parseBlock($this->getRealCurrentLineNb(), $block, $flags);
@@ -206,29 +203,19 @@ class Parser
                 }
                 if ($isRef) {
                     $this->refs[$isRef] = end($data);
+                    array_pop($this->refsBeingParsed);
                 }
             } elseif (
-                self::preg_match('#^(?P<key>'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?(?:![^\s]++\s++)?[^ \'"\[\{!].*?) *\:(\s++(?P<value>.+))?$#u', rtrim($this->currentLine), $values)
-                && (false === strpos($values['key'], ' #') || in_array($values['key'][0], array('"', "'")))
+                self::preg_match('#^(?P<key>(?:![^\s]++\s++)?(?:'.Inline::REGEX_QUOTED_STRING.'|(?:!?!php/const:)?[^ \'"\[\{!].*?)) *\:(\s++(?P<value>.+))?$#u', rtrim($this->currentLine), $values)
+                && (false === strpos($values['key'], ' #') || \in_array($values['key'][0], ['"', "'"]))
             ) {
                 if ($context && 'sequence' == $context) {
-                    throw new ParseException('You cannot define a mapping item when in a sequence', $this->currentLineNb + 1, $this->currentLine);
+                    throw new ParseException('You cannot define a mapping item when in a sequence', $this->currentLineNb + 1, $this->currentLine, $this->filename);
                 }
                 $context = 'mapping';
 
-                // force correct settings
-                Inline::parse(null, $flags, $this->refs);
                 try {
-                    Inline::$parsedLineNumber = $this->getRealCurrentLineNb();
-                    $i = 0;
-                    $evaluateKey = !(Yaml::PARSE_KEYS_AS_STRINGS & $flags);
-
-                    // constants in key will be evaluated anyway
-                    if (isset($values['key'][0]) && '!' === $values['key'][0] && Yaml::PARSE_CONSTANT & $flags) {
-                        $evaluateKey = true;
-                    }
-
-                    $key = Inline::parseScalar($values['key'], 0, null, $i, $evaluateKey);
+                    $key = Inline::parseScalar($values['key']);
                 } catch (ParseException $e) {
                     $e->setParsedLine($this->getRealCurrentLineNb() + 1);
                     $e->setSnippet($this->currentLine);
@@ -236,42 +223,53 @@ class Parser
                     throw $e;
                 }
 
-                if (!(Yaml::PARSE_KEYS_AS_STRINGS & $flags) && !is_string($key) && !is_int($key)) {
-                    $keyType = is_numeric($key) ? 'numeric key' : 'non-string key';
-                    @trigger_error(sprintf('Implicit casting of %s to string is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead.', $keyType), E_USER_DEPRECATED);
+                if (!\is_string($key) && !\is_int($key)) {
+                    throw new ParseException(sprintf('%s keys are not supported. Quote your evaluable mapping keys instead.', is_numeric($key) ? 'Numeric' : 'Non-string'), $this->getRealCurrentLineNb() + 1, $this->currentLine);
                 }
 
                 // Convert float keys to strings, to avoid being converted to integers by PHP
-                if (is_float($key)) {
+                if (\is_float($key)) {
                     $key = (string) $key;
                 }
 
-                if ('<<' === $key) {
+                if ('<<' === $key && (!isset($values['value']) || '&' !== $values['value'][0] || !self::preg_match('#^&(?P<ref>[^ ]+)#u', $values['value'], $refMatches))) {
                     $mergeNode = true;
                     $allowOverwrite = true;
-                    if (isset($values['value']) && 0 === strpos($values['value'], '*')) {
+                    if (isset($values['value'][0]) && '*' === $values['value'][0]) {
                         $refName = substr(rtrim($values['value']), 1);
-                        if (!array_key_exists($refName, $this->refs)) {
-                            throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                        if (!\array_key_exists($refName, $this->refs)) {
+                            if (false !== $pos = array_search($refName, $this->refsBeingParsed, true)) {
+                                throw new ParseException(sprintf('Circular reference [%s, %s] detected for reference "%s".', implode(', ', \array_slice($this->refsBeingParsed, $pos)), $refName, $refName), $this->currentLineNb + 1, $this->currentLine, $this->filename);
+                            }
+
+                            throw new ParseException(sprintf('Reference "%s" does not exist.', $refName), $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                         }
 
                         $refValue = $this->refs[$refName];
 
-                        if (!is_array($refValue)) {
-                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $refValue instanceof \stdClass) {
+                            $refValue = (array) $refValue;
+                        }
+
+                        if (!\is_array($refValue)) {
+                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                         }
 
                         $data += $refValue; // array union
                     } else {
-                        if (isset($values['value']) && $values['value'] !== '') {
+                        if (isset($values['value']) && '' !== $values['value']) {
                             $value = $values['value'];
                         } else {
                             $value = $this->getNextEmbedBlock();
                         }
                         $parsed = $this->parseBlock($this->getRealCurrentLineNb() + 1, $value, $flags);
 
-                        if (!is_array($parsed)) {
-                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsed instanceof \stdClass) {
+                            $parsed = (array) $parsed;
+                        }
+
+                        if (!\is_array($parsed)) {
+                            throw new ParseException('YAML merge keys used with a scalar value instead of an array.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
                         }
 
                         if (isset($parsed[0])) {
@@ -279,8 +277,12 @@ class Parser
                             // and each of these nodes is merged in turn according to its order in the sequence. Keys in mapping nodes earlier
                             // in the sequence override keys specified in later mapping nodes.
                             foreach ($parsed as $parsedItem) {
-                                if (!is_array($parsedItem)) {
-                                    throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem);
+                                if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $parsedItem instanceof \stdClass) {
+                                    $parsedItem = (array) $parsedItem;
+                                }
+
+                                if (!\is_array($parsedItem)) {
+                                    throw new ParseException('Merge items must be arrays.', $this->getRealCurrentLineNb() + 1, $parsedItem, $this->filename);
                                 }
 
                                 $data += $parsedItem; // array union
@@ -291,15 +293,16 @@ class Parser
                             $data += $parsed; // array union
                         }
                     }
-                } elseif (isset($values['value']) && self::preg_match('#^&(?P<ref>[^ ]++) *+(?P<value>.*)#u', $values['value'], $matches)) {
+                } elseif ('<<' !== $key && isset($values['value']) && '&' === $values['value'][0] && self::preg_match('#^&(?P<ref>[^ ]++) *+(?P<value>.*)#u', $values['value'], $matches)) {
                     $isRef = $matches['ref'];
+                    $this->refsBeingParsed[] = $isRef;
                     $values['value'] = $matches['value'];
                 }
 
                 $subTag = null;
                 if ($mergeNode) {
                     // Merge keys
-                } elseif (!isset($values['value']) || '' === $values['value'] || 0 === strpos($values['value'], '#') || (null !== $subTag = $this->getLineTag($values['value'], $flags))) {
+                } elseif (!isset($values['value']) || '' === $values['value'] || 0 === strpos($values['value'], '#') || (null !== $subTag = $this->getLineTag($values['value'], $flags)) || '<<' === $key) {
                     // hash
                     // if next line is less indented or equal, then it means that the current value is null
                     if (!$this->isNextLineIndented() && !$this->isNextLineUnIndentedCollection()) {
@@ -312,22 +315,30 @@ class Parser
                                 $data[$key] = null;
                             }
                         } else {
-                            @trigger_error(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since version 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key), E_USER_DEPRECATED);
+                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
                         }
                     } else {
                         // remember the parsed line number here in case we need it to provide some contexts in error messages below
                         $realCurrentLineNbKey = $this->getRealCurrentLineNb();
                         $value = $this->parseBlock($this->getRealCurrentLineNb() + 1, $this->getNextEmbedBlock(), $flags);
-                        // Spec: Keys MUST be unique; first one wins.
-                        // But overwriting is allowed when a merge node is used in current block.
-                        if ($allowOverwrite || !isset($data[$key])) {
+                        if ('<<' === $key) {
+                            $this->refs[$refMatches['ref']] = $value;
+
+                            if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && $value instanceof \stdClass) {
+                                $value = (array) $value;
+                            }
+
+                            $data += $value;
+                        } elseif ($allowOverwrite || !isset($data[$key])) {
+                            // Spec: Keys MUST be unique; first one wins.
+                            // But overwriting is allowed when a merge node is used in current block.
                             if (null !== $subTag) {
                                 $data[$key] = new TaggedValue($subTag, $value);
                             } else {
                                 $data[$key] = $value;
                             }
                         } else {
-                            @trigger_error(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since version 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key), E_USER_DEPRECATED);
+                            throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $realCurrentLineNbKey + 1, $this->currentLine);
                         }
                     }
                 } else {
@@ -337,26 +348,26 @@ class Parser
                     if ($allowOverwrite || !isset($data[$key])) {
                         $data[$key] = $value;
                     } else {
-                        @trigger_error(sprintf('Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated since version 3.2 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', $key), E_USER_DEPRECATED);
+                        throw new ParseException(sprintf('Duplicate key "%s" detected.', $key), $this->getRealCurrentLineNb() + 1, $this->currentLine);
                     }
                 }
                 if ($isRef) {
                     $this->refs[$isRef] = $data[$key];
+                    array_pop($this->refsBeingParsed);
                 }
             } else {
                 // multiple documents are not supported
                 if ('---' === $this->currentLine) {
-                    throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine);
+                    throw new ParseException('Multiple documents are not supported.', $this->currentLineNb + 1, $this->currentLine, $this->filename);
                 }
 
-                if (isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1]) {
-                    @trigger_error('Starting an unquoted string with a question mark followed by a space is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.', E_USER_DEPRECATED);
+                if ($deprecatedUsage = (isset($this->currentLine[1]) && '?' === $this->currentLine[0] && ' ' === $this->currentLine[1])) {
+                    throw new ParseException('Complex mappings are not supported.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
                 }
 
                 // 1-liner optionally followed by newline(s)
-                if (is_string($value) && $this->lines[0] === trim($value)) {
+                if (\is_string($value) && $this->lines[0] === trim($value)) {
                     try {
-                        Inline::$parsedLineNumber = $this->getRealCurrentLineNb();
                         $value = Inline::parse($this->lines[0], $flags, $this->refs);
                     } catch (ParseException $e) {
                         $e->setParsedLine($this->getRealCurrentLineNb() + 1);
@@ -370,45 +381,52 @@ class Parser
 
                 // try to parse the value as a multi-line string as a last resort
                 if (0 === $this->currentLineNb) {
-                    $parseError = false;
                     $previousLineWasNewline = false;
+                    $previousLineWasTerminatedWithBackslash = false;
                     $value = '';
 
                     foreach ($this->lines as $line) {
-                        try {
-                            if (isset($line[0]) && ('"' === $line[0] || "'" === $line[0])) {
-                                $parsedLine = $line;
-                            } else {
-                                $parsedLine = Inline::parse($line, $flags, $this->refs);
-                            }
+                        // If the indentation is not consistent at offset 0, it is to be considered as a ParseError
+                        if (0 === $this->offset && !$deprecatedUsage && isset($line[0]) && ' ' === $line[0]) {
+                            throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
+                        }
 
-                            if (!is_string($parsedLine)) {
-                                $parseError = true;
-                                break;
-                            }
+                        if (false !== strpos($line, ': ')) {
+                            @trigger_error('Support for mapping keys in multi-line blocks is deprecated since Symfony 4.3 and will throw a ParseException in 5.0.', E_USER_DEPRECATED);
+                        }
 
-                            if ('' === trim($parsedLine)) {
-                                $value .= "\n";
-                                $previousLineWasNewline = true;
-                            } elseif ($previousLineWasNewline) {
-                                $value .= trim($parsedLine);
-                                $previousLineWasNewline = false;
-                            } else {
-                                $value .= ' '.trim($parsedLine);
-                                $previousLineWasNewline = false;
-                            }
-                        } catch (ParseException $e) {
-                            $parseError = true;
-                            break;
+                        if ('' === trim($line)) {
+                            $value .= "\n";
+                        } elseif (!$previousLineWasNewline && !$previousLineWasTerminatedWithBackslash) {
+                            $value .= ' ';
+                        }
+
+                        if ('' !== trim($line) && '\\' === substr($line, -1)) {
+                            $value .= ltrim(substr($line, 0, -1));
+                        } elseif ('' !== trim($line)) {
+                            $value .= trim($line);
+                        }
+
+                        if ('' === trim($line)) {
+                            $previousLineWasNewline = true;
+                            $previousLineWasTerminatedWithBackslash = false;
+                        } elseif ('\\' === substr($line, -1)) {
+                            $previousLineWasNewline = false;
+                            $previousLineWasTerminatedWithBackslash = true;
+                        } else {
+                            $previousLineWasNewline = false;
+                            $previousLineWasTerminatedWithBackslash = false;
                         }
                     }
 
-                    if (!$parseError) {
-                        return trim($value);
+                    try {
+                        return Inline::parse(trim($value));
+                    } catch (ParseException $e) {
+                        // fall-through to the ParseException thrown below
                     }
                 }
 
-                throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                throw new ParseException('Unable to parse.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
             }
         } while ($this->moveToNextLine());
 
@@ -416,7 +434,7 @@ class Parser
             $data = new TaggedValue($tag, $data);
         }
 
-        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && !is_object($data) && 'mapping' === $context) {
+        if (Yaml::PARSE_OBJECT_FOR_MAP & $flags && !\is_object($data) && 'mapping' === $context) {
             $object = new \stdClass();
 
             foreach ($data as $key => $value) {
@@ -429,7 +447,7 @@ class Parser
         return empty($data) ? null : $data;
     }
 
-    private function parseBlock($offset, $yaml, $flags)
+    private function parseBlock(int $offset, string $yaml, int $flags)
     {
         $skippedLineNumbers = $this->skippedLineNumbers;
 
@@ -446,6 +464,7 @@ class Parser
         $parser->totalNumberOfLines = $this->totalNumberOfLines;
         $parser->skippedLineNumbers = $skippedLineNumbers;
         $parser->refs = &$this->refs;
+        $parser->refsBeingParsed = $this->refsBeingParsed;
 
         return $parser->doParse($yaml, $flags);
     }
@@ -453,9 +472,11 @@ class Parser
     /**
      * Returns the current line number (takes the offset into account).
      *
+     * @internal
+     *
      * @return int The current line number
      */
-    private function getRealCurrentLineNb()
+    public function getRealCurrentLineNb(): int
     {
         $realCurrentLineNumber = $this->currentLineNb + $this->offset;
 
@@ -475,53 +496,70 @@ class Parser
      *
      * @return int The current line indentation
      */
-    private function getCurrentLineIndentation()
+    private function getCurrentLineIndentation(): int
     {
-        return strlen($this->currentLine) - strlen(ltrim($this->currentLine, ' '));
+        return \strlen($this->currentLine) - \strlen(ltrim($this->currentLine, ' '));
     }
 
     /**
      * Returns the next embed block of YAML.
      *
-     * @param int  $indentation The indent level at which the block is to be read, or null for default
-     * @param bool $inSequence  True if the enclosing data structure is a sequence
+     * @param int|null $indentation The indent level at which the block is to be read, or null for default
+     * @param bool     $inSequence  True if the enclosing data structure is a sequence
      *
      * @return string A YAML string
      *
      * @throws ParseException When indentation problem are detected
      */
-    private function getNextEmbedBlock($indentation = null, $inSequence = false)
+    private function getNextEmbedBlock(int $indentation = null, bool $inSequence = false): ?string
     {
         $oldLineIndentation = $this->getCurrentLineIndentation();
-        $blockScalarIndentations = array();
-
-        if ($this->isBlockScalarHeader()) {
-            $blockScalarIndentations[] = $oldLineIndentation;
-        }
 
         if (!$this->moveToNextLine()) {
-            return;
+            return null;
         }
 
         if (null === $indentation) {
-            $newIndent = $this->getCurrentLineIndentation();
+            $newIndent = null;
+            $movements = 0;
+
+            do {
+                $EOF = false;
+
+                // empty and comment-like lines do not influence the indentation depth
+                if ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
+                    $EOF = !$this->moveToNextLine();
+
+                    if (!$EOF) {
+                        ++$movements;
+                    }
+                } else {
+                    $newIndent = $this->getCurrentLineIndentation();
+                }
+            } while (!$EOF && null === $newIndent);
+
+            for ($i = 0; $i < $movements; ++$i) {
+                $this->moveToPreviousLine();
+            }
 
             $unindentedEmbedBlock = $this->isStringUnIndentedCollectionItem();
 
             if (!$this->isCurrentLineEmpty() && 0 === $newIndent && !$unindentedEmbedBlock) {
-                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
             }
         } else {
             $newIndent = $indentation;
         }
 
-        $data = array();
+        $data = [];
         if ($this->getCurrentLineIndentation() >= $newIndent) {
             $data[] = substr($this->currentLine, $newIndent);
+        } elseif ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()) {
+            $data[] = $this->currentLine;
         } else {
             $this->moveToPreviousLine();
 
-            return;
+            return null;
         }
 
         if ($inSequence && $oldLineIndentation === $newIndent && isset($data[0][0]) && '-' === $data[0][0]) {
@@ -529,35 +567,14 @@ class Parser
             // and therefore no nested list or mapping
             $this->moveToPreviousLine();
 
-            return;
+            return null;
         }
 
         $isItUnindentedCollection = $this->isStringUnIndentedCollectionItem();
 
-        if (empty($blockScalarIndentations) && $this->isBlockScalarHeader()) {
-            $blockScalarIndentations[] = $this->getCurrentLineIndentation();
-        }
-
-        $previousLineIndentation = $this->getCurrentLineIndentation();
-
         while ($this->moveToNextLine()) {
             $indent = $this->getCurrentLineIndentation();
 
-            // terminate all block scalars that are more indented than the current line
-            if (!empty($blockScalarIndentations) && $indent < $previousLineIndentation && trim($this->currentLine) !== '') {
-                foreach ($blockScalarIndentations as $key => $blockScalarIndentation) {
-                    if ($blockScalarIndentation >= $indent) {
-                        unset($blockScalarIndentations[$key]);
-                    }
-                }
-            }
-
-            if (empty($blockScalarIndentations) && !$this->isCurrentLineComment() && $this->isBlockScalarHeader()) {
-                $blockScalarIndentations[] = $indent;
-            }
-
-            $previousLineIndentation = $indent;
-
             if ($isItUnindentedCollection && !$this->isCurrentLineEmpty() && !$this->isStringUnIndentedCollectionItem() && $newIndent === $indent) {
                 $this->moveToPreviousLine();
                 break;
@@ -568,27 +585,16 @@ class Parser
                 continue;
             }
 
-            // we ignore "comment" lines only when we are not inside a scalar block
-            if (empty($blockScalarIndentations) && $this->isCurrentLineComment()) {
-                // remember ignored comment lines (they are used later in nested
-                // parser calls to determine real line numbers)
-                //
-                // CAUTION: beware to not populate the global property here as it
-                // will otherwise influence the getRealCurrentLineNb() call here
-                // for consecutive comment lines and subsequent embedded blocks
-                $this->locallySkippedLineNumbers[] = $this->getRealCurrentLineNb();
-
-                continue;
-            }
-
             if ($indent >= $newIndent) {
                 $data[] = substr($this->currentLine, $newIndent);
+            } elseif ($this->isCurrentLineComment()) {
+                $data[] = $this->currentLine;
             } elseif (0 == $indent) {
                 $this->moveToPreviousLine();
 
                 break;
             } else {
-                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine);
+                throw new ParseException('Indentation problem.', $this->getRealCurrentLineNb() + 1, $this->currentLine, $this->filename);
             }
         }
 
@@ -600,9 +606,9 @@ class Parser
      *
      * @return bool
      */
-    private function moveToNextLine()
+    private function moveToNextLine(): bool
     {
-        if ($this->currentLineNb >= count($this->lines) - 1) {
+        if ($this->currentLineNb >= \count($this->lines) - 1) {
             return false;
         }
 
@@ -616,7 +622,7 @@ class Parser
      *
      * @return bool
      */
-    private function moveToPreviousLine()
+    private function moveToPreviousLine(): bool
     {
         if ($this->currentLineNb < 1) {
             return false;
@@ -638,7 +644,7 @@ class Parser
      *
      * @throws ParseException When reference does not exist
      */
-    private function parseValue($value, $flags, $context)
+    private function parseValue(string $value, int $flags, string $context)
     {
         if (0 === strpos($value, '*')) {
             if (false !== $pos = strpos($value, '#')) {
@@ -647,24 +653,28 @@ class Parser
                 $value = substr($value, 1);
             }
 
-            if (!array_key_exists($value, $this->refs)) {
-                throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine);
+            if (!\array_key_exists($value, $this->refs)) {
+                if (false !== $pos = array_search($value, $this->refsBeingParsed, true)) {
+                    throw new ParseException(sprintf('Circular reference [%s, %s] detected for reference "%s".', implode(', ', \array_slice($this->refsBeingParsed, $pos)), $value, $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
+                }
+
+                throw new ParseException(sprintf('Reference "%s" does not exist.', $value), $this->currentLineNb + 1, $this->currentLine, $this->filename);
             }
 
             return $this->refs[$value];
         }
 
-        if (self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) {
+        if (\in_array($value[0], ['!', '|', '>'], true) && self::preg_match('/^(?:'.self::TAG_PATTERN.' +)?'.self::BLOCK_SCALAR_HEADER_PATTERN.'$/', $value, $matches)) {
             $modifiers = isset($matches['modifiers']) ? $matches['modifiers'] : '';
 
             $data = $this->parseBlockScalar($matches['separator'], preg_replace('#\d+#', '', $modifiers), (int) abs($modifiers));
 
-            if ('' !== $matches['tag']) {
+            if ('' !== $matches['tag'] && '!' !== $matches['tag']) {
                 if ('!!binary' === $matches['tag']) {
                     return Inline::evaluateBinaryScalar($data);
-                } elseif ('!' !== $matches['tag']) {
-                    @trigger_error(sprintf('Using the custom tag "%s" for the value "%s" is deprecated since version 3.3. It will be replaced by an instance of %s in 4.0.', $matches['tag'], $data, TaggedValue::class), E_USER_DEPRECATED);
                 }
+
+                return new TaggedValue(substr($matches['tag'], 1), $data);
             }
 
             return $data;
@@ -678,15 +688,17 @@ class Parser
                 return Inline::parse($value, $flags, $this->refs);
             }
 
+            $lines = [];
+
             while ($this->moveToNextLine()) {
                 // unquoted strings end before the first unindented line
-                if (null === $quotation && $this->getCurrentLineIndentation() === 0) {
+                if (null === $quotation && 0 === $this->getCurrentLineIndentation()) {
                     $this->moveToPreviousLine();
 
                     break;
                 }
 
-                $value .= ' '.trim($this->currentLine);
+                $lines[] = trim($this->currentLine);
 
                 // quoted string values end with a line that is terminated with the quotation character
                 if ('' !== $this->currentLine && substr($this->currentLine, -1) === $quotation) {
@@ -694,11 +706,25 @@ class Parser
                 }
             }
 
+            for ($i = 0, $linesCount = \count($lines), $previousLineBlank = false; $i < $linesCount; ++$i) {
+                if ('' === $lines[$i]) {
+                    $value .= "\n";
+                    $previousLineBlank = true;
+                } elseif ($previousLineBlank) {
+                    $value .= $lines[$i];
+                    $previousLineBlank = false;
+                } else {
+                    $value .= ' '.$lines[$i];
+                    $previousLineBlank = false;
+                }
+            }
+
             Inline::$parsedLineNumber = $this->getRealCurrentLineNb();
+
             $parsedValue = Inline::parse($value, $flags, $this->refs);
 
-            if ('mapping' === $context && is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) {
-                throw new ParseException('A colon cannot be used in an unquoted mapping value.');
+            if ('mapping' === $context && \is_string($parsedValue) && '"' !== $value[0] && "'" !== $value[0] && '[' !== $value[0] && '{' !== $value[0] && '!' !== $value[0] && false !== strpos($parsedValue, ': ')) {
+                throw new ParseException('A colon cannot be used in an unquoted mapping value.', $this->getRealCurrentLineNb() + 1, $value, $this->filename);
             }
 
             return $parsedValue;
@@ -719,7 +745,7 @@ class Parser
      *
      * @return string The text value
      */
-    private function parseBlockScalar($style, $chomping = '', $indentation = 0)
+    private function parseBlockScalar(string $style, string $chomping = '', int $indentation = 0): string
     {
         $notEOF = $this->moveToNextLine();
         if (!$notEOF) {
@@ -727,7 +753,7 @@ class Parser
         }
 
         $isCurrentLineBlank = $this->isCurrentLineBlank();
-        $blockLines = array();
+        $blockLines = [];
 
         // leading blank lines are consumed before determining indentation
         while ($notEOF && $isCurrentLineBlank) {
@@ -740,8 +766,10 @@ class Parser
 
         // determine indentation if not specified
         if (0 === $indentation) {
-            if (self::preg_match('/^ +/', $this->currentLine, $matches)) {
-                $indentation = strlen($matches[0]);
+            $currentLineLength = \strlen($this->currentLine);
+
+            for ($i = 0; $i < $currentLineLength && ' ' === $this->currentLine[$i]; ++$i) {
+                ++$indentation;
             }
         }
 
@@ -754,7 +782,7 @@ class Parser
                     self::preg_match($pattern, $this->currentLine, $matches)
                 )
             ) {
-                if ($isCurrentLineBlank && strlen($this->currentLine) > $indentation) {
+                if ($isCurrentLineBlank && \strlen($this->currentLine) > $indentation) {
                     $blockLines[] = substr($this->currentLine, $indentation);
                 } elseif ($isCurrentLineBlank) {
                     $blockLines[] = '';
@@ -784,7 +812,7 @@ class Parser
             $previousLineIndented = false;
             $previousLineBlank = false;
 
-            for ($i = 0, $blockLinesCount = count($blockLines); $i < $blockLinesCount; ++$i) {
+            for ($i = 0, $blockLinesCount = \count($blockLines); $i < $blockLinesCount; ++$i) {
                 if ('' === $blockLines[$i]) {
                     $text .= "\n";
                     $previousLineIndented = false;
@@ -826,14 +854,18 @@ class Parser
      *
      * @return bool Returns true if the next line is indented, false otherwise
      */
-    private function isNextLineIndented()
+    private function isNextLineIndented(): bool
     {
         $currentIndentation = $this->getCurrentLineIndentation();
-        $EOF = !$this->moveToNextLine();
+        $movements = 0;
 
-        while (!$EOF && $this->isCurrentLineEmpty()) {
+        do {
             $EOF = !$this->moveToNextLine();
-        }
+
+            if (!$EOF) {
+                ++$movements;
+            }
+        } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));
 
         if ($EOF) {
             return false;
@@ -841,7 +873,9 @@ class Parser
 
         $ret = $this->getCurrentLineIndentation() > $currentIndentation;
 
-        $this->moveToPreviousLine();
+        for ($i = 0; $i < $movements; ++$i) {
+            $this->moveToPreviousLine();
+        }
 
         return $ret;
     }
@@ -851,7 +885,7 @@ class Parser
      *
      * @return bool Returns true if the current line is empty or if it is a comment line, false otherwise
      */
-    private function isCurrentLineEmpty()
+    private function isCurrentLineEmpty(): bool
     {
         return $this->isCurrentLineBlank() || $this->isCurrentLineComment();
     }
@@ -861,7 +895,7 @@ class Parser
      *
      * @return bool Returns true if the current line is blank, false otherwise
      */
-    private function isCurrentLineBlank()
+    private function isCurrentLineBlank(): bool
     {
         return '' == trim($this->currentLine, ' ');
     }
@@ -871,15 +905,15 @@ class Parser
      *
      * @return bool Returns true if the current line is a comment line, false otherwise
      */
-    private function isCurrentLineComment()
+    private function isCurrentLineComment(): bool
     {
         //checking explicitly the first char of the trim is faster than loops or strpos
         $ltrimmedLine = ltrim($this->currentLine, ' ');
 
-        return '' !== $ltrimmedLine && $ltrimmedLine[0] === '#';
+        return '' !== $ltrimmedLine && '#' === $ltrimmedLine[0];
     }
 
-    private function isCurrentLineLastLineInDocument()
+    private function isCurrentLineLastLineInDocument(): bool
     {
         return ($this->offset + $this->currentLineNb) >= ($this->totalNumberOfLines - 1);
     }
@@ -891,9 +925,9 @@ class Parser
      *
      * @return string A cleaned up YAML string
      */
-    private function cleanup($value)
+    private function cleanup(string $value): string
     {
-        $value = str_replace(array("\r\n", "\r"), "\n", $value);
+        $value = str_replace(["\r\n", "\r"], "\n", $value);
 
         // strip YAML header
         $count = 0;
@@ -902,7 +936,7 @@ class Parser
 
         // remove leading comments
         $trimmedValue = preg_replace('#^(\#.*?\n)+#s', '', $value, -1, $count);
-        if ($count == 1) {
+        if (1 === $count) {
             // items have been removed, update the offset
             $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
             $value = $trimmedValue;
@@ -910,7 +944,7 @@ class Parser
 
         // remove start of the document marker (---)
         $trimmedValue = preg_replace('#^\-\-\-.*?\n#s', '', $value, -1, $count);
-        if ($count == 1) {
+        if (1 === $count) {
             // items have been removed, update the offset
             $this->offset += substr_count($value, "\n") - substr_count($trimmedValue, "\n");
             $value = $trimmedValue;
@@ -927,22 +961,28 @@ class Parser
      *
      * @return bool Returns true if the next line starts unindented collection, false otherwise
      */
-    private function isNextLineUnIndentedCollection()
+    private function isNextLineUnIndentedCollection(): bool
     {
         $currentIndentation = $this->getCurrentLineIndentation();
-        $notEOF = $this->moveToNextLine();
+        $movements = 0;
 
-        while ($notEOF && $this->isCurrentLineEmpty()) {
-            $notEOF = $this->moveToNextLine();
-        }
+        do {
+            $EOF = !$this->moveToNextLine();
+
+            if (!$EOF) {
+                ++$movements;
+            }
+        } while (!$EOF && ($this->isCurrentLineEmpty() || $this->isCurrentLineComment()));
 
-        if (false === $notEOF) {
+        if ($EOF) {
             return false;
         }
 
         $ret = $this->getCurrentLineIndentation() === $currentIndentation && $this->isStringUnIndentedCollectionItem();
 
-        $this->moveToPreviousLine();
+        for ($i = 0; $i < $movements; ++$i) {
+            $this->moveToPreviousLine();
+        }
 
         return $ret;
     }
@@ -952,23 +992,13 @@ class Parser
      *
      * @return bool Returns true if the string is un-indented collection item, false otherwise
      */
-    private function isStringUnIndentedCollectionItem()
+    private function isStringUnIndentedCollectionItem(): bool
     {
         return '-' === rtrim($this->currentLine) || 0 === strpos($this->currentLine, '- ');
     }
 
     /**
-     * Tests whether or not the current line is the header of a block scalar.
-     *
-     * @return bool
-     */
-    private function isBlockScalarHeader()
-    {
-        return (bool) self::preg_match('~'.self::BLOCK_SCALAR_HEADER_PATTERN.'$~', $this->currentLine);
-    }
-
-    /**
-     * A local wrapper for `preg_match` which will throw a ParseException if there
+     * A local wrapper for "preg_match" which will throw a ParseException if there
      * is an internal error in the PCRE engine.
      *
      * This avoids us needing to check for "false" every time PCRE is used
@@ -980,7 +1010,7 @@ class Parser
      *
      * @internal
      */
-    public static function preg_match($pattern, $subject, &$matches = null, $flags = 0, $offset = 0)
+    public static function preg_match(string $pattern, string $subject, array &$matches = null, int $flags = 0, int $offset = 0): int
     {
         if (false === $ret = preg_match($pattern, $subject, $matches, $flags, $offset)) {
             switch (preg_last_error()) {
@@ -1012,10 +1042,10 @@ class Parser
     /**
      * Trim the tag on top of the value.
      *
-     * Prevent values such as `!foo {quz: bar}` to be considered as
+     * Prevent values such as "!foo {quz: bar}" to be considered as
      * a mapping block.
      */
-    private function trimTag($value)
+    private function trimTag(string $value): string
     {
         if ('!' === $value[0]) {
             return ltrim(substr($value, 1, strcspn($value, " \r\n", 1)), ' ');
@@ -1024,27 +1054,27 @@ class Parser
         return $value;
     }
 
-    private function getLineTag($value, $flags, $nextLineCheck = true)
+    private function getLineTag(string $value, int $flags, bool $nextLineCheck = true): ?string
     {
         if ('' === $value || '!' !== $value[0] || 1 !== self::preg_match('/^'.self::TAG_PATTERN.' *( +#.*)?$/', $value, $matches)) {
-            return;
+            return null;
         }
 
         if ($nextLineCheck && !$this->isNextLineIndented()) {
-            return;
+            return null;
         }
 
         $tag = substr($matches['tag'], 1);
 
         // Built-in tags
         if ($tag && '!' === $tag[0]) {
-            throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag));
+            throw new ParseException(sprintf('The built-in tag "!%s" is not implemented.', $tag), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
         }
 
         if (Yaml::PARSE_CUSTOM_TAGS & $flags) {
             return $tag;
         }
 
-        throw new ParseException(sprintf('Tags support is not enabled. You must use the flag `Yaml::PARSE_CUSTOM_TAGS` to use "%s".', $matches['tag']));
+        throw new ParseException(sprintf('Tags support is not enabled. You must use the flag "Yaml::PARSE_CUSTOM_TAGS" to use "%s".', $matches['tag']), $this->getRealCurrentLineNb() + 1, $value, $this->filename);
     }
 }
diff --git a/vendor/symfony/yaml/Tag/TaggedValue.php b/vendor/symfony/yaml/Tag/TaggedValue.php
index 000c1d99..4ea34061 100644
--- a/vendor/symfony/yaml/Tag/TaggedValue.php
+++ b/vendor/symfony/yaml/Tag/TaggedValue.php
@@ -20,27 +20,17 @@ final class TaggedValue
     private $tag;
     private $value;
 
-    /**
-     * @param string $tag
-     * @param mixed  $value
-     */
-    public function __construct($tag, $value)
+    public function __construct(string $tag, $value)
     {
         $this->tag = $tag;
         $this->value = $value;
     }
 
-    /**
-     * @return string
-     */
-    public function getTag()
+    public function getTag(): string
     {
         return $this->tag;
     }
 
-    /**
-     * @return mixed
-     */
     public function getValue()
     {
         return $this->value;
diff --git a/vendor/symfony/yaml/Tests/Command/LintCommandTest.php b/vendor/symfony/yaml/Tests/Command/LintCommandTest.php
index 75aa067f..b0e1e26a 100644
--- a/vendor/symfony/yaml/Tests/Command/LintCommandTest.php
+++ b/vendor/symfony/yaml/Tests/Command/LintCommandTest.php
@@ -12,10 +12,10 @@
 namespace Symfony\Component\Yaml\Tests\Command;
 
 use PHPUnit\Framework\TestCase;
-use Symfony\Component\Yaml\Command\LintCommand;
 use Symfony\Component\Console\Application;
 use Symfony\Component\Console\Output\OutputInterface;
 use Symfony\Component\Console\Tester\CommandTester;
+use Symfony\Component\Yaml\Command\LintCommand;
 
 /**
  * Tests the YamlLintCommand.
@@ -31,7 +31,19 @@ class LintCommandTest extends TestCase
         $tester = $this->createCommandTester();
         $filename = $this->createFile('foo: bar');
 
-        $ret = $tester->execute(array('filename' => $filename), array('verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false));
+        $ret = $tester->execute(['filename' => $filename], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]);
+
+        $this->assertEquals(0, $ret, 'Returns 0 in case of success');
+        $this->assertRegExp('/^\/\/ OK in /', trim($tester->getDisplay()));
+    }
+
+    public function testLintCorrectFiles()
+    {
+        $tester = $this->createCommandTester();
+        $filename1 = $this->createFile('foo: bar');
+        $filename2 = $this->createFile('bar: baz');
+
+        $ret = $tester->execute(['filename' => [$filename1, $filename2]], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]);
 
         $this->assertEquals(0, $ret, 'Returns 0 in case of success');
         $this->assertRegExp('/^\/\/ OK in /', trim($tester->getDisplay()));
@@ -45,7 +57,7 @@ bar';
         $tester = $this->createCommandTester();
         $filename = $this->createFile($incorrectContent);
 
-        $ret = $tester->execute(array('filename' => $filename), array('decorated' => false));
+        $ret = $tester->execute(['filename' => $filename], ['decorated' => false]);
 
         $this->assertEquals(1, $ret, 'Returns 1 in case of error');
         $this->assertContains('Unable to parse at line 3 (near "bar").', trim($tester->getDisplay()));
@@ -54,12 +66,30 @@ bar';
     public function testConstantAsKey()
     {
         $yaml = <<<YAML
-!php/const:Symfony\Component\Yaml\Tests\Command\Foo::TEST: bar
+!php/const 'Symfony\Component\Yaml\Tests\Command\Foo::TEST': bar
 YAML;
-        $ret = $this->createCommandTester()->execute(array('filename' => $this->createFile($yaml)), array('verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false));
+        $ret = $this->createCommandTester()->execute(['filename' => $this->createFile($yaml)], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]);
         $this->assertSame(0, $ret, 'lint:yaml exits with code 0 in case of success');
     }
 
+    public function testCustomTags()
+    {
+        $yaml = <<<YAML
+foo: !my_tag {foo: bar}
+YAML;
+        $ret = $this->createCommandTester()->execute(['filename' => $this->createFile($yaml), '--parse-tags' => true], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]);
+        $this->assertSame(0, $ret, 'lint:yaml exits with code 0 in case of success');
+    }
+
+    public function testCustomTagsError()
+    {
+        $yaml = <<<YAML
+foo: !my_tag {foo: bar}
+YAML;
+        $ret = $this->createCommandTester()->execute(['filename' => $this->createFile($yaml)], ['verbosity' => OutputInterface::VERBOSITY_VERBOSE, 'decorated' => false]);
+        $this->assertSame(1, $ret, 'lint:yaml exits with code 1 in case of error');
+    }
+
     /**
      * @expectedException \RuntimeException
      */
@@ -69,7 +99,7 @@ YAML;
         $filename = $this->createFile('');
         unlink($filename);
 
-        $ret = $tester->execute(array('filename' => $filename), array('decorated' => false));
+        $ret = $tester->execute(['filename' => $filename], ['decorated' => false]);
     }
 
     /**
@@ -99,7 +129,7 @@ YAML;
 
     protected function setUp()
     {
-        $this->files = array();
+        $this->files = [];
         @mkdir(sys_get_temp_dir().'/framework-yml-lint-test');
     }
 
diff --git a/vendor/symfony/yaml/Tests/DumperTest.php b/vendor/symfony/yaml/Tests/DumperTest.php
index 1c80bec6..d8d544aa 100644
--- a/vendor/symfony/yaml/Tests/DumperTest.php
+++ b/vendor/symfony/yaml/Tests/DumperTest.php
@@ -12,8 +12,8 @@
 namespace Symfony\Component\Yaml\Tests;
 
 use PHPUnit\Framework\TestCase;
-use Symfony\Component\Yaml\Parser;
 use Symfony\Component\Yaml\Dumper;
+use Symfony\Component\Yaml\Parser;
 use Symfony\Component\Yaml\Yaml;
 
 class DumperTest extends TestCase
@@ -22,20 +22,20 @@ class DumperTest extends TestCase
     protected $dumper;
     protected $path;
 
-    protected $array = array(
+    protected $array = [
         '' => 'bar',
         'foo' => '#bar',
-        'foo\'bar' => array(),
-        'bar' => array(1, 'foo'),
-        'foobar' => array(
+        'foo\'bar' => [],
+        'bar' => [1, 'foo'],
+        'foobar' => [
             'foo' => 'bar',
-            'bar' => array(1, 'foo'),
-            'foobar' => array(
+            'bar' => [1, 'foo'],
+            'foobar' => [
                 'foo' => 'bar',
-                'bar' => array(1, 'foo'),
-            ),
-        ),
-    );
+                'bar' => [1, 'foo'],
+            ],
+        ],
+    ];
 
     protected function setUp()
     {
@@ -77,35 +77,6 @@ EOF;
         $this->assertEquals($expected, $dumper->dump($this->array, 4, 0));
     }
 
-    /**
-     * @group legacy
-     */
-    public function testSetIndentation()
-    {
-        $this->dumper->setIndentation(7);
-
-        $expected = <<<'EOF'
-'': bar
-foo: '#bar'
-'foo''bar': {  }
-bar:
-       - 1
-       - foo
-foobar:
-       foo: bar
-       bar:
-              - 1
-              - foo
-       foobar:
-              foo: bar
-              bar:
-                     - 1
-                     - foo
-
-EOF;
-        $this->assertEquals($expected, $this->dumper->dump($this->array, 4, 0));
-    }
-
     public function testSpecifications()
     {
         $files = $this->parser->parse(file_get_contents($this->path.'/index.yml'));
@@ -125,7 +96,7 @@ EOF;
                     // TODO
                 } else {
                     eval('$expected = '.trim($test['php']).';');
-                    $this->assertSame($expected, $this->parser->parse($this->dumper->dump($expected, 10), Yaml::PARSE_KEYS_AS_STRINGS), $test['test']);
+                    $this->assertSame($expected, $this->parser->parse($this->dumper->dump($expected, 10)), $test['test']);
                 }
             }
         }
@@ -208,24 +179,14 @@ EOF;
 
     public function testObjectSupportEnabled()
     {
-        $dump = $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, Yaml::DUMP_OBJECT);
+        $dump = $this->dumper->dump(['foo' => new A(), 'bar' => 1], 0, 0, Yaml::DUMP_OBJECT);
 
-        $this->assertEquals('{ foo: !php/object:O:30:"Symfony\Component\Yaml\Tests\A":1:{s:1:"a";s:3:"foo";}, bar: 1 }', $dump, '->dump() is able to dump objects');
-    }
-
-    /**
-     * @group legacy
-     */
-    public function testObjectSupportEnabledPassingTrue()
-    {
-        $dump = $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, false, true);
-
-        $this->assertEquals('{ foo: !php/object:O:30:"Symfony\Component\Yaml\Tests\A":1:{s:1:"a";s:3:"foo";}, bar: 1 }', $dump, '->dump() is able to dump objects');
+        $this->assertEquals('{ foo: !php/object \'O:30:"Symfony\Component\Yaml\Tests\A":1:{s:1:"a";s:3:"foo";}\', bar: 1 }', $dump, '->dump() is able to dump objects');
     }
 
     public function testObjectSupportDisabledButNoExceptions()
     {
-        $dump = $this->dumper->dump(array('foo' => new A(), 'bar' => 1));
+        $dump = $this->dumper->dump(['foo' => new A(), 'bar' => 1]);
 
         $this->assertEquals('{ foo: null, bar: 1 }', $dump, '->dump() does not dump objects when disabled');
     }
@@ -235,34 +196,7 @@ EOF;
      */
     public function testObjectSupportDisabledWithExceptions()
     {
-        $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE);
-    }
-
-    /**
-     * @group legacy
-     * @expectedException \Symfony\Component\Yaml\Exception\DumpException
-     */
-    public function testObjectSupportDisabledWithExceptionsPassingTrue()
-    {
-        $this->dumper->dump(array('foo' => new A(), 'bar' => 1), 0, 0, true);
-    }
-
-    public function testEmptyArray()
-    {
-        $dump = $this->dumper->dump(array());
-        $this->assertEquals('{  }', $dump);
-
-        $dump = $this->dumper->dump(array(), 0, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
-        $this->assertEquals('[]', $dump);
-
-        $dump = $this->dumper->dump(array(), 9, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE);
-        $this->assertEquals('[]', $dump);
-
-        $dump = $this->dumper->dump(new \ArrayObject(), 0, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE | Yaml::DUMP_OBJECT_AS_MAP);
-        $this->assertEquals('{  }', $dump);
-
-        $dump = $this->dumper->dump(new \stdClass(), 0, 0, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE | Yaml::DUMP_OBJECT_AS_MAP);
-        $this->assertEquals('{  }', $dump);
+        $this->dumper->dump(['foo' => new A(), 'bar' => 1], 0, 0, Yaml::DUMP_EXCEPTION_ON_INVALID_TYPE);
     }
 
     /**
@@ -275,27 +209,27 @@ EOF;
 
     public function getEscapeSequences()
     {
-        return array(
-            'empty string' => array('', "''"),
-            'null' => array("\x0", '"\\0"'),
-            'bell' => array("\x7", '"\\a"'),
-            'backspace' => array("\x8", '"\\b"'),
-            'horizontal-tab' => array("\t", '"\\t"'),
-            'line-feed' => array("\n", '"\\n"'),
-            'vertical-tab' => array("\v", '"\\v"'),
-            'form-feed' => array("\xC", '"\\f"'),
-            'carriage-return' => array("\r", '"\\r"'),
-            'escape' => array("\x1B", '"\\e"'),
-            'space' => array(' ', "' '"),
-            'double-quote' => array('"', "'\"'"),
-            'slash' => array('/', '/'),
-            'backslash' => array('\\', '\\'),
-            'next-line' => array("\xC2\x85", '"\\N"'),
-            'non-breaking-space' => array("\xc2\xa0", '"\\_"'),
-            'line-separator' => array("\xE2\x80\xA8", '"\\L"'),
-            'paragraph-separator' => array("\xE2\x80\xA9", '"\\P"'),
-            'colon' => array(':', "':'"),
-        );
+        return [
+            'empty string' => ['', "''"],
+            'null' => ["\x0", '"\\0"'],
+            'bell' => ["\x7", '"\\a"'],
+            'backspace' => ["\x8", '"\\b"'],
+            'horizontal-tab' => ["\t", '"\\t"'],
+            'line-feed' => ["\n", '"\\n"'],
+            'vertical-tab' => ["\v", '"\\v"'],
+            'form-feed' => ["\xC", '"\\f"'],
+            'carriage-return' => ["\r", '"\\r"'],
+            'escape' => ["\x1B", '"\\e"'],
+            'space' => [' ', "' '"],
+            'double-quote' => ['"', "'\"'"],
+            'slash' => ['/', '/'],
+            'backslash' => ['\\', '\\'],
+            'next-line' => ["\xC2\x85", '"\\N"'],
+            'non-breaking-space' => ["\xc2\xa0", '"\\_"'],
+            'line-separator' => ["\xE2\x80\xA8", '"\\L"'],
+            'paragraph-separator' => ["\xE2\x80\xA9", '"\\P"'],
+            'colon' => [':', "':'"],
+        ];
     }
 
     public function testBinaryDataIsDumpedBase64Encoded()
@@ -303,7 +237,7 @@ EOF;
         $binaryData = file_get_contents(__DIR__.'/Fixtures/arrow.gif');
         $expected = '{ data: !!binary '.base64_encode($binaryData).' }';
 
-        $this->assertSame($expected, $this->dumper->dump(array('data' => $binaryData)));
+        $this->assertSame($expected, $this->dumper->dump(['data' => $binaryData]));
     }
 
     public function testNonUtf8DataIsDumpedBase64Encoded()
@@ -324,18 +258,18 @@ EOF;
 
     public function objectAsMapProvider()
     {
-        $tests = array();
+        $tests = [];
 
         $bar = new \stdClass();
         $bar->class = 'classBar';
-        $bar->args = array('bar');
+        $bar->args = ['bar'];
         $zar = new \stdClass();
         $foo = new \stdClass();
         $foo->bar = $bar;
         $foo->zar = $zar;
         $object = new \stdClass();
         $object->foo = $foo;
-        $tests['stdClass'] = array($object, $object);
+        $tests['stdClass'] = [$object, $object];
 
         $arrayObject = new \ArrayObject();
         $arrayObject['foo'] = 'bar';
@@ -343,19 +277,19 @@ EOF;
         $parsedArrayObject = new \stdClass();
         $parsedArrayObject->foo = 'bar';
         $parsedArrayObject->baz = 'foobar';
-        $tests['ArrayObject'] = array($arrayObject, $parsedArrayObject);
+        $tests['ArrayObject'] = [$arrayObject, $parsedArrayObject];
 
         $a = new A();
-        $tests['arbitrary-object'] = array($a, null);
+        $tests['arbitrary-object'] = [$a, null];
 
         return $tests;
     }
 
     public function testDumpingArrayObjectInstancesRespectsInlineLevel()
     {
-        $deep = new \ArrayObject(array('deep1' => 'd', 'deep2' => 'e'));
-        $inner = new \ArrayObject(array('inner1' => 'b', 'inner2' => 'c', 'inner3' => $deep));
-        $outer = new \ArrayObject(array('outer1' => 'a', 'outer2' => $inner));
+        $deep = new \ArrayObject(['deep1' => 'd', 'deep2' => 'e']);
+        $inner = new \ArrayObject(['inner1' => 'b', 'inner2' => 'c', 'inner3' => $deep]);
+        $outer = new \ArrayObject(['outer1' => 'a', 'outer2' => $inner]);
 
         $yaml = $this->dumper->dump($outer, 2, 0, Yaml::DUMP_OBJECT_AS_MAP);
 
@@ -372,9 +306,9 @@ YAML;
 
     public function testDumpingArrayObjectInstancesWithNumericKeysInlined()
     {
-        $deep = new \ArrayObject(array('d', 'e'));
-        $inner = new \ArrayObject(array('b', 'c', $deep));
-        $outer = new \ArrayObject(array('a', $inner));
+        $deep = new \ArrayObject(['d', 'e']);
+        $inner = new \ArrayObject(['b', 'c', $deep]);
+        $outer = new \ArrayObject(['a', $inner]);
 
         $yaml = $this->dumper->dump($outer, 0, 0, Yaml::DUMP_OBJECT_AS_MAP);
         $expected = <<<YAML
@@ -385,9 +319,9 @@ YAML;
 
     public function testDumpingArrayObjectInstancesWithNumericKeysRespectsInlineLevel()
     {
-        $deep = new \ArrayObject(array('d', 'e'));
-        $inner = new \ArrayObject(array('b', 'c', $deep));
-        $outer = new \ArrayObject(array('a', $inner));
+        $deep = new \ArrayObject(['d', 'e']);
+        $inner = new \ArrayObject(['b', 'c', $deep]);
+        $outer = new \ArrayObject(['a', $inner]);
         $yaml = $this->dumper->dump($outer, 2, 0, Yaml::DUMP_OBJECT_AS_MAP);
         $expected = <<<YAML
 0: a
@@ -440,19 +374,36 @@ YAML;
 
     public function testDumpMultiLineStringAsScalarBlock()
     {
-        $data = array(
-            'data' => array(
+        $data = [
+            'data' => [
                 'single_line' => 'foo bar baz',
-                'multi_line' => "foo\nline with trailing spaces:\n  \nbar\r\ninteger like line:\n123456789\nempty line:\n\nbaz",
-                'nested_inlined_multi_line_string' => array(
+                'multi_line' => "foo\nline with trailing spaces:\n  \nbar\ninteger like line:\n123456789\nempty line:\n\nbaz",
+                'multi_line_with_carriage_return' => "foo\nbar\r\nbaz",
+                'nested_inlined_multi_line_string' => [
                     'inlined_multi_line' => "foo\nbar\r\nempty line:\n\nbaz",
-                ),
-            ),
-        );
+                ],
+            ],
+        ];
 
         $this->assertSame(file_get_contents(__DIR__.'/Fixtures/multiple_lines_as_literal_block.yml'), $this->dumper->dump($data, 2, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK));
     }
 
+    public function testDumpMultiLineStringAsScalarBlockWhenFirstLineHasLeadingSpace()
+    {
+        $data = [
+            'data' => [
+                'multi_line' => "    the first line has leading spaces\nThe second line does not.",
+            ],
+        ];
+
+        $this->assertSame(file_get_contents(__DIR__.'/Fixtures/multiple_lines_as_literal_block_leading_space_in_first_line.yml'), $this->dumper->dump($data, 2, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK));
+    }
+
+    public function testCarriageReturnIsMaintainedWhenDumpingAsMultiLineLiteralBlock()
+    {
+        $this->assertSame("- \"a\\r\\nb\\nc\"\n", $this->dumper->dump(["a\r\nb\nc"], 2, 0, Yaml::DUMP_MULTI_LINE_LITERAL_BLOCK));
+    }
+
     /**
      * @expectedException \InvalidArgumentException
      * @expectedExceptionMessage The indentation must be greater than zero
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml
index 5f9c9427..81b4129a 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsAnchorAlias.yml
@@ -14,7 +14,7 @@ yaml: |
     - Oren
     - *showell
 php: |
-    array('Steve', 'Clark', 'Brian', 'Oren', 'Steve')
+    ['Steve', 'Clark', 'Brian', 'Oren', 'Steve']
 
 ---
 test: Alias of a Mapping
@@ -28,4 +28,4 @@ yaml: |
     - banana
     - *hello
 php: |
-    array(array('Meat'=>'pork', 'Starch'=>'potato'), 'banana', array('Meat'=>'pork', 'Starch'=>'potato'))
+    [['Meat'=>'pork', 'Starch'=>'potato'], 'banana', ['Meat'=>'pork', 'Starch'=>'potato']]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml
index dfd93021..1a08d8ea 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsBasicTests.yml
@@ -9,7 +9,7 @@ yaml: |
     - banana
     - carrot
 php: |
-    array('apple', 'banana', 'carrot')
+    ['apple', 'banana', 'carrot']
 ---
 test: Sequence With Item Being Null In The Middle
 brief: |
@@ -21,7 +21,7 @@ yaml: |
     -
     - carrot
 php: |
-    array('apple', null, 'carrot')
+    ['apple', null, 'carrot']
 ---
 test: Sequence With Last Item Being Null
 brief: |
@@ -33,7 +33,7 @@ yaml: |
     - banana
     -
 php: |
-    array('apple', 'banana', null)
+    ['apple', 'banana', null]
 ---
 test: Nested Sequences
 brief: |
@@ -46,7 +46,7 @@ yaml: |
      - bar
      - baz
 php: |
-    array(array('foo', 'bar', 'baz'))
+    [['foo', 'bar', 'baz']]
 ---
 test: Mixed Sequences
 brief: |
@@ -61,7 +61,7 @@ yaml: |
     - banana
     - carrot
 php: |
-    array('apple', array('foo', 'bar', 'x123'), 'banana', 'carrot')
+    ['apple', ['foo', 'bar', 'x123'], 'banana', 'carrot']
 ---
 test: Deeply Nested Sequences
 brief: |
@@ -74,7 +74,7 @@ yaml: |
       - uno
       - dos
 php: |
-    array(array(array('uno', 'dos')))
+    [[['uno', 'dos']]]
 ---
 test: Simple Mapping
 brief: |
@@ -87,7 +87,7 @@ yaml: |
     foo: whatever
     bar: stuff
 php: |
-    array('foo' => 'whatever', 'bar' => 'stuff')
+    ['foo' => 'whatever', 'bar' => 'stuff']
 ---
 test: Sequence in a Mapping
 brief: |
@@ -98,7 +98,7 @@ yaml: |
      - uno
      - dos
 php: |
-    array('foo' => 'whatever', 'bar' => array('uno', 'dos'))
+    ['foo' => 'whatever', 'bar' => ['uno', 'dos']]
 ---
 test: Nested Mappings
 brief: |
@@ -110,14 +110,14 @@ yaml: |
      name: steve
      sport: baseball
 php: |
-    array(
+    [
       'foo' => 'whatever',
-      'bar' => array(
+      'bar' => [
          'fruit' => 'apple',
          'name' => 'steve',
          'sport' => 'baseball'
-       )
-    )
+      ]
+    ]
 ---
 test: Mixed Mapping
 brief: |
@@ -136,22 +136,22 @@ yaml: |
        perl: papers
        ruby: scissorses
 php: |
-    array(
+    [
       'foo' => 'whatever',
-      'bar' => array(
-        array(
+      'bar' => [
+        [
             'fruit' => 'apple',
             'name' => 'steve',
             'sport' => 'baseball'
-        ),
+        ],
         'more',
-        array(
+        [
             'python' => 'rocks',
             'perl' => 'papers',
             'ruby' => 'scissorses'
-        )
-      )
-    )
+        ]
+      ]
+    ]
 ---
 test: Mapping-in-Sequence Shortcut
 todo: true
@@ -163,7 +163,7 @@ yaml: |
      - work on YAML.py:
         - work on Store
 php: |
-    array(array('work on YAML.py' => array('work on Store')))
+    [['work on YAML.py' => ['work on Store']]]
 ---
 test: Sequence-in-Mapping Shortcut
 todo: true
@@ -177,7 +177,7 @@ yaml: |
      - '%.sourceforge.net'
      - '%.freepan.org'
 php: |
-     array('allow' => array('localhost', '%.sourceforge.net', '%.freepan.org'))
+     ['allow' => ['localhost', '%.sourceforge.net', '%.freepan.org']]
 ---
 todo: true
 test: Merge key
@@ -192,11 +192,11 @@ yaml: |
        <<:
          age: 38
 php: |
-     array(
+     [
        'mapping' =>
-       array(
+       [
          'name' => 'Joe',
          'job' => 'Accountant',
          'age' => 38
-       )
-     )
+       ]
+     ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml
index f7ca469b..1f3a2e54 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsBlockMapping.yml
@@ -5,7 +5,7 @@ brief: |
 yaml: |
     foo: bar
 php: |
-    array('foo' => 'bar')
+    ['foo' => 'bar']
 ---
 test: Multi Element Mapping
 brief: |
@@ -15,11 +15,11 @@ yaml: |
     white: walls
     blue: berries
 php: |
-    array(
+    [
      'red' => 'baron',
      'white' => 'walls',
      'blue' => 'berries',
-    )
+    ]
 ---
 test: Values aligned
 brief: |
@@ -30,11 +30,11 @@ yaml: |
     white: walls
     blue:  berries
 php: |
-    array(
+    [
      'red' => 'baron',
      'white' => 'walls',
      'blue' => 'berries',
-    )
+    ]
 ---
 test: Colons aligned
 brief: |
@@ -44,8 +44,8 @@ yaml: |
     white : walls
     blue  : berries
 php: |
-    array(
+    [
      'red' => 'baron',
      'white' => 'walls',
      'blue' => 'berries',
-    )
+    ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml
index d9881025..67cb47ad 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsDocumentSeparator.yml
@@ -49,7 +49,7 @@ yaml: |
     foo: 1
     bar: 2
 php: |
-    array('foo' => 1, 'bar' => 2)
+    ['foo' => 1, 'bar' => 2]
 documents: 1
 
 ---
@@ -63,7 +63,7 @@ yaml: |
     foo: |
         ---
 php: |
-    array('foo' => "---\n")
+    ['foo' => "---\n"]
 
 ---
 test: Multiple Document Separators in Block
@@ -79,7 +79,7 @@ yaml: |
     bar: |
         fooness
 php: |
-    array(
+    [
        'foo' => "---\nfoo: bar\n---\nyo: baz\n",
        'bar' => "fooness\n"
-    )
+    ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml
index e8506fcb..e8697f93 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsErrorTests.yml
@@ -22,4 +22,4 @@ yaml: |
     firstline: 1
     secondline: 2
 php: |
-  array('foo' => null, 'firstline' => 1, 'secondline' => 2)
+  ['foo' => null, 'firstline' => 1, 'secondline' => 2]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml
index 03090e4a..cc562cd9 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsFlowCollections.yml
@@ -8,7 +8,7 @@ brief: >
 yaml: |
     seq: [ a, b, c ]
 php: |
-    array('seq' => array('a', 'b', 'c'))
+    ['seq' => ['a', 'b', 'c']]
 ---
 test: Simple Inline Hash
 brief: >
@@ -21,7 +21,7 @@ brief: >
 yaml: |
     hash: { name: Steve, foo: bar }
 php: |
-    array('hash' => array('name' => 'Steve', 'foo' => 'bar'))
+    ['hash' => ['name' => 'Steve', 'foo' => 'bar']]
 ---
 test: Multi-line Inline Collections
 todo: true
@@ -38,15 +38,15 @@ yaml: |
                 Python: python.org,
                 Perl: use.perl.org }
 php: |
-    array(
-      'languages' => array('Ruby', 'Perl', 'Python'),
-      'websites' => array(
+    [
+      'languages' => ['Ruby', 'Perl', 'Python'],
+      'websites' => [
         'YAML' => 'yaml.org',
         'Ruby' => 'ruby-lang.org',
         'Python' => 'python.org',
         'Perl' => 'use.perl.org'
-      )
-    )
+      ]
+    ]
 ---
 test: Commas in Values (not in the spec!)
 todo: true
@@ -57,4 +57,4 @@ brief: >
 yaml: |
     attendances: [ 45,123, 70,000, 17,222 ]
 php: |
-    array('attendances' => array(45123, 70000, 17222))
+    ['attendances' => [45123, 70000, 17222]]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml
index a14735a5..2895202a 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsFoldedScalars.yml
@@ -12,7 +12,7 @@ yaml: |
         Foo
         Bar
 php: |
-    array('this' => "Foo\nBar\n")
+    ['this' => "Foo\nBar\n"]
 ---
 test: The '+' indicator
 brief: >
@@ -28,11 +28,11 @@ yaml: |
 
     dummy: value
 php: |
-    array(
+    [
         'normal' => "extra new lines not kept\n",
         'preserving' => "extra new lines are kept\n\n\n",
         'dummy' => 'value'
-    )
+    ]
 ---
 test: Three trailing newlines in literals
 brief: >
@@ -64,14 +64,14 @@ yaml: |
 
     same as "kept" above: "This has four newlines.\n\n\n\n"
 php: |
-    array(
+    [
       'clipped' => "This has one newline.\n",
       'same as "clipped" above' => "This has one newline.\n",
       'stripped' => 'This has no newline.',
       'same as "stripped" above' => 'This has no newline.',
       'kept' => "This has four newlines.\n\n\n\n",
       'same as "kept" above' => "This has four newlines.\n\n\n\n"
-    )
+    ]
 ---
 test: Extra trailing newlines with spaces
 todo: true
@@ -95,8 +95,8 @@ yaml: |
 
 
 php: |
-    array('this' => "Foo\n\n  \n",
-      'kept' => "Foo\n\n  \n" )
+    ['this' => "Foo\n\n  \n",
+      'kept' => "Foo\n\n  \n"]
 
 ---
 test: Folded Block in a Sequence
@@ -115,12 +115,12 @@ yaml: |
         hmm
     - dog
 php: |
-    array(
+    [
         'apple',
         'banana',
         "can't you see the beauty of yaml? hmm\n",
         'dog'
-    )
+    ]
 ---
 test: Folded Block as a Mapping Value
 brief: >
@@ -135,10 +135,10 @@ yaml: |
         by a knee injury.
     source: espn
 php: |
-    array(
+    [
         'quote' => "Mark McGwire's year was crippled by a knee injury.\n",
         'source' => 'espn'
-    )
+    ]
 ---
 test: Three trailing newlines in folded blocks
 brief: >
@@ -166,11 +166,11 @@ yaml: |
 
     same as "kept" above: "This has four newlines.\n\n\n\n"
 php: |
-    array(
+    [
       'clipped' => "This has one newline.\n",
       'same as "clipped" above' => "This has one newline.\n",
       'stripped' => 'This has no newline.',
       'same as "stripped" above' => 'This has no newline.',
       'kept' => "This has four newlines.\n\n\n\n",
       'same as "kept" above' => "This has four newlines.\n\n\n\n"
-    )
+    ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml
index 9a5300f2..ea8e36ed 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsNullsAndEmpties.yml
@@ -6,7 +6,7 @@ brief: >
 yaml: |
     empty: []
 php: |
-    array('empty' => array())
+    ['empty' => []]
 ---
 test: Empty Mapping
 brief: >
@@ -15,19 +15,19 @@ brief: >
 yaml: |
     empty: {}
 php: |
-    array('empty' => array())
+    ['empty' => []]
 ---
 test: Empty Sequence as Entire Document
 yaml: |
     []
 php: |
-    array()
+    []
 ---
 test: Empty Mapping as Entire Document
 yaml: |
     {}
 php: |
-    array()
+    []
 ---
 test: Null as Document
 yaml: |
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml
index 45e27b7b..80696cd1 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsSpecificationExamples.yml
@@ -6,7 +6,7 @@ yaml: |
   - Sammy Sosa
   - Ken Griffey
 php: |
-  array('Mark McGwire', 'Sammy Sosa', 'Ken Griffey')
+  ['Mark McGwire', 'Sammy Sosa', 'Ken Griffey']
 ---
 test: Mapping of scalars to scalars
 spec: 2.2
@@ -15,7 +15,7 @@ yaml: |
   avg: 0.278
   rbi: 147
 php: |
-  array('hr' => 65, 'avg' => 0.278, 'rbi' => 147)
+  ['hr' => 65, 'avg' => 0.278, 'rbi' => 147]
 ---
 test: Mapping of scalars to sequences
 spec: 2.3
@@ -29,13 +29,13 @@ yaml: |
        - Chicago Cubs
        - Atlanta Braves
 php: |
-    array('american' =>
-        array( 'Boston Red Sox', 'Detroit Tigers',
-          'New York Yankees' ),
+    ['american' =>
+        [ 'Boston Red Sox', 'Detroit Tigers',
+          'New York Yankees' ],
       'national' =>
-        array( 'New York Mets', 'Chicago Cubs',
-          'Atlanta Braves' )
-    )
+        [ 'New York Mets', 'Chicago Cubs',
+          'Atlanta Braves' ]
+    ]
 ---
 test: Sequence of mappings
 spec: 2.4
@@ -49,10 +49,10 @@ yaml: |
       hr:   63
       avg:  0.288
 php: |
-    array(
-      array('name' => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278),
-      array('name' => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288)
-    )
+    [
+      ['name' => 'Mark McGwire', 'hr' => 65, 'avg' => 0.278],
+      ['name' => 'Sammy Sosa', 'hr' => 63, 'avg' => 0.288]
+    ]
 ---
 test: Legacy A5
 todo: true
@@ -72,7 +72,7 @@ yaml: |
       - 2001-07-23
 perl-busted: >
     YAML.pm will be able to emulate this behavior soon. In this regard
-    it may be somewhat more correct than Python's native behaviour which
+    it may be somewhat more correct than Python's native behavior which
     can only use tuples as mapping keys. PyYAML will also need to figure
     out some clever way to roundtrip structured keys.
 python: |
@@ -134,11 +134,11 @@ yaml: |
   - [ Mark McGwire , 65 , 0.278 ]
   - [ Sammy Sosa   , 63 , 0.288 ]
 php: |
-  array(
-    array( 'name', 'hr', 'avg' ),
-    array( 'Mark McGwire', 65, 0.278 ),
-    array( 'Sammy Sosa', 63, 0.288 )
-  )
+  [
+    [ 'name', 'hr', 'avg' ],
+    [ 'Mark McGwire', 65, 0.278 ],
+    [ 'Sammy Sosa', 63, 0.288 ]
+  ]
 ---
 test: Mapping of mappings
 todo: true
@@ -150,12 +150,12 @@ yaml: |
       avg: 0.288
     }
 php: |
-  array(
+  [
     'Mark McGwire' =>
-      array( 'hr' => 65, 'avg' => 0.278 ),
+      [ 'hr' => 65, 'avg' => 0.278 ],
     'Sammy Sosa' =>
-      array( 'hr' => 63, 'avg' => 0.288 )
-  )
+      [ 'hr' => 63, 'avg' => 0.288 ]
+  ]
 ---
 test: Two documents in a stream each with a leading comment
 todo: true
@@ -208,10 +208,10 @@ yaml: |
     - Sammy Sosa
     - Ken Griffey
 php: |
-  array(
-    'hr' => array( 'Mark McGwire', 'Sammy Sosa' ),
-    'rbi' => array( 'Sammy Sosa', 'Ken Griffey' )
-  )
+  [
+    'hr' => [ 'Mark McGwire', 'Sammy Sosa' ],
+    'rbi' => [ 'Sammy Sosa', 'Ken Griffey' ]
+  ]
 ---
 test: Node for Sammy Sosa appears twice in this document
 spec: 2.10
@@ -225,12 +225,12 @@ yaml: |
       - *SS # Subsequent occurrence
       - Ken Griffey
 php: |
-   array(
+   [
       'hr' =>
-         array('Mark McGwire', 'Sammy Sosa'),
+         ['Mark McGwire', 'Sammy Sosa'],
       'rbi' =>
-         array('Sammy Sosa', 'Ken Griffey')
-   )
+         ['Sammy Sosa', 'Ken Griffey']
+    ]
 ---
 test: Mapping between sequences
 todo: true
@@ -297,20 +297,20 @@ yaml: |
   - item    : Big Shoes
     quantity: 1
 php: |
-  array (
-    array (
+  [
+    [
       'item' => 'Super Hoop',
       'quantity' => 1,
-    ),
-    array (
+    ],
+    [
       'item' => 'Basketball',
       'quantity' => 4,
-    ),
-    array (
+    ],
+    [
       'item' => 'Big Shoes',
       'quantity' => 1,
-    )
-  )
+    ]
+  ]
 perl: |
   [
      { item => 'Super Hoop', quantity => 1 },
@@ -462,11 +462,11 @@ yaml: |
      65 Home Runs
      0.278 Batting Average
 php: |
-  array(
+  [
     'name' => 'Mark McGwire',
     'accomplishment' => "Mark set a major league home run record in 1998.\n",
     'stats' => "65 Home Runs\n0.278 Batting Average\n"
-  )
+  ]
 ---
 test: Quoted scalars
 todo: true
@@ -512,21 +512,11 @@ yaml: |
   octal: 014
   hexadecimal: 0xC
 php: |
-  array(
+  [
     'canonical' => 12345,
     'octal' => 014,
     'hexadecimal' => 0xC
-  )
----
-test: Decimal Integer
-deprecated: true
-spec: 2.19
-yaml: |
-  decimal: +12,345
-php: |
-  array(
-    'decimal' => 12345.0,
-  )
+  ]
 ---
 # FIX: spec shows parens around -inf and NaN
 test: Floating point
@@ -538,23 +528,13 @@ yaml: |
   not a number: .NaN
   float as whole number: !!float 1
 php: |
-  array(
+  [
     'canonical' => 1230.15,
     'exponential' => 1230.15,
     'negative infinity' => log(0),
     'not a number' => -log(0),
     'float as whole number' => (float) 1
-  )
----
-test: Fixed Floating point
-deprecated: true
-spec: 2.20
-yaml: |
-  fixed: 1,230.15
-php: |
-  array(
-    'fixed' => 1230.15,
-  )
+  ]
 ---
 test: Timestamps
 todo: true
@@ -565,12 +545,12 @@ yaml: |
   spaced:  2001-12-14 21:59:43.10 -05:00
   date:   2002-12-14 # Time is noon UTC
 php: |
-  array(
+  [
     'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
     'iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
     'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
     'date' => Date.new( 2002, 12, 14 )
-  )
+  ]
 ---
 test: legacy Timestamps test
 todo: true
@@ -581,18 +561,18 @@ yaml: |
     spaced:  2001-12-14 21:59:43.00 -05:00
     date:   2002-12-14
 php: |
-   array(
+   [
      'canonical' => Time::utc( 2001, 12, 15, 2, 59, 43, 0 ),
      'iso8601' => YAML::mktime( 2001, 2, 28, 21, 59, 43, 0, "-05:00" ),
      'spaced' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0, "-05:00" ),
      'date' => Date.new( 2002, 12, 14 )
-   )
+   ]
 ---
 test: Various explicit families
 todo: true
 spec: 2.23
 yaml: |
-  not-date: !str 2002-04-28
+  not-date: !!str 2002-04-28
   picture: !binary |
    R0lGODlhDAAMAIQAAP//9/X
    17unp5WZmZgAAAOfn515eXv
@@ -754,20 +734,20 @@ yaml: |
     Backup contact is Nancy
     Billsmer @ 338-4338.
 php: |
-  array(
+  [
      'invoice' => 34843, 'date' => gmmktime(0, 0, 0, 1, 23, 2001),
      'bill-to' =>
-      array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) )
+      [ 'given' => 'Chris', 'family' => 'Dumars', 'address' => [ 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ]]
      , 'ship-to' =>
-      array( 'given' => 'Chris', 'family' => 'Dumars', 'address' => array( 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ) )
+      [ 'given' => 'Chris', 'family' => 'Dumars', 'address' => [ 'lines' => "458 Walkman Dr.\nSuite #292\n", 'city' => 'Royal Oak', 'state' => 'MI', 'postal' => 48046 ]]
      , 'product' =>
-       array(
-        array( 'sku' => 'BL394D', 'quantity' => 4, 'description' => 'Basketball', 'price' => 450.00 ),
-        array( 'sku' => 'BL4438H', 'quantity' => 1, 'description' => 'Super Hoop', 'price' => 2392.00 )
-      ),
+       [
+        [ 'sku' => 'BL394D', 'quantity' => 4, 'description' => 'Basketball', 'price' => 450.00 ],
+        [ 'sku' => 'BL4438H', 'quantity' => 1, 'description' => 'Super Hoop', 'price' => 2392.00 ]
+      ],
      'tax' => 251.42, 'total' => 4443.52,
      'comments' => "Late afternoon is best. Backup contact is Nancy Billsmer @ 338-4338.\n"
-  )
+  ]
 ---
 test: Log file
 todo: true
@@ -826,9 +806,9 @@ yaml: |
    # These are three throwaway comment
    # lines (the first line is empty).
 php: |
-   array(
+   [
      'this' => "contains three lines of text.\nThe third one starts with a\n# character. This isn't a comment.\n"
-   )
+   ]
 ---
 test: Document with a single value
 todo: true
@@ -878,11 +858,11 @@ yaml: |
    date    : 2001-01-23
    total   : 4443.52
 php: |
-   array(
+   [
       'invoice' => 34843,
       'date' => gmmktime(0, 0, 0, 1, 23, 2001),
       'total' => 4443.52
-   )
+   ]
 ---
 test: Single-line documents
 todo: true
@@ -930,10 +910,10 @@ documents: 2
 test: Explicit typing
 yaml: |
    integer: 12
-   also int: ! "12"
-   string: !str 12
+   no int: ! 12
+   string: !!str 12
 php: |
-   array( 'integer' => 12, 'also int' => 12, 'string' => '12' )
+   [ 'integer' => 12, 'no int' => '12', 'string' => '12' ]
 ---
 test: Private types
 todo: true
@@ -963,9 +943,9 @@ documents: 2
 test: Type family under yaml.org
 yaml: |
   # The URI is 'tag:yaml.org,2002:str'
-  - !str a Unicode string
+  - !!str a Unicode string
 php: |
-  array( 'a Unicode string' )
+  [ 'a Unicode string' ]
 ---
 test: Type family under perl.yaml.org
 todo: true
@@ -1038,9 +1018,9 @@ yaml: |
    repeated use of this value.
   alias : *A001
 php: |
-  array( 'anchor' => 'This scalar has an anchor.',
+  [ 'anchor' => 'This scalar has an anchor.',
     'override' => "The alias node below is a repeated use of this value.\n",
-    'alias' => "The alias node below is a repeated use of this value.\n" )
+    'alias' => "The alias node below is a repeated use of this value.\n" ]
 ---
 test: Flow and block formatting
 todo: true
@@ -1151,12 +1131,12 @@ yaml: |
    redundant: |2
      This value is indented 2 spaces.
 php: |
-   array(
+   [
       'leading spaces' => "    This value starts with four spaces.\n",
       'leading line break' => "\nThis value starts with a line break.\n",
       'leading comment indicator' => "# first line starts with a\n# character.\n",
       'redundant' => "This value is indented 2 spaces.\n"
-   )
+   ]
 ---
 test: Chomping and keep modifiers
 yaml: |
@@ -1175,14 +1155,14 @@ yaml: |
 
     same as "kept" above: "This has two newlines.\n\n"
 php: |
-    array(
+    [
       'clipped' => "This has one newline.\n",
       'same as "clipped" above' => "This has one newline.\n",
       'stripped' => 'This has no newline.',
       'same as "stripped" above' => 'This has no newline.',
       'kept' => "This has two newlines.\n\n",
       'same as "kept" above' => "This has two newlines.\n\n"
-    )
+    ]
 ---
 test: Literal combinations
 todo: true
@@ -1220,7 +1200,7 @@ yaml: |
 
    both are equal to: "  This has no newline."
 php: |
-   array(
+   [
      'empty' => '',
      'literal' => "The \\ ' \" characters may be\nfreely used. Leading white\n   space " +
        "is significant.\n\nLine breaks are significant.\nThus this value contains one\n" +
@@ -1231,7 +1211,7 @@ php: |
      'indented and chomped' => '  This has no newline.',
      'also written as' => '  This has no newline.',
      'both are equal to' => '  This has no newline.'
-   )
+   ]
 ---
 test: Folded combinations
 todo: true
@@ -1287,7 +1267,7 @@ yaml: |
    # Explicit comments may follow
    # but must be less indented.
 php: |
-   array(
+   [
      'empty' => '',
      'one paragraph' => 'Line feeds are converted to spaces, so this value'.
        " contains no line breaks except for the final one.\n",
@@ -1299,7 +1279,7 @@ php: |
      'above is equal to' => "This is a folded paragraph followed by a list:\n".
        " * first entry\n * second entry\nFollowed by another folded paragraph, ".
        "another list:\n\n * first entry\n\n * second entry\n\nAnd a final folded paragraph.\n"
-   )
+   ]
 ---
 test: Single quotes
 todo: true
@@ -1314,13 +1294,13 @@ yaml: |
          line break'
    is same as: "this contains six spaces\nand one line break"
 php: |
-   array(
+   [
      'empty' => '',
      'second' => '! : \\ etc. can be used freely.',
      'third' => "a single quote ' must be escaped.",
      'span' => "this contains six spaces\nand one line break",
      'is same as' => "this contains six spaces\nand one line break"
-   )
+   ]
 ---
 test: Double quotes
 todo: true
@@ -1334,14 +1314,14 @@ yaml: |
          spaces"
    is equal to: "this contains four  spaces"
 php: |
-   array(
+   [
      'empty' => '',
      'second' => '! : etc. can be used freely.',
      'third' => 'a " or a \\ must be escaped.',
      'fourth' => "this value ends with an LF.\n",
      'span' => "this contains four  spaces",
      'is equal to' => "this contains four  spaces"
-   )
+   ]
 ---
 test: Unquoted strings
 todo: true
@@ -1350,7 +1330,7 @@ yaml: |
 
    second: 12          ## This is an integer.
 
-   third: !str 12      ## This is a string.
+   third: !!str 12      ## This is a string.
 
    span: this contains
          six spaces
@@ -1370,7 +1350,7 @@ yaml: |
    note: { one-line keys: but multi-line values }
 
 php: |
-   array(
+   [
      'first' => 'There is no unquoted empty string.',
      'second' => 12,
      'third' => '12',
@@ -1378,7 +1358,7 @@ php: |
      'indicators' => "this has no comments. #:foo and bar# are both text.",
      'flow' => [ 'can span lines', 'like this' ],
      'note' => { 'one-line keys' => 'but multi-line values' }
-   )
+   ]
 ---
 test: Spanning sequences
 todo: true
@@ -1392,11 +1372,11 @@ yaml: |
      - one
      - two
 php: |
-   array(
+   [
      'flow' => [ 'one', 'two' ],
      'spanning' => [ 'one', 'two' ],
      'block' => [ 'one', 'two' ]
-   )
+   ]
 ---
 test: Flow mappings
 yaml: |
@@ -1407,10 +1387,10 @@ yaml: |
        one: 1
        two: 2
 php: |
-   array(
-     'flow' => array( 'one' => 1, 'two' => 2 ),
-     'block' => array( 'one' => 1, 'two' => 2 )
-   )
+   [
+     'flow' => [ 'one' => 1, 'two' => 2 ],
+     'block' => [ 'one' => 1, 'two' => 2 ]
+    ]
 ---
 test: Representations of 12
 todo: true
@@ -1419,7 +1399,7 @@ yaml: |
    # The following scalars
    # are loaded to the
    # string value '1' '2'.
-   - !str 12
+   - !!str 12
    - '12'
    - "12"
    - "\
@@ -1432,7 +1412,7 @@ yaml: |
    - foo/bar
    - /a.*b/
 php: |
-   array( 12, '12', '12', '12', '12', '/foo/bar', 'd:/foo/bar', 'foo/bar', '/a.*b/' )
+   [ 12, '12', '12', '12', '12', '/foo/bar', 'd:/foo/bar', 'foo/bar', '/a.*b/' ]
 ---
 test: "Null"
 todo: true
@@ -1454,12 +1434,12 @@ yaml: |
          only two with values.
 
 php: |
-   array (
+   [
      'canonical' => null,
      'english' => null,
-     'sparse' => array( null, '2nd entry', null, '4th entry', null ]),
+     'sparse' => [ null, '2nd entry', null, '4th entry', null ]],
      'four' => 'This mapping has five keys, only two with values.'
-   )
+      ]
 ---
 test: Omap
 todo: true
@@ -1524,29 +1504,11 @@ yaml: |
    octal: 014
    hexadecimal: 0xC
 php: |
-   array(
+   [
      'canonical' => 12345,
      'octal' => 12,
      'hexadecimal' => 12
-   )
----
-test: Decimal
-deprecated: true
-yaml: |
-   decimal: +12,345
-php: |
-   array(
-     'decimal' => 12345.0,
-   )
----
-test: Fixed Float
-deprecated: true
-yaml: |
-   fixed: 1,230.15
-php: |
-  array(
-    'fixed' => 1230.15,
-  )
+   ]
 ---
 test: Float
 yaml: |
@@ -1555,12 +1517,12 @@ yaml: |
    negative infinity: -.inf
    not a number: .NaN
 php: |
-  array(
+  [
     'canonical' => 1230.15,
     'exponential' => 1230.15,
     'negative infinity' => log(0),
     'not a number' => -log(0)
-  )
+  ]
 ---
 test: Timestamp
 todo: true
@@ -1570,12 +1532,12 @@ yaml: |
    space separated: 2001-12-14 21:59:43.10 -05:00
    date (noon UTC): 2002-12-14
 ruby: |
-   array(
+   [
      'canonical' => YAML::mktime( 2001, 12, 15, 2, 59, 43, 0.10 ),
      'valid iso8601' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
      'space separated' => YAML::mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
      'date (noon UTC)' => Date.new( 2002, 12, 14 )
-   )
+   ]
 ---
 test: Binary
 todo: true
diff --git a/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml b/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml
index 5b9df73b..9a03b7da 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/YtsTypeTransfers.yml
@@ -25,14 +25,14 @@ yaml: |
     - No, I mean, "And what about Yaml?"
     - Oh, oh yeah. Uh.. Yaml for Ruby.
 php: |
-    array(
+    [
       "What's Yaml?",
       "It's for writing data structures in plain text.",
       "And?",
       "And what? That's not good enough for you?",
       "No, I mean, \"And what about Yaml?\"",
       "Oh, oh yeah. Uh.. Yaml for Ruby."
-    )
+    ]
 ---
 test: Indicators in Strings
 brief: >
@@ -43,24 +43,24 @@ yaml: |
     same for the pound sign: here we have it#in a string
     the comma can, honestly, be used in most cases: [ but not in, inline collections ]
 php: |
-    array(
+    [
       'the colon followed by space is an indicator' => 'but is a string:right here',
       'same for the pound sign' => 'here we have it#in a string',
-      'the comma can, honestly, be used in most cases' => array('but not in', 'inline collections')
-    )
+      'the comma can, honestly, be used in most cases' => ['but not in', 'inline collections']
+    ]
 ---
 test: Forcing Strings
 brief: >
     Any YAML type can be forced into a string using the
-    explicit !str method.
+    explicit !!str method.
 yaml: |
-    date string: !str 2001-08-01
-    number string: !str 192
+    date string: !!str 2001-08-01
+    number string: !!str 192
 php: |
-    array(
+    [
       'date string' => '2001-08-01',
       'number string' => '192'
-    )
+    ]
 ---
 test: Single-quoted Strings
 brief: >
@@ -75,12 +75,12 @@ yaml: |
     why do i hate them?: 'it''s very hard to explain'
     entities: '&pound; me'
 php: |
-    array(
+    [
       'all my favorite symbols' => '#:!/%.)',
       'a few i hate' => '&(*',
       'why do i hate them?' => 'it\'s very hard to explain',
       'entities' => '&pound; me'
-    )
+    ]
 ---
 test: Double-quoted Strings
 brief: >
@@ -90,9 +90,9 @@ brief: >
 yaml: |
     i know where i want my line breaks: "one here\nand another here\n"
 php: |
-    array(
+    [
       'i know where i want my line breaks' => "one here\nand another here\n"
-    )
+    ]
 ---
 test: Multi-line Quoted Strings
 todo: true
@@ -106,10 +106,10 @@ yaml: |
       let it go on and on to other lines
       until i end it with a quote."
 php: |
-    array('i want a long string' => "so i'm going to ".
+    ['i want a long string' => "so i'm going to ".
          "let it go on and on to other lines ".
          "until i end it with a quote."
-    )
+    ]
 
 ---
 test: Plain scalars
@@ -128,7 +128,7 @@ yaml: |
     - This would impair my skiing ability somewhat for the
       duration, as can be imagined.
 php: |
-    array(
+    [
       "My little toe is broken in two places;",
       "I'm crazy to have skied this way;",
       "I'm not the craziest he's seen, since there was always ".
@@ -139,7 +139,7 @@ php: |
       "He's going to put my foot in plaster for a month;",
       "This would impair my skiing ability somewhat for the duration, ".
          "as can be imagined."
-    )
+    ]
 ---
 test: 'Null'
 brief: >
@@ -149,11 +149,11 @@ yaml: |
     hosted by: Bob and David
     date of next season: ~
 php: |
-    array(
+    [
       'name' => 'Mr. Show',
       'hosted by' => 'Bob and David',
       'date of next season' => null
-    )
+    ]
 ---
 test: Boolean
 brief: >
@@ -162,10 +162,10 @@ yaml: |
     Is Gus a Liar?: true
     Do I rely on Gus for Sustenance?: false
 php: |
-    array(
+    [
       'Is Gus a Liar?' => true,
       'Do I rely on Gus for Sustenance?' => false
-    )
+    ]
 ---
 test: Integers
 dump_skip: true
@@ -177,38 +177,10 @@ yaml: |
     zero: 0
     simple: 12
 php: |
-    array(
+    [
       'zero' => 0,
       'simple' => 12,
-    )
----
-test: Positive Big Integer
-deprecated: true
-dump_skip: true
-brief: >
-    An integer is a series of numbers, optionally
-    starting with a positive or negative sign.  Integers
-    may also contain commas for readability.
-yaml: |
-    one-thousand: 1,000
-php: |
-    array(
-      'one-thousand' => 1000.0,
-    )
----
-test: Negative Big Integer
-deprecated: true
-dump_skip: true
-brief: >
-    An integer is a series of numbers, optionally
-    starting with a positive or negative sign.  Integers
-    may also contain commas for readability.
-yaml: |
-    negative one-thousand: -1,000
-php: |
-    array(
-      'negative one-thousand' => -1000.0
-    )
+    ]
 ---
 test: Floats
 dump_skip: true
@@ -220,24 +192,10 @@ yaml: |
      a simple float: 2.00
      scientific notation: 1.00009e+3
 php: |
-     array(
+     [
        'a simple float' => 2.0,
        'scientific notation' => 1000.09
-     )
----
-test: Larger Float
-dump_skip: true
-deprecated: true
-brief: >
-     Floats are represented by numbers with decimals,
-     allowing for scientific notation, as well as
-     positive and negative infinity and "not a number."
-yaml: |
-     larger float: 1,000.09
-php: |
-     array(
-       'larger float' => 1000.09,
-     )
+     ]
 ---
 test: Time
 todo: true
@@ -250,10 +208,10 @@ yaml: |
     iso8601: 2001-12-14t21:59:43.10-05:00
     space separated: 2001-12-14 21:59:43.10 -05:00
 php: |
-    array(
+    [
       'iso8601' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" ),
       'space separated' => mktime( 2001, 12, 14, 21, 59, 43, 0.10, "-05:00" )
-    )
+    ]
 ---
 test: Date
 todo: true
diff --git a/vendor/symfony/yaml/Tests/Fixtures/booleanMappingKeys.yml b/vendor/symfony/yaml/Tests/Fixtures/booleanMappingKeys.yml
index 26799e8e..88287f1b 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/booleanMappingKeys.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/booleanMappingKeys.yml
@@ -5,7 +5,7 @@ yaml: |
   true: true
   false: false
 php: |
-  array(
+  [
     'true' => true,
     'false' => false,
-  )
+  ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml b/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml
index 6ca044c8..87d352db 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/escapedCharacters.yml
@@ -4,7 +4,7 @@ yaml: |
 php: |
     "\\0 \\ \\a \\b \\n"
 ---
-test: null
+test: 'null'
 yaml: |
     "\0"
 php: |
@@ -142,14 +142,14 @@ test: Double quotes with a line feed
 yaml: |
    { double: "some value\n \"some quoted string\" and 'some single quotes one'" }
 php: |
-    array(
+    [
         'double' => "some value\n \"some quoted string\" and 'some single quotes one'"
-    )
+    ]
 ---
 test: Backslashes
 yaml: |
     { single: 'foo\Var', no-quotes: foo\Var, double: "foo\\Var" }
 php: |
-    array(
+    [
         'single' => 'foo\Var', 'no-quotes' => 'foo\Var', 'double' => 'foo\Var'
-    )
+    ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/legacyBooleanMappingKeys.yml b/vendor/symfony/yaml/Tests/Fixtures/legacyBooleanMappingKeys.yml
deleted file mode 100644
index 5e8d0917..00000000
--- a/vendor/symfony/yaml/Tests/Fixtures/legacyBooleanMappingKeys.yml
+++ /dev/null
@@ -1,23 +0,0 @@
---- %YAML:1.0
-test: Miscellaneous
-spec: 2.21
-yaml: |
-  true: true
-  false: false
-php: |
-  array(
-    1 => true,
-    0 => false,
-  )
----
-test: Boolean
-yaml: |
-   false: used as key
-   logical:  true
-   answer: false
-php: |
-   array(
-     false => 'used as key',
-     'logical' => true,
-     'answer' => false
-   )
diff --git a/vendor/symfony/yaml/Tests/Fixtures/legacyNonStringKeys.yml b/vendor/symfony/yaml/Tests/Fixtures/legacyNonStringKeys.yml
deleted file mode 100644
index 4e282018..00000000
--- a/vendor/symfony/yaml/Tests/Fixtures/legacyNonStringKeys.yml
+++ /dev/null
@@ -1,2 +0,0 @@
-- legacyBooleanMappingKeys
-- legacyNullMappingKey
diff --git a/vendor/symfony/yaml/Tests/Fixtures/legacyNullMappingKey.yml b/vendor/symfony/yaml/Tests/Fixtures/legacyNullMappingKey.yml
deleted file mode 100644
index 551a6205..00000000
--- a/vendor/symfony/yaml/Tests/Fixtures/legacyNullMappingKey.yml
+++ /dev/null
@@ -1,9 +0,0 @@
---- %YAML:1.0
-test: Miscellaneous
-spec: 2.21
-yaml: |
-  null: ~
-php: |
-  array(
-    '' => null,
-  )
diff --git a/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml b/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml
index b4903d30..9d72f09b 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block.yml
@@ -10,4 +10,5 @@ data:
         empty line:
         
         baz
+    multi_line_with_carriage_return: "foo\nbar\r\nbaz"
     nested_inlined_multi_line_string: { inlined_multi_line: "foo\nbar\r\nempty line:\n\nbaz" }
diff --git a/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block_leading_space_in_first_line.yml b/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block_leading_space_in_first_line.yml
new file mode 100644
index 00000000..3f2dedd1
--- /dev/null
+++ b/vendor/symfony/yaml/Tests/Fixtures/multiple_lines_as_literal_block_leading_space_in_first_line.yml
@@ -0,0 +1,4 @@
+data:
+    multi_line: |4
+            the first line has leading spaces
+        The second line does not.
diff --git a/vendor/symfony/yaml/Tests/Fixtures/not_readable.yml b/vendor/symfony/yaml/Tests/Fixtures/not_readable.yml
new file mode 100644
index 00000000..3216a89e
--- /dev/null
+++ b/vendor/symfony/yaml/Tests/Fixtures/not_readable.yml
@@ -0,0 +1,18 @@
+- escapedCharacters
+- sfComments
+- sfCompact
+- sfTests
+- sfObjects
+- sfMergeKey
+- sfQuotes
+- YtsAnchorAlias
+- YtsBasicTests
+- YtsBlockMapping
+- YtsDocumentSeparator
+- YtsErrorTests
+- YtsFlowCollections
+- YtsFoldedScalars
+- YtsNullsAndEmpties
+- YtsSpecificationExamples
+- YtsTypeTransfers
+- unindentedCollections
diff --git a/vendor/symfony/yaml/Tests/Fixtures/nullMappingKey.yml b/vendor/symfony/yaml/Tests/Fixtures/nullMappingKey.yml
index 7dcadc72..cd90f7b4 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/nullMappingKey.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/nullMappingKey.yml
@@ -4,6 +4,6 @@ spec: 2.21
 yaml: |
   null: ~
 php: |
-  array(
+  [
     'null' => null,
-  )
+  ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/numericMappingKeys.yml b/vendor/symfony/yaml/Tests/Fixtures/numericMappingKeys.yml
index 9cfb7713..246447e4 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/numericMappingKeys.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/numericMappingKeys.yml
@@ -6,7 +6,7 @@ yaml: |
   1: foo
   0: bar
 php: |
-  array(1 => 'foo', 0 => 'bar')
+  [1 => 'foo', 0 => 'bar']
 ---
 test: Integers as Map Keys
 brief: >
@@ -16,8 +16,8 @@ yaml: |
     2: two
     3: three
 php: |
-    array(
+    [
         1 => 'one',
         2 => 'two',
         3 => 'three'
-    )
+    ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml b/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml
index b72a9b69..af3ab385 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/sfComments.yml
@@ -11,7 +11,7 @@ yaml: |
     ex6: foo#foo # comment here
     ex7: foo 	# ignore me # and me
 php: |
-    array('ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo', 'ex5' => 'foo', 'ex6' => 'foo#foo', 'ex7' => 'foo')
+    ['ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo', 'ex5' => 'foo', 'ex6' => 'foo#foo', 'ex7' => 'foo']
 ---
 test: Comments in the middle
 brief: >
@@ -24,7 +24,7 @@ yaml: |
     # some comment
     # some comment
 php: |
-    array('foo' => array('bar' => 'foo'))
+    ['foo' => ['bar' => 'foo']]
 ---
 test: Comments on a hash line
 brief: >
@@ -33,7 +33,7 @@ yaml: |
     foo:   # a comment
       foo: bar # a comment
 php: |
-    array('foo' => array('foo' => 'bar'))
+    ['foo' => ['foo' => 'bar']]
 ---
 test: 'Value starting with a #'
 brief: >
@@ -41,7 +41,7 @@ brief: >
 yaml: |
     foo:   '#bar'
 php: |
-    array('foo' => '#bar')
+    ['foo' => '#bar']
 ---
 test: Document starting with a comment and a separator
 brief: >
@@ -51,7 +51,7 @@ yaml: |
     ---
     foo: bar # a comment
 php: |
-    array('foo' => 'bar')
+    ['foo' => 'bar']
 ---
 test: Comment containing a colon on a hash line
 brief: >
@@ -65,7 +65,7 @@ brief: >
     'Hash key containing a #'
 yaml: 'foo#bar: baz'
 php: |
-    array('foo#bar' => 'baz')
+    ['foo#bar' => 'baz']
 ---
 test: 'Hash key ending with a space and a #'
 brief: >
@@ -73,4 +73,4 @@ brief: >
 yaml: |
     'foo #': baz
 php: |
-    array('foo #' => 'baz')
+    ['foo #' => 'baz']
diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml b/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml
index 1339d23a..8cadae2c 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/sfCompact.yml
@@ -13,22 +13,22 @@ yaml: |
       nick: Biggies
     quantity: 1
 php: |
-  array (
-    array (
+  [
+    [
       'item' => 'Super Hoop',
-    ),
-    array (
+    ],
+    [
       'item' => 'Basketball',
       'quantity' => 1,
-    ),
-    array (
-      'item' => array(
+    ],
+    [
+      'item' => [
         'name' => 'Big Shoes',
         'nick' => 'Biggies'
-      ),
+      ],
       'quantity' => 1
-    )
-  )
+    ]
+  ]
 ---
 test: Compact notation combined with inline notation
 brief: |
@@ -39,18 +39,18 @@ yaml: |
     - { item: Super Hoop, quantity: 1 }
     - [ Basketball, Big Shoes ]
 php: |
-  array (
-    'items' => array (
-      array (
+  [
+    'items' => [
+      [
         'item' => 'Super Hoop',
         'quantity' => 1,
-      ),
-      array (
+      ],
+      [
         'Basketball',
         'Big Shoes'
-      )
-    )
-  )
+      ]
+      ]
+    ]
 --- %YAML:1.0
 test: Compact notation
 brief: |
@@ -66,22 +66,22 @@ yaml: |
       nick: Biggies
     quantity: 1
 php: |
-  array (
-    array (
+  [
+    [
       'item' => 'Super Hoop',
-    ),
-    array (
+    ],
+    [
       'item' => 'Basketball',
       'quantity' => 1,
-    ),
-    array (
-      'item' => array(
+    ],
+    [
+      'item' => [
         'name' => 'Big Shoes',
         'nick' => 'Biggies'
-      ),
+      ],
       'quantity' => 1
-    )
-  )
+    ]
+  ]
 ---
 test: Compact notation combined with inline notation
 brief: |
@@ -92,18 +92,18 @@ yaml: |
     - { item: Super Hoop, quantity: 1 }
     - [ Basketball, Big Shoes ]
 php: |
-  array (
-    'items' => array (
-      array (
+  [
+    'items' => [
+      [
         'item' => 'Super Hoop',
         'quantity' => 1,
-      ),
-      array (
+      ],
+      [
         'Basketball',
         'Big Shoes'
-      )
-    )
-  )
+      ]
+    ]
+  ]
 --- %YAML:1.0
 test: Compact notation
 brief: |
@@ -119,22 +119,22 @@ yaml: |
       nick: Biggies
     quantity: 1
 php: |
-  array (
-    array (
+  [
+    [
       'item' => 'Super Hoop',
-    ),
-    array (
+    ],
+    [
       'item' => 'Basketball',
       'quantity' => 1,
-    ),
-    array (
-      'item' => array(
+    ],
+    [
+      'item' => [
         'name' => 'Big Shoes',
         'nick' => 'Biggies'
-      ),
+      ],
       'quantity' => 1
-    )
-  )
+    ]
+  ]
 ---
 test: Compact notation combined with inline notation
 brief: |
@@ -145,15 +145,15 @@ yaml: |
     - { item: Super Hoop, quantity: 1 }
     - [ Basketball, Big Shoes ]
 php: |
-  array (
-    'items' => array (
-      array (
+  [
+    'items' => [
+      [
         'item' => 'Super Hoop',
         'quantity' => 1,
-      ),
-      array (
+      ],
+      [
         'Basketball',
         'Big Shoes'
-      )
-    )
-  )
+      ]
+    ]
+  ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml b/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml
index 18e5abf9..af787ae4 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/sfMergeKey.yml
@@ -21,6 +21,7 @@ yaml: |
         c:
             foo: bar
             bar: foo
+    bar_inline: {a: before, d: other, <<: *foo, b: new, x: Oren, c: { foo: bar, bar: foo}}
     foo2: &foo2
         a: Ballmer
     ding: &dong [ fi, fei, fo, fam]
@@ -42,14 +43,19 @@ yaml: |
             p: 12345
         z:
             <<: *nestedref
+    head_inline: &head_inline { <<: [ *foo , *dong , *foo2 ] }
+    recursive_inline: { <<: *head_inline, c: { <<: *foo2 } }
 php: |
-    array(
-        'foo' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull'),
-        'bar' => array('a' => 'before', 'd' => 'other', 'e' => null, 'b' => 'new', 'c' => array('foo' => 'bar', 'bar' => 'foo'), 'x' => 'Oren'),
-        'foo2' => array('a' => 'Ballmer'),
-        'ding' => array('fi', 'fei', 'fo', 'fam'),
-        'check' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam', 'isit' => 'tested'),
-        'head' => array('a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam'),
-        'taz' => array('a' => 'Steve', 'w' => array('p' => 1234)),
-        'nested' => array('a' => 'Steve', 'w' => array('p' => 12345), 'd' => 'Doug', 'z' => array('p' => 12345))
-    )
+    [
+        'foo' => ['a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull'],
+        'bar' => ['a' => 'before', 'd' => 'other', 'e' => null, 'b' => 'new', 'c' => ['foo' => 'bar', 'bar' => 'foo'], 'x' => 'Oren'],
+        'bar_inline' => ['a' => 'before', 'd' => 'other', 'b' => 'new', 'c' => ['foo' => 'bar', 'bar' => 'foo'], 'e' => 'notnull', 'x' => 'Oren'],
+        'foo2' => ['a' => 'Ballmer'],
+        'ding' => ['fi', 'fei', 'fo', 'fam'],
+        'check' => ['a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam', 'isit' => 'tested'],
+        'head' => ['a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam'],
+        'taz' => ['a' => 'Steve', 'w' => ['p' => 1234]],
+        'nested' => ['a' => 'Steve', 'w' => ['p' => 12345], 'd' => 'Doug', 'z' => ['p' => 12345]],
+        'head_inline' => ['a' => 'Steve', 'b' => 'Clark', 'c' => 'Brian', 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam'],
+        'recursive_inline' => ['a' => 'Steve', 'b' => 'Clark', 'c' => ['a' => 'Ballmer'], 'e' => 'notnull', 'fi', 'fei', 'fo', 'fam'],
+    ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml b/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml
index ee124b24..144615f2 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/sfObjects.yml
@@ -8,4 +8,4 @@ yaml: |
     ex3: 'foo # bar' # comment
     ex4: foo # comment
 php: |
-    array('ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo')
+    ['ex1' => 'foo # bar', 'ex2' => 'foo # bar', 'ex3' => 'foo # bar', 'ex4' => 'foo']
diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml b/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml
index 7c60baec..c8326fdb 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/sfQuotes.yml
@@ -5,7 +5,7 @@ brief: >
 yaml: |
     foo: '| bar'
 php: |
-    array('foo' => '| bar')
+    ['foo' => '| bar']
 ---
 test: A key can be a quoted string
 brief: >
@@ -19,15 +19,15 @@ yaml: |
     "foo4: ": bar
     foo5: { "foo \" bar: ": bar, 'foo '' bar: ': bar }
 php: |
-    array(
+    [
       'foo1' => 'bar',
       'foo2' => 'bar',
       'foo " bar' => 'bar',
       'foo \' bar' => 'bar',
       'foo3: ' => 'bar',
       'foo4: ' => 'bar',
-      'foo5' => array(
+      'foo5' => [
         'foo " bar: ' => 'bar',
         'foo \' bar: ' => 'bar',
-      ),
-    )
+      ],
+    ]
diff --git a/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml b/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml
index 2a0b9c87..2ea417a7 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/sfTests.yml
@@ -5,19 +5,19 @@ brief: >
 yaml: |
     stripped_title: { name: "foo bar", help: "bar foo" }
 php: |
-    array('stripped_title' => array('name' => 'foo bar', 'help' => 'bar foo'))
+    ['stripped_title' => ['name' => 'foo bar', 'help' => 'bar foo']]
 ---
 test: Empty sequence
 yaml: |
     foo: [ ]
 php: |
-    array('foo' => array())
+    ['foo' => []]
 ---
 test: Empty value
 yaml: |
     foo:
 php: |
-    array('foo' => null)
+    ['foo' => null]
 ---
 test: Inline string parsing
 brief: >
@@ -25,7 +25,7 @@ brief: >
 yaml: |
     test: ['complex: string', 'another [string]']
 php: |
-    array('test' => array('complex: string', 'another [string]'))
+    ['test' => ['complex: string', 'another [string]']]
 ---
 test: Boolean
 brief: >
@@ -40,7 +40,7 @@ yaml: |
     - 'null'
     - '~'
 php: |
-    array(
+    [
       false,
       true,
       null,
@@ -49,7 +49,7 @@ php: |
       'true',
       'null',
       '~',
-    )
+    ]
 ---
 test: Empty lines in literal blocks
 brief: >
@@ -63,7 +63,7 @@ yaml: |
         
       bar
 php: |
-  array('foo' => array('bar' => "foo\n\n\n  \nbar\n"))
+  ['foo' => ['bar' => "foo\n\n\n  \nbar\n"]]
 ---
 test: Empty lines in folded blocks
 brief: >
@@ -77,7 +77,7 @@ yaml: |
       
       bar
 php: |
-  array('foo' => array('bar' => "\nfoo\n\nbar\n"))
+  ['foo' => ['bar' => "\nfoo\n\nbar\n"]]
 ---
 test: IP addresses
 brief: >
@@ -85,7 +85,7 @@ brief: >
 yaml: |
   foo: 10.0.0.2
 php: |
-  array('foo' => '10.0.0.2')
+  ['foo' => '10.0.0.2']
 ---
 test: A sequence with an embedded mapping
 brief: >
@@ -94,28 +94,28 @@ yaml: |
   - foo
   - bar: { bar: foo }
 php: |
-  array('foo', array('bar' => array('bar' => 'foo')))
+  ['foo', ['bar' => ['bar' => 'foo']]]
 ---
 test: Octal
 brief: as in spec example 2.19, octal value is converted
 yaml: |
   foo: 0123
 php: |
-  array('foo' => 83)
+  ['foo' => 83]
 ---
 test: Octal strings
 brief: Octal notation in a string must remain a string
 yaml: |
   foo: "0123"
 php: |
-  array('foo' => '0123')
+  ['foo' => '0123']
 ---
 test: Octal strings
 brief: Octal notation in a string must remain a string
 yaml: |
   foo: '0123'
 php: |
-  array('foo' => '0123')
+  ['foo' => '0123']
 ---
 test: Octal strings
 brief: Octal notation in a string must remain a string
@@ -123,18 +123,18 @@ yaml: |
   foo: |
     0123
 php: |
-  array('foo' => "0123\n")
+  ['foo' => "0123\n"]
 ---
 test: Document as a simple hash
 brief: Document as a simple hash
 yaml: |
   { foo: bar }
 php: |
-  array('foo' => 'bar')
+  ['foo' => 'bar']
 ---
 test: Document as a simple array
 brief: Document as a simple array
 yaml: |
   [ foo, bar ]
 php: |
-  array('foo', 'bar')
+  ['foo', 'bar']
diff --git a/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml b/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml
index 0c96108e..c85952df 100644
--- a/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml
+++ b/vendor/symfony/yaml/Tests/Fixtures/unindentedCollections.yml
@@ -8,7 +8,7 @@ yaml: |
     - item2
     - item3
 php: |
-    array('collection' => array('item1', 'item2', 'item3'))
+    ['collection' => ['item1', 'item2', 'item3']]
 ---
 test: Nested unindented collection (two levels)
 brief: >
@@ -20,7 +20,7 @@ yaml: |
         - b
         - c
 php: |
-    array('collection' => array('key' => array('a', 'b', 'c')))
+    ['collection' => ['key' => ['a', 'b', 'c']]]
 ---
 test: Nested unindented collection (three levels)
 brief: >
@@ -33,7 +33,7 @@ yaml: |
             - two
             - three
 php: |
-    array('collection' => array('key' => array('subkey' => array('one', 'two', 'three'))))
+    ['collection' => ['key' => ['subkey' => ['one', 'two', 'three']]]]
 ---
 test: Key/value after unindented collection (1)
 brief: >
@@ -46,7 +46,7 @@ yaml: |
         - c
     foo: bar
 php: |
-    array('collection' => array('key' => array('a', 'b', 'c')), 'foo' => 'bar')
+    ['collection' => ['key' => ['a', 'b', 'c']], 'foo' => 'bar']
 ---
 test: Key/value after unindented collection (at the same level)
 brief: >
@@ -59,7 +59,7 @@ yaml: |
         - c
         foo: bar
 php: |
-    array('collection' => array('key' => array('a', 'b', 'c'), 'foo' => 'bar'))
+    ['collection' => ['key' => ['a', 'b', 'c'], 'foo' => 'bar']]
 ---
 test: Shortcut Key after unindented collection
 brief: >
@@ -69,7 +69,7 @@ yaml: |
     - key: foo
       foo: bar
 php: |
-    array('collection' => array(array('key' => 'foo', 'foo' => 'bar')))
+    ['collection' => [['key' => 'foo', 'foo' => 'bar']]]
 ---
 test: Shortcut Key after unindented collection with custom spaces
 brief: >
@@ -79,4 +79,4 @@ yaml: |
     -  key: foo
        foo: bar
 php: |
-    array('collection' => array(array('key' => 'foo', 'foo' => 'bar')))
+    ['collection' => [['key' => 'foo', 'foo' => 'bar']]]
diff --git a/vendor/symfony/yaml/Tests/InlineTest.php b/vendor/symfony/yaml/Tests/InlineTest.php
index 665c2ecc..9da83436 100644
--- a/vendor/symfony/yaml/Tests/InlineTest.php
+++ b/vendor/symfony/yaml/Tests/InlineTest.php
@@ -14,10 +14,16 @@ namespace Symfony\Component\Yaml\Tests;
 use PHPUnit\Framework\TestCase;
 use Symfony\Component\Yaml\Exception\ParseException;
 use Symfony\Component\Yaml\Inline;
+use Symfony\Component\Yaml\Tag\TaggedValue;
 use Symfony\Component\Yaml\Yaml;
 
 class InlineTest extends TestCase
 {
+    protected function setUp()
+    {
+        Inline::initialize(0, 0);
+    }
+
     /**
      * @dataProvider getTestsForParse
      */
@@ -48,12 +54,13 @@ class InlineTest extends TestCase
 
     public function getTestsForParsePhpConstants()
     {
-        return array(
-            array('!php/const:Symfony\Component\Yaml\Yaml::PARSE_CONSTANT', Yaml::PARSE_CONSTANT),
-            array('!php/const:PHP_INT_MAX', PHP_INT_MAX),
-            array('[!php/const:PHP_INT_MAX]', array(PHP_INT_MAX)),
-            array('{ foo: !php/const:PHP_INT_MAX }', array('foo' => PHP_INT_MAX)),
-        );
+        return [
+            ['!php/const Symfony\Component\Yaml\Yaml::PARSE_CONSTANT', Yaml::PARSE_CONSTANT],
+            ['!php/const PHP_INT_MAX', PHP_INT_MAX],
+            ['[!php/const PHP_INT_MAX]', [PHP_INT_MAX]],
+            ['{ foo: !php/const PHP_INT_MAX }', ['foo' => PHP_INT_MAX]],
+            ['!php/const NULL', null],
+        ];
     }
 
     /**
@@ -62,27 +69,16 @@ class InlineTest extends TestCase
      */
     public function testParsePhpConstantThrowsExceptionWhenUndefined()
     {
-        Inline::parse('!php/const:WRONG_CONSTANT', Yaml::PARSE_CONSTANT);
+        Inline::parse('!php/const WRONG_CONSTANT', Yaml::PARSE_CONSTANT);
     }
 
     /**
      * @expectedException \Symfony\Component\Yaml\Exception\ParseException
-     * @expectedExceptionMessageRegExp #The string "!php/const:PHP_INT_MAX" could not be parsed as a constant.*#
+     * @expectedExceptionMessageRegExp #The string "!php/const PHP_INT_MAX" could not be parsed as a constant.*#
      */
     public function testParsePhpConstantThrowsExceptionOnInvalidType()
     {
-        Inline::parse('!php/const:PHP_INT_MAX', Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE);
-    }
-
-    /**
-     * @group legacy
-     * @dataProvider getTestsForParseWithMapObjects
-     */
-    public function testParseWithMapObjectsPassingTrue($yaml, $value)
-    {
-        $actual = Inline::parse($yaml, false, false, true);
-
-        $this->assertSame(serialize($value), serialize($actual));
+        Inline::parse('!php/const PHP_INT_MAX', Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE);
     }
 
     /**
@@ -103,7 +99,7 @@ class InlineTest extends TestCase
         }
 
         try {
-            $requiredLocales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252');
+            $requiredLocales = ['fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252'];
             if (false === setlocale(LC_NUMERIC, $requiredLocales)) {
                 $this->markTestSkipped('Could not set any of required locales: '.implode(', ', $requiredLocales));
             }
@@ -167,13 +163,12 @@ class InlineTest extends TestCase
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Using a colon after an unquoted mapping key that is not followed by an indication character (i.e. " ", ",", "[", "]", "{", "}") is deprecated since version 3.2 and will throw a ParseException in 4.0.
-     * throws \Symfony\Component\Yaml\Exception\ParseException in 4.0
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Colons must be followed by a space or an indication character (i.e. " ", ",", "[", "]", "{", "}")
      */
     public function testParseMappingKeyWithColonNotFollowedBySpace()
     {
-        Inline::parse('{1:""}');
+        Inline::parse('{foo:""}');
     }
 
     /**
@@ -205,58 +200,36 @@ class InlineTest extends TestCase
      */
     public function testParseReferences($yaml, $expected)
     {
-        $this->assertSame($expected, Inline::parse($yaml, 0, array('var' => 'var-value')));
-    }
-
-    /**
-     * @group legacy
-     * @dataProvider getDataForParseReferences
-     */
-    public function testParseReferencesAsFifthArgument($yaml, $expected)
-    {
-        $this->assertSame($expected, Inline::parse($yaml, false, false, false, array('var' => 'var-value')));
+        $this->assertSame($expected, Inline::parse($yaml, 0, ['var' => 'var-value']));
     }
 
     public function getDataForParseReferences()
     {
-        return array(
-            'scalar' => array('*var', 'var-value'),
-            'list' => array('[ *var ]', array('var-value')),
-            'list-in-list' => array('[[ *var ]]', array(array('var-value'))),
-            'map-in-list' => array('[ { key: *var } ]', array(array('key' => 'var-value'))),
-            'embedded-mapping-in-list' => array('[ key: *var ]', array(array('key' => 'var-value'))),
-            'map' => array('{ key: *var }', array('key' => 'var-value')),
-            'list-in-map' => array('{ key: [*var] }', array('key' => array('var-value'))),
-            'map-in-map' => array('{ foo: { bar: *var } }', array('foo' => array('bar' => 'var-value'))),
-        );
+        return [
+            'scalar' => ['*var', 'var-value'],
+            'list' => ['[ *var ]', ['var-value']],
+            'list-in-list' => ['[[ *var ]]', [['var-value']]],
+            'map-in-list' => ['[ { key: *var } ]', [['key' => 'var-value']]],
+            'embedded-mapping-in-list' => ['[ key: *var ]', [['key' => 'var-value']]],
+            'map' => ['{ key: *var }', ['key' => 'var-value']],
+            'list-in-map' => ['{ key: [*var] }', ['key' => ['var-value']]],
+            'map-in-map' => ['{ foo: { bar: *var } }', ['foo' => ['bar' => 'var-value']]],
+        ];
     }
 
     public function testParseMapReferenceInSequence()
     {
-        $foo = array(
+        $foo = [
             'a' => 'Steve',
             'b' => 'Clark',
             'c' => 'Brian',
-        );
-        $this->assertSame(array($foo), Inline::parse('[*foo]', 0, array('foo' => $foo)));
-    }
-
-    /**
-     * @group legacy
-     */
-    public function testParseMapReferenceInSequenceAsFifthArgument()
-    {
-        $foo = array(
-            'a' => 'Steve',
-            'b' => 'Clark',
-            'c' => 'Brian',
-        );
-        $this->assertSame(array($foo), Inline::parse('[*foo]', false, false, false, array('foo' => $foo)));
+        ];
+        $this->assertSame([$foo], Inline::parse('[*foo]', 0, ['foo' => $foo]));
     }
 
     /**
      * @expectedException \Symfony\Component\Yaml\Exception\ParseException
-     * @expectedExceptionMessage A reference must contain at least one character.
+     * @expectedExceptionMessage A reference must contain at least one character at line 1.
      */
     public function testParseUnquotedAsterisk()
     {
@@ -265,7 +238,7 @@ class InlineTest extends TestCase
 
     /**
      * @expectedException \Symfony\Component\Yaml\Exception\ParseException
-     * @expectedExceptionMessage A reference must contain at least one character.
+     * @expectedExceptionMessage A reference must contain at least one character at line 1.
      */
     public function testParseUnquotedAsteriskFollowedByAComment()
     {
@@ -274,42 +247,42 @@ class InlineTest extends TestCase
 
     /**
      * @dataProvider getReservedIndicators
-     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
-     * @expectedExceptionMessage cannot start a plain scalar; you need to quote the scalar.
      */
     public function testParseUnquotedScalarStartingWithReservedIndicator($indicator)
     {
+        if (method_exists($this, 'expectExceptionMessage')) {
+            $this->expectException(ParseException::class);
+            $this->expectExceptionMessage(sprintf('cannot start a plain scalar; you need to quote the scalar at line 1 (near "%sfoo").', $indicator));
+        } else {
+            $this->setExpectedException(ParseException::class, sprintf('cannot start a plain scalar; you need to quote the scalar at line 1 (near "%sfoo").', $indicator));
+        }
+
         Inline::parse(sprintf('{ foo: %sfoo }', $indicator));
     }
 
     public function getReservedIndicators()
     {
-        return array(array('@'), array('`'));
+        return [['@'], ['`']];
     }
 
     /**
      * @dataProvider getScalarIndicators
-     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
-     * @expectedExceptionMessage cannot start a plain scalar; you need to quote the scalar.
      */
     public function testParseUnquotedScalarStartingWithScalarIndicator($indicator)
     {
+        if (method_exists($this, 'expectExceptionMessage')) {
+            $this->expectException(ParseException::class);
+            $this->expectExceptionMessage(sprintf('cannot start a plain scalar; you need to quote the scalar at line 1 (near "%sfoo").', $indicator));
+        } else {
+            $this->setExpectedException(ParseException::class, sprintf('cannot start a plain scalar; you need to quote the scalar at line 1 (near "%sfoo").', $indicator));
+        }
+
         Inline::parse(sprintf('{ foo: %sfoo }', $indicator));
     }
 
     public function getScalarIndicators()
     {
-        return array(array('|'), array('>'));
-    }
-
-    /**
-     * @group legacy
-     * @expectedDeprecation Not quoting the scalar "%bar " starting with the "%" indicator character is deprecated since Symfony 3.1 and will throw a ParseException in 4.0.
-     * throws \Symfony\Component\Yaml\Exception\ParseException in 4.0
-     */
-    public function testParseUnquotedScalarStartingWithPercentCharacter()
-    {
-        Inline::parse('{ foo: %bar }');
+        return [['|'], ['>'], ['%']];
     }
 
     /**
@@ -322,240 +295,240 @@ class InlineTest extends TestCase
 
     public function getDataForIsHash()
     {
-        return array(
-            array(array(), false),
-            array(array(1, 2, 3), false),
-            array(array(2 => 1, 1 => 2, 0 => 3), true),
-            array(array('foo' => 1, 'bar' => 2), true),
-        );
+        return [
+            [[], false],
+            [[1, 2, 3], false],
+            [[2 => 1, 1 => 2, 0 => 3], true],
+            [['foo' => 1, 'bar' => 2], true],
+        ];
     }
 
     public function getTestsForParse()
     {
-        return array(
-            array('', ''),
-            array('null', null),
-            array('false', false),
-            array('true', true),
-            array('12', 12),
-            array('-12', -12),
-            array('1_2', 12),
-            array('_12', '_12'),
-            array('12_', 12),
-            array('"quoted string"', 'quoted string'),
-            array("'quoted string'", 'quoted string'),
-            array('12.30e+02', 12.30e+02),
-            array('123.45_67', 123.4567),
-            array('0x4D2', 0x4D2),
-            array('0x_4_D_2_', 0x4D2),
-            array('02333', 02333),
-            array('0_2_3_3_3', 02333),
-            array('.Inf', -log(0)),
-            array('-.Inf', log(0)),
-            array("'686e444'", '686e444'),
-            array('686e444', 646e444),
-            array('123456789123456789123456789123456789', '123456789123456789123456789123456789'),
-            array('"foo\r\nbar"', "foo\r\nbar"),
-            array("'foo#bar'", 'foo#bar'),
-            array("'foo # bar'", 'foo # bar'),
-            array("'#cfcfcf'", '#cfcfcf'),
-            array('::form_base.html.twig', '::form_base.html.twig'),
+        return [
+            ['', ''],
+            ['null', null],
+            ['false', false],
+            ['true', true],
+            ['12', 12],
+            ['-12', -12],
+            ['1_2', 12],
+            ['_12', '_12'],
+            ['12_', 12],
+            ['"quoted string"', 'quoted string'],
+            ["'quoted string'", 'quoted string'],
+            ['12.30e+02', 12.30e+02],
+            ['123.45_67', 123.4567],
+            ['0x4D2', 0x4D2],
+            ['0x_4_D_2_', 0x4D2],
+            ['02333', 02333],
+            ['0_2_3_3_3', 02333],
+            ['.Inf', -log(0)],
+            ['-.Inf', log(0)],
+            ["'686e444'", '686e444'],
+            ['686e444', 646e444],
+            ['123456789123456789123456789123456789', '123456789123456789123456789123456789'],
+            ['"foo\r\nbar"', "foo\r\nbar"],
+            ["'foo#bar'", 'foo#bar'],
+            ["'foo # bar'", 'foo # bar'],
+            ["'#cfcfcf'", '#cfcfcf'],
+            ['::form_base.html.twig', '::form_base.html.twig'],
 
             // Pre-YAML-1.2 booleans
-            array("'y'", 'y'),
-            array("'n'", 'n'),
-            array("'yes'", 'yes'),
-            array("'no'", 'no'),
-            array("'on'", 'on'),
-            array("'off'", 'off'),
-
-            array('2007-10-30', gmmktime(0, 0, 0, 10, 30, 2007)),
-            array('2007-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 2007)),
-            array('2007-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 2007)),
-            array('1960-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 1960)),
-            array('1730-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 1730)),
-
-            array('"a \\"string\\" with \'quoted strings inside\'"', 'a "string" with \'quoted strings inside\''),
-            array("'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''),
+            ["'y'", 'y'],
+            ["'n'", 'n'],
+            ["'yes'", 'yes'],
+            ["'no'", 'no'],
+            ["'on'", 'on'],
+            ["'off'", 'off'],
+
+            ['2007-10-30', gmmktime(0, 0, 0, 10, 30, 2007)],
+            ['2007-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 2007)],
+            ['2007-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 2007)],
+            ['1960-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 1960)],
+            ['1730-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 1730)],
+
+            ['"a \\"string\\" with \'quoted strings inside\'"', 'a "string" with \'quoted strings inside\''],
+            ["'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''],
 
             // sequences
             // urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon
-            array('[foo, http://urls.are/no/mappings, false, null, 12]', array('foo', 'http://urls.are/no/mappings', false, null, 12)),
-            array('[  foo  ,   bar , false  ,  null     ,  12  ]', array('foo', 'bar', false, null, 12)),
-            array('[\'foo,bar\', \'foo bar\']', array('foo,bar', 'foo bar')),
+            ['[foo, http://urls.are/no/mappings, false, null, 12]', ['foo', 'http://urls.are/no/mappings', false, null, 12]],
+            ['[  foo  ,   bar , false  ,  null     ,  12  ]', ['foo', 'bar', false, null, 12]],
+            ['[\'foo,bar\', \'foo bar\']', ['foo,bar', 'foo bar']],
 
             // mappings
-            array('{foo: bar,bar: foo,false: false,null: null,integer: 12}', array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12), Yaml::PARSE_KEYS_AS_STRINGS),
-            array('{ foo  : bar, bar : foo,  false  :   false,  null  :   null,  integer :  12  }', array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12), Yaml::PARSE_KEYS_AS_STRINGS),
-            array('{foo: \'bar\', bar: \'foo: bar\'}', array('foo' => 'bar', 'bar' => 'foo: bar')),
-            array('{\'foo\': \'bar\', "bar": \'foo: bar\'}', array('foo' => 'bar', 'bar' => 'foo: bar')),
-            array('{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', array('foo\'' => 'bar', 'bar"' => 'foo: bar')),
-            array('{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', array('foo: ' => 'bar', 'bar: ' => 'foo: bar')),
-            array('{"foo:bar": "baz"}', array('foo:bar' => 'baz')),
-            array('{"foo":"bar"}', array('foo' => 'bar')),
+            ['{foo: bar,bar: foo,"false": false, "null": null,integer: 12}', ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12]],
+            ['{ foo  : bar, bar : foo, "false"  :   false,  "null"  :   null,  integer :  12  }', ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12]],
+            ['{foo: \'bar\', bar: \'foo: bar\'}', ['foo' => 'bar', 'bar' => 'foo: bar']],
+            ['{\'foo\': \'bar\', "bar": \'foo: bar\'}', ['foo' => 'bar', 'bar' => 'foo: bar']],
+            ['{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', ['foo\'' => 'bar', 'bar"' => 'foo: bar']],
+            ['{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', ['foo: ' => 'bar', 'bar: ' => 'foo: bar']],
+            ['{"foo:bar": "baz"}', ['foo:bar' => 'baz']],
+            ['{"foo":"bar"}', ['foo' => 'bar']],
 
             // nested sequences and mappings
-            array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))),
-            array('[foo, {bar: foo}]', array('foo', array('bar' => 'foo'))),
-            array('{ foo: {bar: foo} }', array('foo' => array('bar' => 'foo'))),
-            array('{ foo: [bar, foo] }', array('foo' => array('bar', 'foo'))),
-            array('{ foo:{bar: foo} }', array('foo' => array('bar' => 'foo'))),
-            array('{ foo:[bar, foo] }', array('foo' => array('bar', 'foo'))),
+            ['[foo, [bar, foo]]', ['foo', ['bar', 'foo']]],
+            ['[foo, {bar: foo}]', ['foo', ['bar' => 'foo']]],
+            ['{ foo: {bar: foo} }', ['foo' => ['bar' => 'foo']]],
+            ['{ foo: [bar, foo] }', ['foo' => ['bar', 'foo']]],
+            ['{ foo:{bar: foo} }', ['foo' => ['bar' => 'foo']]],
+            ['{ foo:[bar, foo] }', ['foo' => ['bar', 'foo']]],
 
-            array('[  foo, [  bar, foo  ]  ]', array('foo', array('bar', 'foo'))),
+            ['[  foo, [  bar, foo  ]  ]', ['foo', ['bar', 'foo']]],
 
-            array('[{ foo: {bar: foo} }]', array(array('foo' => array('bar' => 'foo')))),
+            ['[{ foo: {bar: foo} }]', [['foo' => ['bar' => 'foo']]]],
 
-            array('[foo, [bar, [foo, [bar, foo]], foo]]', array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo'))),
+            ['[foo, [bar, [foo, [bar, foo]], foo]]', ['foo', ['bar', ['foo', ['bar', 'foo']], 'foo']]],
 
-            array('[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]', array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo')))),
+            ['[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]', ['foo', ['bar' => 'foo', 'foo' => ['foo', ['bar' => 'foo']]], ['foo', ['bar' => 'foo']]]],
 
-            array('[foo, bar: { foo: bar }]', array('foo', '1' => array('bar' => array('foo' => 'bar')))),
-            array('[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', array('foo', '@foo.baz', array('%foo%' => 'foo is %foo%', 'bar' => '%foo%'), true, '@service_container')),
-        );
+            ['[foo, bar: { foo: bar }]', ['foo', '1' => ['bar' => ['foo' => 'bar']]]],
+            ['[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', ['foo', '@foo.baz', ['%foo%' => 'foo is %foo%', 'bar' => '%foo%'], true, '@service_container']],
+        ];
     }
 
     public function getTestsForParseWithMapObjects()
     {
-        return array(
-            array('', ''),
-            array('null', null),
-            array('false', false),
-            array('true', true),
-            array('12', 12),
-            array('-12', -12),
-            array('"quoted string"', 'quoted string'),
-            array("'quoted string'", 'quoted string'),
-            array('12.30e+02', 12.30e+02),
-            array('0x4D2', 0x4D2),
-            array('02333', 02333),
-            array('.Inf', -log(0)),
-            array('-.Inf', log(0)),
-            array("'686e444'", '686e444'),
-            array('686e444', 646e444),
-            array('123456789123456789123456789123456789', '123456789123456789123456789123456789'),
-            array('"foo\r\nbar"', "foo\r\nbar"),
-            array("'foo#bar'", 'foo#bar'),
-            array("'foo # bar'", 'foo # bar'),
-            array("'#cfcfcf'", '#cfcfcf'),
-            array('::form_base.html.twig', '::form_base.html.twig'),
-
-            array('2007-10-30', gmmktime(0, 0, 0, 10, 30, 2007)),
-            array('2007-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 2007)),
-            array('2007-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 2007)),
-            array('1960-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 1960)),
-            array('1730-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 1730)),
-
-            array('"a \\"string\\" with \'quoted strings inside\'"', 'a "string" with \'quoted strings inside\''),
-            array("'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''),
+        return [
+            ['', ''],
+            ['null', null],
+            ['false', false],
+            ['true', true],
+            ['12', 12],
+            ['-12', -12],
+            ['"quoted string"', 'quoted string'],
+            ["'quoted string'", 'quoted string'],
+            ['12.30e+02', 12.30e+02],
+            ['0x4D2', 0x4D2],
+            ['02333', 02333],
+            ['.Inf', -log(0)],
+            ['-.Inf', log(0)],
+            ["'686e444'", '686e444'],
+            ['686e444', 646e444],
+            ['123456789123456789123456789123456789', '123456789123456789123456789123456789'],
+            ['"foo\r\nbar"', "foo\r\nbar"],
+            ["'foo#bar'", 'foo#bar'],
+            ["'foo # bar'", 'foo # bar'],
+            ["'#cfcfcf'", '#cfcfcf'],
+            ['::form_base.html.twig', '::form_base.html.twig'],
+
+            ['2007-10-30', gmmktime(0, 0, 0, 10, 30, 2007)],
+            ['2007-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 2007)],
+            ['2007-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 2007)],
+            ['1960-10-30 02:59:43 Z', gmmktime(2, 59, 43, 10, 30, 1960)],
+            ['1730-10-30T02:59:43Z', gmmktime(2, 59, 43, 10, 30, 1730)],
+
+            ['"a \\"string\\" with \'quoted strings inside\'"', 'a "string" with \'quoted strings inside\''],
+            ["'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''],
 
             // sequences
             // urls are no key value mapping. see #3609. Valid yaml "key: value" mappings require a space after the colon
-            array('[foo, http://urls.are/no/mappings, false, null, 12]', array('foo', 'http://urls.are/no/mappings', false, null, 12)),
-            array('[  foo  ,   bar , false  ,  null     ,  12  ]', array('foo', 'bar', false, null, 12)),
-            array('[\'foo,bar\', \'foo bar\']', array('foo,bar', 'foo bar')),
+            ['[foo, http://urls.are/no/mappings, false, null, 12]', ['foo', 'http://urls.are/no/mappings', false, null, 12]],
+            ['[  foo  ,   bar , false  ,  null     ,  12  ]', ['foo', 'bar', false, null, 12]],
+            ['[\'foo,bar\', \'foo bar\']', ['foo,bar', 'foo bar']],
 
             // mappings
-            array('{foo: bar,bar: foo,false: false,null: null,integer: 12}', (object) array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12), Yaml::PARSE_OBJECT_FOR_MAP | Yaml::PARSE_KEYS_AS_STRINGS),
-            array('{ foo  : bar, bar : foo,  false  :   false,  null  :   null,  integer :  12  }', (object) array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12), Yaml::PARSE_OBJECT_FOR_MAP | Yaml::PARSE_KEYS_AS_STRINGS),
-            array('{foo: \'bar\', bar: \'foo: bar\'}', (object) array('foo' => 'bar', 'bar' => 'foo: bar')),
-            array('{\'foo\': \'bar\', "bar": \'foo: bar\'}', (object) array('foo' => 'bar', 'bar' => 'foo: bar')),
-            array('{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', (object) array('foo\'' => 'bar', 'bar"' => 'foo: bar')),
-            array('{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', (object) array('foo: ' => 'bar', 'bar: ' => 'foo: bar')),
-            array('{"foo:bar": "baz"}', (object) array('foo:bar' => 'baz')),
-            array('{"foo":"bar"}', (object) array('foo' => 'bar')),
+            ['{foo: bar,bar: foo,"false": false,"null": null,integer: 12}', (object) ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12], Yaml::PARSE_OBJECT_FOR_MAP],
+            ['{ foo  : bar, bar : foo,  "false"  :   false,  "null"  :   null,  integer :  12  }', (object) ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12], Yaml::PARSE_OBJECT_FOR_MAP],
+            ['{foo: \'bar\', bar: \'foo: bar\'}', (object) ['foo' => 'bar', 'bar' => 'foo: bar']],
+            ['{\'foo\': \'bar\', "bar": \'foo: bar\'}', (object) ['foo' => 'bar', 'bar' => 'foo: bar']],
+            ['{\'foo\'\'\': \'bar\', "bar\"": \'foo: bar\'}', (object) ['foo\'' => 'bar', 'bar"' => 'foo: bar']],
+            ['{\'foo: \': \'bar\', "bar: ": \'foo: bar\'}', (object) ['foo: ' => 'bar', 'bar: ' => 'foo: bar']],
+            ['{"foo:bar": "baz"}', (object) ['foo:bar' => 'baz']],
+            ['{"foo":"bar"}', (object) ['foo' => 'bar']],
 
             // nested sequences and mappings
-            array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))),
-            array('[foo, {bar: foo}]', array('foo', (object) array('bar' => 'foo'))),
-            array('{ foo: {bar: foo} }', (object) array('foo' => (object) array('bar' => 'foo'))),
-            array('{ foo: [bar, foo] }', (object) array('foo' => array('bar', 'foo'))),
+            ['[foo, [bar, foo]]', ['foo', ['bar', 'foo']]],
+            ['[foo, {bar: foo}]', ['foo', (object) ['bar' => 'foo']]],
+            ['{ foo: {bar: foo} }', (object) ['foo' => (object) ['bar' => 'foo']]],
+            ['{ foo: [bar, foo] }', (object) ['foo' => ['bar', 'foo']]],
 
-            array('[  foo, [  bar, foo  ]  ]', array('foo', array('bar', 'foo'))),
+            ['[  foo, [  bar, foo  ]  ]', ['foo', ['bar', 'foo']]],
 
-            array('[{ foo: {bar: foo} }]', array((object) array('foo' => (object) array('bar' => 'foo')))),
+            ['[{ foo: {bar: foo} }]', [(object) ['foo' => (object) ['bar' => 'foo']]]],
 
-            array('[foo, [bar, [foo, [bar, foo]], foo]]', array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo'))),
+            ['[foo, [bar, [foo, [bar, foo]], foo]]', ['foo', ['bar', ['foo', ['bar', 'foo']], 'foo']]],
 
-            array('[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]', array('foo', (object) array('bar' => 'foo', 'foo' => array('foo', (object) array('bar' => 'foo'))), array('foo', (object) array('bar' => 'foo')))),
+            ['[foo, {bar: foo, foo: [foo, {bar: foo}]}, [foo, {bar: foo}]]', ['foo', (object) ['bar' => 'foo', 'foo' => ['foo', (object) ['bar' => 'foo']]], ['foo', (object) ['bar' => 'foo']]]],
 
-            array('[foo, bar: { foo: bar }]', array('foo', '1' => (object) array('bar' => (object) array('foo' => 'bar')))),
-            array('[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', array('foo', '@foo.baz', (object) array('%foo%' => 'foo is %foo%', 'bar' => '%foo%'), true, '@service_container')),
+            ['[foo, bar: { foo: bar }]', ['foo', '1' => (object) ['bar' => (object) ['foo' => 'bar']]]],
+            ['[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', ['foo', '@foo.baz', (object) ['%foo%' => 'foo is %foo%', 'bar' => '%foo%'], true, '@service_container']],
 
-            array('{}', new \stdClass()),
-            array('{ foo  : bar, bar : {}  }', (object) array('foo' => 'bar', 'bar' => new \stdClass())),
-            array('{ foo  : [], bar : {}  }', (object) array('foo' => array(), 'bar' => new \stdClass())),
-            array('{foo: \'bar\', bar: {} }', (object) array('foo' => 'bar', 'bar' => new \stdClass())),
-            array('{\'foo\': \'bar\', "bar": {}}', (object) array('foo' => 'bar', 'bar' => new \stdClass())),
-            array('{\'foo\': \'bar\', "bar": \'{}\'}', (object) array('foo' => 'bar', 'bar' => '{}')),
+            ['{}', new \stdClass()],
+            ['{ foo  : bar, bar : {}  }', (object) ['foo' => 'bar', 'bar' => new \stdClass()]],
+            ['{ foo  : [], bar : {}  }', (object) ['foo' => [], 'bar' => new \stdClass()]],
+            ['{foo: \'bar\', bar: {} }', (object) ['foo' => 'bar', 'bar' => new \stdClass()]],
+            ['{\'foo\': \'bar\', "bar": {}}', (object) ['foo' => 'bar', 'bar' => new \stdClass()]],
+            ['{\'foo\': \'bar\', "bar": \'{}\'}', (object) ['foo' => 'bar', 'bar' => '{}']],
 
-            array('[foo, [{}, {}]]', array('foo', array(new \stdClass(), new \stdClass()))),
-            array('[foo, [[], {}]]', array('foo', array(array(), new \stdClass()))),
-            array('[foo, [[{}, {}], {}]]', array('foo', array(array(new \stdClass(), new \stdClass()), new \stdClass()))),
-            array('[foo, {bar: {}}]', array('foo', '1' => (object) array('bar' => new \stdClass()))),
-        );
+            ['[foo, [{}, {}]]', ['foo', [new \stdClass(), new \stdClass()]]],
+            ['[foo, [[], {}]]', ['foo', [[], new \stdClass()]]],
+            ['[foo, [[{}, {}], {}]]', ['foo', [[new \stdClass(), new \stdClass()], new \stdClass()]]],
+            ['[foo, {bar: {}}]', ['foo', '1' => (object) ['bar' => new \stdClass()]]],
+        ];
     }
 
     public function getTestsForDump()
     {
-        return array(
-            array('null', null),
-            array('false', false),
-            array('true', true),
-            array('12', 12),
-            array("'1_2'", '1_2'),
-            array('_12', '_12'),
-            array("'12_'", '12_'),
-            array("'quoted string'", 'quoted string'),
-            array('!!float 1230', 12.30e+02),
-            array('1234', 0x4D2),
-            array('1243', 02333),
-            array("'0x_4_D_2_'", '0x_4_D_2_'),
-            array("'0_2_3_3_3'", '0_2_3_3_3'),
-            array('.Inf', -log(0)),
-            array('-.Inf', log(0)),
-            array("'686e444'", '686e444'),
-            array('"foo\r\nbar"', "foo\r\nbar"),
-            array("'foo#bar'", 'foo#bar'),
-            array("'foo # bar'", 'foo # bar'),
-            array("'#cfcfcf'", '#cfcfcf'),
-
-            array("'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''),
-
-            array("'-dash'", '-dash'),
-            array("'-'", '-'),
+        return [
+            ['null', null],
+            ['false', false],
+            ['true', true],
+            ['12', 12],
+            ["'1_2'", '1_2'],
+            ['_12', '_12'],
+            ["'12_'", '12_'],
+            ["'quoted string'", 'quoted string'],
+            ['!!float 1230', 12.30e+02],
+            ['1234', 0x4D2],
+            ['1243', 02333],
+            ["'0x_4_D_2_'", '0x_4_D_2_'],
+            ["'0_2_3_3_3'", '0_2_3_3_3'],
+            ['.Inf', -log(0)],
+            ['-.Inf', log(0)],
+            ["'686e444'", '686e444'],
+            ['"foo\r\nbar"', "foo\r\nbar"],
+            ["'foo#bar'", 'foo#bar'],
+            ["'foo # bar'", 'foo # bar'],
+            ["'#cfcfcf'", '#cfcfcf'],
+
+            ["'a \"string\" with ''quoted strings inside'''", 'a "string" with \'quoted strings inside\''],
+
+            ["'-dash'", '-dash'],
+            ["'-'", '-'],
 
             // Pre-YAML-1.2 booleans
-            array("'y'", 'y'),
-            array("'n'", 'n'),
-            array("'yes'", 'yes'),
-            array("'no'", 'no'),
-            array("'on'", 'on'),
-            array("'off'", 'off'),
+            ["'y'", 'y'],
+            ["'n'", 'n'],
+            ["'yes'", 'yes'],
+            ["'no'", 'no'],
+            ["'on'", 'on'],
+            ["'off'", 'off'],
 
             // sequences
-            array('[foo, bar, false, null, 12]', array('foo', 'bar', false, null, 12)),
-            array('[\'foo,bar\', \'foo bar\']', array('foo,bar', 'foo bar')),
+            ['[foo, bar, false, null, 12]', ['foo', 'bar', false, null, 12]],
+            ['[\'foo,bar\', \'foo bar\']', ['foo,bar', 'foo bar']],
 
             // mappings
-            array('{ foo: bar, bar: foo, \'false\': false, \'null\': null, integer: 12 }', array('foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12), Yaml::PARSE_KEYS_AS_STRINGS),
-            array('{ foo: bar, bar: \'foo: bar\' }', array('foo' => 'bar', 'bar' => 'foo: bar')),
+            ['{ foo: bar, bar: foo, \'false\': false, \'null\': null, integer: 12 }', ['foo' => 'bar', 'bar' => 'foo', 'false' => false, 'null' => null, 'integer' => 12]],
+            ['{ foo: bar, bar: \'foo: bar\' }', ['foo' => 'bar', 'bar' => 'foo: bar']],
 
             // nested sequences and mappings
-            array('[foo, [bar, foo]]', array('foo', array('bar', 'foo'))),
+            ['[foo, [bar, foo]]', ['foo', ['bar', 'foo']]],
 
-            array('[foo, [bar, [foo, [bar, foo]], foo]]', array('foo', array('bar', array('foo', array('bar', 'foo')), 'foo'))),
+            ['[foo, [bar, [foo, [bar, foo]], foo]]', ['foo', ['bar', ['foo', ['bar', 'foo']], 'foo']]],
 
-            array('{ foo: { bar: foo } }', array('foo' => array('bar' => 'foo'))),
+            ['{ foo: { bar: foo } }', ['foo' => ['bar' => 'foo']]],
 
-            array('[foo, { bar: foo }]', array('foo', array('bar' => 'foo'))),
+            ['[foo, { bar: foo }]', ['foo', ['bar' => 'foo']]],
 
-            array('[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]', array('foo', array('bar' => 'foo', 'foo' => array('foo', array('bar' => 'foo'))), array('foo', array('bar' => 'foo')))),
+            ['[foo, { bar: foo, foo: [foo, { bar: foo }] }, [foo, { bar: foo }]]', ['foo', ['bar' => 'foo', 'foo' => ['foo', ['bar' => 'foo']]], ['foo', ['bar' => 'foo']]]],
 
-            array('[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', array('foo', '@foo.baz', array('%foo%' => 'foo is %foo%', 'bar' => '%foo%'), true, '@service_container')),
+            ['[foo, \'@foo.baz\', { \'%foo%\': \'foo is %foo%\', bar: \'%foo%\' }, true, \'@service_container\']', ['foo', '@foo.baz', ['%foo%' => 'foo is %foo%', 'bar' => '%foo%'], true, '@service_container']],
 
-            array('{ foo: { bar: { 1: 2, baz: 3 } } }', array('foo' => array('bar' => array(1 => 2, 'baz' => 3))), Yaml::PARSE_KEYS_AS_STRINGS),
-        );
+            ['{ foo: { bar: { 1: 2, baz: 3 } } }', ['foo' => ['bar' => [1 => 2, 'baz' => 3]]]],
+        ];
     }
 
     /**
@@ -574,12 +547,7 @@ class InlineTest extends TestCase
         $expected = new \DateTime($yaml);
         $expected->setTimeZone(new \DateTimeZone('UTC'));
         $expected->setDate($year, $month, $day);
-
-        if (\PHP_VERSION_ID >= 70100) {
-            $expected->setTime($hour, $minute, $second, 1000000 * ($second - (int) $second));
-        } else {
-            $expected->setTime($hour, $minute, $second);
-        }
+        $expected->setTime($hour, $minute, $second, 1000000 * ($second - (int) $second));
 
         $date = Inline::parse($yaml, Yaml::PARSE_DATETIME);
         $this->assertEquals($expected, $date);
@@ -588,12 +556,12 @@ class InlineTest extends TestCase
 
     public function getTimestampTests()
     {
-        return array(
-            'canonical' => array('2001-12-15T02:59:43.1Z', 2001, 12, 15, 2, 59, 43.1, '+0000'),
-            'ISO-8601' => array('2001-12-15t21:59:43.10-05:00', 2001, 12, 16, 2, 59, 43.1, '-0500'),
-            'spaced' => array('2001-12-15 21:59:43.10 -5', 2001, 12, 16, 2, 59, 43.1, '-0500'),
-            'date' => array('2001-12-15', 2001, 12, 15, 0, 0, 0, '+0000'),
-        );
+        return [
+            'canonical' => ['2001-12-15T02:59:43.1Z', 2001, 12, 15, 2, 59, 43.1, '+0000'],
+            'ISO-8601' => ['2001-12-15t21:59:43.10-05:00', 2001, 12, 16, 2, 59, 43.1, '-0500'],
+            'spaced' => ['2001-12-15 21:59:43.10 -5', 2001, 12, 16, 2, 59, 43.1, '-0500'],
+            'date' => ['2001-12-15', 2001, 12, 15, 0, 0, 0, '+0000'],
+        ];
     }
 
     /**
@@ -604,13 +572,9 @@ class InlineTest extends TestCase
         $expected = new \DateTime($yaml);
         $expected->setTimeZone(new \DateTimeZone('UTC'));
         $expected->setDate($year, $month, $day);
-        if (\PHP_VERSION_ID >= 70100) {
-            $expected->setTime($hour, $minute, $second, 1000000 * ($second - (int) $second));
-        } else {
-            $expected->setTime($hour, $minute, $second);
-        }
+        $expected->setTime($hour, $minute, $second, 1000000 * ($second - (int) $second));
 
-        $expectedNested = array('nested' => array($expected));
+        $expectedNested = ['nested' => [$expected]];
         $yamlNested = "{nested: [$yaml]}";
 
         $this->assertEquals($expectedNested, Inline::parse($yamlNested, Yaml::PARSE_DATETIME));
@@ -626,13 +590,13 @@ class InlineTest extends TestCase
 
     public function getDateTimeDumpTests()
     {
-        $tests = array();
+        $tests = [];
 
         $dateTime = new \DateTime('2001-12-15 21:59:43', new \DateTimeZone('UTC'));
-        $tests['date-time-utc'] = array($dateTime, '2001-12-15T21:59:43+00:00');
+        $tests['date-time-utc'] = [$dateTime, '2001-12-15T21:59:43+00:00'];
 
         $dateTime = new \DateTimeImmutable('2001-07-15 21:59:43', new \DateTimeZone('Europe/Berlin'));
-        $tests['immutable-date-time-europe-berlin'] = array($dateTime, '2001-07-15T21:59:43+02:00');
+        $tests['immutable-date-time-europe-berlin'] = [$dateTime, '2001-07-15T21:59:43+02:00'];
 
         return $tests;
     }
@@ -647,11 +611,11 @@ class InlineTest extends TestCase
 
     public function getBinaryData()
     {
-        return array(
-            'enclosed with double quotes' => array('!!binary "SGVsbG8gd29ybGQ="'),
-            'enclosed with single quotes' => array("!!binary 'SGVsbG8gd29ybGQ='"),
-            'containing spaces' => array('!!binary  "SGVs bG8gd 29ybGQ="'),
-        );
+        return [
+            'enclosed with double quotes' => ['!!binary "SGVsbG8gd29ybGQ="'],
+            'enclosed with single quotes' => ["!!binary 'SGVsbG8gd29ybGQ='"],
+            'containing spaces' => ['!!binary  "SGVs bG8gd 29ybGQ="'],
+        ];
     }
 
     /**
@@ -671,17 +635,17 @@ class InlineTest extends TestCase
 
     public function getInvalidBinaryData()
     {
-        return array(
-            'length not a multiple of four' => array('!!binary "SGVsbG8d29ybGQ="', '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/'),
-            'invalid characters' => array('!!binary "SGVsbG8#d29ybGQ="', '/The base64 encoded data \(.*\) contains invalid characters/'),
-            'too many equals characters' => array('!!binary "SGVsbG8gd29yb==="', '/The base64 encoded data \(.*\) contains invalid characters/'),
-            'misplaced equals character' => array('!!binary "SGVsbG8gd29ybG=Q"', '/The base64 encoded data \(.*\) contains invalid characters/'),
-        );
+        return [
+            'length not a multiple of four' => ['!!binary "SGVsbG8d29ybGQ="', '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/'],
+            'invalid characters' => ['!!binary "SGVsbG8#d29ybGQ="', '/The base64 encoded data \(.*\) contains invalid characters/'],
+            'too many equals characters' => ['!!binary "SGVsbG8gd29yb==="', '/The base64 encoded data \(.*\) contains invalid characters/'],
+            'misplaced equals character' => ['!!binary "SGVsbG8gd29ybG=Q"', '/The base64 encoded data \(.*\) contains invalid characters/'],
+        ];
     }
 
     /**
      * @expectedException \Symfony\Component\Yaml\Exception\ParseException
-     * @expectedExceptionMessage Malformed inline YAML string: {this, is not, supported}.
+     * @expectedExceptionMessage Malformed inline YAML string: {this, is not, supported} at line 1.
      */
     public function testNotSupportedMissingValue()
     {
@@ -692,19 +656,19 @@ class InlineTest extends TestCase
     {
         $longStringWithQuotes = str_repeat("x\r\n\\\"x\"x", 1000);
 
-        $yamlString = Inline::dump(array('longStringWithQuotes' => $longStringWithQuotes));
+        $yamlString = Inline::dump(['longStringWithQuotes' => $longStringWithQuotes]);
         $arrayFromYaml = Inline::parse($yamlString);
 
         $this->assertEquals($longStringWithQuotes, $arrayFromYaml['longStringWithQuotes']);
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Omitting the key of a mapping is deprecated and will throw a ParseException in 4.0.
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Missing mapping key
      */
-    public function testOmittedMappingKeyIsParsedAsColon()
+    public function testMappingKeysCannotBeOmitted()
     {
-        $this->assertSame(array(':' => 'foo'), Inline::parse('{: foo}'));
+        Inline::parse('{: foo}');
     }
 
     /**
@@ -717,20 +681,21 @@ class InlineTest extends TestCase
 
     public function getTestsForNullValues()
     {
-        return array(
-            'null before closing curly brace' => array('{foo:}', array('foo' => null)),
-            'null before comma' => array('{foo:, bar: baz}', array('foo' => null, 'bar' => 'baz')),
-        );
+        return [
+            'null before closing curly brace' => ['{foo:}', ['foo' => null]],
+            'null before comma' => ['{foo:, bar: baz}', ['foo' => null, 'bar' => 'baz']],
+        ];
     }
 
     public function testTheEmptyStringIsAValidMappingKey()
     {
-        $this->assertSame(array('' => 'foo'), Inline::parse('{ "": foo }'));
+        $this->assertSame(['' => 'foo'], Inline::parse('{ "": foo }'));
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Implicit casting of incompatible mapping keys to strings is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead.
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Implicit casting of incompatible mapping keys to strings is not supported. Quote your evaluable mapping keys instead
+     *
      * @dataProvider getNotPhpCompatibleMappingKeyData
      */
     public function testImplicitStringCastingOfMappingKeysIsDeprecated($yaml, $expected)
@@ -738,21 +703,58 @@ class InlineTest extends TestCase
         $this->assertSame($expected, Inline::parse($yaml));
     }
 
-    /**
-     * @dataProvider getNotPhpCompatibleMappingKeyData
-     */
-    public function testExplicitStringCastingOfMappingKeys($yaml, $expected)
+    public function getNotPhpCompatibleMappingKeyData()
     {
-        $this->assertSame($expected, Inline::parse($yaml, Yaml::PARSE_KEYS_AS_STRINGS));
+        return [
+            'boolean-true' => ['{true: "foo"}', ['true' => 'foo']],
+            'boolean-false' => ['{false: "foo"}', ['false' => 'foo']],
+            'null' => ['{null: "foo"}', ['null' => 'foo']],
+            'float' => ['{0.25: "foo"}', ['0.25' => 'foo']],
+        ];
     }
 
-    public function getNotPhpCompatibleMappingKeyData()
+    public function testTagWithoutValueInSequence()
+    {
+        $value = Inline::parse('[!foo]', Yaml::PARSE_CUSTOM_TAGS);
+
+        $this->assertInstanceOf(TaggedValue::class, $value[0]);
+        $this->assertSame('foo', $value[0]->getTag());
+        $this->assertSame('', $value[0]->getValue());
+    }
+
+    public function testTagWithEmptyValueInSequence()
+    {
+        $value = Inline::parse('[!foo ""]', Yaml::PARSE_CUSTOM_TAGS);
+
+        $this->assertInstanceOf(TaggedValue::class, $value[0]);
+        $this->assertSame('foo', $value[0]->getTag());
+        $this->assertSame('', $value[0]->getValue());
+    }
+
+    public function testTagWithoutValueInMapping()
+    {
+        $value = Inline::parse('{foo: !bar}', Yaml::PARSE_CUSTOM_TAGS);
+
+        $this->assertInstanceOf(TaggedValue::class, $value['foo']);
+        $this->assertSame('bar', $value['foo']->getTag());
+        $this->assertSame('', $value['foo']->getValue());
+    }
+
+    public function testTagWithEmptyValueInMapping()
+    {
+        $value = Inline::parse('{foo: !bar ""}', Yaml::PARSE_CUSTOM_TAGS);
+
+        $this->assertInstanceOf(TaggedValue::class, $value['foo']);
+        $this->assertSame('bar', $value['foo']->getTag());
+        $this->assertSame('', $value['foo']->getValue());
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Unexpected end of line, expected one of ",}" at line 1 (near "{abc: 'def'").
+     */
+    public function testUnfinishedInlineMap()
     {
-        return array(
-            'boolean-true' => array('{true: "foo"}', array('true' => 'foo')),
-            'boolean-false' => array('{false: "foo"}', array('false' => 'foo')),
-            'null' => array('{null: "foo"}', array('null' => 'foo')),
-            'float' => array('{0.25: "foo"}', array('0.25' => 'foo')),
-        );
+        Inline::parse("{abc: 'def'");
     }
 }
diff --git a/vendor/symfony/yaml/Tests/ParserTest.php b/vendor/symfony/yaml/Tests/ParserTest.php
index 620eff32..6fc02e1d 100644
--- a/vendor/symfony/yaml/Tests/ParserTest.php
+++ b/vendor/symfony/yaml/Tests/ParserTest.php
@@ -13,9 +13,9 @@ namespace Symfony\Component\Yaml\Tests;
 
 use PHPUnit\Framework\TestCase;
 use Symfony\Component\Yaml\Exception\ParseException;
-use Symfony\Component\Yaml\Yaml;
 use Symfony\Component\Yaml\Parser;
 use Symfony\Component\Yaml\Tag\TaggedValue;
+use Symfony\Component\Yaml\Yaml;
 
 class ParserTest extends TestCase
 {
@@ -30,39 +30,16 @@ class ParserTest extends TestCase
     protected function tearDown()
     {
         $this->parser = null;
+
+        chmod(__DIR__.'/Fixtures/not_readable.yml', 0644);
     }
 
     /**
      * @dataProvider getDataFormSpecifications
      */
-    public function testSpecifications($expected, $yaml, $comment, $deprecated)
+    public function testSpecifications($expected, $yaml, $comment)
     {
-        $deprecations = array();
-
-        if ($deprecated) {
-            set_error_handler(function ($type, $msg) use (&$deprecations) {
-                if (E_USER_DEPRECATED !== $type) {
-                    restore_error_handler();
-
-                    if (class_exists('PHPUnit_Util_ErrorHandler')) {
-                        return call_user_func_array('PHPUnit_Util_ErrorHandler::handleError', func_get_args());
-                    }
-
-                    return call_user_func_array('PHPUnit\Util\ErrorHandler::handleError', func_get_args());
-                }
-
-                $deprecations[] = $msg;
-            });
-        }
-
         $this->assertEquals($expected, var_export($this->parser->parse($yaml), true), $comment);
-
-        if ($deprecated) {
-            restore_error_handler();
-
-            $this->assertCount(1, $deprecations);
-            $this->assertContains('Using the comma as a group separator for floats is deprecated since version 3.2 and will be removed in 4.0.', $deprecations[0]);
-        }
     }
 
     public function getDataFormSpecifications()
@@ -70,42 +47,20 @@ class ParserTest extends TestCase
         return $this->loadTestsFromFixtureFiles('index.yml');
     }
 
-    /**
-     * @dataProvider getNonStringMappingKeysData
-     */
-    public function testNonStringMappingKeys($expected, $yaml, $comment)
-    {
-        $this->assertSame($expected, var_export($this->parser->parse($yaml, Yaml::PARSE_KEYS_AS_STRINGS), true), $comment);
-    }
-
     public function getNonStringMappingKeysData()
     {
         return $this->loadTestsFromFixtureFiles('nonStringKeys.yml');
     }
 
-    /**
-     * @group legacy
-     * @dataProvider getLegacyNonStringMappingKeysData
-     */
-    public function testLegacyNonStringMappingKeys($expected, $yaml, $comment)
-    {
-        $this->assertSame($expected, var_export($this->parser->parse($yaml), true), $comment);
-    }
-
-    public function getLegacyNonStringMappingKeysData()
-    {
-        return $this->loadTestsFromFixtureFiles('legacyNonStringKeys.yml');
-    }
-
     public function testTabsInYaml()
     {
         // test tabs in YAML
-        $yamls = array(
+        $yamls = [
             "foo:\n	bar",
             "foo:\n 	bar",
             "foo:\n	 bar",
             "foo:\n 	 bar",
-        );
+        ];
 
         foreach ($yamls as $yaml) {
             try {
@@ -132,7 +87,7 @@ EOF;
 
     public function getBlockChompingTests()
     {
-        $tests = array();
+        $tests = [];
 
         $yaml = <<<'EOF'
 foo: |-
@@ -143,11 +98,11 @@ bar: |-
     two
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one\ntwo",
             'bar' => "one\ntwo",
-        );
-        $tests['Literal block chomping strip with single trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Literal block chomping strip with single trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: |-
@@ -160,19 +115,19 @@ bar: |-
 
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one\ntwo",
             'bar' => "one\ntwo",
-        );
-        $tests['Literal block chomping strip with multiple trailing newlines'] = array($expected, $yaml);
+        ];
+        $tests['Literal block chomping strip with multiple trailing newlines'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 {}
 
 
 EOF;
-        $expected = array();
-        $tests['Literal block chomping strip with multiple trailing newlines after a 1-liner'] = array($expected, $yaml);
+        $expected = [];
+        $tests['Literal block chomping strip with multiple trailing newlines after a 1-liner'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: |-
@@ -182,11 +137,11 @@ bar: |-
     one
     two
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one\ntwo",
             'bar' => "one\ntwo",
-        );
-        $tests['Literal block chomping strip without trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Literal block chomping strip without trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: |
@@ -197,11 +152,11 @@ bar: |
     two
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one\ntwo\n",
             'bar' => "one\ntwo\n",
-        );
-        $tests['Literal block chomping clip with single trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Literal block chomping clip with single trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: |
@@ -214,11 +169,11 @@ bar: |
 
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one\ntwo\n",
             'bar' => "one\ntwo\n",
-        );
-        $tests['Literal block chomping clip with multiple trailing newlines'] = array($expected, $yaml);
+        ];
+        $tests['Literal block chomping clip with multiple trailing newlines'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo:
@@ -227,14 +182,14 @@ foo:
 
     two
 EOF;
-        $expected = array(
-            'foo' => array(
-                array(
+        $expected = [
+            'foo' => [
+                [
                     'bar' => "one\n\ntwo",
-                ),
-            ),
-        );
-        $tests['Literal block chomping clip with embedded blank line inside unindented collection'] = array($expected, $yaml);
+                ],
+            ],
+        ];
+        $tests['Literal block chomping clip with embedded blank line inside unindented collection'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: |
@@ -244,11 +199,11 @@ bar: |
     one
     two
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one\ntwo\n",
             'bar' => "one\ntwo",
-        );
-        $tests['Literal block chomping clip without trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Literal block chomping clip without trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: |+
@@ -259,11 +214,11 @@ bar: |+
     two
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one\ntwo\n",
             'bar' => "one\ntwo\n",
-        );
-        $tests['Literal block chomping keep with single trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Literal block chomping keep with single trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: |+
@@ -276,11 +231,11 @@ bar: |+
 
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one\ntwo\n\n",
             'bar' => "one\ntwo\n\n",
-        );
-        $tests['Literal block chomping keep with multiple trailing newlines'] = array($expected, $yaml);
+        ];
+        $tests['Literal block chomping keep with multiple trailing newlines'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: |+
@@ -290,11 +245,11 @@ bar: |+
     one
     two
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one\ntwo\n",
             'bar' => "one\ntwo",
-        );
-        $tests['Literal block chomping keep without trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Literal block chomping keep without trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: >-
@@ -305,11 +260,11 @@ bar: >-
     two
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => 'one two',
             'bar' => 'one two',
-        );
-        $tests['Folded block chomping strip with single trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Folded block chomping strip with single trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: >-
@@ -322,11 +277,11 @@ bar: >-
 
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => 'one two',
             'bar' => 'one two',
-        );
-        $tests['Folded block chomping strip with multiple trailing newlines'] = array($expected, $yaml);
+        ];
+        $tests['Folded block chomping strip with multiple trailing newlines'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: >-
@@ -336,11 +291,11 @@ bar: >-
     one
     two
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => 'one two',
             'bar' => 'one two',
-        );
-        $tests['Folded block chomping strip without trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Folded block chomping strip without trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: >
@@ -351,11 +306,11 @@ bar: >
     two
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one two\n",
             'bar' => "one two\n",
-        );
-        $tests['Folded block chomping clip with single trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Folded block chomping clip with single trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: >
@@ -368,11 +323,11 @@ bar: >
 
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one two\n",
             'bar' => "one two\n",
-        );
-        $tests['Folded block chomping clip with multiple trailing newlines'] = array($expected, $yaml);
+        ];
+        $tests['Folded block chomping clip with multiple trailing newlines'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: >
@@ -382,11 +337,11 @@ bar: >
     one
     two
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one two\n",
             'bar' => 'one two',
-        );
-        $tests['Folded block chomping clip without trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Folded block chomping clip without trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: >+
@@ -397,11 +352,11 @@ bar: >+
     two
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one two\n",
             'bar' => "one two\n",
-        );
-        $tests['Folded block chomping keep with single trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Folded block chomping keep with single trailing newline'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: >+
@@ -414,11 +369,11 @@ bar: >+
 
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one two\n\n",
             'bar' => "one two\n\n",
-        );
-        $tests['Folded block chomping keep with multiple trailing newlines'] = array($expected, $yaml);
+        ];
+        $tests['Folded block chomping keep with multiple trailing newlines'] = [$expected, $yaml];
 
         $yaml = <<<'EOF'
 foo: >+
@@ -428,11 +383,11 @@ bar: >+
     one
     two
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "one two\n",
             'bar' => 'one two',
-        );
-        $tests['Folded block chomping keep without trailing newline'] = array($expected, $yaml);
+        ];
+        $tests['Folded block chomping keep without trailing newline'] = [$expected, $yaml];
 
         return $tests;
     }
@@ -459,9 +414,9 @@ foo: |-
     bar
 
 EOF;
-        $expected = array(
+        $expected = [
             'foo' => "\n\nbar",
-        );
+        ];
 
         $this->assertSame($expected, $this->parser->parse($yaml));
     }
@@ -469,70 +424,34 @@ EOF;
     public function testObjectSupportEnabled()
     {
         $input = <<<'EOF'
-foo: !php/object:O:30:"Symfony\Component\Yaml\Tests\B":1:{s:1:"b";s:3:"foo";}
+foo: !php/object O:30:"Symfony\Component\Yaml\Tests\B":1:{s:1:"b";s:3:"foo";}
 bar: 1
 EOF;
-        $this->assertEquals(array('foo' => new B(), 'bar' => 1), $this->parser->parse($input, Yaml::PARSE_OBJECT), '->parse() is able to parse objects');
+        $this->assertEquals(['foo' => new B(), 'bar' => 1], $this->parser->parse($input, Yaml::PARSE_OBJECT), '->parse() is able to parse objects');
     }
 
-    /**
-     * @group legacy
-     */
-    public function testObjectSupportEnabledPassingTrue()
+    public function testObjectSupportDisabledButNoExceptions()
     {
         $input = <<<'EOF'
-foo: !php/object:O:30:"Symfony\Component\Yaml\Tests\B":1:{s:1:"b";s:3:"foo";}
+foo: !php/object O:30:"Symfony\Tests\Component\Yaml\B":1:{s:1:"b";s:3:"foo";}
 bar: 1
 EOF;
-        $this->assertEquals(array('foo' => new B(), 'bar' => 1), $this->parser->parse($input, false, true), '->parse() is able to parse objects');
-    }
-
-    /**
-     * @group legacy
-     */
-    public function testObjectSupportEnabledWithDeprecatedTag()
-    {
-        $input = <<<'EOF'
-foo: !!php/object:O:30:"Symfony\Component\Yaml\Tests\B":1:{s:1:"b";s:3:"foo";}
-bar: 1
-EOF;
-        $this->assertEquals(array('foo' => new B(), 'bar' => 1), $this->parser->parse($input, Yaml::PARSE_OBJECT), '->parse() is able to parse objects');
-    }
-
-    /**
-     * @dataProvider invalidDumpedObjectProvider
-     */
-    public function testObjectSupportDisabledButNoExceptions($input)
-    {
-        $this->assertEquals(array('foo' => null, 'bar' => 1), $this->parser->parse($input), '->parse() does not parse objects');
+        $this->assertEquals(['foo' => null, 'bar' => 1], $this->parser->parse($input), '->parse() does not parse objects');
     }
 
     /**
      * @dataProvider getObjectForMapTests
      */
-    public function testObjectForMap($yaml, $expected, $explicitlyParseKeysAsStrings = false)
+    public function testObjectForMap($yaml, $expected)
     {
         $flags = Yaml::PARSE_OBJECT_FOR_MAP;
 
-        if ($explicitlyParseKeysAsStrings) {
-            $flags |= Yaml::PARSE_KEYS_AS_STRINGS;
-        }
-
         $this->assertEquals($expected, $this->parser->parse($yaml, $flags));
     }
 
-    /**
-     * @group legacy
-     * @dataProvider getObjectForMapTests
-     */
-    public function testObjectForMapEnabledWithMappingUsingBooleanToggles($yaml, $expected)
-    {
-        $this->assertEquals($expected, $this->parser->parse($yaml, false, false, true));
-    }
-
     public function getObjectForMapTests()
     {
-        $tests = array();
+        $tests = [];
 
         $yaml = <<<'EOF'
 foo:
@@ -540,20 +459,20 @@ foo:
 EOF;
         $expected = new \stdClass();
         $expected->foo = new \stdClass();
-        $expected->foo->fiz = array('cat');
-        $tests['mapping'] = array($yaml, $expected);
+        $expected->foo->fiz = ['cat'];
+        $tests['mapping'] = [$yaml, $expected];
 
         $yaml = '{ "foo": "bar", "fiz": "cat" }';
         $expected = new \stdClass();
         $expected->foo = 'bar';
         $expected->fiz = 'cat';
-        $tests['inline-mapping'] = array($yaml, $expected);
+        $tests['inline-mapping'] = [$yaml, $expected];
 
         $yaml = "foo: bar\nbaz: foobar";
         $expected = new \stdClass();
         $expected->foo = 'bar';
         $expected->baz = 'foobar';
-        $tests['object-for-map-is-applied-after-parsing'] = array($yaml, $expected);
+        $tests['object-for-map-is-applied-after-parsing'] = [$yaml, $expected];
 
         $yaml = <<<'EOT'
 array:
@@ -561,12 +480,12 @@ array:
   - key: two
 EOT;
         $expected = new \stdClass();
-        $expected->array = array();
+        $expected->array = [];
         $expected->array[0] = new \stdClass();
         $expected->array[0]->key = 'one';
         $expected->array[1] = new \stdClass();
         $expected->array[1]->key = 'two';
-        $tests['nest-map-and-sequence'] = array($yaml, $expected);
+        $tests['nest-map-and-sequence'] = [$yaml, $expected];
 
         $yaml = <<<'YAML'
 map:
@@ -577,67 +496,58 @@ YAML;
         $expected->map = new \stdClass();
         $expected->map->{1} = 'one';
         $expected->map->{2} = 'two';
-        $tests['numeric-keys'] = array($yaml, $expected, true);
+        $tests['numeric-keys'] = [$yaml, $expected];
 
         $yaml = <<<'YAML'
 map:
-  0: one
-  1: two
+  '0': one
+  '1': two
 YAML;
         $expected = new \stdClass();
         $expected->map = new \stdClass();
         $expected->map->{0} = 'one';
         $expected->map->{1} = 'two';
-        $tests['zero-indexed-numeric-keys'] = array($yaml, $expected, true);
+        $tests['zero-indexed-numeric-keys'] = [$yaml, $expected];
 
         return $tests;
     }
 
     /**
-     * @dataProvider invalidDumpedObjectProvider
      * @expectedException \Symfony\Component\Yaml\Exception\ParseException
      */
-    public function testObjectsSupportDisabledWithExceptions($yaml)
+    public function testObjectsSupportDisabledWithExceptions()
     {
-        $this->parser->parse($yaml, Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE);
-    }
-
-    public function testCanParseContentWithTrailingSpaces()
-    {
-        $yaml = "items:  \n  foo: bar";
-
-        $expected = array(
-            'items' => array('foo' => 'bar'),
-        );
+        $yaml = <<<'EOF'
+foo: !php/object:O:30:"Symfony\Tests\Component\Yaml\B":1:{s:1:"b";s:3:"foo";}
+bar: 1
+EOF;
 
-        $this->assertSame($expected, $this->parser->parse($yaml));
+        $this->parser->parse($yaml, Yaml::PARSE_EXCEPTION_ON_INVALID_TYPE);
     }
 
     /**
      * @group legacy
-     * @dataProvider invalidDumpedObjectProvider
-     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedDeprecation Support for mapping keys in multi-line blocks is deprecated since Symfony 4.3 and will throw a ParseException in 5.0.
      */
-    public function testObjectsSupportDisabledWithExceptionsUsingBooleanToggles($yaml)
+    public function testMappingKeyInMultiLineStringTriggersDeprecationNotice()
     {
-        $this->parser->parse($yaml, true);
+        $yaml = <<<'EOF'
+data:
+    dbal:wrong
+        default_connection: monolith
+EOF;
+        $this->parser->parse($yaml);
     }
 
-    public function invalidDumpedObjectProvider()
+    public function testCanParseContentWithTrailingSpaces()
     {
-        $yamlTag = <<<'EOF'
-foo: !!php/object:O:30:"Symfony\Tests\Component\Yaml\B":1:{s:1:"b";s:3:"foo";}
-bar: 1
-EOF;
-        $localTag = <<<'EOF'
-foo: !php/object:O:30:"Symfony\Tests\Component\Yaml\B":1:{s:1:"b";s:3:"foo";}
-bar: 1
-EOF;
+        $yaml = "items:  \n  foo: bar";
 
-        return array(
-            'yaml-tag' => array($yamlTag),
-            'local-tag' => array($localTag),
-        );
+        $expected = [
+            'items' => ['foo' => 'bar'],
+        ];
+
+        $this->assertSame($expected, $this->parser->parse($yaml));
     }
 
     /**
@@ -645,11 +555,11 @@ EOF;
      */
     public function testNonUtf8Exception()
     {
-        $yamls = array(
+        $yamls = [
             iconv('UTF-8', 'ISO-8859-1', "foo: 'äöü�'"),
             iconv('UTF-8', 'ISO-8859-15', "euro: 'â?¬'"),
             iconv('UTF-8', 'CP1252', "cp1252: '©��áñ'"),
-        );
+        ];
 
         foreach ($yamls as $yaml) {
             try {
@@ -740,19 +650,19 @@ a:
 - foo
 d: e
 EOT;
-        $expected = array(
-            'a' => array(
-                array(
-                    'b' => array(
-                        array(
+        $expected = [
+            'a' => [
+                [
+                    'b' => [
+                        [
                             'bar' => 'baz',
-                        ),
-                    ),
-                ),
+                        ],
+                    ],
+                ],
                 'foo',
-            ),
+            ],
             'd' => 'e',
-        );
+        ];
 
         $this->assertSame($expected, $this->parser->parse($yaml));
     }
@@ -766,12 +676,94 @@ a:
 # comment
     d: e
 EOT;
-        $expected = array(
-            'a' => array(
-                'b' => array('c'),
+        $expected = [
+            'a' => [
+                'b' => ['c'],
                 'd' => 'e',
-            ),
-        );
+            ],
+        ];
+
+        $this->assertSame($expected, $this->parser->parse($yaml));
+    }
+
+    public function testNonStringFollowedByCommentEmbeddedInMapping()
+    {
+        $yaml = <<<'EOT'
+a:
+    b:
+        {}
+# comment
+    d:
+        1.1
+# another comment
+EOT;
+        $expected = [
+            'a' => [
+                'b' => [],
+                'd' => 1.1,
+            ],
+        ];
+
+        $this->assertSame($expected, $this->parser->parse($yaml));
+    }
+
+    public function getParseExceptionNotAffectedMultiLineStringLastResortParsing()
+    {
+        $tests = [];
+
+        $yaml = <<<'EOT'
+a
+    b:
+EOT;
+        $tests['parse error on first line'] = [$yaml];
+
+        $yaml = <<<'EOT'
+a
+
+b
+    c:
+EOT;
+        $tests['parse error due to inconsistent indentation'] = [$yaml];
+
+        $yaml = <<<'EOT'
+ &  *  !  |  >  '  "  %  @  ` #, { asd a;sdasd }-@^qw3
+EOT;
+        $tests['symfony/symfony/issues/22967#issuecomment-322067742'] = [$yaml];
+
+        return $tests;
+    }
+
+    /**
+     * @dataProvider getParseExceptionNotAffectedMultiLineStringLastResortParsing
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     */
+    public function testParseExceptionNotAffectedByMultiLineStringLastResortParsing($yaml)
+    {
+        $this->parser->parse($yaml);
+    }
+
+    public function testMultiLineStringLastResortParsing()
+    {
+        $yaml = <<<'EOT'
+test:
+  You can have things that don't look like strings here
+  true
+  yes you can
+EOT;
+        $expected = [
+            'test' => 'You can have things that don\'t look like strings here true yes you can',
+        ];
+
+        $this->assertSame($expected, $this->parser->parse($yaml));
+
+        $yaml = <<<'EOT'
+a:
+    b
+       c
+EOT;
+        $expected = [
+            'a' => 'b c',
+        ];
 
         $this->assertSame($expected, $this->parser->parse($yaml));
     }
@@ -805,15 +797,17 @@ EOF
     }
 
     /**
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Duplicate key "child" detected
+     *
      * > It is an error for two equal keys to appear in the same mapping node.
      * > In such a case the YAML processor may continue, ignoring the second
-     * > `key: value` pair and issuing an appropriate warning. This strategy
+     * > "key: value" pair and issuing an appropriate warning. This strategy
      * > preserves a consistent information model for one-pass and random access
      * > applications.
      *
      * @see http://yaml.org/spec/1.2/spec.html#id2759572
      * @see http://yaml.org/spec/1.1/#id932806
-     * @group legacy
      */
     public function testMappingDuplicateKeyBlock()
     {
@@ -825,16 +819,17 @@ parent:
     child: duplicate
     child: duplicate
 EOD;
-        $expected = array(
-            'parent' => array(
+        $expected = [
+            'parent' => [
                 'child' => 'first',
-            ),
-        );
+            ],
+        ];
         $this->assertSame($expected, Yaml::parse($input));
     }
 
     /**
-     * @group legacy
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Duplicate key "child" detected
      */
     public function testMappingDuplicateKeyFlow()
     {
@@ -842,51 +837,51 @@ EOD;
 parent: { child: first, child: duplicate }
 parent: { child: duplicate, child: duplicate }
 EOD;
-        $expected = array(
-            'parent' => array(
+        $expected = [
+            'parent' => [
                 'child' => 'first',
-            ),
-        );
+            ],
+        ];
         $this->assertSame($expected, Yaml::parse($input));
     }
 
     /**
-     * @group legacy
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
      * @dataProvider getParseExceptionOnDuplicateData
-     * @expectedDeprecation Duplicate key "%s" detected whilst parsing YAML. Silent handling of duplicate mapping keys in YAML is deprecated %s.
-     * throws \Symfony\Component\Yaml\Exception\ParseException in 4.0
      */
     public function testParseExceptionOnDuplicate($input, $duplicateKey, $lineNumber)
     {
+        $this->expectExceptionMessage(sprintf('Duplicate key "%s" detected at line %d', $duplicateKey, $lineNumber));
+
         Yaml::parse($input);
     }
 
     public function getParseExceptionOnDuplicateData()
     {
-        $tests = array();
+        $tests = [];
 
         $yaml = <<<EOD
 parent: { child: first, child: duplicate }
 EOD;
-        $tests[] = array($yaml, 'child', 1);
+        $tests[] = [$yaml, 'child', 1];
 
         $yaml = <<<EOD
 parent:
   child: first,
   child: duplicate
 EOD;
-        $tests[] = array($yaml, 'child', 3);
+        $tests[] = [$yaml, 'child', 3];
 
         $yaml = <<<EOD
 parent: { child: foo }
 parent: { child: bar }
 EOD;
-        $tests[] = array($yaml, 'parent', 2);
+        $tests[] = [$yaml, 'parent', 2];
 
         $yaml = <<<EOD
 parent: { child_mapping: { value: bar},  child_mapping: { value: bar} }
 EOD;
-        $tests[] = array($yaml, 'child_mapping', 1);
+        $tests[] = [$yaml, 'child_mapping', 1];
 
         $yaml = <<<EOD
 parent:
@@ -895,12 +890,12 @@ parent:
   child_mapping:
     value: bar
 EOD;
-        $tests[] = array($yaml, 'child_mapping', 4);
+        $tests[] = [$yaml, 'child_mapping', 4];
 
         $yaml = <<<EOD
 parent: { child_sequence: ['key1', 'key2', 'key3'],  child_sequence: ['key1', 'key2', 'key3'] }
 EOD;
-        $tests[] = array($yaml, 'child_sequence', 1);
+        $tests[] = [$yaml, 'child_sequence', 1];
 
         $yaml = <<<EOD
 parent:
@@ -913,7 +908,7 @@ parent:
     - key2
     - key3
 EOD;
-        $tests[] = array($yaml, 'child_sequence', 6);
+        $tests[] = [$yaml, 'child_sequence', 6];
 
         return $tests;
     }
@@ -924,21 +919,21 @@ EOD;
 hash:
 EOF;
 
-        $this->assertEquals(array('hash' => null), Yaml::parse($input));
+        $this->assertEquals(['hash' => null], Yaml::parse($input));
     }
 
     public function testCommentAtTheRootIndent()
     {
-        $this->assertEquals(array(
-            'services' => array(
-                'app.foo_service' => array(
+        $this->assertEquals([
+            'services' => [
+                'app.foo_service' => [
                     'class' => 'Foo',
-                ),
-                'app/bar_service' => array(
+                ],
+                'app/bar_service' => [
                     'class' => 'Bar',
-                ),
-            ),
-        ), Yaml::parse(<<<'EOF'
+                ],
+            ],
+        ], Yaml::parse(<<<'EOF'
 # comment 1
 services:
 # comment 2
@@ -955,7 +950,7 @@ EOF
 
     public function testStringBlockWithComments()
     {
-        $this->assertEquals(array('content' => <<<'EOT'
+        $this->assertEquals(['content' => <<<'EOT'
 # comment 1
 header
 
@@ -966,7 +961,7 @@ header
 
 footer # comment3
 EOT
-        ), Yaml::parse(<<<'EOF'
+        ], Yaml::parse(<<<'EOF'
 content: |
     # comment 1
     header
@@ -983,7 +978,7 @@ EOF
 
     public function testFoldedStringBlockWithComments()
     {
-        $this->assertEquals(array(array('content' => <<<'EOT'
+        $this->assertEquals([['content' => <<<'EOT'
 # comment 1
 header
 
@@ -994,7 +989,7 @@ header
 
 footer # comment3
 EOT
-        )), Yaml::parse(<<<'EOF'
+        ]], Yaml::parse(<<<'EOF'
 -
     content: |
         # comment 1
@@ -1012,7 +1007,7 @@ EOF
 
     public function testNestedFoldedStringBlockWithComments()
     {
-        $this->assertEquals(array(array(
+        $this->assertEquals([[
             'title' => 'some title',
             'content' => <<<'EOT'
 # comment 1
@@ -1025,7 +1020,7 @@ header
 
 footer # comment3
 EOT
-        )), Yaml::parse(<<<'EOF'
+        ]], Yaml::parse(<<<'EOF'
 -
     title: some title
     content: |
@@ -1044,17 +1039,17 @@ EOF
 
     public function testReferenceResolvingInInlineStrings()
     {
-        $this->assertEquals(array(
+        $this->assertEquals([
             'var' => 'var-value',
             'scalar' => 'var-value',
-            'list' => array('var-value'),
-            'list_in_list' => array(array('var-value')),
-            'map_in_list' => array(array('key' => 'var-value')),
-            'embedded_mapping' => array(array('key' => 'var-value')),
-            'map' => array('key' => 'var-value'),
-            'list_in_map' => array('key' => array('var-value')),
-            'map_in_map' => array('foo' => array('bar' => 'var-value')),
-        ), Yaml::parse(<<<'EOF'
+            'list' => ['var-value'],
+            'list_in_list' => [['var-value']],
+            'map_in_list' => [['key' => 'var-value']],
+            'embedded_mapping' => [['key' => 'var-value']],
+            'map' => ['key' => 'var-value'],
+            'list_in_map' => ['key' => ['var-value']],
+            'map_in_map' => ['foo' => ['bar' => 'var-value']],
+        ], Yaml::parse(<<<'EOF'
 var:  &var var-value
 scalar: *var
 list: [ *var ]
@@ -1076,12 +1071,12 @@ EOF
 foo: 1
 bar: 2
 EOF;
-        $this->assertEquals(array('foo' => 1, 'bar' => 2), $this->parser->parse($yaml));
+        $this->assertEquals(['foo' => 1, 'bar' => 2], $this->parser->parse($yaml));
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Implicit casting of numeric key to string is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead.
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Numeric keys are not supported. Quote your evaluable mapping keys instead
      */
     public function testFloatKeys()
     {
@@ -1091,19 +1086,12 @@ foo:
     1.3: "baz"
 EOF;
 
-        $expected = array(
-            'foo' => array(
-                '1.2' => 'bar',
-                '1.3' => 'baz',
-            ),
-        );
-
-        $this->assertEquals($expected, $this->parser->parse($yaml));
+        $this->parser->parse($yaml);
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Implicit casting of non-string key to string is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0. Quote your evaluable mapping keys instead.
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Non-string keys are not supported. Quote your evaluable mapping keys instead
      */
     public function testBooleanKeys()
     {
@@ -1112,45 +1100,32 @@ true: foo
 false: bar
 EOF;
 
-        $expected = array(
-            1 => 'foo',
-            0 => 'bar',
-        );
-
-        $this->assertEquals($expected, $this->parser->parse($yaml));
+        $this->parser->parse($yaml);
     }
 
-    public function testExplicitStringCastingOfFloatKeys()
+    public function testExplicitStringCasting()
     {
         $yaml = <<<'EOF'
-foo:
-    1.2: "bar"
-    1.3: "baz"
-EOF;
+'1.2': "bar"
+!!str 1.3: "baz"
 
-        $expected = array(
-            'foo' => array(
-                '1.2' => 'bar',
-                '1.3' => 'baz',
-            ),
-        );
+'true': foo
+!!str false: bar
 
-        $this->assertEquals($expected, $this->parser->parse($yaml, Yaml::PARSE_KEYS_AS_STRINGS));
-    }
-
-    public function testExplicitStringCastingOfBooleanKeys()
-    {
-        $yaml = <<<'EOF'
-true: foo
-false: bar
+!!str null: 'null'
+'~': 'null'
 EOF;
 
-        $expected = array(
+        $expected = [
+            '1.2' => 'bar',
+            '1.3' => 'baz',
             'true' => 'foo',
             'false' => 'bar',
-        );
+            'null' => 'null',
+            '~' => 'null',
+        ];
 
-        $this->assertEquals($expected, $this->parser->parse($yaml, Yaml::PARSE_KEYS_AS_STRINGS));
+        $this->assertEquals($expected, $this->parser->parse($yaml));
     }
 
     /**
@@ -1173,7 +1148,7 @@ foo:
     bar: foobar # Note: a comment after a colon
 EOT;
 
-        $this->assertSame(array('foo' => array('bar' => 'foobar')), $this->parser->parse($yaml));
+        $this->assertSame(['foo' => ['bar' => 'foobar']], $this->parser->parse($yaml));
     }
 
     /**
@@ -1186,7 +1161,7 @@ EOT;
 
     public function getCommentLikeStringInScalarBlockData()
     {
-        $tests = array();
+        $tests = [];
 
         $yaml = <<<'EOT'
 pages:
@@ -1203,9 +1178,9 @@ pages:
 
             footer # comment3
 EOT;
-        $expected = array(
-            'pages' => array(
-                array(
+        $expected = [
+            'pages' => [
+                [
                     'title' => 'some title',
                     'content' => <<<'EOT'
 # comment 1
@@ -1219,10 +1194,10 @@ header
 footer # comment3
 EOT
                     ,
-                ),
-            ),
-        );
-        $tests[] = array($yaml, $expected);
+                ],
+            ],
+        ];
+        $tests[] = [$yaml, $expected];
 
         $yaml = <<<'EOT'
 test: |
@@ -1239,7 +1214,7 @@ collection:
         # bar
         baz
 EOT;
-        $expected = array(
+        $expected = [
             'test' => <<<'EOT'
 foo
 # bar
@@ -1247,8 +1222,8 @@ baz
 
 EOT
             ,
-            'collection' => array(
-                array(
+            'collection' => [
+                [
                     'one' => <<<'EOT'
 foo
 # bar
@@ -1256,18 +1231,18 @@ baz
 
 EOT
                     ,
-                ),
-                array(
+                ],
+                [
                     'two' => <<<'EOT'
 foo
 # bar
 baz
 EOT
                     ,
-                ),
-            ),
-        );
-        $tests[] = array($yaml, $expected);
+                ],
+            ],
+        ];
+        $tests[] = [$yaml, $expected];
 
         $yaml = <<<'EOT'
 foo:
@@ -1279,17 +1254,17 @@ foo:
 # comment
     foobar: ~
 EOT;
-        $expected = array(
-            'foo' => array(
-                'bar' => array(
+        $expected = [
+            'foo' => [
+                'bar' => [
                     'scalar-block' => "line1 line2>\n",
-                ),
-                'baz' => array(
+                ],
+                'baz' => [
                     'foobar' => null,
-                ),
-            ),
-        );
-        $tests[] = array($yaml, $expected);
+                ],
+            ],
+        ];
+        $tests[] = [$yaml, $expected];
 
         $yaml = <<<'EOT'
 a:
@@ -1299,13 +1274,13 @@ a:
 #        second row
     d: hello
 EOT;
-        $expected = array(
-            'a' => array(
+        $expected = [
+            'a' => [
                 'b' => 'hello',
                 'd' => 'hello',
-            ),
-        );
-        $tests[] = array($yaml, $expected);
+            ],
+        ];
+        $tests[] = [$yaml, $expected];
 
         return $tests;
     }
@@ -1323,13 +1298,13 @@ test: >
 EOT;
 
         $this->assertSame(
-            array(
+            [
                 'test' => <<<'EOT'
 <h2>A heading</h2>
 <ul> <li>a list</li> <li>may be a good example</li> </ul>
 EOT
                 ,
-            ),
+            ],
             $this->parser->parse($yaml)
         );
     }
@@ -1347,7 +1322,7 @@ test: >
 EOT;
 
         $this->assertSame(
-            array(
+            [
                 'test' => <<<'EOT'
 <h2>A heading</h2>
 <ul>
@@ -1356,7 +1331,7 @@ EOT;
 </ul>
 EOT
                 ,
-            ),
+            ],
             $this->parser->parse($yaml)
         );
     }
@@ -1366,28 +1341,28 @@ EOT
      */
     public function testParseBinaryData($data)
     {
-        $this->assertSame(array('data' => 'Hello world'), $this->parser->parse($data));
+        $this->assertSame(['data' => 'Hello world'], $this->parser->parse($data));
     }
 
     public function getBinaryData()
     {
-        return array(
-            'enclosed with double quotes' => array('data: !!binary "SGVsbG8gd29ybGQ="'),
-            'enclosed with single quotes' => array("data: !!binary 'SGVsbG8gd29ybGQ='"),
-            'containing spaces' => array('data: !!binary  "SGVs bG8gd 29ybGQ="'),
-            'in block scalar' => array(
+        return [
+            'enclosed with double quotes' => ['data: !!binary "SGVsbG8gd29ybGQ="'],
+            'enclosed with single quotes' => ["data: !!binary 'SGVsbG8gd29ybGQ='"],
+            'containing spaces' => ['data: !!binary  "SGVs bG8gd 29ybGQ="'],
+            'in block scalar' => [
                 <<<'EOT'
 data: !!binary |
     SGVsbG8gd29ybGQ=
 EOT
-    ),
-            'containing spaces in block scalar' => array(
+    ],
+            'containing spaces in block scalar' => [
                 <<<'EOT'
 data: !!binary |
     SGVs bG8gd 29ybGQ=
 EOT
-    ),
-        );
+    ],
+        ];
     }
 
     /**
@@ -1407,44 +1382,44 @@ EOT
 
     public function getInvalidBinaryData()
     {
-        return array(
-            'length not a multiple of four' => array('data: !!binary "SGVsbG8d29ybGQ="', '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/'),
-            'invalid characters' => array('!!binary "SGVsbG8#d29ybGQ="', '/The base64 encoded data \(.*\) contains invalid characters/'),
-            'too many equals characters' => array('data: !!binary "SGVsbG8gd29yb==="', '/The base64 encoded data \(.*\) contains invalid characters/'),
-            'misplaced equals character' => array('data: !!binary "SGVsbG8gd29ybG=Q"', '/The base64 encoded data \(.*\) contains invalid characters/'),
-            'length not a multiple of four in block scalar' => array(
+        return [
+            'length not a multiple of four' => ['data: !!binary "SGVsbG8d29ybGQ="', '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/'],
+            'invalid characters' => ['!!binary "SGVsbG8#d29ybGQ="', '/The base64 encoded data \(.*\) contains invalid characters/'],
+            'too many equals characters' => ['data: !!binary "SGVsbG8gd29yb==="', '/The base64 encoded data \(.*\) contains invalid characters/'],
+            'misplaced equals character' => ['data: !!binary "SGVsbG8gd29ybG=Q"', '/The base64 encoded data \(.*\) contains invalid characters/'],
+            'length not a multiple of four in block scalar' => [
                 <<<'EOT'
 data: !!binary |
     SGVsbG8d29ybGQ=
 EOT
                 ,
                 '/The normalized base64 encoded data \(data without whitespace characters\) length must be a multiple of four \(\d+ bytes given\)/',
-            ),
-            'invalid characters in block scalar' => array(
+            ],
+            'invalid characters in block scalar' => [
                 <<<'EOT'
 data: !!binary |
     SGVsbG8#d29ybGQ=
 EOT
                 ,
                 '/The base64 encoded data \(.*\) contains invalid characters/',
-            ),
-            'too many equals characters in block scalar' => array(
+            ],
+            'too many equals characters in block scalar' => [
                 <<<'EOT'
 data: !!binary |
     SGVsbG8gd29yb===
 EOT
                 ,
                 '/The base64 encoded data \(.*\) contains invalid characters/',
-            ),
-            'misplaced equals character in block scalar' => array(
+            ],
+            'misplaced equals character in block scalar' => [
                 <<<'EOT'
 data: !!binary |
     SGVsbG8gd29ybG=Q
 EOT
                 ,
                 '/The base64 encoded data \(.*\) contains invalid characters/',
-            ),
-        );
+            ],
+        ];
     }
 
     public function testParseDateAsMappingValue()
@@ -1457,7 +1432,7 @@ EOT;
         $expectedDate->setDate(2002, 12, 14);
         $expectedDate->setTime(0, 0, 0);
 
-        $this->assertEquals(array('date' => $expectedDate), $this->parser->parse($yaml, Yaml::PARSE_DATETIME));
+        $this->assertEquals(['date' => $expectedDate], $this->parser->parse($yaml, Yaml::PARSE_DATETIME));
     }
 
     /**
@@ -1479,8 +1454,8 @@ EOT;
 
     public function parserThrowsExceptionWithCorrectLineNumberProvider()
     {
-        return array(
-            array(
+        return [
+            [
                 4,
                 <<<'YAML'
 foo:
@@ -1488,8 +1463,8 @@ foo:
         # bar
         bar: "123",
 YAML
-            ),
-            array(
+            ],
+            [
                 5,
                 <<<'YAML'
 foo:
@@ -1498,8 +1473,8 @@ foo:
         # bar
         bar: "123",
 YAML
-            ),
-            array(
+            ],
+            [
                 8,
                 <<<'YAML'
 foo:
@@ -1511,8 +1486,8 @@ bar:
         # bar
         bar: "123",
 YAML
-            ),
-            array(
+            ],
+            [
                 10,
                 <<<'YAML'
 foo:
@@ -1526,8 +1501,8 @@ bar:
         # bar
         bar: "123",
 YAML
-            ),
-        );
+            ],
+        ];
     }
 
     public function testParseMultiLineQuotedString()
@@ -1540,7 +1515,50 @@ foo"
 bar: baz
 EOT;
 
-        $this->assertSame(array('foo' => 'bar baz foobar foo', 'bar' => 'baz'), $this->parser->parse($yaml));
+        $this->assertSame(['foo' => 'bar baz foobar foo', 'bar' => 'baz'], $this->parser->parse($yaml));
+    }
+
+    public function testMultiLineQuotedStringWithTrailingBackslash()
+    {
+        $yaml = <<<YAML
+foobar:
+    "foo\
+    bar"
+YAML;
+
+        $this->assertSame(['foobar' => 'foobar'], $this->parser->parse($yaml));
+    }
+
+    public function testCommentCharactersInMultiLineQuotedStrings()
+    {
+        $yaml = <<<YAML
+foo:
+    foobar: 'foo
+      #bar'
+    bar: baz
+YAML;
+        $expected = [
+            'foo' => [
+                'foobar' => 'foo #bar',
+                'bar' => 'baz',
+            ],
+        ];
+
+        $this->assertSame($expected, $this->parser->parse($yaml));
+    }
+
+    public function testBlankLinesInQuotedMultiLineString()
+    {
+        $yaml = <<<YAML
+foobar: 'foo
+
+    bar'
+YAML;
+        $expected = [
+            'foobar' => "foo\nbar",
+        ];
+
+        $this->assertSame($expected, $this->parser->parse($yaml));
     }
 
     public function testParseMultiLineUnquotedString()
@@ -1553,7 +1571,7 @@ foo: bar
 bar: baz
 EOT;
 
-        $this->assertSame(array('foo' => 'bar baz foobar foo', 'bar' => 'baz'), $this->parser->parse($yaml));
+        $this->assertSame(['foo' => 'bar baz foobar foo', 'bar' => 'baz'], $this->parser->parse($yaml));
     }
 
     public function testParseMultiLineString()
@@ -1571,7 +1589,7 @@ EOT;
 
     public function multiLineDataProvider()
     {
-        $tests = array();
+        $tests = [];
 
         $yaml = <<<'EOF'
 foo:
@@ -1581,15 +1599,15 @@ foo:
     two
     three
 EOF;
-        $expected = array(
-            'foo' => array(
-                array(
+        $expected = [
+            'foo' => [
+                [
                     'bar' => "one\ntwo three",
-                ),
-            ),
-        );
+                ],
+            ],
+        ];
 
-        $tests[] = array($yaml, $expected, false);
+        $tests[] = [$yaml, $expected, false];
 
         $yaml = <<<'EOF'
 bar
@@ -1597,7 +1615,7 @@ bar
 EOF;
         $expected = 'bar "foo"';
 
-        $tests[] = array($yaml, $expected, false);
+        $tests[] = [$yaml, $expected, false];
 
         $yaml = <<<'EOF'
 bar
@@ -1605,7 +1623,7 @@ bar
 EOF;
         $expected = 'bar "foo';
 
-        $tests[] = array($yaml, $expected, false);
+        $tests[] = [$yaml, $expected, false];
 
         $yaml = <<<'EOF'
 bar
@@ -1614,7 +1632,7 @@ bar
 EOF;
         $expected = "bar\n'foo'";
 
-        $tests[] = array($yaml, $expected, false);
+        $tests[] = [$yaml, $expected, false];
 
         $yaml = <<<'EOF'
 bar
@@ -1623,14 +1641,14 @@ foo'
 EOF;
         $expected = "bar\nfoo'";
 
-        $tests[] = array($yaml, $expected, false);
+        $tests[] = [$yaml, $expected, false];
 
         return $tests;
     }
 
     public function testTaggedInlineMapping()
     {
-        $this->assertEquals(new TaggedValue('foo', array('foo' => 'bar')), $this->parser->parse('!foo {foo: bar}', Yaml::PARSE_CUSTOM_TAGS));
+        $this->assertEquals(new TaggedValue('foo', ['foo' => 'bar']), $this->parser->parse('!foo {foo: bar}', Yaml::PARSE_CUSTOM_TAGS));
     }
 
     /**
@@ -1643,37 +1661,58 @@ EOF;
 
     public function taggedValuesProvider()
     {
-        return array(
-            'sequences' => array(
-                array(new TaggedValue('foo', array('yaml')), new TaggedValue('quz', array('bar'))),
+        return [
+            'scalars' => [
+                [
+                    'foo' => new TaggedValue('inline', 'bar'),
+                    'quz' => new TaggedValue('long', 'this is a long text'),
+                ],
+                <<<YAML
+foo: !inline bar
+quz: !long >
+  this is a long
+  text
+YAML
+            ],
+            'sequences' => [
+                [new TaggedValue('foo', ['yaml']), new TaggedValue('quz', ['bar'])],
                 <<<YAML
 - !foo
     - yaml
 - !quz [bar]
 YAML
-            ),
-            'mappings' => array(
-                new TaggedValue('foo', array('foo' => new TaggedValue('quz', array('bar')), 'quz' => new TaggedValue('foo', array('quz' => 'bar')))),
+            ],
+            'mappings' => [
+                new TaggedValue('foo', ['foo' => new TaggedValue('quz', ['bar']), 'quz' => new TaggedValue('foo', ['quz' => 'bar'])]),
                 <<<YAML
 !foo
 foo: !quz [bar]
 quz: !foo
    quz: bar
 YAML
-            ),
-            'inline' => array(
-                array(new TaggedValue('foo', array('foo', 'bar')), new TaggedValue('quz', array('foo' => 'bar', 'quz' => new TaggedValue('bar', array('one' => 'bar'))))),
+            ],
+            'inline' => [
+                [new TaggedValue('foo', ['foo', 'bar']), new TaggedValue('quz', ['foo' => 'bar', 'quz' => new TaggedValue('bar', ['one' => 'bar'])])],
                 <<<YAML
 - !foo [foo, bar]
 - !quz {foo: bar, quz: !bar {one: bar}}
 YAML
-            ),
-        );
+            ],
+            'spaces-around-tag-value-in-sequence' => [
+                [new TaggedValue('foo', 'bar')],
+                '[ !foo bar ]',
+            ],
+        ];
+    }
+
+    public function testNonSpecificTagSupport()
+    {
+        $this->assertSame('12', $this->parser->parse('! 12'));
     }
 
     /**
      * @expectedException \Symfony\Component\Yaml\Exception\ParseException
-     * @expectedExceptionMessage Tags support is not enabled. Enable the `Yaml::PARSE_CUSTOM_TAGS` flag to use "!iterator" at line 1 (near "!iterator [foo]").
+     * @expectedExceptionMessage Tags support is not enabled. Enable the "Yaml::PARSE_CUSTOM_TAGS" flag to use "!iterator" at line 1 (near "!iterator [foo]").
      */
     public function testCustomTagsDisabled()
     {
@@ -1681,17 +1720,26 @@ YAML
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Using the unquoted scalar value "!iterator foo" is deprecated since version 3.3 and will be considered as a tagged value in 4.0. You must quote it.
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Tags support is not enabled. Enable the "Yaml::PARSE_CUSTOM_TAGS" flag to use "!iterator" at line 1 (near "!iterator foo").
      */
     public function testUnsupportedTagWithScalar()
     {
-        $this->assertEquals('!iterator foo', $this->parser->parse('!iterator foo'));
+        $this->parser->parse('!iterator foo');
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage The string "!!iterator foo" could not be parsed as it uses an unsupported built-in tag at line 1 (near "!!iterator foo").
+     */
+    public function testUnsupportedBuiltInTagWithScalar()
+    {
+        $this->parser->parse('!!iterator foo');
     }
 
     /**
      * @expectedException \Symfony\Component\Yaml\Exception\ParseException
-     * @expectedExceptionMessage The built-in tag "!!foo" is not implemented.
+     * @expectedExceptionMessage The built-in tag "!!foo" is not implemented at line 1 (near "!!foo").
      */
     public function testExceptionWhenUsingUnsuportedBuiltInTags()
     {
@@ -1699,8 +1747,8 @@ YAML
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Starting an unquoted string with a question mark followed by a space is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Complex mappings are not supported at line 1 (near "? "1"").
      */
     public function testComplexMappingThrowsParseException()
     {
@@ -1714,8 +1762,8 @@ YAML;
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Starting an unquoted string with a question mark followed by a space is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Complex mappings are not supported at line 2 (near "? "1"").
      */
     public function testComplexMappingNestedInMappingThrowsParseException()
     {
@@ -1730,8 +1778,8 @@ YAML;
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Starting an unquoted string with a question mark followed by a space is deprecated since version 3.3 and will throw \Symfony\Component\Yaml\Exception\ParseException in 4.0.
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Complex mappings are not supported at line 1 (near "- ? "1"").
      */
     public function testComplexMappingNestedInSequenceThrowsParseException()
     {
@@ -1763,8 +1811,8 @@ INI;
     {
         $parser = new Parser();
 
-        $tests = array();
-        $files = $parser->parse(file_get_contents(__DIR__.'/Fixtures/'.$testsFile));
+        $tests = [];
+        $files = $parser->parseFile(__DIR__.'/Fixtures/'.$testsFile);
         foreach ($files as $file) {
             $yamls = file_get_contents(__DIR__.'/Fixtures/'.$file.'.yml');
 
@@ -1780,7 +1828,7 @@ INI;
                 } else {
                     eval('$expected = '.trim($test['php']).';');
 
-                    $tests[] = array(var_export($expected, true), $test['yaml'], $test['test'], isset($test['deprecated']) ? $test['deprecated'] : false);
+                    $tests[] = [var_export($expected, true), $test['yaml'], $test['test']];
                 }
             }
         }
@@ -1791,7 +1839,7 @@ INI;
     public function testCanParseVeryLongValue()
     {
         $longStringWithSpaces = str_repeat('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ', 20000);
-        $trickyVal = array('x' => $longStringWithSpaces);
+        $trickyVal = ['x' => $longStringWithSpaces];
 
         $yamlString = Yaml::dump($trickyVal);
         $arrayFromYaml = $this->parser->parse($yamlString);
@@ -1824,46 +1872,285 @@ YAML;
     {
         $yaml = <<<YAML
 transitions:
-    !php/const:Symfony\Component\Yaml\Tests\B::FOO:
+    !php/const 'Symfony\Component\Yaml\Tests\B::FOO':
         from:
-            - !php/const:Symfony\Component\Yaml\Tests\B::BAR
-        to: !php/const:Symfony\Component\Yaml\Tests\B::BAZ
+            - !php/const 'Symfony\Component\Yaml\Tests\B::BAR'
+        to: !php/const 'Symfony\Component\Yaml\Tests\B::BAZ'
 YAML;
-        $expected = array(
-            'transitions' => array(
-                'foo' => array(
-                    'from' => array(
+        $expected = [
+            'transitions' => [
+                'foo' => [
+                    'from' => [
                         'bar',
-                    ),
+                    ],
                     'to' => 'baz',
-                ),
-            ),
-        );
+                ],
+            ],
+        ];
 
         $this->assertSame($expected, $this->parser->parse($yaml, Yaml::PARSE_CONSTANT));
     }
 
-    public function testPhpConstantTagMappingKeyWithKeysCastToStrings()
+    public function testMergeKeysWhenMappingsAreParsedAsObjects()
     {
         $yaml = <<<YAML
-transitions:
-    !php/const:Symfony\Component\Yaml\Tests\B::FOO:
-        from:
-            - !php/const:Symfony\Component\Yaml\Tests\B::BAR
-        to: !php/const:Symfony\Component\Yaml\Tests\B::BAZ
+foo: &FOO
+    bar: 1
+bar: &BAR
+    baz: 2
+    <<: *FOO
+baz:
+    baz_foo: 3
+    <<:
+        baz_bar: 4
+foobar:
+    bar: ~
+    <<: [*FOO, *BAR]
 YAML;
-        $expected = array(
-            'transitions' => array(
-                'foo' => array(
-                    'from' => array(
-                        'bar',
-                    ),
-                    'to' => 'baz',
-                ),
-            ),
-        );
+        $expected = (object) [
+            'foo' => (object) [
+                'bar' => 1,
+            ],
+            'bar' => (object) [
+                'baz' => 2,
+                'bar' => 1,
+            ],
+            'baz' => (object) [
+                'baz_foo' => 3,
+                'baz_bar' => 4,
+            ],
+            'foobar' => (object) [
+                'bar' => null,
+                'baz' => 2,
+            ],
+        ];
+
+        $this->assertEquals($expected, $this->parser->parse($yaml, Yaml::PARSE_OBJECT_FOR_MAP));
+    }
 
-        $this->assertSame($expected, $this->parser->parse($yaml, Yaml::PARSE_CONSTANT | Yaml::PARSE_KEYS_AS_STRINGS));
+    public function testFilenamesAreParsedAsStringsWithoutFlag()
+    {
+        $file = __DIR__.'/Fixtures/index.yml';
+
+        $this->assertSame($file, $this->parser->parse($file));
+    }
+
+    public function testParseFile()
+    {
+        $this->assertInternalType('array', $this->parser->parseFile(__DIR__.'/Fixtures/index.yml'));
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessageRegExp #^File ".+/Fixtures/nonexistent.yml" does not exist\.$#
+     */
+    public function testParsingNonExistentFilesThrowsException()
+    {
+        $this->parser->parseFile(__DIR__.'/Fixtures/nonexistent.yml');
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessageRegExp #^File ".+/Fixtures/not_readable.yml" cannot be read\.$#
+     */
+    public function testParsingNotReadableFilesThrowsException()
+    {
+        if ('\\' === \DIRECTORY_SEPARATOR) {
+            $this->markTestSkipped('chmod is not supported on Windows');
+        }
+
+        if (!getenv('USER') || 'root' === getenv('USER')) {
+            $this->markTestSkipped('This test will fail if run under superuser');
+        }
+
+        $file = __DIR__.'/Fixtures/not_readable.yml';
+        chmod($file, 0200);
+
+        $this->parser->parseFile($file);
+    }
+
+    public function testParseReferencesOnMergeKeys()
+    {
+        $yaml = <<<YAML
+mergekeyrefdef:
+    a: foo
+    <<: &quux
+        b: bar
+        c: baz
+mergekeyderef:
+    d: quux
+    <<: *quux
+YAML;
+        $expected = [
+            'mergekeyrefdef' => [
+                'a' => 'foo',
+                'b' => 'bar',
+                'c' => 'baz',
+            ],
+            'mergekeyderef' => [
+                'd' => 'quux',
+                'b' => 'bar',
+                'c' => 'baz',
+            ],
+        ];
+
+        $this->assertSame($expected, $this->parser->parse($yaml));
+    }
+
+    public function testParseReferencesOnMergeKeysWithMappingsParsedAsObjects()
+    {
+        $yaml = <<<YAML
+mergekeyrefdef:
+    a: foo
+    <<: &quux
+        b: bar
+        c: baz
+mergekeyderef:
+    d: quux
+    <<: *quux
+YAML;
+        $expected = (object) [
+            'mergekeyrefdef' => (object) [
+                'a' => 'foo',
+                'b' => 'bar',
+                'c' => 'baz',
+            ],
+            'mergekeyderef' => (object) [
+                'd' => 'quux',
+                'b' => 'bar',
+                'c' => 'baz',
+            ],
+        ];
+
+        $this->assertEquals($expected, $this->parser->parse($yaml, Yaml::PARSE_OBJECT_FOR_MAP));
+    }
+
+    /**
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Reference "foo" does not exist
+     */
+    public function testEvalRefException()
+    {
+        $yaml = <<<EOE
+foo: { &foo { a: Steve, <<: *foo} }
+EOE;
+        $this->parser->parse($yaml);
+    }
+
+    /**
+     * @dataProvider circularReferenceProvider
+     * @expectedException \Symfony\Component\Yaml\Exception\ParseException
+     * @expectedExceptionMessage Circular reference [foo, bar, foo] detected
+     */
+    public function testDetectCircularReferences($yaml)
+    {
+        $this->parser->parse($yaml, Yaml::PARSE_CUSTOM_TAGS);
+    }
+
+    public function circularReferenceProvider()
+    {
+        $tests = [];
+
+        $yaml = <<<YAML
+foo:
+    - &foo
+      - &bar
+        bar: foobar
+        baz: *foo
+YAML;
+        $tests['sequence'] = [$yaml];
+
+        $yaml = <<<YAML
+foo: &foo
+    bar: &bar
+        foobar: baz
+        baz: *foo
+YAML;
+        $tests['mapping'] = [$yaml];
+
+        $yaml = <<<YAML
+foo: &foo
+    bar: &bar
+        foobar: baz
+        <<: *foo
+YAML;
+        $tests['mapping with merge key'] = [$yaml];
+
+        return $tests;
+    }
+
+    /**
+     * @dataProvider indentedMappingData
+     */
+    public function testParseIndentedMappings($yaml, $expected)
+    {
+        $this->assertSame($expected, $this->parser->parse($yaml));
+    }
+
+    public function indentedMappingData()
+    {
+        $tests = [];
+
+        $yaml = <<<YAML
+foo:
+  - bar: "foobar"
+    # A comment
+    baz: "foobaz"
+YAML;
+        $expected = [
+            'foo' => [
+                [
+                    'bar' => 'foobar',
+                    'baz' => 'foobaz',
+                ],
+            ],
+        ];
+        $tests['comment line is first line in indented block'] = [$yaml, $expected];
+
+        $yaml = <<<YAML
+foo:
+    - bar:
+        # comment
+        baz: [1, 2, 3]
+YAML;
+        $expected = [
+            'foo' => [
+                [
+                    'bar' => [
+                        'baz' => [1, 2, 3],
+                    ],
+                ],
+            ],
+        ];
+        $tests['mapping value on new line starting with a comment line'] = [$yaml, $expected];
+
+        $yaml = <<<YAML
+foo:
+  -
+    bar: foobar
+YAML;
+        $expected = [
+            'foo' => [
+                [
+                    'bar' => 'foobar',
+                ],
+            ],
+        ];
+        $tests['mapping in sequence starting on a new line'] = [$yaml, $expected];
+
+        $yaml = <<<YAML
+foo:
+
+    bar: baz
+YAML;
+        $expected = [
+            'foo' => [
+                'bar' => 'baz',
+            ],
+        ];
+        $tests['blank line at the beginning of an indented mapping value'] = [$yaml, $expected];
+
+        return $tests;
     }
 }
 
diff --git a/vendor/symfony/yaml/Tests/YamlTest.php b/vendor/symfony/yaml/Tests/YamlTest.php
index 3f6c2525..5a792c51 100644
--- a/vendor/symfony/yaml/Tests/YamlTest.php
+++ b/vendor/symfony/yaml/Tests/YamlTest.php
@@ -18,7 +18,7 @@ class YamlTest extends TestCase
 {
     public function testParseAndDump()
     {
-        $data = array('lorem' => 'ipsum', 'dolor' => 'sit');
+        $data = ['lorem' => 'ipsum', 'dolor' => 'sit'];
         $yml = Yaml::dump($data);
         $parsed = Yaml::parse($yml);
         $this->assertEquals($data, $parsed);
@@ -30,7 +30,7 @@ class YamlTest extends TestCase
      */
     public function testZeroIndentationThrowsException()
     {
-        Yaml::dump(array('lorem' => 'ipsum', 'dolor' => 'sit'), 2, 0);
+        Yaml::dump(['lorem' => 'ipsum', 'dolor' => 'sit'], 2, 0);
     }
 
     /**
@@ -39,6 +39,6 @@ class YamlTest extends TestCase
      */
     public function testNegativeIndentationThrowsException()
     {
-        Yaml::dump(array('lorem' => 'ipsum', 'dolor' => 'sit'), 2, -4);
+        Yaml::dump(['lorem' => 'ipsum', 'dolor' => 'sit'], 2, -4);
     }
 }
diff --git a/vendor/symfony/yaml/Unescaper.php b/vendor/symfony/yaml/Unescaper.php
index 6e863e12..9c3a19ec 100644
--- a/vendor/symfony/yaml/Unescaper.php
+++ b/vendor/symfony/yaml/Unescaper.php
@@ -35,7 +35,7 @@ class Unescaper
      *
      * @return string The unescaped string
      */
-    public function unescapeSingleQuotedString($value)
+    public function unescapeSingleQuotedString(string $value): string
     {
         return str_replace('\'\'', '\'', $value);
     }
@@ -47,7 +47,7 @@ class Unescaper
      *
      * @return string The unescaped string
      */
-    public function unescapeDoubleQuotedString($value)
+    public function unescapeDoubleQuotedString(string $value): string
     {
         $callback = function ($match) {
             return $this->unescapeCharacter($match[0]);
@@ -64,7 +64,7 @@ class Unescaper
      *
      * @return string The unescaped character
      */
-    private function unescapeCharacter($value)
+    private function unescapeCharacter(string $value): string
     {
         switch ($value[1]) {
             case '0':
@@ -120,23 +120,19 @@ class Unescaper
 
     /**
      * Get the UTF-8 character for the given code point.
-     *
-     * @param int $c The unicode code point
-     *
-     * @return string The corresponding UTF-8 character
      */
-    private static function utf8chr($c)
+    private static function utf8chr(int $c): string
     {
         if (0x80 > $c %= 0x200000) {
-            return chr($c);
+            return \chr($c);
         }
         if (0x800 > $c) {
-            return chr(0xC0 | $c >> 6).chr(0x80 | $c & 0x3F);
+            return \chr(0xC0 | $c >> 6).\chr(0x80 | $c & 0x3F);
         }
         if (0x10000 > $c) {
-            return chr(0xE0 | $c >> 12).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
+            return \chr(0xE0 | $c >> 12).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
         }
 
-        return chr(0xF0 | $c >> 18).chr(0x80 | $c >> 12 & 0x3F).chr(0x80 | $c >> 6 & 0x3F).chr(0x80 | $c & 0x3F);
+        return \chr(0xF0 | $c >> 18).\chr(0x80 | $c >> 12 & 0x3F).\chr(0x80 | $c >> 6 & 0x3F).\chr(0x80 | $c & 0x3F);
     }
 }
diff --git a/vendor/symfony/yaml/Yaml.php b/vendor/symfony/yaml/Yaml.php
index 84f749b5..94a5e4ad 100644
--- a/vendor/symfony/yaml/Yaml.php
+++ b/vendor/symfony/yaml/Yaml.php
@@ -17,6 +17,8 @@ use Symfony\Component\Yaml\Exception\ParseException;
  * Yaml offers convenience methods to load and dump YAML.
  *
  * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @final
  */
 class Yaml
 {
@@ -31,7 +33,28 @@ class Yaml
     const PARSE_CONSTANT = 256;
     const PARSE_CUSTOM_TAGS = 512;
     const DUMP_EMPTY_ARRAY_AS_SEQUENCE = 1024;
-    const PARSE_KEYS_AS_STRINGS = 2048;
+
+    /**
+     * Parses a YAML file into a PHP value.
+     *
+     * Usage:
+     *
+     *     $array = Yaml::parseFile('config.yml');
+     *     print_r($array);
+     *
+     * @param string $filename The path to the YAML file to be parsed
+     * @param int    $flags    A bit field of PARSE_* constants to customize the YAML parser behavior
+     *
+     * @return mixed The YAML converted to a PHP value
+     *
+     * @throws ParseException If the file could not be read or the YAML is not valid
+     */
+    public static function parseFile(string $filename, int $flags = 0)
+    {
+        $yaml = new Parser();
+
+        return $yaml->parseFile($filename, $flags);
+    }
 
     /**
      * Parses YAML into a PHP value.
@@ -49,34 +72,8 @@ class Yaml
      *
      * @throws ParseException If the YAML is not valid
      */
-    public static function parse($input, $flags = 0)
+    public static function parse(string $input, int $flags = 0)
     {
-        if (is_bool($flags)) {
-            @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the PARSE_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED);
-
-            if ($flags) {
-                $flags = self::PARSE_EXCEPTION_ON_INVALID_TYPE;
-            } else {
-                $flags = 0;
-            }
-        }
-
-        if (func_num_args() >= 3) {
-            @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the PARSE_OBJECT flag instead.', E_USER_DEPRECATED);
-
-            if (func_get_arg(2)) {
-                $flags |= self::PARSE_OBJECT;
-            }
-        }
-
-        if (func_num_args() >= 4) {
-            @trigger_error('Passing a boolean flag to toggle object for map support is deprecated since version 3.1 and will be removed in 4.0. Use the Yaml::PARSE_OBJECT_FOR_MAP flag instead.', E_USER_DEPRECATED);
-
-            if (func_get_arg(3)) {
-                $flags |= self::PARSE_OBJECT_FOR_MAP;
-            }
-        }
-
         $yaml = new Parser();
 
         return $yaml->parse($input, $flags);
@@ -95,26 +92,8 @@ class Yaml
      *
      * @return string A YAML string representing the original PHP value
      */
-    public static function dump($input, $inline = 2, $indent = 4, $flags = 0)
+    public static function dump($input, int $inline = 2, int $indent = 4, int $flags = 0): string
     {
-        if (is_bool($flags)) {
-            @trigger_error('Passing a boolean flag to toggle exception handling is deprecated since version 3.1 and will be removed in 4.0. Use the DUMP_EXCEPTION_ON_INVALID_TYPE flag instead.', E_USER_DEPRECATED);
-
-            if ($flags) {
-                $flags = self::DUMP_EXCEPTION_ON_INVALID_TYPE;
-            } else {
-                $flags = 0;
-            }
-        }
-
-        if (func_num_args() >= 5) {
-            @trigger_error('Passing a boolean flag to toggle object support is deprecated since version 3.1 and will be removed in 4.0. Use the DUMP_OBJECT flag instead.', E_USER_DEPRECATED);
-
-            if (func_get_arg(4)) {
-                $flags |= self::DUMP_OBJECT;
-            }
-        }
-
         $yaml = new Dumper($indent);
 
         return $yaml->dump($input, $inline, 0, $flags);
diff --git a/vendor/symfony/yaml/composer.json b/vendor/symfony/yaml/composer.json
index 2103d6cf..2338728e 100644
--- a/vendor/symfony/yaml/composer.json
+++ b/vendor/symfony/yaml/composer.json
@@ -16,10 +16,14 @@
         }
     ],
     "require": {
-        "php": "^5.5.9|>=7.0.8"
+        "php": "^7.1.3",
+        "symfony/polyfill-ctype": "~1.8"
     },
     "require-dev": {
-        "symfony/console": "~2.8|~3.0"
+        "symfony/console": "~3.4|~4.0"
+    },
+    "conflict": {
+        "symfony/console": "<3.4"
     },
     "suggest": {
         "symfony/console": "For validating YAML files using the lint command"
@@ -33,7 +37,7 @@
     "minimum-stability": "dev",
     "extra": {
         "branch-alias": {
-            "dev-master": "3.3-dev"
+            "dev-master": "4.3-dev"
         }
     }
 }
diff --git a/vendor/symfony/yaml/phpunit.xml.dist b/vendor/symfony/yaml/phpunit.xml.dist
index 7c732f8a..b5d4d914 100644
--- a/vendor/symfony/yaml/phpunit.xml.dist
+++ b/vendor/symfony/yaml/phpunit.xml.dist
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
 <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
-         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.1/phpunit.xsd";
+         xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/5.2/phpunit.xsd";
          backupGlobals="false"
          colors="true"
          bootstrap="vendor/autoload.php"
diff --git a/vendor/twig/extensions/.travis.yml b/vendor/twig/extensions/.travis.yml
index 45990457..88c7404c 100644
--- a/vendor/twig/extensions/.travis.yml
+++ b/vendor/twig/extensions/.travis.yml
@@ -8,24 +8,27 @@ cache:
         - $HOME/.composer/cache/files
 
 env:
-    globals:
-        - deps=no
+    - DEPS=no
 
 before_install:
     - phpenv config-rm xdebug.ini
 
 before_script:
-    - if [ "$deps" = "low" ]; then composer --prefer-lowest --prefer-stable update; fi;
-    - if [ "$deps" = "no" ]; then composer install; fi;
+    - if [ "$DEPS" == "low" ]; then composer --prefer-lowest --prefer-stable update; fi;
+    - if [ "$DEPS" == "no" ]; then composer install; fi;
 
-script: ./vendor/bin/simple-phpunit
+script: |
+    ./vendor/bin/simple-phpunit
 
 matrix:
     include:
         - php: 5.3
+          dist: precise
         - php: 5.4
         - php: 5.5
         - php: 5.6
-          env: deps=low
+          env: DEPS=low
         - php: 7.0
+        - php: 7.1
+        - php: 7.2
     fast_finish: true
diff --git a/vendor/twig/extensions/composer.json b/vendor/twig/extensions/composer.json
index cabcd9c0..3644d8e9 100644
--- a/vendor/twig/extensions/composer.json
+++ b/vendor/twig/extensions/composer.json
@@ -2,7 +2,6 @@
     "name": "twig/extensions",
     "description": "Common additional features for Twig that do not directly belong in core",
     "keywords": ["i18n","text"],
-    "homepage": "http://twig.sensiolabs.org/doc/extensions/index.html";,
     "type": "library",
     "license": "MIT",
     "authors": [
@@ -12,11 +11,11 @@
         }
     ],
     "require": {
-        "twig/twig": "~1.27|~2.0"
+        "twig/twig": "^1.27|^2.0"
     },
     "require-dev": {
-        "symfony/phpunit-bridge": "~3.3@dev",
-        "symfony/translation": "~2.3|~3.0"
+        "symfony/phpunit-bridge": "^3.4",
+        "symfony/translation": "^2.7|^3.4"
     },
     "suggest": {
         "symfony/translation": "Allow the time_diff output to be translated"
diff --git a/vendor/twig/extensions/doc/i18n.rst b/vendor/twig/extensions/doc/i18n.rst
index 39a785de..0d4e9cc3 100644
--- a/vendor/twig/extensions/doc/i18n.rst
+++ b/vendor/twig/extensions/doc/i18n.rst
@@ -135,10 +135,21 @@ Extracting Template Strings
 ---------------------------
 
 If you use the Twig I18n extension, you will probably need to extract the
-template strings at some point. Unfortunately, the ``xgettext`` utility does
-not understand Twig templates natively. But there is a simple workaround: as
-Twig converts templates to PHP files, you can use ``xgettext`` on the template
-cache instead.
+template strings at some point.
+
+Using Poedit 2
+~~~~~~~~~~~~~~
+
+Poedit 2 has native support for extracting from Twig files and no extra
+setup is necessary (Pro version).
+
+Using ``xgettext`` or Poedit 1
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Unfortunately, the ``xgettext`` utility does not understand Twig templates
+natively and neither do tools based on it such as free versions of Poedit.
+But there is a simple workaround: as Twig converts templates to
+PHP files, you can use ``xgettext`` on the template cache instead.
 
 Create a script that forces the generation of the cache for all your
 templates. Here is a simple example to get you started::
diff --git a/vendor/twig/extensions/doc/intl.rst b/vendor/twig/extensions/doc/intl.rst
index 6d656a7b..75fe3e69 100644
--- a/vendor/twig/extensions/doc/intl.rst
+++ b/vendor/twig/extensions/doc/intl.rst
@@ -64,7 +64,6 @@ For the following calendars should use 'traditional':
     * Indian
     * Islamic
     * Hebrew
-    * Indian
     * Coptic
     * Ethiopic
 
@@ -90,7 +89,7 @@ representating the number.
 Arguments
 ~~~~~~~~~
 
-* ``style``: Optional date format (default: 'decimal'). Choose one of these formats:
+* ``style``: Optional number format (default: 'decimal'). Choose one of these formats:
 
   * 'decimal':    `NumberFormatter::DECIMAL`_
   * 'currency':   `NumberFormatter::CURRENCY`_
@@ -143,6 +142,8 @@ Arguments
 .. _`IntlDateFormatter::MEDIUM`:      http://php.net/manual/en/class.intldateformatter.php#intldateformatter.constants.medium
 .. _`IntlDateFormatter::LONG`:        http://php.net/manual/en/class.intldateformatter.php#intldateformatter.constants.long
 .. _`IntlDateFormatter::FULL`:        http://php.net/manual/en/class.intldateformatter.php#intldateformatter.constants.full
+.. _`IntlDateFormatter::GREGORIAN`:   http://php.net/IntlDateFormatter#intldateformatter.constants.gregorian
+.. _`IntlDateFormatter::TRADITIONAL`: http://php.net/IntlDateFormatter#intldateformatter.constants.traditional
 .. _`ICU user guide`:                 http://userguide.icu-project.org/formatparse/datetime
 .. _`NumberFormatter::create()`:      http://php.net/manual/en/numberformatter.create.php
 .. _`NumberFormatter::DECIMAL`:       http://php.net/manual/en/class.numberformatter.php#numberformatter.constants.decimal
diff --git a/vendor/twig/extensions/lib/Twig/Extensions/Extension/Date.php b/vendor/twig/extensions/lib/Twig/Extensions/Extension/Date.php
index 56f54a72..1cdd455d 100644
--- a/vendor/twig/extensions/lib/Twig/Extensions/Extension/Date.php
+++ b/vendor/twig/extensions/lib/Twig/Extensions/Extension/Date.php
@@ -9,6 +9,7 @@
  * file that was distributed with this source code.
  */
 use Symfony\Component\Translation\TranslatorInterface;
+use Symfony\Component\Translation\IdentityTranslator;
 
 /**
  * @author Robin van der Vleuten <robinvdvleuten@xxxxxxxxx>
@@ -31,6 +32,11 @@ class Twig_Extensions_Extension_Date extends Twig_Extension
 
     public function __construct(TranslatorInterface $translator = null)
     {
+        // Ignore the IdentityTranslator, otherwise the parameters won't be replaced properly
+        if ($translator instanceof IdentityTranslator) {
+            $translator = null;
+        }
+
         $this->translator = $translator;
     }
 
diff --git a/vendor/twig/extensions/lib/Twig/Extensions/Extension/Intl.php b/vendor/twig/extensions/lib/Twig/Extensions/Extension/Intl.php
index 741f7944..49b0f88b 100644
--- a/vendor/twig/extensions/lib/Twig/Extensions/Extension/Intl.php
+++ b/vendor/twig/extensions/lib/Twig/Extensions/Extension/Intl.php
@@ -14,7 +14,7 @@ class Twig_Extensions_Extension_Intl extends Twig_Extension
     public function __construct()
     {
         if (!class_exists('IntlDateFormatter')) {
-            throw new RuntimeException('The intl extension is needed to use intl-based filters.');
+            throw new RuntimeException('The native PHP intl extension (http://php.net/manual/en/book.intl.php) is needed to use intl-based filters.');
         }
     }
 
@@ -51,11 +51,24 @@ function twig_localized_date_filter(Twig_Environment $env, $date, $dateFormat =
         'full' => IntlDateFormatter::FULL,
     );
 
+    if (PHP_VERSION_ID < 50500 || !class_exists('IntlTimeZone')) {
+        $formatter = IntlDateFormatter::create(
+            $locale,
+            $formatValues[$dateFormat],
+            $formatValues[$timeFormat],
+            $date->getTimezone()->getName(),
+            'gregorian' === $calendar ? IntlDateFormatter::GREGORIAN : IntlDateFormatter::TRADITIONAL,
+            $format
+        );
+
+        return $formatter->format($date->getTimestamp());
+    }
+
     $formatter = IntlDateFormatter::create(
         $locale,
         $formatValues[$dateFormat],
         $formatValues[$timeFormat],
-        PHP_VERSION_ID >= 50500 ? $date->getTimezone() : $date->getTimezone()->getName(),
+        IntlTimeZone::createTimeZone($date->getTimezone()->getName()),
         'gregorian' === $calendar ? IntlDateFormatter::GREGORIAN : IntlDateFormatter::TRADITIONAL,
         $format
     );
@@ -101,7 +114,7 @@ function twig_get_number_formatter($locale, $style)
 {
     static $formatter, $currentStyle;
 
-    $locale = $locale !== null ? $locale : Locale::getDefault();
+    $locale = null !== $locale ? $locale : Locale::getDefault();
 
     if ($formatter && $formatter->getLocale() === $locale && $currentStyle === $style) {
         // Return same instance of NumberFormatter if parameters are the same
diff --git a/vendor/twig/extensions/test/Twig/Tests/Extension/ArrayTest.php b/vendor/twig/extensions/test/Twig/Tests/Extension/ArrayTest.php
index 44a3f94c..6832f9ac 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Extension/ArrayTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Extension/ArrayTest.php
@@ -10,7 +10,7 @@
  */
 require_once __DIR__.'/../../../../lib/Twig/Extensions/Extension/Array.php';
 
-class Twig_Tests_Extension_ArrayTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Extension_ArrayTest extends \PHPUnit\Framework\TestCase
 {
     /**
      * @dataProvider getShuffleFilterTestData
diff --git a/vendor/twig/extensions/test/Twig/Tests/Extension/DateTest.php b/vendor/twig/extensions/test/Twig/Tests/Extension/DateTest.php
index 00800989..1845565f 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Extension/DateTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Extension/DateTest.php
@@ -12,7 +12,7 @@
 /**
  * @author Robin van der Vleuten <robinvdvleuten@xxxxxxxxx>
  */
-class Twig_Tests_Extension_DateTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Extension_DateTest extends \PHPUnit\Framework\TestCase
 {
     /**
      * @var TwigEnvironment
diff --git a/vendor/twig/extensions/test/Twig/Tests/Extension/IntlTest.php b/vendor/twig/extensions/test/Twig/Tests/Extension/IntlTest.php
index 76a75b28..90aeadc0 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Extension/IntlTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Extension/IntlTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Extension_IntlTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Extension_IntlTest extends \PHPUnit\Framework\TestCase
 {
     /**
      * @requires extension intl
@@ -22,4 +22,16 @@ class Twig_Tests_Extension_IntlTest extends PHPUnit_Framework_TestCase
         $date = twig_localized_date_filter($env, new DateTime('2015-01-01T00:00:00', new DateTimeZone('UTC')), 'short', 'long', 'en', '+01:00');
         $this->assertEquals('1/1/15 1:00:00 AM GMT+01:00', $date);
     }
+
+    /**
+     * @requires extension intl
+     * @requires PHP 5.5
+     */
+    public function testLocalizedDateFilterWithDateTimeZoneZ()
+    {
+        class_exists('Twig_Extensions_Extension_Intl');
+        $env = $this->getMockBuilder('Twig_Environment')->disableOriginalConstructor()->getMock();
+        $date = twig_localized_date_filter($env, new DateTime('2017-11-19T00:00:00Z'), 'short', 'long', 'fr', 'Z');
+        $this->assertEquals('19/11/2017 00:00:00 UTC', $date);
+    }
 }
diff --git a/vendor/twig/extensions/test/Twig/Tests/Extension/TextTest.php b/vendor/twig/extensions/test/Twig/Tests/Extension/TextTest.php
index db364de3..632f43df 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Extension/TextTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Extension/TextTest.php
@@ -11,7 +11,7 @@
 
 require_once __DIR__.'/../../../../lib/Twig/Extensions/Extension/Text.php';
 
-class Twig_Tests_Extension_TextTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Extension_TextTest extends \PHPUnit\Framework\TestCase
 {
     /** @var TwigEnvironment */
     private $env;
diff --git a/vendor/twig/extensions/test/Twig/Tests/Grammar/ArgumentsTest.php b/vendor/twig/extensions/test/Twig/Tests/Grammar/ArgumentsTest.php
index a6ee6121..7a418f80 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Grammar/ArgumentsTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Grammar/ArgumentsTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Grammar_ArgumentsTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Grammar_ArgumentsTest extends \PHPUnit\Framework\TestCase
 {
     public function testMagicToString()
     {
diff --git a/vendor/twig/extensions/test/Twig/Tests/Grammar/ArrayTest.php b/vendor/twig/extensions/test/Twig/Tests/Grammar/ArrayTest.php
index 66f7a6ab..7f05b68c 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Grammar/ArrayTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Grammar/ArrayTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Grammar_ArrayTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Grammar_ArrayTest extends \PHPUnit\Framework\TestCase
 {
     public function testMagicToString()
     {
diff --git a/vendor/twig/extensions/test/Twig/Tests/Grammar/BodyTest.php b/vendor/twig/extensions/test/Twig/Tests/Grammar/BodyTest.php
index 6ba5a9c6..3463f2b7 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Grammar/BodyTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Grammar/BodyTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Grammar_BodyTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Grammar_BodyTest extends \PHPUnit\Framework\TestCase
 {
     public function testMagicToString()
     {
diff --git a/vendor/twig/extensions/test/Twig/Tests/Grammar/BooleanTest.php b/vendor/twig/extensions/test/Twig/Tests/Grammar/BooleanTest.php
index 4894d511..196041a7 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Grammar/BooleanTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Grammar/BooleanTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Grammar_BooleanTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Grammar_BooleanTest extends \PHPUnit\Framework\TestCase
 {
     public function testMagicToString()
     {
diff --git a/vendor/twig/extensions/test/Twig/Tests/Grammar/ConstantTest.php b/vendor/twig/extensions/test/Twig/Tests/Grammar/ConstantTest.php
index d5d89b19..065ca7f7 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Grammar/ConstantTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Grammar/ConstantTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Grammar_ConstantTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Grammar_ConstantTest extends \PHPUnit\Framework\TestCase
 {
     public function testMagicToString()
     {
diff --git a/vendor/twig/extensions/test/Twig/Tests/Grammar/ExpressionTest.php b/vendor/twig/extensions/test/Twig/Tests/Grammar/ExpressionTest.php
index 5323a21c..33583b0a 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Grammar/ExpressionTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Grammar/ExpressionTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Grammar_ExpressionTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Grammar_ExpressionTest extends \PHPUnit\Framework\TestCase
 {
     public function testMagicToString()
     {
diff --git a/vendor/twig/extensions/test/Twig/Tests/Grammar/NumberTest.php b/vendor/twig/extensions/test/Twig/Tests/Grammar/NumberTest.php
index a803904e..5a4d3446 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Grammar/NumberTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Grammar/NumberTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Grammar_NumberTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Grammar_NumberTest extends \PHPUnit\Framework\TestCase
 {
     public function testMagicToString()
     {
diff --git a/vendor/twig/extensions/test/Twig/Tests/Grammar/OptionalTest.php b/vendor/twig/extensions/test/Twig/Tests/Grammar/OptionalTest.php
index 704c294a..5bbbef5b 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Grammar/OptionalTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Grammar/OptionalTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Grammar_OptionalTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Grammar_OptionalTest extends \PHPUnit\Framework\TestCase
 {
     public function testMagicToString()
     {
diff --git a/vendor/twig/extensions/test/Twig/Tests/Grammar/TagTest.php b/vendor/twig/extensions/test/Twig/Tests/Grammar/TagTest.php
index 3254d1ba..bcbca24b 100644
--- a/vendor/twig/extensions/test/Twig/Tests/Grammar/TagTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/Grammar/TagTest.php
@@ -9,7 +9,7 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Grammar_TagTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_Grammar_TagTest extends \PHPUnit\Framework\TestCase
 {
     public function testMagicToString()
     {
diff --git a/vendor/twig/extensions/test/Twig/Tests/SimpleTokenParserTest.php b/vendor/twig/extensions/test/Twig/Tests/SimpleTokenParserTest.php
index 2d5da889..51ec2fe6 100644
--- a/vendor/twig/extensions/test/Twig/Tests/SimpleTokenParserTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/SimpleTokenParserTest.php
@@ -12,7 +12,7 @@
 /**
  * @group legacy
  */
-class Twig_Tests_SimpleTokenParserTest extends PHPUnit_Framework_TestCase
+class Twig_Tests_SimpleTokenParserTest extends \PHPUnit\Framework\TestCase
 {
     /**
      * @dataProvider getTests
diff --git a/vendor/twig/extensions/test/Twig/Tests/grammarTest.php b/vendor/twig/extensions/test/Twig/Tests/grammarTest.php
index 0f4ffb6f..b878d021 100644
--- a/vendor/twig/extensions/test/Twig/Tests/grammarTest.php
+++ b/vendor/twig/extensions/test/Twig/Tests/grammarTest.php
@@ -12,7 +12,7 @@
 /**
  * @group legacy
  */
-class grammarTest extends PHPUnit_Framework_TestCase
+class grammarTest extends \PHPUnit\Framework\TestCase
 {
     protected function setUp()
     {
diff --git a/vendor/twig/twig/.gitignore b/vendor/twig/twig/.gitignore
index 31103621..bc959c53 100644
--- a/vendor/twig/twig/.gitignore
+++ b/vendor/twig/twig/.gitignore
@@ -1,5 +1,3 @@
-/build
 /composer.lock
-/ext/twig/autom4te.cache/
 /phpunit.xml
 /vendor
diff --git a/vendor/twig/twig/.php_cs.dist b/vendor/twig/twig/.php_cs.dist
index d249ffbe..1b31c0a3 100644
--- a/vendor/twig/twig/.php_cs.dist
+++ b/vendor/twig/twig/.php_cs.dist
@@ -1,16 +1,18 @@
 <?php
 
 return PhpCsFixer\Config::create()
-    ->setRules(array(
+    ->setRules([
         '@Symfony' => true,
         '@Symfony:risky' => true,
-        'array_syntax' => array('syntax' => 'long'),
-        'php_unit_fqcn_annotation' => false,
+        'array_syntax' => ['syntax' => 'short'],
+        'php_unit_fqcn_annotation' => true,
         'no_unreachable_default_argument_value' => false,
-        'braces' => array('allow_single_line_closure' => true),
+        'braces' => ['allow_single_line_closure' => true],
         'heredoc_to_nowdoc' => false,
-        'dir_constant' => false,
-    ))
+        'ordered_imports' => true,
+        'phpdoc_types_order' => ['null_adjustment' => 'always_last', 'sort_algorithm' => 'none'],
+        'native_function_invocation' => ['include' => ['@compiler_optimized'], 'scope' => 'all'],
+    ])
     ->setRiskyAllowed(true)
     ->setFinder(PhpCsFixer\Finder::create()->in(__DIR__))
 ;
diff --git a/vendor/twig/twig/.travis.yml b/vendor/twig/twig/.travis.yml
index 147eb7df..c2395895 100644
--- a/vendor/twig/twig/.travis.yml
+++ b/vendor/twig/twig/.travis.yml
@@ -7,43 +7,22 @@ cache:
         - vendor
         - $HOME/.composer/cache/files
 
-php:
-    - 5.3
-    - 5.4
-    - 5.5
-    - 5.6
-    - 7.0
-    - 7.1
-    - nightly
-
-env:
-    - TWIG_EXT=no
-    - TWIG_EXT=yes
-
 before_install:
-    # turn off XDebug
     - phpenv config-rm xdebug.ini || return 0
 
 install:
     - travis_retry composer install
 
-before_script:
-    - if [ "$TWIG_EXT" == "yes" ]; then sh -c "cd ext/twig && phpize && ./configure --enable-twig && make && make install"; fi
-    - if [ "$TWIG_EXT" == "yes" ]; then echo "extension=twig.so" >> `php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`; fi
-
-script: |
-    if [[ $TRAVIS_PHP_VERSION = 7.* || $TRAVIS_PHP_VERSION = nightly ]]; then
-        SYMFONY_PHPUNIT_VERSION=6.1 ./vendor/bin/simple-phpunit
-    else
-        ./vendor/bin/simple-phpunit
-    fi
+script: ./vendor/bin/simple-phpunit
 
-matrix:
+jobs:
     fast_finish: true
-    exclude:
+    include:
         - php: 7.0
-          env: TWIG_EXT=yes
         - php: 7.1
-          env: TWIG_EXT=yes
-        - php: nightly
-          env: TWIG_EXT=yes
+        - php: 7.2
+        - php: 7.3
+        - php: 7.4snapshot
+        - stage: integration tests
+          php: 7.3
+          script: ./drupal_test.sh
diff --git a/vendor/twig/twig/CHANGELOG b/vendor/twig/twig/CHANGELOG
index f738c841..7931fced 100644
--- a/vendor/twig/twig/CHANGELOG
+++ b/vendor/twig/twig/CHANGELOG
@@ -1,3 +1,396 @@
+* 2.11.3 (2019-06-18)
+
+ * fixed the filter filter (allow the result to be used several times)
+ * fixed macro auto-import when a template contains only macros
+
+* 2.11.2 (2019-06-05)
+
+ * fixed macro auto-import
+
+* 2.11.1 (2019-06-04)
+
+ * added support for "Twig\Markup" instances in the "in" test (again)
+ * allowed string operators as variables names in assignments
+ * fixed support for macros defined in parent templates
+
+* 2.11.0 (2019-05-31)
+
+ * added the possibility to register classes/interfaces as being safe for the escaper ("EscaperExtension::addSafeClass()")
+ * deprecated CoreExtension::setEscaper() and CoreExtension::getEscapers() in favor of the same methods on EscaperExtension
+ * macros are now auto-imported in the template they are defined (under the ``_self`` variable)
+ * added support for macros on "is defined" tests
+ * fixed macros "import" when using the same name in the parent and child templates
+ * fixed recursive macros
+ * macros imported "globally" in a template are now available in macros without re-importing them
+ * fixed the "filter" filter when the argument is \Traversable but does not implement \Iterator (\SimpleXmlElement for instance)
+ * fixed a PHP fatal error when calling a macro imported in a block in a nested block
+ * fixed a PHP fatal error when calling a macro imported in the template in another macro
+ * fixed wrong error message on "import" and "from"
+
+* 2.10.0 (2019-05-14)
+
+ * deprecated "if" conditions on "for" tags
+ * added "filter", "map", and "reduce" filters (and support for arrow functions)
+ * fixed partial output leak when a PHP fatal error occurs
+ * optimized context access on PHP 7.4
+
+* 2.9.0 (2019-04-28)
+
+ * deprecated returning "false" to remove a Node from NodeVisitorInterface::leaveNode()
+ * allowed Twig\NodeVisitor\NodeVisitorInterface::leaveNode() to return "null" instead of "false" (same meaning)
+ * deprecated the "filter" tag (use the "apply" tag instead)
+ * added the "apply" tag as a replacement for the "filter" tag
+ * allowed Twig\Loader\FilesystemLoader::findTemplate() to return "null" instead of "false" (same meaning)
+ * added support for "Twig\Markup" instances in the "in" test
+ * fixed "import" when macros are stored in a template string
+ * fixed Lexer when using custom options containing the # char
+ * added template line number to twig_get_attribute()
+
+* 2.8.1 (2019-04-16)
+
+ * fixed EscaperNodeVisitor
+ * deprecated passing a 3rd, 4th, and 5th arguments to the Sandbox exception classes
+ * deprecated Node::setTemplateName() in favor of Node::setSourceContext()
+
+* 2.8.0 (2019-04-16)
+
+ * added Traversable support for the length filter
+ * fixed some wrong location in error messages
+ * made exception creation faster
+ * made escaping on ternary expressions (?: and ??) more fine-grained
+ * added the possibility to give a nice name to string templates (template_from_string function)
+ * fixed the "with" behavior to always include the globals (for consistency with the "include" and "embed" tags)
+ * fixed "include" with "ignore missing" when an error loading occurs in the included template
+ * added support for a new whitespace trimming option ({%~ ~%}, {{~ ~}}, {#~ ~#})
+ * added the "column" filter
+
+* 2.7.4 (2019-03-23)
+
+ * fixed variadic support
+ * fixed CheckToStringNode implementation (broken when a function/filter is variadic)
+
+* 2.7.3 (2019-03-21)
+
+ * fixed the spaceless filter so that it behaves like the spaceless tag
+ * fixed BC break on Environment::resolveTemplate()
+ * allowed Traversable objects to be used in the "with" tag
+ * allowed Traversable objects to be used in the "with" tag
+ * allowed Traversable objects to be used in the "with" argument of the "include" and "embed" tags
+
+* 2.7.2 (2019-03-12)
+
+ * added TemplateWrapper::getTemplateName()
+
+* 2.7.1 (2019-03-12)
+
+ * fixed class aliases
+
+* 2.7.0 (2019-03-12)
+
+ * fixed sandbox security issue (under some circumstances, calling the
+   __toString() method on an object was possible even if not allowed by the
+   security policy)
+ * fixed batch filter clobbers array keys when fill parameter is used
+ * added preserveKeys support for the batch filter
+ * fixed "embed" support when used from "template_from_string"
+ * deprecated passing a Twig\Template to Twig\Environment::load()/Twig\Environment::resolveTemplate()
+ * added the possibility to pass a TemplateWrapper to Twig\Environment::load()
+ * marked Twig\Environment::getTemplateClass() as internal (implementation detail)
+ * improved the performance of the sandbox
+ * deprecated the spaceless tag
+ * added a spaceless filter
+ * added max value to the "random" function
+ * deprecated Twig\Extension\InitRuntimeInterface
+ * deprecated Twig\Loader\ExistsLoaderInterface
+ * deprecated PSR-0 classes in favor of namespaced ones
+ * made namespace classes the default classes (PSR-0 ones are aliases now)
+ * added Twig\Loader\ChainLoader::getLoaders()
+ * removed duplicated directory separator in FilesystemLoader
+ * deprecated the "base_template_class" option on Twig\Environment
+ * deprecated the Twig\Environment::getBaseTemplateClass() and
+   Twig\Environment::setBaseTemplateClass() methods
+ * changed internal code to use the namespaced classes as much as possible
+ * deprecated Twig_Parser::isReservedMacroName()
+
+* 2.6.2 (2019-01-14)
+
+ * fixed regression (key exists check for non ArrayObject objects)
+
+* 2.6.1 (2019-01-14)
+
+ * fixed ArrayObject access with a null value
+ * fixed embedded templates starting with a BOM
+ * fixed using a Twig_TemplateWrapper instance as an argument to extends
+ * fixed error location when calling an undefined block
+ * deprecated passing a string as a source on Twig_Error
+ * switched generated code to use the PHP short array notation
+ * fixed float representation in compiled templates
+ * added a second argument to the join filter (last separator configuration)
+
+* 2.6.0 (2018-12-16)
+
+ * made sure twig_include returns a string
+ * fixed multi-byte UFT-8 in escape('html_attr')
+ * added the "deprecated" tag
+ * added support for dynamically named tests
+ * fixed GlobalsInterface extended class
+ * fixed filesystem loader throwing an exception instead of returning false
+
+* 2.5.0 (2018-07-13)
+
+ * deprecated using the spaceless tag at the root level of a child template (noop anyway)
+ * deprecated the possibility to define a block in a non-capturing block in a child template
+ * added the Symfony ctype polyfill as a dependency
+ * fixed reporting the proper location for errors compiled in templates
+ * fixed the error handling for the optimized extension-based function calls
+ * ensured that syntax errors are triggered with the right line
+ * "js" filter now produces valid JSON
+
+* 2.4.8 (2018-04-02)
+
+ * fixed a regression when using the "default" filter or the "defined" test on non-existing arrays
+
+* 2.4.7 (2018-03-20)
+
+ * optimized runtime performance
+ * optimized parser performance by inlining the constant values
+ * fixed block names unicity
+ * fixed counting children of SimpleXMLElement objects
+ * added missing else clause to avoid infinite loops
+ * fixed .. (range operator) in sandbox policy
+
+* 2.4.6 (2018-03-03)
+
+ * fixed a regression in the way the profiler is registered in templates
+
+* 2.4.5 (2018-03-02)
+
+ * optimized the performance of calling an extension method at runtime
+ * optimized the performance of the dot operator for array and method calls
+ * added an exception when using "===" instead of "same as"
+ * fixed possible array to string conversion concealing actual error
+ * made variable names deterministic in compiled templates
+ * fixed length filter when passing an instance of IteratorAggregate
+ * fixed Environment::resolveTemplate to accept instances of TemplateWrapper
+
+* 2.4.4 (2017-09-27)
+
+ * added Twig_Profiler_Profile::reset()
+ * fixed use TokenParser to return an empty Node
+ * added RuntimeExtensionInterface
+ * added circular reference detection when loading templates
+ * added support for runtime loaders in IntegrationTestCase
+ * fixed deprecation when using Twig_Profiler_Dumper_Html
+ * removed @final from Twig_Profiler_Dumper_Text
+
+* 2.4.3 (2017-06-07)
+
+ * fixed namespaces introduction
+
+* 2.4.2 (2017-06-05)
+
+ * fixed namespaces introduction
+
+* 2.4.1 (2017-06-05)
+
+ * fixed namespaces introduction
+
+* 2.4.0 (2017-06-05)
+
+ * added support for PHPUnit 6 when testing extensions
+ * fixed PHP 7.2 compatibility
+ * fixed template name generation in Twig_Environment::createTemplate()
+ * removed final tag on Twig_TokenParser_Include
+ * dropped HHVM support
+ * added namespaced aliases for all (non-deprecated) classes and interfaces
+ * marked Twig_Filter, Twig_Function, Twig_Test, Twig_Node_Module and Twig_Profiler_Profile as final via the @final annotation
+
+* 2.3.2 (2017-04-20)
+
+ * fixed edge case in the method cache for Twig attributes
+
+* 2.3.1 (2017-04-18)
+
+ * fixed the empty() test
+
+* 2.3.0 (2017-03-22)
+
+ * fixed a race condition handling when writing cache files
+ * "length" filter now returns string length when applied to an object that does
+   not implement \Countable but provides __toString()
+ * "empty" test will now consider the return value of the __toString() method for
+   objects implement __toString() but not \Countable
+ * fixed JS escaping for unicode characters with higher code points
+ * added error message when calling `parent()` in a block that doesn't exist in the parent template
+
+* 2.2.0 (2017-02-26)
+
+ * added a PSR-11 compatible runtime loader
+ * added `side` argument to `trim` to allow left or right trimming only.
+
+* 2.1.0 (2017-01-11)
+
+ * fixed twig_get_attribute()
+ * added Twig_NodeCaptureInterface for nodes that capture all output
+
+* 2.0.0 (2017-01-05)
+
+ * removed the C extension
+ * moved Twig_Environment::getAttribute() to twig_get_attribute()
+ * removed Twig_Environment::getLexer(), Twig_Environment::getParser(), Twig_Environment::getCompiler()
+ * removed Twig_Compiler::getFilename()
+ * added hasser support in Twig_Template::getAttribute()
+ * sped up the json_encode filter
+ * removed reserved macro names; all names can be used as macro
+ * removed Twig_Template::getEnvironment()
+ * changed _self variable to return the current template name
+ * made the loader a required argument of Twig_Environment constructor
+ * removed Twig_Environment::clearTemplateCache()
+ * removed Twig_Autoloader (use Composer instead)
+ * removed `true` as an equivalent to `html` for the auto-escaping strategy
+ * removed pre-1.8 autoescape tag syntax
+ * dropped support for PHP 5.x
+ * removed the ability to register a global variable after the runtime or the extensions have been initialized
+ * improved the performance of the filesystem loader
+ * removed features that were deprecated in 1.x
+
+* 1.42.2 (2019-XX-XX)
+
+ * Display partial output (PHP buffer) when an error occurs in debug mode
+
+* 1.42.1 (2019-06-04)
+
+ * added support for "Twig\Markup" instances in the "in" test (again)
+ * allowed string operators as variables names in assignments
+
+* 1.42.0 (2019-05-31)
+
+ * fixed the "filter" filter when the argument is \Traversable but does not implement \Iterator (\SimpleXmlElement for instance)
+ * fixed a PHP fatal error when calling a macro imported in a block in a nested block
+ * fixed a PHP fatal error when calling a macro imported in the template in another macro
+ * fixed wrong error message on "import" and "from"
+
+* 1.41.0 (2019-05-14)
+
+ * fixed support for PHP 7.4
+ * added "filter", "map", and "reduce" filters (and support for arrow functions)
+ * fixed partial output leak when a PHP fatal error occurs
+ * optimized context access on PHP 7.4
+
+* 1.40.1 (2019-04-29)
+
+* fixed regression in NodeTraverser
+
+* 1.40.0 (2019-04-28)
+
+ * allowed Twig\NodeVisitor\NodeVisitorInterface::leaveNode() to return "null" instead of "false" (same meaning)
+ * added the "apply" tag as a replacement for the "filter" tag
+ * allowed Twig\Loader\FilesystemLoader::findTemplate() to return "null" instead of "false" (same meaning)
+ * added support for "Twig\Markup" instances in the "in" test
+ * fixed Lexer when using custom options containing the # char
+ * fixed "import" when macros are stored in a template string
+
+* 1.39.1 (2019-04-16)
+
+ * fixed EscaperNodeVisitor
+
+* 1.39.0 (2019-04-16)
+
+ * added Traversable support for the length filter
+ * fixed some wrong location in error messages
+ * made exception creation faster
+ * made escaping on ternary expressions (?: and ??) more fine-grained
+ * added the possibility to give a nice name to string templates (template_from_string function)
+ * fixed the "with" behavior to always include the globals (for consistency with the "include" and "embed" tags)
+ * fixed "include" with "ignore missing" when an error loading occurs in the included template
+ * added support for a new whitespace trimming option ({%~ ~%}, {{~ ~}}, {#~ ~#})
+
+* 1.38.4 (2019-03-23)
+
+ * fixed CheckToStringNode implementation (broken when a function/filter is variadic)
+
+* 1.38.3 (2019-03-21)
+
+ * fixed the spaceless filter so that it behaves like the spaceless tag
+ * fixed BC break on Environment::resolveTemplate()
+ * fixed the bundled Autoloader to also load namespaced classes
+ * allowed Traversable objects to be used in the "with" tag
+ * allowed Traversable objects to be used in the "with" argument of the "include" and "embed" tags
+
+* 1.38.2 (2019-03-12)
+
+ * added TemplateWrapper::getTemplateName()
+
+* 1.38.1 (2019-03-12)
+
+ * fixed class aliases
+
+* 1.38.0 (2019-03-12)
+
+ * fixed sandbox security issue (under some circumstances, calling the
+   __toString() method on an object was possible even if not allowed by the
+   security policy)
+ * fixed batch filter clobbers array keys when fill parameter is used
+ * added preserveKeys support for the batch filter
+ * fixed "embed" support when used from "template_from_string"
+ * added the possibility to pass a TemplateWrapper to Twig\Environment::load()
+ * improved the performance of the sandbox
+ * added a spaceless filter
+ * added max value to the "random" function
+ * made namespace classes the default classes (PSR-0 ones are aliases now)
+ * removed duplicated directory separator in FilesystemLoader
+ * added Twig\Loader\ChainLoader::getLoaders()
+ * changed internal code to use the namespaced classes as much as possible
+
+* 1.37.1 (2019-01-14)
+
+ * fixed regression (key exists check for non ArrayObject objects)
+ * fixed logic in TemplateWrapper
+
+* 1.37.0 (2019-01-14)
+
+ * fixed ArrayObject access with a null value
+ * fixed embedded templates starting with a BOM
+ * fixed using a Twig_TemplateWrapper instance as an argument to extends
+ * switched generated code to use the PHP short array notation
+ * dropped PHP 5.3 support
+ * fixed float representation in compiled templates
+ * added a second argument to the join filter (last separator configuration)
+
+* 1.36.0 (2018-12-16)
+
+ * made sure twig_include returns a string
+ * fixed multi-byte UFT-8 in escape('html_attr')
+ * added the "deprecated" tag
+ * added support for dynamically named tests
+ * fixed GlobalsInterface extended class
+ * fixed filesystem loader throwing an exception instead of returning false
+
+* 1.35.4 (2018-07-13)
+
+ * ensured that syntax errors are triggered with the right line
+ * added the Symfony ctype polyfill as a dependency
+ * "js" filter now produces valid JSON
+
+* 1.35.3 (2018-03-20)
+
+ * fixed block names unicity
+ * fixed counting children of SimpleXMLElement objects
+ * added missing else clause to avoid infinite loops
+ * fixed .. (range operator) in sandbox policy
+
+* 1.35.2 (2018-03-03)
+
+ * fixed a regression in the way the profiler is registered in templates
+
+* 1.35.1 (2018-03-02)
+
+ * added an exception when using "===" instead of "same as"
+ * fixed possible array to string conversion concealing actual error
+ * made variable names deterministic in compiled templates
+ * fixed length filter when passing an instance of IteratorAggregate
+ * fixed Environment::resolveTemplate to accept instances of TemplateWrapper
+
 * 1.35.0 (2017-09-27)
 
  * added Twig_Profiler_Profile::reset()
diff --git a/vendor/twig/twig/LICENSE b/vendor/twig/twig/LICENSE
index b6e17a1a..d06ced2a 100644
--- a/vendor/twig/twig/LICENSE
+++ b/vendor/twig/twig/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2009-2017 by the Twig Team.
+Copyright (c) 2009-2019 by the Twig Team.
 
 Some rights reserved.
 
diff --git a/vendor/twig/twig/README.rst b/vendor/twig/twig/README.rst
index 81737b0b..f33ea336 100644
--- a/vendor/twig/twig/README.rst
+++ b/vendor/twig/twig/README.rst
@@ -12,4 +12,4 @@ More Information
 
 Read the `documentation`_ for more information.
 
-.. _documentation: http://twig.sensiolabs.org/documentation
+.. _documentation: https://twig.symfony.com/documentation
diff --git a/vendor/twig/twig/composer.json b/vendor/twig/twig/composer.json
index 09c1ea5e..b0c5836f 100644
--- a/vendor/twig/twig/composer.json
+++ b/vendor/twig/twig/composer.json
@@ -3,7 +3,7 @@
     "type": "library",
     "description": "Twig, the flexible, fast, and secure template language for PHP",
     "keywords": ["templating"],
-    "homepage": "http://twig.sensiolabs.org";,
+    "homepage": "https://twig.symfony.com";,
     "license": "BSD-3-Clause",
     "authors": [
         {
@@ -14,7 +14,7 @@
         },
         {
             "name": "Twig Team",
-            "homepage": "http://twig.sensiolabs.org/contributors";,
+            "homepage": "https://twig.symfony.com/contributors";,
             "role": "Contributors"
         },
         {
@@ -23,15 +23,14 @@
             "role": "Project Founder"
         }
     ],
-    "support": {
-        "forum": "https://groups.google.com/forum/#!forum/twig-users";
-    },
     "require": {
-        "php": ">=5.3.3"
+        "php": "^7.0",
+        "symfony/polyfill-mbstring": "^1.3",
+        "symfony/polyfill-ctype": "^1.8"
     },
     "require-dev": {
-        "symfony/phpunit-bridge": "~3.3@dev",
-        "symfony/debug": "~2.7",
+        "symfony/phpunit-bridge": "^3.4.19|^4.1.8|^5.0",
+        "symfony/debug": "^2.7",
         "psr/container": "^1.0"
     },
     "autoload": {
@@ -42,9 +41,14 @@
             "Twig\\" : "src/"
         }
     },
+    "autoload-dev": {
+        "psr-0" : {
+            "Twig_Tests_" : "test/"
+        }
+    },
     "extra": {
         "branch-alias": {
-            "dev-master": "1.35-dev"
+            "dev-master": "2.11-dev"
         }
     }
 }
diff --git a/vendor/twig/twig/doc/advanced.rst b/vendor/twig/twig/doc/advanced.rst
index d86db501..4d22fcce 100644
--- a/vendor/twig/twig/doc/advanced.rst
+++ b/vendor/twig/twig/doc/advanced.rst
@@ -1,22 +1,16 @@
 Extending Twig
 ==============
 
-.. caution::
-
-    This section describes how to extend Twig as of **Twig 1.12**. If you are
-    using an older version, read the :doc:`legacy<advanced_legacy>` chapter
-    instead.
-
 Twig can be extended in many ways; you can add extra tags, filters, tests,
 operators, global variables, and functions. You can even extend the parser
 itself with node visitors.
 
 .. note::
 
-    The first section of this chapter describes how to extend Twig easily. If
-    you want to reuse your changes in different projects or if you want to
-    share them with others, you should then create an extension as described
-    in the following section.
+    The first section of this chapter describes how to extend Twig. If you want
+    to reuse your changes in different projects or if you want to share them
+    with others, you should then create an extension as described in the
+    following section.
 
 .. caution::
 
@@ -40,7 +34,7 @@ generate).
 
 You can use a ``lipsum`` *tag*:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% lipsum 40 %}
 
@@ -51,43 +45,42 @@ three main reasons:
 * The tag outputs something;
 * The tag is not flexible as you cannot use it in an expression:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
       {{ 'some text' ~ {% lipsum 40 %} ~ 'some more text' }}
 
 In fact, you rarely need to create tags; and that's good news because tags are
-the most complex extension point of Twig.
+the most complex extension point.
 
 Now, let's use a ``lipsum`` *filter*:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 40|lipsum }}
 
-Again, it works, but it looks weird. A filter transforms the passed value to
-something else but here we use the value to indicate the number of words to
-generate (so, ``40`` is an argument of the filter, not the value we want to
-transform).
+Again, it works. But a filter should transform the passed value to something
+else. Here, we use the value to indicate the number of words to generate (so,
+``40`` is an argument of the filter, not the value we want to transform).
 
 Next, let's use a ``lipsum`` *function*:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ lipsum(40) }}
 
 Here we go. For this specific example, the creation of a function is the
 extension point to use. And you can use it anywhere an expression is accepted:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 'some text' ~ lipsum(40) ~ 'some more text' }}
 
     {% set lipsum = lipsum(40) %}
 
-Last but not the least, you can also use a *global* object with a method able
-to generate lorem ipsum text:
+Lastly, you can also use a *global* object with a method able to generate lorem
+ipsum text:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ text.lipsum(40) }}
 
@@ -99,13 +92,13 @@ Keep in mind the following when you want to extend Twig:
 ========== ========================== ========== =========================
 What?      Implementation difficulty? How often? When?
 ========== ========================== ========== =========================
-*macro*    trivial                    frequent   Content generation
-*global*   trivial                    frequent   Helper object
-*function* trivial                    frequent   Content generation
-*filter*   trivial                    frequent   Value transformation
+*macro*    simple                     frequent   Content generation
+*global*   simple                     frequent   Helper object
+*function* simple                     frequent   Content generation
+*filter*   simple                     frequent   Value transformation
 *tag*      complex                    rare       DSL language construct
-*test*     trivial                    rare       Boolean decision
-*operator* trivial                    rare       Values transformation
+*test*     simple                     rare       Boolean decision
+*operator* simple                     rare       Values transformation
 ========== ========================== ========== =========================
 
 Globals
@@ -114,49 +107,49 @@ Globals
 A global variable is like any other template variable, except that it's
 available in all templates and macros::
 
-    $twig = new Twig_Environment($loader);
+    $twig = new \Twig\Environment($loader);
     $twig->addGlobal('text', new Text());
 
 You can then use the ``text`` variable anywhere in a template:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ text.lipsum(40) }}
 
 Filters
 -------
 
-Creating a filter is as simple as associating a name with a PHP callable::
+Creating a filter consists of associating a name with a PHP callable::
 
     // an anonymous function
-    $filter = new Twig_SimpleFilter('rot13', function ($string) {
+    $filter = new \Twig\TwigFilter('rot13', function ($string) {
         return str_rot13($string);
     });
 
     // or a simple PHP function
-    $filter = new Twig_SimpleFilter('rot13', 'str_rot13');
+    $filter = new \Twig\TwigFilter('rot13', 'str_rot13');
 
     // or a class static method
-    $filter = new Twig_SimpleFilter('rot13', array('SomeClass', 'rot13Filter'));
-    $filter = new Twig_SimpleFilter('rot13', 'SomeClass::rot13Filter');
+    $filter = new \Twig\TwigFilter('rot13', ['SomeClass', 'rot13Filter']);
+    $filter = new \Twig\TwigFilter('rot13', 'SomeClass::rot13Filter');
 
     // or a class method
-    $filter = new Twig_SimpleFilter('rot13', array($this, 'rot13Filter'));
+    $filter = new \Twig\TwigFilter('rot13', [$this, 'rot13Filter']);
     // the one below needs a runtime implementation (see below for more information)
-    $filter = new Twig_SimpleFilter('rot13', array('SomeClass', 'rot13Filter'));
+    $filter = new \Twig\TwigFilter('rot13', ['SomeClass', 'rot13Filter']);
 
-The first argument passed to the ``Twig_SimpleFilter`` constructor is the name
-of the filter you will use in templates and the second one is the PHP callable
-to associate with it.
+The first argument passed to the ``\Twig\TwigFilter`` constructor is the name of the
+filter you will use in templates and the second one is the PHP callable to
+associate with it.
 
-Then, add the filter to your Twig environment::
+Then, add the filter to the Twig environment::
 
-    $twig = new Twig_Environment($loader);
+    $twig = new \Twig\Environment($loader);
     $twig->addFilter($filter);
 
 And here is how to use it in a template:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 'Twig'|rot13 }}
 
@@ -168,7 +161,7 @@ to the filter (within parentheses ``()``) as extra arguments.
 
 For instance, the following code:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 'TWIG'|lower }}
     {{ now|date('d/m/Y') }}
@@ -178,10 +171,9 @@ is compiled to something like the following::
     <?php echo strtolower('TWIG') ?>
     <?php echo twig_date_format_filter($now, 'd/m/Y') ?>
 
-The ``Twig_SimpleFilter`` class takes an array of options as its last
-argument::
+The ``\Twig\TwigFilter`` class takes an array of options as its last argument::
 
-    $filter = new Twig_SimpleFilter('rot13', 'str_rot13', $options);
+    $filter = new \Twig\TwigFilter('rot13', 'str_rot13', $options);
 
 Environment-aware Filters
 ~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -190,12 +182,12 @@ If you want to access the current environment instance in your filter, set the
 ``needs_environment`` option to ``true``; Twig will pass the current
 environment as the first argument to the filter call::
 
-    $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $string) {
+    $filter = new \Twig\TwigFilter('rot13', function (Twig_Environment $env, $string) {
         // get the current charset for instance
         $charset = $env->getCharset();
 
         return str_rot13($string);
-    }, array('needs_environment' => true));
+    }, ['needs_environment' => true]);
 
 Context-aware Filters
 ~~~~~~~~~~~~~~~~~~~~~
@@ -205,13 +197,13 @@ If you want to access the current context in your filter, set the
 the first argument to the filter call (or the second one if
 ``needs_environment`` is also set to ``true``)::
 
-    $filter = new Twig_SimpleFilter('rot13', function ($context, $string) {
+    $filter = new \Twig\TwigFilter('rot13', function ($context, $string) {
         // ...
-    }, array('needs_context' => true));
+    }, ['needs_context' => true]);
 
-    $filter = new Twig_SimpleFilter('rot13', function (Twig_Environment $env, $context, $string) {
+    $filter = new \Twig\TwigFilter('rot13', function (Twig_Environment $env, $context, $string) {
         // ...
-    }, array('needs_context' => true, 'needs_environment' => true));
+    }, ['needs_context' => true, 'needs_environment' => true]);
 
 Automatic Escaping
 ~~~~~~~~~~~~~~~~~~
@@ -221,71 +213,66 @@ before printing. If your filter acts as an escaper (or explicitly outputs HTML
 or JavaScript code), you will want the raw output to be printed. In such a
 case, set the ``is_safe`` option::
 
-    $filter = new Twig_SimpleFilter('nl2br', 'nl2br', array('is_safe' => array('html')));
+    $filter = new \Twig\TwigFilter('nl2br', 'nl2br', ['is_safe' => ['html']]);
 
 Some filters may need to work on input that is already escaped or safe, for
 example when adding (safe) HTML tags to originally unsafe output. In such a
 case, set the ``pre_escape`` option to escape the input data before it is run
 through your filter::
 
-    $filter = new Twig_SimpleFilter('somefilter', 'somefilter', array('pre_escape' => 'html', 'is_safe' => array('html')));
+    $filter = new \Twig\TwigFilter('somefilter', 'somefilter', ['pre_escape' => 'html', 'is_safe' => ['html']]);
 
 Variadic Filters
 ~~~~~~~~~~~~~~~~
 
-.. versionadded:: 1.19
-    Support for variadic filters was added in Twig 1.19.
-
 When a filter should accept an arbitrary number of arguments, set the
 ``is_variadic`` option to ``true``; Twig will pass the extra arguments as the
 last argument to the filter call as an array::
 
-    $filter = new Twig_SimpleFilter('thumbnail', function ($file, array $options = array()) {
+    $filter = new \Twig\TwigFilter('thumbnail', function ($file, array $options = []) {
         // ...
-    }, array('is_variadic' => true));
+    }, ['is_variadic' => true]);
 
-Be warned that named arguments passed to a variadic filter cannot be checked
-for validity as they will automatically end up in the option array.
+Be warned that :ref:`named arguments <named-arguments>` passed to a variadic
+filter cannot be checked for validity as they will automatically end up in the
+option array.
 
 Dynamic Filters
 ~~~~~~~~~~~~~~~
 
-A filter name containing the special ``*`` character is a dynamic filter as
-the ``*`` can be any string::
+A filter name containing the special ``*`` character is a dynamic filter and
+the ``*`` part will match any string::
 
-    $filter = new Twig_SimpleFilter('*_path', function ($name, $arguments) {
+    $filter = new \Twig\TwigFilter('*_path', function ($name, $arguments) {
         // ...
     });
 
-The following filters will be matched by the above defined dynamic filter:
+The following filters are matched by the above defined dynamic filter:
 
 * ``product_path``
 * ``category_path``
 
 A dynamic filter can define more than one dynamic parts::
 
-    $filter = new Twig_SimpleFilter('*_path_*', function ($name, $suffix, $arguments) {
+    $filter = new \Twig\TwigFilter('*_path_*', function ($name, $suffix, $arguments) {
         // ...
     });
 
-The filter will receive all dynamic part values before the normal filter
-arguments, but after the environment and the context. For instance, a call to
-``'foo'|a_path_b()`` will result in the following arguments to be passed to
-the filter: ``('a', 'b', 'foo')``.
+The filter receives all dynamic part values before the normal filter arguments,
+but after the environment and the context. For instance, a call to
+``'foo'|a_path_b()`` will result in the following arguments to be passed to the
+filter: ``('a', 'b', 'foo')``.
 
 Deprecated Filters
 ~~~~~~~~~~~~~~~~~~
 
-.. versionadded:: 1.21
-    Support for deprecated filters was added in Twig 1.21.
-
 You can mark a filter as being deprecated by setting the ``deprecated`` option
 to ``true``. You can also give an alternative filter that replaces the
 deprecated one when that makes sense::
 
-    $filter = new Twig_SimpleFilter('obsolete', function () {
+    $filter = new \Twig\TwigFilter('obsolete', function () {
         // ...
-    }, array('deprecated' => true, 'alternative' => 'new_one'));
+    }, ['deprecated' => true, 'alternative' => 'new_one']);
 
 When a filter is deprecated, Twig emits a deprecation notice when compiling a
 template using it. See :ref:`deprecation-notices` for more information.
@@ -294,10 +281,10 @@ Functions
 ---------
 
 Functions are defined in the exact same way as filters, but you need to create
-an instance of ``Twig_SimpleFunction``::
+an instance of ``\Twig\TwigFunction``::
 
-    $twig = new Twig_Environment($loader);
-    $function = new Twig_SimpleFunction('function_name', function () {
+    $twig = new \Twig\Environment($loader);
+    $function = new \Twig\TwigFunction('function_name', function () {
         // ...
     });
     $twig->addFunction($function);
@@ -309,10 +296,10 @@ Tests
 -----
 
 Tests are defined in the exact same way as filters and functions, but you need
-to create an instance of ``Twig_SimpleTest``::
+to create an instance of ``\Twig\TwigTest``::
 
-    $twig = new Twig_Environment($loader);
-    $test = new Twig_SimpleTest('test_name', function () {
+    $twig = new \Twig\Environment($loader);
+    $test = new \Twig\TwigTest('test_name', function () {
         // ...
     });
     $twig->addTest($test);
@@ -321,8 +308,8 @@ Tests allow you to create custom application specific logic for evaluating
 boolean conditions. As a simple example, let's create a Twig test that checks if
 objects are 'red'::
 
-    $twig = new Twig_Environment($loader);
-    $test = new Twig_SimpleTest('red', function ($value) {
+    $twig = new \Twig\Environment($loader);
+    $test = new \Twig\TwigTest('red', function ($value) {
         if (isset($value->color) && $value->color == 'red') {
             return true;
         }
@@ -333,22 +320,22 @@ objects are 'red'::
     });
     $twig->addTest($test);
 
-Test functions should always return true/false.
+Test functions must always return ``true``/``false``.
 
 When creating tests you can use the ``node_class`` option to provide custom test
 compilation. This is useful if your test can be compiled into PHP primitives.
 This is used by many of the tests built into Twig::
 
-    $twig = new Twig_Environment($loader);
-    $test = new Twig_SimpleTest(
+    $twig = new \Twig\Environment($loader);
+    $test = new \Twig\TwigTest(
         'odd',
         null,
-        array('node_class' => 'Twig_Node_Expression_Test_Odd'));
+        ['node_class' => \Twig\Node\Expression\Test\OddTest::class]);
     $twig->addTest($test);
 
-    class Twig_Node_Expression_Test_Odd extends Twig_Node_Expression_Test
+    class Twig_Node_Expression_Test_Odd extends \Twig\Node\Expression\TestExpression
     {
-        public function compile(Twig_Compiler $compiler)
+        public function compile(\Twig\Compiler $compiler)
         {
             $compiler
                 ->raw('(')
@@ -359,11 +346,11 @@ This is used by many of the tests built into Twig::
         }
     }
 
-The above example shows how you can create tests that use a node class. The
-node class has access to one sub-node called 'node'. This sub-node contains the
+The above example shows how you can create tests that use a node class. The node
+class has access to one sub-node called ``node``. This sub-node contains the
 value that is being tested. When the ``odd`` filter is used in code such as:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if my_value is odd %}
 
@@ -371,21 +358,67 @@ The ``node`` sub-node will contain an expression of ``my_value``. Node-based
 tests also have access to the ``arguments`` node. This node will contain the
 various other arguments that have been provided to your test.
 
+.. versionadded:: 2.6
+    Dynamic tests support was added in Twig 2.6.
+
 If you want to pass a variable number of positional or named arguments to the
-test, set the ``is_variadic`` option to ``true``. Tests also support dynamic
-name feature as filters and functions.
+test, set the ``is_variadic`` option to ``true``. Tests support dynamic
+names (see dynamic filters for the syntax).
 
 Tags
 ----
 
 One of the most exciting features of a template engine like Twig is the
-possibility to define new language constructs. This is also the most complex
+possibility to define new **language constructs**. This is also the most complex
 feature as you need to understand how Twig's internals work.
 
-Let's create a simple ``set`` tag that allows the definition of simple
-variables from within a template. The tag can be used like follows:
+Most of the time though, a tag is not needed:
+
+* If your tag generates some output, use a **function** instead.
+
+* If your tag modifies some content and returns it, use a **filter** instead.
+
+  For instance, if you want to create a tag that converts a Markdown formatted
+  text to HTML, create a ``markdown`` filter instead:
+
+  .. code-block:: twig
+
+      {{ '**markdown** text'|markdown }}
+
+  If you want use this filter on large amounts of text, wrap it with the
+  :doc:`apply <tags/apply>` tag:
+
+  .. code-block:: twig
+
+      {% apply markdown %}
+      Title
+      =====
+
+      Much better than creating a tag as you can **compose** filters.
+      {% endapply %}
 
-.. code-block:: jinja
+ .. note::
+
+      The ``apply`` tag was introduced in Twig 2.9; use the ``filter`` tag with
+      previous versions.
+
+* If your tag does not output anything, but only exists because of a side
+  effect, create a **function** that returns nothing and call it via the
+  :doc:`filter <tags/do>` tag.
+
+  For instance, if you want to create a tag that logs text, create a ``log``
+  function instead and call it via the :doc:`do <tags/do>` tag:
+
+  .. code-block:: twig
+
+      {% do log('Log some things') %}
+
+If you still want to create a tag for a new language construct, great!
+
+Let's create a ``set`` tag that allows the definition of simple variables from
+within a template. The tag can be used like follows:
+
+.. code-block:: twig
 
     {% set name = "value" %}
 
@@ -397,8 +430,7 @@ variables from within a template. The tag can be used like follows:
 
     The ``set`` tag is part of the Core extension and as such is always
     available. The built-in version is slightly more powerful and supports
-    multiple assignments by default (cf. the template designers chapter for
-    more information).
+    multiple assignments by default.
 
 Three steps are needed to define a new tag:
 
@@ -411,10 +443,10 @@ Three steps are needed to define a new tag:
 Registering a new tag
 ~~~~~~~~~~~~~~~~~~~~~
 
-Adding a tag is as simple as calling the ``addTokenParser`` method on the
-``Twig_Environment`` instance::
+Add a tag by calling the ``addTokenParser`` method on the ``\Twig\Environment``
+instance::
 
-    $twig = new Twig_Environment($loader);
+    $twig = new \Twig\Environment($loader);
     $twig->addTokenParser(new Project_Set_TokenParser());
 
 Defining a Token Parser
@@ -422,17 +454,17 @@ Defining a Token Parser
 
 Now, let's see the actual code of this class::
 
-    class Project_Set_TokenParser extends Twig_TokenParser
+    class Project_Set_TokenParser extends \Twig\TokenParser\AbstractTokenParser
     {
-        public function parse(Twig_Token $token)
+        public function parse(\Twig\Token $token)
         {
             $parser = $this->parser;
             $stream = $parser->getStream();
 
-            $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-            $stream->expect(Twig_Token::OPERATOR_TYPE, '=');
+            $name = $stream->expect(\Twig\Token::NAME_TYPE)->getValue();
+            $stream->expect(\Twig\Token::OPERATOR_TYPE, '=');
             $value = $parser->getExpressionParser()->parseExpression();
-            $stream->expect(Twig_Token::BLOCK_END_TYPE);
+            $stream->expect(\Twig\Token::BLOCK_END_TYPE);
 
             return new Project_Set_Node($name, $value, $token->getLine(), $this->getTag());
         }
@@ -446,7 +478,7 @@ Now, let's see the actual code of this class::
 The ``getTag()`` method must return the tag we want to parse, here ``set``.
 
 The ``parse()`` method is invoked whenever the parser encounters a ``set``
-tag. It should return a ``Twig_Node`` instance that represents the node (the
+tag. It should return a ``\Twig\Node\Node`` instance that represents the node (the
 ``Project_Set_Node`` calls creating is explained in the next section).
 
 The parsing process is simplified thanks to a bunch of methods you can call
@@ -477,16 +509,16 @@ the ``set`` tag.
 Defining a Node
 ~~~~~~~~~~~~~~~
 
-The ``Project_Set_Node`` class itself is rather simple::
+The ``Project_Set_Node`` class itself is quite short::
 
-    class Project_Set_Node extends Twig_Node
+    class Project_Set_Node extends \Twig\Node\Node
     {
-        public function __construct($name, Twig_Node_Expression $value, $line, $tag = null)
+        public function __construct($name, \Twig\Node\Expression\AbstractExpression $value, $line, $tag = null)
         {
-            parent::__construct(array('value' => $value), array('name' => $name), $line, $tag);
+            parent::__construct(['value' => $value], ['name' => $name], $line, $tag);
         }
 
-        public function compile(Twig_Compiler $compiler)
+        public function compile(\Twig\Compiler $compiler)
         {
             $compiler
                 ->addDebugInfo($this)
@@ -510,15 +542,15 @@ developer generate beautiful and readable PHP code:
 * ``string()``: Writes a quoted string.
 
 * ``repr()``: Writes a PHP representation of a given value (see
-  ``Twig_Node_For`` for a usage example).
+  ``\Twig\Node\ForNode`` for a usage example).
 
 * ``addDebugInfo()``: Adds the line of the original template file related to
   the current node as a comment.
 
-* ``indent()``: Indents the generated code (see ``Twig_Node_Block`` for a
+* ``indent()``: Indents the generated code (see ``\Twig\Node\BlockNode`` for a
   usage example).
 
-* ``outdent()``: Outdents the generated code (see ``Twig_Node_Block`` for a
+* ``outdent()``: Outdents the generated code (see ``\Twig\Node\BlockNode`` for a
   usage example).
 
 .. _creating_extensions:
@@ -528,8 +560,7 @@ Creating an Extension
 
 The main motivation for writing an extension is to move often used code into a
 reusable class like adding support for internationalization. An extension can
-define tags, filters, tests, operators, global variables, functions, and node
-visitors.
+define tags, filters, tests, operators, functions, and node visitors.
 
 Most of the time, it is useful to create a single extension for your project,
 to host all the specific tags and filters you want to add to Twig.
@@ -543,105 +574,72 @@ to host all the specific tags and filters you want to add to Twig.
 .. note::
 
     Before writing your own extensions, have a look at the Twig official
-    extension repository: http://github.com/twigphp/Twig-extensions.
+    extension repository: https://github.com/twigphp/Twig-extensions.
 
 An extension is a class that implements the following interface::
 
-    interface Twig_ExtensionInterface
+    interface \Twig\Extension\ExtensionInterface
     {
         /**
-         * Initializes the runtime environment.
-         *
-         * This is where you can load some file that contains filter functions for instance.
-         *
-         * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_InitRuntimeInterface instead
-         */
-        function initRuntime(Twig_Environment $environment);
-
-        /**
          * Returns the token parser instances to add to the existing list.
          *
-         * @return (Twig_TokenParserInterface|Twig_TokenParserBrokerInterface)[]
+         * @return \Twig\TokenParser\TokenParserInterface[]
          */
-        function getTokenParsers();
+        public function getTokenParsers();
 
         /**
          * Returns the node visitor instances to add to the existing list.
          *
-         * @return Twig_NodeVisitorInterface[]
+         * @return \Twig\NodeVisitor\NodeVisitorInterface[]
          */
-        function getNodeVisitors();
+        public function getNodeVisitors();
 
         /**
          * Returns a list of filters to add to the existing list.
          *
-         * @return Twig_SimpleFilter[]
+         * @return \Twig\TwigFilter[]
          */
-        function getFilters();
+        public function getFilters();
 
         /**
          * Returns a list of tests to add to the existing list.
          *
-         * @return Twig_SimpleTest[]
+         * @return \Twig\TwigTest[]
          */
-        function getTests();
+        public function getTests();
 
         /**
          * Returns a list of functions to add to the existing list.
          *
-         * @return Twig_SimpleFunction[]
+         * @return \Twig\TwigFunction[]
          */
-        function getFunctions();
+        public function getFunctions();
 
         /**
          * Returns a list of operators to add to the existing list.
          *
          * @return array<array> First array of unary operators, second array of binary operators
          */
-        function getOperators();
-
-        /**
-         * Returns a list of global variables to add to the existing list.
-         *
-         * @return array An array of global variables
-         *
-         * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_GlobalsInterface instead
-         */
-        function getGlobals();
-
-        /**
-         * Returns the name of the extension.
-         *
-         * @return string The extension name
-         *
-         * @deprecated since 1.26 (to be removed in 2.0), not used anymore internally
-         */
-        function getName();
+        public function getOperators();
     }
 
 To keep your extension class clean and lean, inherit from the built-in
-``Twig_Extension`` class instead of implementing the interface as it provides
+``\Twig\Extension\AbstractExtension`` class instead of implementing the interface as it provides
 empty implementations for all methods:
 
-    class Project_Twig_Extension extends Twig_Extension
+    class Project_Twig_Extension extends \Twig\Extension\AbstractExtension
     {
     }
 
-Of course, this extension does nothing for now. We will customize it in the
-next sections.
+This extension does nothing for now. We will customize it in the next sections.
 
-.. note::
-
-    Prior to Twig 1.26, you must implement the ``getName()`` method which must
-    return a unique identifier for the extension.
-
-Twig does not care where you save your extension on the filesystem, as all
-extensions must be registered explicitly to be available in your templates.
+You can save your extension anywhere on the filesystem, as all extensions must
+be registered explicitly to be available in your templates.
 
 You can register an extension by using the ``addExtension()`` method on your
 main ``Environment`` object::
 
-    $twig = new Twig_Environment($loader);
+    $twig = new \Twig\Environment($loader);
     $twig->addExtension(new Project_Twig_Extension());
 
 .. tip::
@@ -654,13 +652,13 @@ Globals
 Global variables can be registered in an extension via the ``getGlobals()``
 method::
 
-    class Project_Twig_Extension extends Twig_Extension implements Twig_Extension_GlobalsInterface
+    class Project_Twig_Extension extends \Twig\Extension\AbstractExtension implements \Twig\Extension\GlobalsInterface
     {
         public function getGlobals()
         {
-            return array(
+            return [
                 'text' => new Text(),
-            );
+            ];
         }
 
         // ...
@@ -672,13 +670,13 @@ Functions
 Functions can be registered in an extension via the ``getFunctions()``
 method::
 
-    class Project_Twig_Extension extends Twig_Extension
+    class Project_Twig_Extension extends \Twig\Extension\AbstractExtension
     {
         public function getFunctions()
         {
-            return array(
-                new Twig_SimpleFunction('lipsum', 'generate_lipsum'),
-            );
+            return [
+                new \Twig\TwigFunction('lipsum', 'generate_lipsum'),
+            ];
         }
 
         // ...
@@ -691,13 +689,13 @@ To add a filter to an extension, you need to override the ``getFilters()``
 method. This method must return an array of filters to add to the Twig
 environment::
 
-    class Project_Twig_Extension extends Twig_Extension
+    class Project_Twig_Extension extends \Twig\Extension\AbstractExtension
     {
         public function getFilters()
         {
-            return array(
-                new Twig_SimpleFilter('rot13', 'str_rot13'),
-            );
+            return [
+                new \Twig\TwigFilter('rot13', 'str_rot13'),
+            ];
         }
 
         // ...
@@ -710,11 +708,11 @@ Adding a tag in an extension can be done by overriding the
 ``getTokenParsers()`` method. This method must return an array of tags to add
 to the Twig environment::
 
-    class Project_Twig_Extension extends Twig_Extension
+    class Project_Twig_Extension extends \Twig\Extension\AbstractExtension
     {
         public function getTokenParsers()
         {
-            return array(new Project_Set_TokenParser());
+            return [new Project_Set_TokenParser()];
         }
 
         // ...
@@ -728,21 +726,21 @@ Operators
 ~~~~~~~~~
 
 The ``getOperators()`` methods lets you add new operators. Here is how to add
-``!``, ``||``, and ``&&`` operators::
+the ``!``, ``||``, and ``&&`` operators::
 
-    class Project_Twig_Extension extends Twig_Extension
+    class Project_Twig_Extension extends \Twig\Extension\AbstractExtension
     {
         public function getOperators()
         {
-            return array(
-                array(
-                    '!' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
-                ),
-                array(
-                    '||' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                    '&&' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                ),
-            );
+            return [
+                [
+                    '!' => ['precedence' => 50, 'class' => \Twig\Node\Expression\Unary\NotUnary::class],
+                ],
+                [
+                    '||' => ['precedence' => 10, 'class' => \Twig\Node\Expression\Binary\OrBinary::class, 'associativity' => \Twig\ExpressionParser::OPERATOR_LEFT],
+                    '&&' => ['precedence' => 15, 'class' => \Twig\Node\Expression\Binary\AndBinary::class, 'associativity' => \Twig\ExpressionParser::OPERATOR_LEFT],
+                ],
+            ];
         }
 
         // ...
@@ -753,13 +751,13 @@ Tests
 
 The ``getTests()`` method lets you add new test functions::
 
-    class Project_Twig_Extension extends Twig_Extension
+    class Project_Twig_Extension extends \Twig\Extension\AbstractExtension
     {
         public function getTests()
         {
-            return array(
-                new Twig_SimpleTest('even', 'twig_test_even'),
-            );
+            return [
+                new \Twig\TwigTest('even', 'twig_test_even'),
+            ];
         }
 
         // ...
@@ -782,7 +780,7 @@ any valid PHP callable:
 
 The simplest way to use methods is to define them on the extension itself::
 
-    class Project_Twig_Extension extends Twig_Extension
+    class Project_Twig_Extension extends \Twig\Extension\AbstractExtension
     {
         private $rot13Provider;
 
@@ -793,14 +791,14 @@ The simplest way to use methods is to define them on the extension itself::
 
         public function getFunctions()
         {
-            return array(
-                new Twig_SimpleFunction('rot13', array($this, 'rot13')),
-            );
+            return [
+                new \Twig\TwigFunction('rot13', [$this, 'rot13']),
+            ];
         }
 
         public function rot13($value)
         {
-            return $rot13Provider->rot13($value);
+            return $this->rot13Provider->rot13($value);
         }
     }
 
@@ -808,12 +806,12 @@ This is very convenient but not recommended as it makes template compilation
 depend on runtime dependencies even if they are not needed (think for instance
 as a dependency that connects to a database engine).
 
-As of Twig 1.26, you can easily decouple the extension definitions from their
-runtime implementations by registering a ``Twig_RuntimeLoaderInterface``
-instance on the environment that knows how to instantiate such runtime classes
-(runtime classes must be autoload-able)::
+You can easily decouple the extension definitions from their runtime
+implementations by registering a ``\Twig\RuntimeLoader\RuntimeLoaderInterface`` instance on
+the environment that knows how to instantiate such runtime classes (runtime
+classes must be autoload-able)::
 
-    class RuntimeLoader implements Twig_RuntimeLoaderInterface
+    class RuntimeLoader implements \Twig\RuntimeLoader\RuntimeLoaderInterface
     {
         public function load($class)
         {
@@ -832,8 +830,8 @@ instance on the environment that knows how to instantiate such runtime classes
 
 .. note::
 
-    As of Twig 1.32, Twig comes with a PSR-11 compatible runtime loader
-    (``Twig_ContainerRuntimeLoader``) that works on PHP 5.3+.
+    Twig comes with a PSR-11 compatible runtime loader
+    (``\Twig\RuntimeLoader\ContainerRuntimeLoader``).
 
 It is now possible to move the runtime logic to a new
 ``Project_Twig_RuntimeExtension`` class and use it directly in the extension::
@@ -849,73 +847,30 @@ It is now possible to move the runtime logic to a new
 
         public function rot13($value)
         {
-            return $rot13Provider->rot13($value);
+            return $this->rot13Provider->rot13($value);
         }
     }
 
-    class Project_Twig_Extension extends Twig_Extension
+    class Project_Twig_Extension extends \Twig\Extension\AbstractExtension
     {
         public function getFunctions()
         {
-            return array(
-                new Twig_SimpleFunction('rot13', array('Project_Twig_RuntimeExtension', 'rot13')),
+            return [
+                new \Twig\TwigFunction('rot13', ['Project_Twig_RuntimeExtension', 'rot13']),
                 // or
-                new Twig_SimpleFunction('rot13', 'Project_Twig_RuntimeExtension::rot13'),
-            );
+                new \Twig\TwigFunction('rot13', 'Project_Twig_RuntimeExtension::rot13'),
+            ];
         }
     }
 
-Overloading
------------
-
-To overload an already defined filter, test, operator, global variable, or
-function, re-define it in an extension and register it **as late as
-possible** (order matters)::
-
-    class MyCoreExtension extends Twig_Extension
-    {
-        public function getFilters()
-        {
-            return array(
-                new Twig_SimpleFilter('date', array($this, 'dateFilter')),
-            );
-        }
-
-        public function dateFilter($timestamp, $format = 'F j, Y H:i')
-        {
-            // do something different from the built-in date filter
-        }
-    }
-
-    $twig = new Twig_Environment($loader);
-    $twig->addExtension(new MyCoreExtension());
-
-Here, we have overloaded the built-in ``date`` filter with a custom one.
-
-If you do the same on the ``Twig_Environment`` itself, beware that it takes
-precedence over any other registered extensions::
-
-    $twig = new Twig_Environment($loader);
-    $twig->addFilter(new Twig_SimpleFilter('date', function ($timestamp, $format = 'F j, Y H:i') {
-        // do something different from the built-in date filter
-    }));
-    // the date filter will come from the above registration, not
-    // from the registered extension below
-    $twig->addExtension(new MyCoreExtension());
-
-.. caution::
-
-    Note that overloading the built-in Twig elements is not recommended as it
-    might be confusing.
-
 Testing an Extension
 --------------------
 
 Functional Tests
 ~~~~~~~~~~~~~~~~
 
-You can create functional tests for extensions simply by creating the
-following file structure in your test directory::
+You can create functional tests for extensions by creating the following file
+structure in your test directory::
 
     Fixtures/
         filters/
@@ -931,14 +886,14 @@ following file structure in your test directory::
 
 The ``IntegrationTest.php`` file should look like this::
 
-    class Project_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase
+    class Project_Tests_IntegrationTest extends \Twig\Test\IntegrationTestCase
     {
         public function getExtensions()
         {
-            return array(
+            return [
                 new Project_Twig_Extension1(),
                 new Project_Twig_Extension2(),
-            );
+            ];
         }
 
         public function getFixturesDir()
@@ -954,9 +909,9 @@ Node Tests
 ~~~~~~~~~~
 
 Testing the node visitors can be complex, so extend your test cases from
-``Twig_Test_NodeTestCase``. Examples can be found in the Twig repository
+``\Twig\Test\NodeTestCase``. Examples can be found in the Twig repository
 `tests/Twig/Node`_ directory.
 
-.. _`rot13`:                   http://www.php.net/manual/en/function.str-rot13.php
-.. _`tests/Twig/Fixtures`:     https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Fixtures
-.. _`tests/Twig/Node`:         https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Node
+.. _`rot13`:               https://secure.php.net/manual/en/function.str-rot13.php
+.. _`tests/Twig/Fixtures`: https://github.com/twigphp/Twig/tree/2.x/test/Twig/Tests/Fixtures
+.. _`tests/Twig/Node`:     https://github.com/twigphp/Twig/tree/2.x/test/Twig/Tests/Node
diff --git a/vendor/twig/twig/doc/advanced_legacy.rst b/vendor/twig/twig/doc/advanced_legacy.rst
deleted file mode 100644
index 33e9f45a..00000000
--- a/vendor/twig/twig/doc/advanced_legacy.rst
+++ /dev/null
@@ -1,885 +0,0 @@
-Extending Twig
-==============
-
-.. caution::
-
-    This section describes how to extends Twig for versions **older than
-    1.12**. If you are using a newer version, read the :doc:`newer<advanced>`
-    chapter instead.
-
-Twig can be extended in many ways; you can add extra tags, filters, tests,
-operators, global variables, and functions. You can even extend the parser
-itself with node visitors.
-
-.. note::
-
-    The first section of this chapter describes how to extend Twig easily. If
-    you want to reuse your changes in different projects or if you want to
-    share them with others, you should then create an extension as described
-    in the following section.
-
-.. caution::
-
-    When extending Twig by calling methods on the Twig environment instance,
-    Twig won't be able to recompile your templates when the PHP code is
-    updated. To see your changes in real-time, either disable template caching
-    or package your code into an extension (see the next section of this
-    chapter).
-
-Before extending Twig, you must understand the differences between all the
-different possible extension points and when to use them.
-
-First, remember that Twig has two main language constructs:
-
-* ``{{ }}``: used to print the result of an expression evaluation;
-
-* ``{% %}``: used to execute statements.
-
-To understand why Twig exposes so many extension points, let's see how to
-implement a *Lorem ipsum* generator (it needs to know the number of words to
-generate).
-
-You can use a ``lipsum`` *tag*:
-
-.. code-block:: jinja
-
-    {% lipsum 40 %}
-
-That works, but using a tag for ``lipsum`` is not a good idea for at least
-three main reasons:
-
-* ``lipsum`` is not a language construct;
-* The tag outputs something;
-* The tag is not flexible as you cannot use it in an expression:
-
-  .. code-block:: jinja
-
-      {{ 'some text' ~ {% lipsum 40 %} ~ 'some more text' }}
-
-In fact, you rarely need to create tags; and that's good news because tags are
-the most complex extension point of Twig.
-
-Now, let's use a ``lipsum`` *filter*:
-
-.. code-block:: jinja
-
-    {{ 40|lipsum }}
-
-Again, it works, but it looks weird. A filter transforms the passed value to
-something else but here we use the value to indicate the number of words to
-generate (so, ``40`` is an argument of the filter, not the value we want to
-transform).
-
-Next, let's use a ``lipsum`` *function*:
-
-.. code-block:: jinja
-
-    {{ lipsum(40) }}
-
-Here we go. For this specific example, the creation of a function is the
-extension point to use. And you can use it anywhere an expression is accepted:
-
-.. code-block:: jinja
-
-    {{ 'some text' ~ ipsum(40) ~ 'some more text' }}
-
-    {% set ipsum = ipsum(40) %}
-
-Last but not the least, you can also use a *global* object with a method able
-to generate lorem ipsum text:
-
-.. code-block:: jinja
-
-    {{ text.lipsum(40) }}
-
-As a rule of thumb, use functions for frequently used features and global
-objects for everything else.
-
-Keep in mind the following when you want to extend Twig:
-
-========== ========================== ========== =========================
-What?      Implementation difficulty? How often? When?
-========== ========================== ========== =========================
-*macro*    trivial                    frequent   Content generation
-*global*   trivial                    frequent   Helper object
-*function* trivial                    frequent   Content generation
-*filter*   trivial                    frequent   Value transformation
-*tag*      complex                    rare       DSL language construct
-*test*     trivial                    rare       Boolean decision
-*operator* trivial                    rare       Values transformation
-========== ========================== ========== =========================
-
-Globals
--------
-
-A global variable is like any other template variable, except that it's
-available in all templates and macros::
-
-    $twig = new Twig_Environment($loader);
-    $twig->addGlobal('text', new Text());
-
-You can then use the ``text`` variable anywhere in a template:
-
-.. code-block:: jinja
-
-    {{ text.lipsum(40) }}
-
-Filters
--------
-
-A filter is a regular PHP function or an object method that takes the left
-side of the filter (before the pipe ``|``) as first argument and the extra
-arguments passed to the filter (within parentheses ``()``) as extra arguments.
-
-Defining a filter is as easy as associating the filter name with a PHP
-callable. For instance, let's say you have the following code in a template:
-
-.. code-block:: jinja
-
-    {{ 'TWIG'|lower }}
-
-When compiling this template to PHP, Twig looks for the PHP callable
-associated with the ``lower`` filter. The ``lower`` filter is a built-in Twig
-filter, and it is simply mapped to the PHP ``strtolower()`` function. After
-compilation, the generated PHP code is roughly equivalent to:
-
-.. code-block:: html+php
-
-    <?php echo strtolower('TWIG') ?>
-
-As you can see, the ``'TWIG'`` string is passed as a first argument to the PHP
-function.
-
-A filter can also take extra arguments like in the following example:
-
-.. code-block:: jinja
-
-    {{ now|date('d/m/Y') }}
-
-In this case, the extra arguments are passed to the function after the main
-argument, and the compiled code is equivalent to:
-
-.. code-block:: html+php
-
-    <?php echo twig_date_format_filter($now, 'd/m/Y') ?>
-
-Let's see how to create a new filter.
-
-In this section, we will create a ``rot13`` filter, which should return the
-`rot13`_ transformation of a string. Here is an example of its usage and the
-expected output:
-
-.. code-block:: jinja
-
-    {{ "Twig"|rot13 }}
-
-    {# should displays Gjvt #}
-
-Adding a filter is as simple as calling the ``addFilter()`` method on the
-``Twig_Environment`` instance::
-
-    $twig = new Twig_Environment($loader);
-    $twig->addFilter('rot13', new Twig_Filter_Function('str_rot13'));
-
-The second argument of ``addFilter()`` is an instance of ``Twig_Filter``.
-Here, we use ``Twig_Filter_Function`` as the filter is a PHP function. The
-first argument passed to the ``Twig_Filter_Function`` constructor is the name
-of the PHP function to call, here ``str_rot13``, a native PHP function.
-
-Let's say I now want to be able to add a prefix before the converted string:
-
-.. code-block:: jinja
-
-    {{ "Twig"|rot13('prefix_') }}
-
-    {# should displays prefix_Gjvt #}
-
-As the PHP ``str_rot13()`` function does not support this requirement, let's
-create a new PHP function::
-
-    function project_compute_rot13($string, $prefix = '')
-    {
-        return $prefix.str_rot13($string);
-    }
-
-As you can see, the ``prefix`` argument of the filter is passed as an extra
-argument to the ``project_compute_rot13()`` function.
-
-Adding this filter is as easy as before::
-
-    $twig->addFilter('rot13', new Twig_Filter_Function('project_compute_rot13'));
-
-For better encapsulation, a filter can also be defined as a static method of a
-class. The ``Twig_Filter_Function`` class can also be used to register such
-static methods as filters::
-
-    $twig->addFilter('rot13', new Twig_Filter_Function('SomeClass::rot13Filter'));
-
-.. tip::
-
-    In an extension, you can also define a filter as a static method of the
-    extension class.
-
-Environment aware Filters
-~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The ``Twig_Filter`` classes take options as their last argument. For instance,
-if you want access to the current environment instance in your filter, set the
-``needs_environment`` option to ``true``::
-
-    $filter = new Twig_Filter_Function('str_rot13', array('needs_environment' => true));
-
-Twig will then pass the current environment as the first argument to the
-filter call::
-
-    function twig_compute_rot13(Twig_Environment $env, $string)
-    {
-        // get the current charset for instance
-        $charset = $env->getCharset();
-
-        return str_rot13($string);
-    }
-
-Automatic Escaping
-~~~~~~~~~~~~~~~~~~
-
-If automatic escaping is enabled, the output of the filter may be escaped
-before printing. If your filter acts as an escaper (or explicitly outputs HTML
-or JavaScript code), you will want the raw output to be printed. In such a
-case, set the ``is_safe`` option::
-
-    $filter = new Twig_Filter_Function('nl2br', array('is_safe' => array('html')));
-
-Some filters may need to work on input that is already escaped or safe, for
-example when adding (safe) HTML tags to originally unsafe output. In such a
-case, set the ``pre_escape`` option to escape the input data before it is run
-through your filter::
-
-    $filter = new Twig_Filter_Function('somefilter', array('pre_escape' => 'html', 'is_safe' => array('html')));
-
-Dynamic Filters
-~~~~~~~~~~~~~~~
-
-.. versionadded:: 1.5
-    Dynamic filters support was added in Twig 1.5.
-
-A filter name containing the special ``*`` character is a dynamic filter as
-the ``*`` can be any string::
-
-    $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
-
-    function twig_path($name, $arguments)
-    {
-        // ...
-    }
-
-The following filters will be matched by the above defined dynamic filter:
-
-* ``product_path``
-* ``category_path``
-
-A dynamic filter can define more than one dynamic parts::
-
-    $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
-
-    function twig_path($name, $suffix, $arguments)
-    {
-        // ...
-    }
-
-The filter will receive all dynamic part values before the normal filters
-arguments. For instance, a call to ``'foo'|a_path_b()`` will result in the
-following PHP call: ``twig_path('a', 'b', 'foo')``.
-
-Functions
----------
-
-A function is a regular PHP function or an object method that can be called from
-templates.
-
-.. code-block:: jinja
-
-    {{ constant("DATE_W3C") }}
-
-When compiling this template to PHP, Twig looks for the PHP callable
-associated with the ``constant`` function. The ``constant`` function is a built-in Twig
-function, and it is simply mapped to the PHP ``constant()`` function. After
-compilation, the generated PHP code is roughly equivalent to:
-
-.. code-block:: html+php
-
-    <?php echo constant('DATE_W3C') ?>
-
-Adding a function is similar to adding a filter. This can be done by calling the
-``addFunction()`` method on the ``Twig_Environment`` instance::
-
-    $twig = new Twig_Environment($loader);
-    $twig->addFunction('functionName', new Twig_Function_Function('someFunction'));
-
-You can also expose extension methods as functions in your templates::
-
-    // $this is an object that implements Twig_ExtensionInterface.
-    $twig = new Twig_Environment($loader);
-    $twig->addFunction('otherFunction', new Twig_Function_Method($this, 'someMethod'));
-
-Functions also support ``needs_environment`` and ``is_safe`` parameters.
-
-Dynamic Functions
-~~~~~~~~~~~~~~~~~
-
-.. versionadded:: 1.5
-    Dynamic functions support was added in Twig 1.5.
-
-A function name containing the special ``*`` character is a dynamic function
-as the ``*`` can be any string::
-
-    $twig->addFunction('*_path', new Twig_Function_Function('twig_path'));
-
-    function twig_path($name, $arguments)
-    {
-        // ...
-    }
-
-The following functions will be matched by the above defined dynamic function:
-
-* ``product_path``
-* ``category_path``
-
-A dynamic function can define more than one dynamic parts::
-
-    $twig->addFilter('*_path_*', new Twig_Filter_Function('twig_path'));
-
-    function twig_path($name, $suffix, $arguments)
-    {
-        // ...
-    }
-
-The function will receive all dynamic part values before the normal functions
-arguments. For instance, a call to ``a_path_b('foo')`` will result in the
-following PHP call: ``twig_path('a', 'b', 'foo')``.
-
-Tags
-----
-
-One of the most exciting feature of a template engine like Twig is the
-possibility to define new language constructs. This is also the most complex
-feature as you need to understand how Twig's internals work.
-
-Let's create a simple ``set`` tag that allows the definition of simple
-variables from within a template. The tag can be used like follows:
-
-.. code-block:: jinja
-
-    {% set name = "value" %}
-
-    {{ name }}
-
-    {# should output value #}
-
-.. note::
-
-    The ``set`` tag is part of the Core extension and as such is always
-    available. The built-in version is slightly more powerful and supports
-    multiple assignments by default (cf. the template designers chapter for
-    more information).
-
-Three steps are needed to define a new tag:
-
-* Defining a Token Parser class (responsible for parsing the template code);
-
-* Defining a Node class (responsible for converting the parsed code to PHP);
-
-* Registering the tag.
-
-Registering a new tag
-~~~~~~~~~~~~~~~~~~~~~
-
-Adding a tag is as simple as calling the ``addTokenParser`` method on the
-``Twig_Environment`` instance::
-
-    $twig = new Twig_Environment($loader);
-    $twig->addTokenParser(new Project_Set_TokenParser());
-
-Defining a Token Parser
-~~~~~~~~~~~~~~~~~~~~~~~
-
-Now, let's see the actual code of this class::
-
-    class Project_Set_TokenParser extends Twig_TokenParser
-    {
-        public function parse(Twig_Token $token)
-        {
-            $lineno = $token->getLine();
-            $name = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue();
-            $this->parser->getStream()->expect(Twig_Token::OPERATOR_TYPE, '=');
-            $value = $this->parser->getExpressionParser()->parseExpression();
-
-            $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-            return new Project_Set_Node($name, $value, $lineno, $this->getTag());
-        }
-
-        public function getTag()
-        {
-            return 'set';
-        }
-    }
-
-The ``getTag()`` method must return the tag we want to parse, here ``set``.
-
-The ``parse()`` method is invoked whenever the parser encounters a ``set``
-tag. It should return a ``Twig_Node`` instance that represents the node (the
-``Project_Set_Node`` calls creating is explained in the next section).
-
-The parsing process is simplified thanks to a bunch of methods you can call
-from the token stream (``$this->parser->getStream()``):
-
-* ``getCurrent()``: Gets the current token in the stream.
-
-* ``next()``: Moves to the next token in the stream, *but returns the old one*.
-
-* ``test($type)``, ``test($value)`` or ``test($type, $value)``: Determines whether
-  the current token is of a particular type or value (or both). The value may be an
-  array of several possible values.
-
-* ``expect($type[, $value[, $message]])``: If the current token isn't of the given
-  type/value a syntax error is thrown. Otherwise, if the type and value are correct,
-  the token is returned and the stream moves to the next token.
-
-* ``look()``: Looks a the next token without consuming it.
-
-Parsing expressions is done by calling the ``parseExpression()`` like we did for
-the ``set`` tag.
-
-.. tip::
-
-    Reading the existing ``TokenParser`` classes is the best way to learn all
-    the nitty-gritty details of the parsing process.
-
-Defining a Node
-~~~~~~~~~~~~~~~
-
-The ``Project_Set_Node`` class itself is rather simple::
-
-    class Project_Set_Node extends Twig_Node
-    {
-        public function __construct($name, Twig_Node_Expression $value, $lineno, $tag = null)
-        {
-            parent::__construct(array('value' => $value), array('name' => $name), $lineno, $tag);
-        }
-
-        public function compile(Twig_Compiler $compiler)
-        {
-            $compiler
-                ->addDebugInfo($this)
-                ->write('$context[\''.$this->getAttribute('name').'\'] = ')
-                ->subcompile($this->getNode('value'))
-                ->raw(";\n")
-            ;
-        }
-    }
-
-The compiler implements a fluid interface and provides methods that helps the
-developer generate beautiful and readable PHP code:
-
-* ``subcompile()``: Compiles a node.
-
-* ``raw()``: Writes the given string as is.
-
-* ``write()``: Writes the given string by adding indentation at the beginning
-  of each line.
-
-* ``string()``: Writes a quoted string.
-
-* ``repr()``: Writes a PHP representation of a given value (see
-  ``Twig_Node_For`` for a usage example).
-
-* ``addDebugInfo()``: Adds the line of the original template file related to
-  the current node as a comment.
-
-* ``indent()``: Indents the generated code (see ``Twig_Node_Block`` for a
-  usage example).
-
-* ``outdent()``: Outdents the generated code (see ``Twig_Node_Block`` for a
-  usage example).
-
-.. _creating_extensions:
-
-Creating an Extension
----------------------
-
-The main motivation for writing an extension is to move often used code into a
-reusable class like adding support for internationalization. An extension can
-define tags, filters, tests, operators, global variables, functions, and node
-visitors.
-
-Creating an extension also makes for a better separation of code that is
-executed at compilation time and code needed at runtime. As such, it makes
-your code faster.
-
-Most of the time, it is useful to create a single extension for your project,
-to host all the specific tags and filters you want to add to Twig.
-
-.. tip::
-
-    When packaging your code into an extension, Twig is smart enough to
-    recompile your templates whenever you make a change to it (when the
-    ``auto_reload`` is enabled).
-
-.. note::
-
-    Before writing your own extensions, have a look at the Twig official
-    extension repository: http://github.com/twigphp/Twig-extensions.
-
-An extension is a class that implements the following interface::
-
-    interface Twig_ExtensionInterface
-    {
-        /**
-         * Initializes the runtime environment.
-         *
-         * This is where you can load some file that contains filter functions for instance.
-         */
-        function initRuntime(Twig_Environment $environment);
-
-        /**
-         * Returns the token parser instances to add to the existing list.
-         *
-         * @return (Twig_TokenParserInterface|Twig_TokenParserBrokerInterface)[]
-         */
-        function getTokenParsers();
-
-        /**
-         * Returns the node visitor instances to add to the existing list.
-         *
-         * @return Twig_NodeVisitorInterface[]
-         */
-        function getNodeVisitors();
-
-        /**
-         * Returns a list of filters to add to the existing list.
-         *
-         * @return Twig_SimpleFilter[]
-         */
-        function getFilters();
-
-        /**
-         * Returns a list of tests to add to the existing list.
-         *
-         * @return Twig_SimpleTest[]
-         */
-        function getTests();
-
-        /**
-         * Returns a list of functions to add to the existing list.
-         *
-         * @return Twig_SimpleFunction[]
-         */
-        function getFunctions();
-
-        /**
-         * Returns a list of operators to add to the existing list.
-         *
-         * @return array<array> First array of unary operators, second array of binary operators
-         */
-        function getOperators();
-
-        /**
-         * Returns a list of global variables to add to the existing list.
-         *
-         * @return array An array of global variables
-         */
-        function getGlobals();
-
-        /**
-         * Returns the name of the extension.
-         *
-         * @return string The extension name
-         */
-        function getName();
-    }
-
-To keep your extension class clean and lean, it can inherit from the built-in
-``Twig_Extension`` class instead of implementing the whole interface. That
-way, you just need to implement the ``getName()`` method as the
-``Twig_Extension`` provides empty implementations for all other methods.
-
-The ``getName()`` method must return a unique identifier for your extension.
-
-Now, with this information in mind, let's create the most basic extension
-possible::
-
-    class Project_Twig_Extension extends Twig_Extension
-    {
-        public function getName()
-        {
-            return 'project';
-        }
-    }
-
-.. note::
-
-    Of course, this extension does nothing for now. We will customize it in
-    the next sections.
-
-Twig does not care where you save your extension on the filesystem, as all
-extensions must be registered explicitly to be available in your templates.
-
-You can register an extension by using the ``addExtension()`` method on your
-main ``Environment`` object::
-
-    $twig = new Twig_Environment($loader);
-    $twig->addExtension(new Project_Twig_Extension());
-
-Of course, you need to first load the extension file by either using
-``require_once()`` or by using an autoloader (see `spl_autoload_register()`_).
-
-.. tip::
-
-    The bundled extensions are great examples of how extensions work.
-
-Globals
-~~~~~~~
-
-Global variables can be registered in an extension via the ``getGlobals()``
-method::
-
-    class Project_Twig_Extension extends Twig_Extension
-    {
-        public function getGlobals()
-        {
-            return array(
-                'text' => new Text(),
-            );
-        }
-
-        // ...
-    }
-
-Functions
-~~~~~~~~~
-
-Functions can be registered in an extension via the ``getFunctions()``
-method::
-
-    class Project_Twig_Extension extends Twig_Extension
-    {
-        public function getFunctions()
-        {
-            return array(
-                'lipsum' => new Twig_Function_Function('generate_lipsum'),
-            );
-        }
-
-        // ...
-    }
-
-Filters
-~~~~~~~
-
-To add a filter to an extension, you need to override the ``getFilters()``
-method. This method must return an array of filters to add to the Twig
-environment::
-
-    class Project_Twig_Extension extends Twig_Extension
-    {
-        public function getFilters()
-        {
-            return array(
-                'rot13' => new Twig_Filter_Function('str_rot13'),
-            );
-        }
-
-        // ...
-    }
-
-As you can see in the above code, the ``getFilters()`` method returns an array
-where keys are the name of the filters (``rot13``) and the values the
-definition of the filter (``new Twig_Filter_Function('str_rot13')``).
-
-As seen in the previous chapter, you can also define filters as static methods
-on the extension class::
-
-$twig->addFilter('rot13', new Twig_Filter_Function('Project_Twig_Extension::rot13Filter'));
-
-You can also use ``Twig_Filter_Method`` instead of ``Twig_Filter_Function``
-when defining a filter to use a method::
-
-    class Project_Twig_Extension extends Twig_Extension
-    {
-        public function getFilters()
-        {
-            return array(
-                'rot13' => new Twig_Filter_Method($this, 'rot13Filter'),
-            );
-        }
-
-        public function rot13Filter($string)
-        {
-            return str_rot13($string);
-        }
-
-        // ...
-    }
-
-The first argument of the ``Twig_Filter_Method`` constructor is always
-``$this``, the current extension object. The second one is the name of the
-method to call.
-
-Using methods for filters is a great way to package your filter without
-polluting the global namespace. This also gives the developer more flexibility
-at the cost of a small overhead.
-
-Overriding default Filters
-..........................
-
-If some default core filters do not suit your needs, you can easily override
-them by creating your own extension. Just use the same names as the one you
-want to override::
-
-    class MyCoreExtension extends Twig_Extension
-    {
-        public function getFilters()
-        {
-            return array(
-                'date' => new Twig_Filter_Method($this, 'dateFilter'),
-                // ...
-            );
-        }
-
-        public function dateFilter($timestamp, $format = 'F j, Y H:i')
-        {
-            return '...'.twig_date_format_filter($timestamp, $format);
-        }
-
-        public function getName()
-        {
-            return 'project';
-        }
-    }
-
-Here, we override the ``date`` filter with a custom one. Using this extension
-is as simple as registering the ``MyCoreExtension`` extension by calling the
-``addExtension()`` method on the environment instance::
-
-    $twig = new Twig_Environment($loader);
-    $twig->addExtension(new MyCoreExtension());
-
-Tags
-~~~~
-
-Adding a tag in an extension can be done by overriding the
-``getTokenParsers()`` method. This method must return an array of tags to add
-to the Twig environment::
-
-    class Project_Twig_Extension extends Twig_Extension
-    {
-        public function getTokenParsers()
-        {
-            return array(new Project_Set_TokenParser());
-        }
-
-        // ...
-    }
-
-In the above code, we have added a single new tag, defined by the
-``Project_Set_TokenParser`` class. The ``Project_Set_TokenParser`` class is
-responsible for parsing the tag and compiling it to PHP.
-
-Operators
-~~~~~~~~~
-
-The ``getOperators()`` methods allows to add new operators. Here is how to add
-``!``, ``||``, and ``&&`` operators::
-
-    class Project_Twig_Extension extends Twig_Extension
-    {
-        public function getOperators()
-        {
-            return array(
-                array(
-                    '!' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
-                ),
-                array(
-                    '||' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                    '&&' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                ),
-            );
-        }
-
-        // ...
-    }
-
-Tests
-~~~~~
-
-The ``getTests()`` methods allows to add new test functions::
-
-    class Project_Twig_Extension extends Twig_Extension
-    {
-        public function getTests()
-        {
-            return array(
-                'even' => new Twig_Test_Function('twig_test_even'),
-            );
-        }
-
-        // ...
-    }
-
-Testing an Extension
---------------------
-
-.. versionadded:: 1.10
-    Support for functional tests was added in Twig 1.10.
-
-Functional Tests
-~~~~~~~~~~~~~~~~
-
-You can create functional tests for extensions simply by creating the
-following file structure in your test directory::
-
-    Fixtures/
-        filters/
-            foo.test
-            bar.test
-        functions/
-            foo.test
-            bar.test
-        tags/
-            foo.test
-            bar.test
-    IntegrationTest.php
-
-The ``IntegrationTest.php`` file should look like this::
-
-    class Project_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase
-    {
-        public function getExtensions()
-        {
-            return array(
-                new Project_Twig_Extension1(),
-                new Project_Twig_Extension2(),
-            );
-        }
-
-        public function getFixturesDir()
-        {
-            return dirname(__FILE__).'/Fixtures/';
-        }
-    }
-
-Fixtures examples can be found within the Twig repository
-`tests/Twig/Fixtures`_ directory.
-
-Node Tests
-~~~~~~~~~~
-
-Testing the node visitors can be complex, so extend your test cases from
-``Twig_Test_NodeTestCase``. Examples can be found in the Twig repository
-`tests/Twig/Node`_ directory.
-
-.. _`spl_autoload_register()`: http://www.php.net/spl_autoload_register
-.. _`rot13`:                   http://www.php.net/manual/en/function.str-rot13.php
-.. _`tests/Twig/Fixtures`:     https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Fixtures
-.. _`tests/Twig/Node`:         https://github.com/twigphp/Twig/tree/master/test/Twig/Tests/Node
diff --git a/vendor/twig/twig/doc/api.rst b/vendor/twig/twig/doc/api.rst
index 8be2b8af..5c0294c2 100644
--- a/vendor/twig/twig/doc/api.rst
+++ b/vendor/twig/twig/doc/api.rst
@@ -9,28 +9,25 @@ Basics
 ------
 
 Twig uses a central object called the **environment** (of class
-``Twig_Environment``). Instances of this class are used to store the
-configuration and extensions, and are used to load templates from the file
-system or other locations.
+``\Twig\Environment``). Instances of this class are used to store the
+configuration and extensions, and are used to load templates.
 
-Most applications will create one ``Twig_Environment`` object on application
-initialization and use that to load templates. In some cases it's however
-useful to have multiple environments side by side, if different configurations
-are in use.
+Most applications create one ``\Twig\Environment`` object on application
+initialization and use that to load templates. In some cases, it might be useful
+to have multiple environments side by side, with different configurations.
 
-The simplest way to configure Twig to load templates for your application
-looks roughly like this::
+The typical way to configure Twig to load templates for an application looks
+roughly like this::
 
-    require_once '/path/to/lib/Twig/Autoloader.php';
-    Twig_Autoloader::register();
+    require_once '/path/to/vendor/autoload.php';
 
-    $loader = new Twig_Loader_Filesystem('/path/to/templates');
-    $twig = new Twig_Environment($loader, array(
+    $loader = new \Twig\Loader\FilesystemLoader('/path/to/templates');
+    $twig = new \Twig\Environment($loader, [
         'cache' => '/path/to/compilation_cache',
-    ));
+    ]);
 
-This will create a template environment with the default settings and a loader
-that looks up the templates in the ``/path/to/templates/`` folder. Different
+This creates a template environment with a default configuration and a loader
+that looks up templates in the ``/path/to/templates/`` directory. Different
 loaders are available and you can also write your own if you want to load
 templates from a database or other resources.
 
@@ -47,44 +44,36 @@ Rendering Templates
 -------------------
 
 To load a template from a Twig environment, call the ``load()`` method which
-returns a ``Twig_TemplateWrapper`` instance::
+returns a ``\Twig\TemplateWrapper`` instance::
 
     $template = $twig->load('index.html');
 
-.. note::
-
-    Before Twig 1.28, you should use ``loadTemplate()`` instead which returns a
-    ``Twig_Template`` instance.
-
 To render the template with some variables, call the ``render()`` method::
 
-    echo $template->render(array('the' => 'variables', 'go' => 'here'));
+    echo $template->render(['the' => 'variables', 'go' => 'here']);
 
 .. note::
 
-    The ``display()`` method is a shortcut to output the template directly.
+    The ``display()`` method is a shortcut to output the rendered template.
 
 You can also load and render the template in one fell swoop::
 
-    echo $twig->render('index.html', array('the' => 'variables', 'go' => 'here'));
-
-.. versionadded:: 1.28
-    The possibility to render blocks from the API was added in Twig 1.28.
+    echo $twig->render('index.html', ['the' => 'variables', 'go' => 'here']);
 
 If a template defines blocks, they can be rendered individually via the
 ``renderBlock()`` call::
 
-    echo $template->renderBlock('block_name', array('the' => 'variables', 'go' => 'here'));
+    echo $template->renderBlock('block_name', ['the' => 'variables', 'go' => 'here']);
 
 .. _environment_options:
 
 Environment Options
 -------------------
 
-When creating a new ``Twig_Environment`` instance, you can pass an array of
+When creating a new ``\Twig\Environment`` instance, you can pass an array of
 options as the constructor second argument::
 
-    $twig = new Twig_Environment($loader, array('debug' => true));
+    $twig = new \Twig\Environment($loader, ['debug' => true]);
 
 The following options are available:
 
@@ -98,7 +87,7 @@ The following options are available:
 
   The charset used by the templates.
 
-* ``base_template_class`` *string* (defaults to ``Twig_Template``)
+* ``base_template_class`` *string* (defaults to ``\Twig\Template``)
 
   The base template class to use for generated
   templates.
@@ -122,23 +111,16 @@ The following options are available:
   replace them with a ``null`` value. When set to ``true``, Twig throws an
   exception instead (default to ``false``).
 
-* ``autoescape`` *string* or *boolean*
-
-  If set to ``true``, HTML auto-escaping will be enabled by
-  default for all templates (default to ``true``).
+* ``autoescape`` *string*
 
-  As of Twig 1.8, you can set the escaping strategy to use (``html``, ``js``,
-  ``false`` to disable).
-
-  As of Twig 1.9, you can set the escaping strategy to use (``css``, ``url``,
-  ``html_attr``, or a PHP callback that takes the template name and must
-  return the escaping strategy to use -- the callback cannot be a function name
-  to avoid collision with built-in escaping strategies).
-
-  As of Twig 1.17, the ``filename`` escaping strategy (renamed to ``name`` as
-  of Twig 1.27) determines the escaping strategy to use for a template based on
-  the template filename extension (this strategy does not incur any overhead at
-  runtime as auto-escaping is done at compilation time.)
+  Sets the default auto-escaping strategy (``name``, ``html``, ``js``, ``css``,
+  ``url``, ``html_attr``, or a PHP callback that takes the template "filename"
+  and returns the escaping strategy to use -- the callback cannot be a function
+  name to avoid collision with built-in escaping strategies); set it to
+  ``false`` to disable auto-escaping. The ``name`` escaping strategy determines
+  the escaping strategy to use for a template based on the template filename
+  extension (this strategy does not incur any overhead at runtime as
+  auto-escaping is done at compilation time.)
 
 * ``optimizations`` *integer*
 
@@ -157,33 +139,27 @@ Compilation Cache
 
 All template loaders can cache the compiled templates on the filesystem for
 future reuse. It speeds up Twig a lot as templates are only compiled once; and
-the performance boost is even larger if you use a PHP accelerator such as APC.
-See the ``cache`` and ``auto_reload`` options of ``Twig_Environment`` above
-for more information.
+the performance boost is even larger if you use a PHP accelerator such as
+OPCache. See the ``cache`` and ``auto_reload`` options of ``\Twig\Environment``
+above for more information.
 
 Built-in Loaders
 ~~~~~~~~~~~~~~~~
 
-Here is a list of the built-in loaders Twig provides:
-
-``Twig_Loader_Filesystem``
-..........................
-
-.. versionadded:: 1.10
-    The ``prependPath()`` and support for namespaces were added in Twig 1.10.
+Here is a list of the built-in loaders:
 
-.. versionadded:: 1.27
-    Relative paths support was added in Twig 1.27.
+``\Twig\Loader\FilesystemLoader``
+.................................
 
-``Twig_Loader_Filesystem`` loads templates from the file system. This loader
+``\Twig\Loader\FilesystemLoader`` loads templates from the file system. This loader
 can find templates in folders on the file system and is the preferred way to
 load them::
 
-    $loader = new Twig_Loader_Filesystem($templateDir);
+    $loader = new \Twig\Loader\FilesystemLoader($templateDir);
 
 It can also look for templates in an array of directories::
 
-    $loader = new Twig_Loader_Filesystem(array($templateDir1, $templateDir2));
+    $loader = new \Twig\Loader\FilesystemLoader([$templateDir1, $templateDir2]);
 
 With such a configuration, Twig will first look for templates in
 ``$templateDir1`` and if they do not exist, it will fallback to look for them
@@ -207,68 +183,65 @@ methods act on the "main" namespace)::
 Namespaced templates can be accessed via the special
 ``@namespace_name/template_path`` notation::
 
-    $twig->render('@admin/index.html', array());
+    $twig->render('@admin/index.html', []);
 
-``Twig_Loader_Filesystem`` support absolute and relative paths. Using relative
+``\Twig\Loader\FilesystemLoader`` support absolute and relative paths. Using relative
 paths is preferred as it makes the cache keys independent of the project root
 directory (for instance, it allows warming the cache from a build server where
 the directory might be different from the one used on production servers)::
 
-    $loader = new Twig_Loader_Filesystem('templates', getcwd().'/..');
+    $loader = new \Twig\Loader\FilesystemLoader('templates', getcwd().'/..');
 
 .. note::
 
     When not passing the root path as a second argument, Twig uses ``getcwd()``
     for relative paths.
 
-``Twig_Loader_Array``
-.....................
+``\Twig\Loader\ArrayLoader``
+............................
 
-``Twig_Loader_Array`` loads a template from a PHP array. It's passed an array
-of strings bound to template names::
+``\Twig\Loader\ArrayLoader`` loads a template from a PHP array. It is passed an
+array of strings bound to template names::
 
-    $loader = new Twig_Loader_Array(array(
+    $loader = new \Twig\Loader\ArrayLoader([
         'index.html' => 'Hello {{ name }}!',
-    ));
-    $twig = new Twig_Environment($loader);
+    ]);
+    $twig = new \Twig\Environment($loader);
 
-    echo $twig->render('index.html', array('name' => 'Fabien'));
+    echo $twig->render('index.html', ['name' => 'Fabien']);
 
 This loader is very useful for unit testing. It can also be used for small
 projects where storing all templates in a single PHP file might make sense.
 
 .. tip::
 
-    When using the ``Array`` or ``String`` loaders with a cache mechanism, you
-    should know that a new cache key is generated each time a template content
-    "changes" (the cache key being the source code of the template). If you
-    don't want to see your cache grows out of control, you need to take care
-    of clearing the old cache file by yourself.
+    When using the ``Array`` loader with a cache mechanism, you should know that
+    a new cache key is generated each time a template content "changes" (the
+    cache key being the source code of the template). If you don't want to see
+    your cache grows out of control, you need to take care of clearing the old
+    cache file by yourself.
 
-``Twig_Loader_Chain``
-.....................
+``\Twig\Loader\ChainLoader``
+............................
 
-``Twig_Loader_Chain`` delegates the loading of templates to other loaders::
+``\Twig\Loader\ChainLoader`` delegates the loading of templates to other loaders::
 
-    $loader1 = new Twig_Loader_Array(array(
+    $loader1 = new \Twig\Loader\ArrayLoader([
         'base.html' => '{% block content %}{% endblock %}',
-    ));
-    $loader2 = new Twig_Loader_Array(array(
+    ]);
+    $loader2 = new \Twig\Loader\ArrayLoader([
         'index.html' => '{% extends "base.html" %}{% block content %}Hello {{ name }}{% endblock %}',
         'base.html'  => 'Will never be loaded',
-    ));
+    ]);
 
-    $loader = new Twig_Loader_Chain(array($loader1, $loader2));
+    $loader = new \Twig\Loader\ChainLoader([$loader1, $loader2]);
 
-    $twig = new Twig_Environment($loader);
+    $twig = new \Twig\Environment($loader);
 
-When looking for a template, Twig will try each loader in turn and it will
-return as soon as the template is found. When rendering the ``index.html``
-template from the above example, Twig will load it with ``$loader2`` but the
-``base.html`` template will be loaded from ``$loader1``.
-
-``Twig_Loader_Chain`` accepts any loader that implements
-``Twig_LoaderInterface``.
+When looking for a template, Twig tries each loader in turn and returns as soon
+as the template is found. When rendering the ``index.html`` template from the
+above example, Twig will load it with ``$loader2`` but the ``base.html``
+template will be loaded from ``$loader1``.
 
 .. note::
 
@@ -277,77 +250,89 @@ template from the above example, Twig will load it with ``$loader2`` but the
 Create your own Loader
 ~~~~~~~~~~~~~~~~~~~~~~
 
-All loaders implement the ``Twig_LoaderInterface``::
+All loaders implement the ``\Twig\Loader\LoaderInterface``::
 
-    interface Twig_LoaderInterface
+    interface \Twig\Loader\LoaderInterface
     {
         /**
-         * Gets the source code of a template, given its name.
+         * Returns the source context for a given template logical name.
          *
-         * @param  string $name string The name of the template to load
+         * @param string $name The template logical name
          *
-         * @return string The template source code
+         * @return \Twig\Source
          *
-         * @deprecated since 1.27 (to be removed in 2.0), implement Twig_SourceContextLoaderInterface
+         * @throws \Twig\Error\LoaderError When $name is not found
          */
-        function getSource($name);
+        public function getSourceContext($name);
 
         /**
          * Gets the cache key to use for the cache for a given template name.
          *
-         * @param  string $name string The name of the template to load
+         * @param string $name The name of the template to load
          *
          * @return string The cache key
+         *
+         * @throws \Twig\Error\LoaderError When $name is not found
          */
-        function getCacheKey($name);
+        public function getCacheKey($name);
 
         /**
          * Returns true if the template is still fresh.
          *
          * @param string    $name The template name
          * @param timestamp $time The last modification time of the cached template
+         *
+         * @return bool    true if the template is fresh, false otherwise
+         *
+         * @throws \Twig\Error\LoaderError When $name is not found
+         */
+        public function isFresh($name, $time);
+
+        /**
+         * Check if we have the source code of a template, given its name.
+         *
+         * @param string $name The name of the template to check if we can load
+         *
+         * @return bool    If the template source code is handled by this loader or not
          */
-        function isFresh($name, $time);
+        public function exists($name);
     }
 
 The ``isFresh()`` method must return ``true`` if the current cached template
 is still fresh, given the last modification time, or ``false`` otherwise.
 
-.. note::
-
-    As of Twig 1.27, you should also implement
-    ``Twig_SourceContextLoaderInterface`` to avoid deprecation notices.
-
-.. tip::
-
-    As of Twig 1.11.0, you can also implement ``Twig_ExistsLoaderInterface``
-    to make your loader faster when used with the chain loader.
+The ``getSourceContext()`` method must return an instance of ``\Twig\Source``.
 
 Using Extensions
 ----------------
 
-Twig extensions are packages that add new features to Twig. Using an
-extension is as simple as using the ``addExtension()`` method::
+Twig extensions are packages that add new features to Twig. Register an
+extension via the ``addExtension()`` method::
 
-    $twig->addExtension(new Twig_Extension_Sandbox());
+    $twig->addExtension(new \Twig\Extension\SandboxExtension());
 
 Twig comes bundled with the following extensions:
 
-* *Twig_Extension_Core*: Defines all the core features of Twig.
+* *Twig\Extension\CoreExtension*: Defines all the core features of Twig.
 
-* *Twig_Extension_Escaper*: Adds automatic output-escaping and the possibility
-  to escape/unescape blocks of code.
+* *Twig\Extension\DebugExtension*: Defines the ``dump`` function to help debug
+  template variables.
 
-* *Twig_Extension_Sandbox*: Adds a sandbox mode to the default Twig
+* *Twig\Extension\EscaperExtension*: Adds automatic output-escaping and the
+  possibility to escape/unescape blocks of code.
+
+* *Twig\Extension\SandboxExtension*: Adds a sandbox mode to the default Twig
   environment, making it safe to evaluate untrusted code.
 
-* *Twig_Extension_Profiler*: Enabled the built-in Twig profiler (as of Twig
-  1.18).
+* *Twig\Extension\ProfilerExtension*: Enabled the built-in Twig profiler.
+
+* *Twig\Extension\OptimizerExtension*: Optimizes the node tree before
+  compilation.
 
-* *Twig_Extension_Optimizer*: Optimizes the node tree before compilation.
+* *Twig\Extension\StringLoaderExtension*: Defined the ``template_from_string``
+   function to allow loading templates from string in a template.
 
-The core, escaper, and optimizer extensions do not need to be added to the
-Twig environment, as they are registered by default.
+The Core, Escaper, and Optimizer extensions are registered by default.
 
 Built-in Extensions
 -------------------
@@ -378,21 +363,19 @@ tag, ``autoescape``, and a filter, ``raw``.
 When creating the escaper extension, you can switch on or off the global
 output escaping strategy::
 
-    $escaper = new Twig_Extension_Escaper('html');
+    $escaper = new \Twig\Extension\EscaperExtension('html');
     $twig->addExtension($escaper);
 
 If set to ``html``, all variables in templates are escaped (using the ``html``
 escaping strategy), except those using the ``raw`` filter:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ article.to_html|raw }}
 
-You can also change the escaping mode locally by using the ``autoescape`` tag
-(see the :doc:`autoescape<tags/autoescape>` doc for the syntax used before
-Twig 1.8):
+You can also change the escaping mode locally by using the ``autoescape`` tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% autoescape 'html' %}
         {{ var }}
@@ -409,7 +392,7 @@ The escaping rules are implemented as follows:
 * Literals (integers, booleans, arrays, ...) used in the template directly as
   variables or filter arguments are never automatically escaped:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
         {{ "Twig<br />" }} {# won't be escaped #}
 
@@ -419,7 +402,7 @@ The escaping rules are implemented as follows:
 * Expressions which the result is always a literal or a variable marked safe
   are never automatically escaped:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
         {{ foo ? "Twig<br />" : "<br />Twig" }} {# won't be escaped #}
 
@@ -432,15 +415,33 @@ The escaping rules are implemented as follows:
         {% set text = "Twig<br />" %}
         {{ foo ? text|escape : "<br />Twig" }} {# the result of the expression won't be escaped #}
 
+* Objects with a ``__toString`` method are converted to strings and
+  escaped. You can mark some classes and/or interfaces as being safe for some
+  strategies via ``EscaperExtension::addSafeClass()``:
+
+  .. code-block:: twig
+
+        // mark object of class Foo as safe for the HTML strategy
+        $escaper->addSafeClass('Foo', ['html']);
+
+        // mark object of interface Foo as safe for the HTML strategy
+        $escaper->addSafeClass('FooInterface', ['html']);
+
+        // mark object of class Foo as safe for the HTML and JS strategies
+        $escaper->addSafeClass('Foo', ['html', 'js']);
+
+        // mark object of class Foo as safe for all strategies
+        $escaper->addSafeClass('Foo', ['all']);
+
 * Escaping is applied before printing, after any other filter is applied:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
         {{ var|upper }} {# is equivalent to {{ var|upper|escape }} #}
 
 * The `raw` filter should only be used at the end of the filter chain:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
         {{ var|raw|upper }} {# will be escaped #}
 
@@ -451,7 +452,7 @@ The escaping rules are implemented as follows:
   ``escape('html')`` are marked safe for HTML, ``escape('js')`` is marked
   safe for JavaScript, ``raw`` is marked safe for everything.
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
         {% autoescape 'js' %}
             {{ var|escape('html') }} {# will be escaped for HTML and JavaScript #}
@@ -473,35 +474,35 @@ Sandbox Extension
 The ``sandbox`` extension can be used to evaluate untrusted code. Access to
 unsafe attributes and methods is prohibited. The sandbox security is managed
 by a policy instance. By default, Twig comes with one policy class:
-``Twig_Sandbox_SecurityPolicy``. This class allows you to white-list some
+``\Twig\Sandbox\SecurityPolicy``. This class allows you to white-list some
 tags, filters, properties, and methods::
 
-    $tags = array('if');
-    $filters = array('upper');
-    $methods = array(
-        'Article' => array('getTitle', 'getBody'),
-    );
-    $properties = array(
-        'Article' => array('title', 'body'),
-    );
-    $functions = array('range');
-    $policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
+    $tags = ['if'];
+    $filters = ['upper'];
+    $methods = [
+        'Article' => ['getTitle', 'getBody'],
+    ];
+    $properties = [
+        'Article' => ['title', 'body'],
+    ];
+    $functions = ['range'];
+    $policy = new \Twig\Sandbox\SecurityPolicy($tags, $filters, $methods, $properties, $functions);
 
 With the previous configuration, the security policy will only allow usage of
 the ``if`` tag, and the ``upper`` filter. Moreover, the templates will only be
 able to call the ``getTitle()`` and ``getBody()`` methods on ``Article``
 objects, and the ``title`` and ``body`` public properties. Everything else
-won't be allowed and will generate a ``Twig_Sandbox_SecurityError`` exception.
+won't be allowed and will generate a ``\Twig\Sandbox\SecurityError`` exception.
 
 The policy object is the first argument of the sandbox constructor::
 
-    $sandbox = new Twig_Extension_Sandbox($policy);
+    $sandbox = new \Twig\Extension\SandboxExtension($policy);
     $twig->addExtension($sandbox);
 
 By default, the sandbox mode is disabled and should be enabled when including
 untrusted template code by using the ``sandbox`` tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% sandbox %}
         {% include 'user.html' %}
@@ -510,21 +511,18 @@ untrusted template code by using the ``sandbox`` tag:
 You can sandbox all templates by passing ``true`` as the second argument of
 the extension constructor::
 
-    $sandbox = new Twig_Extension_Sandbox($policy, true);
+    $sandbox = new \Twig\Extension\SandboxExtension($policy, true);
 
 Profiler Extension
 ~~~~~~~~~~~~~~~~~~
 
-.. versionadded:: 1.18
-    The Profile extension was added in Twig 1.18.
-
 The ``profiler`` extension enables a profiler for Twig templates; it should
 only be used on your development machines as it adds some overhead::
 
-    $profile = new Twig_Profiler_Profile();
-    $twig->addExtension(new Twig_Extension_Profiler($profile));
+    $profile = new \Twig\Profiler\Profile();
+    $twig->addExtension(new \Twig\Extension\ProfilerExtension($profile));
 
-    $dumper = new Twig_Profiler_Dumper_Text();
+    $dumper = new \Twig\Profiler\Dumper\TextDumper();
     echo $dumper->dump($profile);
 
 A profile contains information about time and memory consumption for template,
@@ -533,11 +531,12 @@ block, and macro executions.
 You can also dump the data in a `Blackfire.io <https://blackfire.io/>`_
 compatible format::
 
-    $dumper = new Twig_Profiler_Dumper_Blackfire();
+    $dumper = new \Twig\Profiler\Dumper\BlackfireDumper();
     file_put_contents('/path/to/profile.prof', $dumper->dump($profile));
 
 Upload the profile to visualize it (create a `free account
-<https://blackfire.io/signup>`_ first):
+<https://blackfire.io/signup?utm_source=twig&utm_medium=doc&utm_campaign=profiler>`_
+first):
 
 .. code-block:: sh
 
@@ -548,27 +547,31 @@ Optimizer Extension
 
 The ``optimizer`` extension optimizes the node tree before compilation::
 
-    $twig->addExtension(new Twig_Extension_Optimizer());
+    $twig->addExtension(new \Twig\Extension\OptimizerExtension());
 
 By default, all optimizations are turned on. You can select the ones you want
 to enable by passing them to the constructor::
 
-    $optimizer = new Twig_Extension_Optimizer(Twig_NodeVisitor_Optimizer::OPTIMIZE_FOR);
+    $optimizer = new \Twig\Extension\OptimizerExtension(\Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_FOR);
 
     $twig->addExtension($optimizer);
 
 Twig supports the following optimizations:
 
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_ALL``, enables all optimizations
+* ``\Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_ALL``, enables all optimizations
   (this is the default value).
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_NONE``, disables all optimizations.
+
+* ``\Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_NONE``, disables all optimizations.
   This reduces the compilation time, but it can increase the execution time
   and the consumed memory.
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_FOR``, optimizes the ``for`` tag by
+
+* ``\Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_FOR``, optimizes the ``for`` tag by
   removing the ``loop`` variable creation whenever possible.
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_RAW_FILTER``, removes the ``raw``
+
+* ``\Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_RAW_FILTER``, removes the ``raw``
   filter whenever possible.
-* ``Twig_NodeVisitor_Optimizer::OPTIMIZE_VAR_ACCESS``, simplifies the creation
+
+* ``\Twig\NodeVisitor\OptimizerNodeVisitor::OPTIMIZE_VAR_ACCESS``, simplifies the creation
   and access of variables in the compiled templates whenever possible.
 
 Exceptions
@@ -576,15 +579,15 @@ Exceptions
 
 Twig can throw exceptions:
 
-* ``Twig_Error``: The base exception for all errors.
+* ``\Twig\Error\Error``: The base exception for all errors.
 
-* ``Twig_Error_Syntax``: Thrown to tell the user that there is a problem with
+* ``\Twig\Error\SyntaxError``: Thrown to tell the user that there is a problem with
   the template syntax.
 
-* ``Twig_Error_Runtime``: Thrown when an error occurs at runtime (when a filter
+* ``\Twig\Error\RuntimeError``: Thrown when an error occurs at runtime (when a filter
   does not exist for instance).
 
-* ``Twig_Error_Loader``: Thrown when an error occurs during template loading.
+* ``\Twig\Error\LoaderError``: Thrown when an error occurs during template loading.
 
-* ``Twig_Sandbox_SecurityError``: Thrown when an unallowed tag, filter, or
+* ``\Twig\Sandbox\SecurityError``: Thrown when an unallowed tag, filter, or
   method is called in a sandboxed template.
diff --git a/vendor/twig/twig/doc/coding_standards.rst b/vendor/twig/twig/doc/coding_standards.rst
index bf8ea91a..721b0f13 100644
--- a/vendor/twig/twig/doc/coding_standards.rst
+++ b/vendor/twig/twig/doc/coding_standards.rst
@@ -7,7 +7,7 @@ standards:
 * Put one (and only one) space after the start of a delimiter (``{{``, ``{%``,
   and ``{#``) and before the end of a delimiter (``}}``, ``%}``, and ``#}``):
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
     {{ foo }}
     {# comment #}
@@ -16,7 +16,7 @@ standards:
   When using the whitespace control character, do not put any spaces between
   it and the delimiter:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
     {{- foo -}}
     {#- comment -#}
@@ -28,7 +28,7 @@ standards:
   operators (``not``, ``and``, ``or``), ``~``, ``is``, ``in``, and the ternary
   operator (``?:``):
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
      {{ 1 + 2 }}
      {{ foo ~ bar }}
@@ -37,7 +37,7 @@ standards:
 * Put one (and only one) space after the ``:`` sign in hashes and ``,`` in
   arrays and hashes:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
      {{ [1, 2, 3] }}
      {{ {'foo': 'bar'} }}
@@ -45,13 +45,13 @@ standards:
 * Do not put any spaces after an opening parenthesis and before a closing
   parenthesis in expressions:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
     {{ 1 + (2 * 3) }}
 
 * Do not put any spaces before and after string delimiters:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
     {{ 'foo' }}
     {{ "foo" }}
@@ -59,7 +59,7 @@ standards:
 * Do not put any spaces before and after the following operators: ``|``,
   ``.``, ``..``, ``[]``:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
     {{ foo|upper|lower }}
     {{ user.name }}
@@ -69,7 +69,7 @@ standards:
 * Do not put any spaces before and after the parenthesis used for filter and
   function calls:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
      {{ foo|default('foo') }}
      {{ range(1..10) }}
@@ -77,14 +77,14 @@ standards:
 * Do not put any spaces before and after the opening and the closing of arrays
   and hashes:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
      {{ [1, 2, 3] }}
      {{ {'foo': 'bar'} }}
 
 * Use lower cased and underscored variable names:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
      {% set foo = 'foo' %}
      {% set foo_bar = 'foo' %}
@@ -92,7 +92,7 @@ standards:
 * Indent your code inside tags (use the same indentation as the one used for
   the target language of the rendered template):
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
      {% block foo %}
          {% if true %}
diff --git a/vendor/twig/twig/doc/deprecated.rst b/vendor/twig/twig/doc/deprecated.rst
index 8b25cc41..d7a6145e 100644
--- a/vendor/twig/twig/doc/deprecated.rst
+++ b/vendor/twig/twig/doc/deprecated.rst
@@ -1,224 +1,115 @@
 Deprecated Features
 ===================
 
-This document lists all deprecated features in Twig. Deprecated features are
+This document lists deprecated features in Twig 2.x. Deprecated features are
 kept for backward compatibility and removed in the next major release (a
-feature that was deprecated in Twig 1.x is removed in Twig 2.0).
+feature that was deprecated in Twig 2.x is removed in Twig 3.0).
 
-Deprecation Notices
--------------------
-
-As of Twig 1.21, Twig generates deprecation notices when a template uses
-deprecated features. See :ref:`deprecation-notices` for more information.
-
-Macros
-------
-
-As of Twig 2.0, macros imported in a file are not available in child templates
-anymore (via an ``include`` call for instance). You need to import macros
-explicitly in each file where you are using them.
-
-Token Parsers
--------------
-
-* As of Twig 1.x, the token parser broker sub-system is deprecated. The
-  following class and interface will be removed in 2.0:
-
-  * ``Twig_TokenParserBrokerInterface``
-  * ``Twig_TokenParserBroker``
-
-* As of Twig 1.27, ``Twig_Parser::getFilename()`` is deprecated. From a token
-  parser, use ``$this->parser->getStream()->getSourceContext()->getPath()`` instead.
-
-* As of Twig 1.27, ``Twig_Parser::getEnvironment()`` is deprecated.
+PSR-0
+-----
 
-Extensions
-----------
+* PSR-0 classes are deprecated in favor of namespaced ones since Twig 2.7.
 
-* As of Twig 1.x, the ability to remove an extension is deprecated and the
-  ``Twig_Environment::removeExtension()`` method will be removed in 2.0.
+Inheritance
+-----------
 
-* As of Twig 1.23, the ``Twig_ExtensionInterface::initRuntime()`` method is
-  deprecated. You have two options to avoid the deprecation notice: if you
-  implement this method to store the environment for your custom filters,
-  functions, or tests, use the ``needs_environment`` option instead; if you
-  have more complex needs, explicitly implement
-  ``Twig_Extension_InitRuntimeInterface`` (not recommended).
+* Defining a "block" definition in a non-capturing block in a child template is
+  deprecated since Twig 2.5.0. In Twig 3.0, it will throw a
+  ``Twig\Error\SyntaxError`` exception. It does not work anyway, so most
+  projects won't need to do anything to upgrade.
 
-* As of Twig 1.23, the ``Twig_ExtensionInterface::getGlobals()`` method is
-  deprecated. Implement ``Twig_Extension_GlobalsInterface`` to avoid
-  deprecation notices.
+Errors
+------
 
-* As of Twig 1.26, the ``Twig_ExtensionInterface::getName()`` method is
-  deprecated and it is not used internally anymore.
+ * Passing a string as the ``$source`` argument on ``\Twig\Error\Error`` /
+   ``Twig\Error\Error`` constructor is deprecated since Twig 2.6.1. Pass an
+   instance of ``Twig\Source`` instead.
 
-PEAR
+Tags
 ----
 
-PEAR support has been discontinued in Twig 1.15.1, and no PEAR packages are
-provided anymore. Use Composer instead.
-
-Filters
--------
-
-* As of Twig 1.x, use ``Twig_SimpleFilter`` to add a filter. The following
-  classes and interfaces will be removed in 2.0:
+* The ``spaceless`` tag is deprecated in Twig 2.7. Use the ``spaceless`` filter
+  instead or ``{% apply spaceless %}`` (the ``Twig\Node\SpacelessNode`` and
+  ``Twig\TokenParser\SpacelessTokenParser`` classes are also deprecated).
 
-  * ``Twig_FilterInterface``
-  * ``Twig_FilterCallableInterface``
-  * ``Twig_Filter``
-  * ``Twig_Filter_Function``
-  * ``Twig_Filter_Method``
-  * ``Twig_Filter_Node``
+* Using the ``spaceless`` tag at the root level of a child template is
+  deprecated in Twig 2.5.0. This does not work as one would expect it to work
+  anyway. In Twig 3.0, it will throw a ``Twig\Error\SyntaxError`` exception.
 
-* As of Twig 2.x, the ``Twig_SimpleFilter`` class is deprecated and will be
-  removed in Twig 3.x (use ``Twig_Filter`` instead). In Twig 2.x,
-  ``Twig_SimpleFilter`` is just an alias for ``Twig_Filter``.
+* The ``filter`` tag is deprecated in Twig 2.9. Use the ``apply`` tag instead
+  (the ``Twig\TokenParser\FilterTokenParser`` classes is also deprecated).
 
-Functions
----------
-
-* As of Twig 1.x, use ``Twig_SimpleFunction`` to add a function. The following
-  classes and interfaces will be removed in 2.0:
-
-  * ``Twig_FunctionInterface``
-  * ``Twig_FunctionCallableInterface``
-  * ``Twig_Function``
-  * ``Twig_Function_Function``
-  * ``Twig_Function_Method``
-  * ``Twig_Function_Node``
-
-* As of Twig 2.x, the ``Twig_SimpleFunction`` class is deprecated and will be
-  removed in Twig 3.x (use ``Twig_Function`` instead). In Twig 2.x,
-  ``Twig_SimpleFunction`` is just an alias for ``Twig_Function``.
-
-Tests
------
+* Adding an ``if`` condition on a ``for`` tag is deprecated in Twig 2.10. Use a
+  ``filter`` filter or an "if" condition inside the "for" body instead (if your condition
+  depends on a variable updated inside the loop)
 
-* As of Twig 1.x, use ``Twig_SimpleTest`` to add a test. The following classes
-  and interfaces will be removed in 2.0:
+Final Classes
+-------------
 
-  * ``Twig_TestInterface``
-  * ``Twig_TestCallableInterface``
-  * ``Twig_Test``
-  * ``Twig_Test_Function``
-  * ``Twig_Test_Method``
-  * ``Twig_Test_Node``
+The following classes are marked as ``@final`` in Twig 2 and will be final in
+3.0:
 
-* As of Twig 2.x, the ``Twig_SimpleTest`` class is deprecated and will be
-  removed in Twig 3.x (use ``Twig_Test`` instead). In Twig 2.x,
-  ``Twig_SimpleTest`` is just an alias for ``Twig_Test``.
+* ``Twig\Node\ModuleNode``
+* ``Twig\TwigFilter``
+* ``Twig\TwigFunction``
+* ``Twig\TwigTest``
+* ``Twig\Profiler\Profile``
 
-* The ``sameas`` and ``divisibleby`` tests are deprecated in favor of ``same
-  as`` and ``divisible by`` respectively.
+Parser
+------
 
-Tags
-----
+* As of Twig 2.7, the ``\Twig\Parser::isReservedMacroName()`` / ``Twig\Parser``
+  function is deprecated and will be removed in Twig 3.0. It always returns
+  ``false`` anyway as Twig 2 does not have any reserved macro names.
 
-* As of Twig 1.x, the ``raw`` tag is deprecated. You should use ``verbatim``
-  instead.
+Environment
+-----------
 
-Nodes
------
+* As of Twig 2.7, the ``base_template_class`` option on ``Twig\Environment`` is
+  deprecated and will be removed in Twig 3.0.
 
-* As of Twig 1.x, ``Node::toXml()`` is deprecated and will be removed in Twig
-  2.0.
+* As of Twig 2.7, the ``Twig\Environment::getBaseTemplateClass()`` and
+  ``Twig\Environment::setBaseTemplateClass()`` methods are deprecated and will
+  be removed in Twig 3.0.
 
-* As of Twig 1.26, ``Node::$nodes`` should only contains ``Twig_Node``
-  instances, storing a ``null`` value is deprecated and won't be possible in
-  Twig 2.x.
+* As of Twig 2.7, the ``Twig\Environment::getTemplateClass()`` is marked as
+  being internal and should not be used.
 
-* As of Twig 1.27, the ``filename`` attribute on ``Twig_Node_Module`` is
-  deprecated. Use ``getName()`` instead.
+* As of Twig 2.7, passing a ``Twig\Template`` instance to the
+  ``Twig\Environment::load()`` and ``Twig\Environment::resolveTemplate()`` is
+  deprecated.
 
-* As of Twig 1.27, the ``Twig_Node::getFilename()/Twig_Node::getLine()``
-  methods are deprecated, use
-  ``Twig_Node::getTemplateName()/Twig_Node::getTemplateLine()`` instead.
+* Depending on the input, ``Twig\Environment::resolveTemplate()`` can return
+  a ``Twig\Template`` or a ``Twig\TemplateWrapper`` instance. In Twig 3.0, this
+  method will **always** return a ``Twig\TemplateWrapper`` instance. You should
+  only rely on the methods of this class if you want to be forward-compatible.
 
 Interfaces
 ----------
 
-* As of Twig 2.x, the following interfaces are deprecated and empty (they will
-  be removed in Twig 3.0):
-
-* ``Twig_CompilerInterface``     (use ``Twig_Compiler`` instead)
-* ``Twig_LexerInterface``        (use ``Twig_Lexer`` instead)
-* ``Twig_NodeInterface``         (use ``Twig_Node`` instead)
-* ``Twig_ParserInterface``       (use ``Twig_Parser`` instead)
-* ``Twig_ExistsLoaderInterface`` (merged with ``Twig_LoaderInterface``)
-* ``Twig_SourceContextLoaderInterface`` (merged with ``Twig_LoaderInterface``)
-* ``Twig_TemplateInterface``     (use ``Twig_Template`` instead, and use
-  those constants Twig_Template::ANY_CALL, Twig_Template::ARRAY_CALL,
-  Twig_Template::METHOD_CALL)
-
-Compiler
---------
-
-* As of Twig 1.26, the ``Twig_Compiler::getFilename()`` has been deprecated.
-  You should not use it anyway as its values is not reliable.
-
-* As of Twig 1.27, the ``Twig_Compiler::addIndentation()`` has been deprecated.
-  Use ``Twig_Compiler::write('')`` instead.
-
-Loaders
--------
-
-* As of Twig 1.x, ``Twig_Loader_String`` is deprecated and will be removed in
-  2.0. You can render a string via ``Twig_Environment::createTemplate()``.
+* As of Twig 2.7, the empty ``Twig\Loader\ExistsLoaderInterface`` interface is
+  deprecated and will be removed in Twig 3.0.
 
-* As of Twig 1.27, ``Twig_LoaderInterface::getSource()`` is deprecated.
-  Implement ``Twig_SourceContextLoaderInterface`` instead and use
-  ``getSourceContext()``.
+* As of Twig 2.7, the ``Twig\Extension\InitRuntimeInterface`` interface is
+  deprecated and will be removed in Twig 3.0.
 
-Node Visitors
--------------
-
-* Because of the removal of ``Twig_NodeInterface`` in 2.0, you need to extend
-  ``Twig_BaseNodeVisitor`` instead of implementing ``Twig_NodeVisitorInterface``
-  directly to make your node visitors compatible with both Twig 1.x and 2.x.
-
-Globals
--------
-
-* As of Twig 2.x, the ability to register a global variable after the runtime
-  or the extensions have been initialized is not possible anymore (but
-  changing the value of an already registered global is possible).
+Extensions
+----------
 
-* As of Twig 1.x, using the ``_self`` global variable to get access to the
-  current ``Twig_Template`` instance is deprecated; most usages only need the
-  current template name, which will continue to work in Twig 2.0. In Twig 2.0,
-  ``_self`` returns the current template name instead of the current
-  ``Twig_Template`` instance. If you are using ``{{ _self.templateName }}``,
-  just replace it with ``{{ _self }}``.
+* As of Twig 2.11, the ``Twig\Extension\CoreExtension::setEscaper()`` and
+  ``Twig\Extension\CoreExtension::getEscapers()`` are deprecated. Use the same
+  methods on ``Twig\Extension\EscaperExtension`` instead.
 
 Miscellaneous
 -------------
 
-* As of Twig 1.x, ``Twig_Environment::clearTemplateCache()``,
-  ``Twig_Environment::writeCacheFile()``,
-  ``Twig_Environment::clearCacheFiles()``,
-  ``Twig_Environment::getCacheFilename()``,
-  ``Twig_Environment::getTemplateClassPrefix()``,
-  ``Twig_Environment::getLexer()``, ``Twig_Environment::getParser()``, and
-  ``Twig_Environment::getCompiler()`` are deprecated and will be removed in 2.0.
-
-* As of Twig 1.x, ``Twig_Template::getEnvironment()`` and
-  ``Twig_TemplateInterface::getEnvironment()`` are deprecated and will be
-  removed in 2.0.
-
-* As of Twig 1.21, setting the environment option ``autoescape`` to ``true`` is
-  deprecated and will be removed in 2.0. Use ``"html"`` instead.
-
-* As of Twig 1.27, ``Twig_Error::getTemplateFile()`` and
-  ``Twig_Error::setTemplateFile()`` are deprecated. Use
-  ``Twig_Error::getTemplateName()`` and ``Twig_Error::setTemplateName()``
-  instead.
-
-* As of Twig 1.27, ``Twig_Template::getSource()`` is deprecated. Use
-  ``Twig_Template::getSourceContext()`` instead.
-
-* As of Twig 1.27, ``Twig_Parser::addHandler()`` and
-  ``Twig_Parser::addNodeVisitor()`` are deprecated and will be removed in 2.0.
+* As of Twig 2.7, the ``Twig_SimpleFilter``, ``Twig_SimpleFunction``, and
+  ``Twig_SimpleTest`` empty classes are deprecated and will be removed in Twig
+  3.0. Use ``Twig\TwigFilter``, ``Twig\TwigFunction``, and ``Twig\TwigTest``
+  respectively.
 
-* As of Twig 1.29, some classes are marked as being final via the `@final`
-  annotation. Those classes will be marked as final in 2.0.
+* As of Twig 2.8.2, all usage of
+  ``Twig\Loader\FilesystemLoader::findTemplate()`` check for a ``null`` return
+  value (same meaning as returning ``false``). If you are overidding
+  ``Twig\Loader\FilesystemLoader::findTemplate()``, you must return ``null`` instead of ``false``
+  to be compatible with Twig 3.0.
diff --git a/vendor/twig/twig/doc/filters/abs.rst b/vendor/twig/twig/doc/filters/abs.rst
index 22fa59d0..77d5cf05 100644
--- a/vendor/twig/twig/doc/filters/abs.rst
+++ b/vendor/twig/twig/doc/filters/abs.rst
@@ -3,7 +3,7 @@
 
 The ``abs`` filter returns the absolute value.
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# number = -5 #}
 
@@ -15,4 +15,4 @@ The ``abs`` filter returns the absolute value.
 
     Internally, Twig uses the PHP `abs`_ function.
 
-.. _`abs`: http://php.net/abs
+.. _`abs`: https://secure.php.net/abs
diff --git a/vendor/twig/twig/doc/filters/batch.rst b/vendor/twig/twig/doc/filters/batch.rst
index f8b6fa9d..2f936c15 100644
--- a/vendor/twig/twig/doc/filters/batch.rst
+++ b/vendor/twig/twig/doc/filters/batch.rst
@@ -1,14 +1,11 @@
 ``batch``
 =========
 
-.. versionadded:: 1.12.3
-    The ``batch`` filter was added in Twig 1.12.3.
-
 The ``batch`` filter "batches" items by returning a list of lists with the
 given number of items. A second parameter can be provided and used to fill in
 missing items:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set items = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] %}
 
@@ -24,7 +21,7 @@ missing items:
 
 The above example will be rendered as:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <table>
         <tr>
diff --git a/vendor/twig/twig/doc/filters/capitalize.rst b/vendor/twig/twig/doc/filters/capitalize.rst
index 10546a1f..2353658b 100644
--- a/vendor/twig/twig/doc/filters/capitalize.rst
+++ b/vendor/twig/twig/doc/filters/capitalize.rst
@@ -4,7 +4,7 @@
 The ``capitalize`` filter capitalizes a value. The first character will be
 uppercase, all others lowercase:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 'my first car'|capitalize }}
 
diff --git a/vendor/twig/twig/doc/filters/column.rst b/vendor/twig/twig/doc/filters/column.rst
new file mode 100644
index 00000000..97a3037d
--- /dev/null
+++ b/vendor/twig/twig/doc/filters/column.rst
@@ -0,0 +1,27 @@
+``column``
+==========
+
+.. versionadded:: 2.8
+    The ``column`` filter was added in Twig 2.8.
+
+The ``column`` filter returns the values from a single column in the input
+array.
+
+.. code-block:: twig
+
+    {% set items = [{ 'fruit' : 'apple'}, {'fruit' : 'orange' }] %}
+
+    {% set fruits = items|column('fruit') %}
+
+    {# fruits now contains ['apple', 'orange'] #}
+
+.. note::
+
+    Internally, Twig uses the PHP `array_column`_ function.
+
+Arguments
+---------
+
+* ``name``: The column name to extract
+
+.. _`array_column`: https://secure.php.net/array_column
diff --git a/vendor/twig/twig/doc/filters/convert_encoding.rst b/vendor/twig/twig/doc/filters/convert_encoding.rst
index f4ebe580..d977c752 100644
--- a/vendor/twig/twig/doc/filters/convert_encoding.rst
+++ b/vendor/twig/twig/doc/filters/convert_encoding.rst
@@ -1,22 +1,17 @@
 ``convert_encoding``
 ====================
 
-.. versionadded:: 1.4
-    The ``convert_encoding`` filter was added in Twig 1.4.
-
 The ``convert_encoding`` filter converts a string from one encoding to
 another. The first argument is the expected output charset and the second one
 is the input charset:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ data|convert_encoding('UTF-8', 'iso-2022-jp') }}
 
 .. note::
 
-    This filter relies on the `iconv`_ or `mbstring`_ extension, so one of
-    them must be installed. In case both are installed, `mbstring`_ is used by
-    default (Twig before 1.8.1 uses `iconv`_ by default).
+    This filter relies on the `iconv`_ extension.
 
 Arguments
 ---------
@@ -24,5 +19,4 @@ Arguments
 * ``to``:   The output charset
 * ``from``: The input charset
 
-.. _`iconv`:    http://php.net/iconv
-.. _`mbstring`: http://php.net/mbstring
+.. _`iconv`: https://secure.php.net/iconv
diff --git a/vendor/twig/twig/doc/filters/date.rst b/vendor/twig/twig/doc/filters/date.rst
index 99a17ab7..195e8523 100644
--- a/vendor/twig/twig/doc/filters/date.rst
+++ b/vendor/twig/twig/doc/filters/date.rst
@@ -1,21 +1,9 @@
 ``date``
 ========
 
-.. versionadded:: 1.1
-    The timezone support has been added in Twig 1.1.
-
-.. versionadded:: 1.5
-    The default date format support has been added in Twig 1.5.
-
-.. versionadded:: 1.6.1
-    The default timezone support has been added in Twig 1.6.1.
-
-.. versionadded:: 1.11.0
-    The introduction of the false value for the timezone was introduced in Twig 1.11.0
-
 The ``date`` filter formats a date to a given format:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ post.published_at|date("m/d/Y") }}
 
@@ -27,14 +15,14 @@ The ``date`` filter accepts strings (it must be in a format supported by the
 `strtotime`_ function), `DateTime`_ instances, or `DateInterval`_ instances. For
 instance, to display the current date, filter the word "now":
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ "now"|date("m/d/Y") }}
 
 To escape words and characters in the date format use ``\\`` in front of each
 character:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ post.published_at|date("F jS \\a\\t g:ia") }}
 
@@ -42,7 +30,7 @@ If the value passed to the ``date`` filter is ``null``, it will return the
 current date by default. If an empty string is desired instead of the current
 date, use a ternary operator:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ post.published_at is empty ? "" : post.published_at|date("m/d/Y") }}
 
@@ -53,11 +41,8 @@ dates and the second one is the default format for date intervals:
 
 .. code-block:: php
 
-    $twig = new Twig_Environment($loader);
-    $twig->getExtension('Twig_Extension_Core')->setDateFormat('d/m/Y', '%d days');
-
-    // before Twig 1.26
-    $twig->getExtension('core')->setDateFormat('d/m/Y', '%d days');
+    $twig = new \Twig\Environment($loader);
+    $twig->getExtension(\Twig\Extension\CoreExtension::class)->setDateFormat('d/m/Y', '%d days');
 
 Timezone
 --------
@@ -66,14 +51,14 @@ By default, the date is displayed by applying the default timezone (the one
 specified in php.ini or declared in Twig -- see below), but you can override
 it by explicitly specifying a timezone:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ post.published_at|date("m/d/Y", "Europe/Paris") }}
 
 If the date is already a DateTime object, and if you want to keep its current
 timezone, pass ``false`` as the timezone value:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ post.published_at|date("m/d/Y", false) }}
 
@@ -81,11 +66,8 @@ The default timezone can also be set globally by calling ``setTimezone()``:
 
 .. code-block:: php
 
-    $twig = new Twig_Environment($loader);
-    $twig->getExtension('Twig_Extension_Core')->setTimezone('Europe/Paris');
-
-    // before Twig 1.26
-    $twig->getExtension('core')->setTimezone('Europe/Paris');
+    $twig = new \Twig\Environment($loader);
+    $twig->getExtension(\Twig\Extension\CoreExtension::class)->setTimezone('Europe/Paris');
 
 Arguments
 ---------
@@ -93,8 +75,8 @@ Arguments
 * ``format``:   The date format
 * ``timezone``: The date timezone
 
-.. _`strtotime`:            http://www.php.net/strtotime
-.. _`DateTime`:             http://www.php.net/DateTime
-.. _`DateInterval`:         http://www.php.net/DateInterval
-.. _`date`:                 http://www.php.net/date
-.. _`DateInterval::format`: http://www.php.net/DateInterval.format
+.. _`strtotime`:            https://secure.php.net/strtotime
+.. _`DateTime`:             https://secure.php.net/DateTime
+.. _`DateInterval`:         https://secure.php.net/DateInterval
+.. _`date`:                 https://secure.php.net/date
+.. _`DateInterval::format`: https://secure.php.net/DateInterval.format
diff --git a/vendor/twig/twig/doc/filters/date_modify.rst b/vendor/twig/twig/doc/filters/date_modify.rst
index add40b56..5668f9e0 100644
--- a/vendor/twig/twig/doc/filters/date_modify.rst
+++ b/vendor/twig/twig/doc/filters/date_modify.rst
@@ -1,12 +1,9 @@
 ``date_modify``
 ===============
 
-.. versionadded:: 1.9.0
-    The date_modify filter has been added in Twig 1.9.0.
-
 The ``date_modify`` filter modifies a date with a given modifier string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ post.published_at|date_modify("+1 day")|date("m/d/Y") }}
 
@@ -19,5 +16,5 @@ Arguments
 
 * ``modifier``: The modifier
 
-.. _`strtotime`: http://www.php.net/strtotime
-.. _`DateTime`:  http://www.php.net/DateTime
+.. _`strtotime`: https://secure.php.net/strtotime
+.. _`DateTime`:  https://secure.php.net/DateTime
diff --git a/vendor/twig/twig/doc/filters/default.rst b/vendor/twig/twig/doc/filters/default.rst
index 641ac6e7..c4ccb56a 100644
--- a/vendor/twig/twig/doc/filters/default.rst
+++ b/vendor/twig/twig/doc/filters/default.rst
@@ -4,7 +4,7 @@
 The ``default`` filter returns the passed default value if the value is
 undefined or empty, otherwise the value of the variable:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ var|default('var is not defined') }}
 
@@ -18,7 +18,7 @@ When using the ``default`` filter on an expression that uses variables in some
 method calls, be sure to use the ``default`` filter whenever a variable can be
 undefined:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ var.method(foo|default('foo'))|default('foo') }}
 
diff --git a/vendor/twig/twig/doc/filters/escape.rst b/vendor/twig/twig/doc/filters/escape.rst
index 21491343..7c654ab6 100644
--- a/vendor/twig/twig/doc/filters/escape.rst
+++ b/vendor/twig/twig/doc/filters/escape.rst
@@ -1,33 +1,29 @@
 ``escape``
 ==========
 
-.. versionadded:: 1.9.0
-    The ``css``, ``url``, and ``html_attr`` strategies were added in Twig
-    1.9.0.
-
-.. versionadded:: 1.14.0
-    The ability to define custom escapers was added in Twig 1.14.0.
-
-The ``escape`` filter escapes a string for safe insertion into the final
-output. It supports different escaping strategies depending on the template
+The ``escape`` filter escapes a string using strategies that depend on the
 context.
 
 By default, it uses the HTML escaping strategy:
 
-.. code-block:: jinja
+.. code-block:: html+twig
 
-    {{ user.username|escape }}
+    <p>
+        {{ user.username|escape }}
+    </p>
 
 For convenience, the ``e`` filter is defined as an alias:
 
-.. code-block:: jinja
+.. code-block:: html+twig
 
-    {{ user.username|e }}
+    <p>
+        {{ user.username|e }}
+    </p>
 
 The ``escape`` filter can also be used in other contexts than HTML thanks to
 an optional argument which defines the escaping strategy to use:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ user.username|e }}
     {# is equivalent to #}
@@ -35,26 +31,33 @@ an optional argument which defines the escaping strategy to use:
 
 And here is how to escape variables included in JavaScript code:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ user.username|escape('js') }}
     {{ user.username|e('js') }}
 
-The ``escape`` filter supports the following escaping strategies:
+The ``escape`` filter supports the following escaping strategies for HTML
+documents:
 
 * ``html``: escapes a string for the **HTML body** context.
 
-* ``js``: escapes a string for the **JavaScript context**.
+* ``js``: escapes a string for the **JavaScript** context.
 
-* ``css``: escapes a string for the **CSS context**. CSS escaping can be
+* ``css``: escapes a string for the **CSS** context. CSS escaping can be
   applied to any string being inserted into CSS and escapes everything except
   alphanumerics.
 
-* ``url``: escapes a string for the **URI or parameter contexts**. This should
+* ``url``: escapes a string for the **URI or parameter** contexts. This should
   not be used to escape an entire URI; only a subcomponent being inserted.
 
 * ``html_attr``: escapes a string for the **HTML attribute** context.
 
+Note that doing contextual escaping in HTML documents is hard and choosing the
+right escaping strategy depends on a lot of factors. Please, read related
+documentation like `the OWASP prevention cheat sheet
+<https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.md>`_
+to learn more about this topic.
+
 .. note::
 
     Internally, ``escape`` uses the PHP native `htmlspecialchars`_ function
@@ -67,7 +70,7 @@ The ``escape`` filter supports the following escaping strategies:
     escape filter; but that does not work when using a variable as the
     escaping strategy:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% set strategy = 'html' %}
 
@@ -79,7 +82,7 @@ The ``escape`` filter supports the following escaping strategies:
     When using a variable as the escaping strategy, you should disable
     automatic escaping:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% set strategy = 'html' %}
 
@@ -96,19 +99,16 @@ used in the ``escape`` call) and the second one must be a valid PHP callable:
 
 .. code-block:: php
 
-    $twig = new Twig_Environment($loader);
-    $twig->getExtension('Twig_Extension_Core')->setEscaper('csv', 'csv_escaper');
-
-    // before Twig 1.26
-    $twig->getExtension('core')->setEscaper('csv', 'csv_escaper');
+    $twig = new \Twig\Environment($loader);
+    $twig->getExtension(\Twig\Extension\CoreExtension::class)->setEscaper('csv', 'csv_escaper');
 
 When called by Twig, the callable receives the Twig environment instance, the
 string to escape, and the charset.
 
 .. note::
 
-    Built-in escapers cannot be overridden mainly they should be considered as
-    the final implementation and also for better performance.
+    Built-in escapers cannot be overridden mainly because they should be
+    considered as the final implementation and also for better performance.
 
 Arguments
 ---------
@@ -116,4 +116,4 @@ Arguments
 * ``strategy``: The escaping strategy
 * ``charset``:  The string charset
 
-.. _`htmlspecialchars`: http://php.net/htmlspecialchars
+.. _`htmlspecialchars`: https://secure.php.net/htmlspecialchars
diff --git a/vendor/twig/twig/doc/filters/filter.rst b/vendor/twig/twig/doc/filters/filter.rst
new file mode 100644
index 00000000..310e63a7
--- /dev/null
+++ b/vendor/twig/twig/doc/filters/filter.rst
@@ -0,0 +1,58 @@
+``filter``
+=========
+
+.. versionadded:: 1.41
+    The ``filter`` filter was added in Twig 1.41 and 2.10.
+
+The ``filter`` filter filters elements of a sequence or a mapping using an arrow
+function. The arrow function receives the value of the sequence or mapping:
+
+.. code-block:: twig
+
+    {% set sizes = [34, 36, 38, 40, 42] %}
+
+    {{ sizes|filter(v => v > 38)|join(', ') }}
+    {# output 40, 42 #}
+
+Combined with the ``for`` tag, it allows to filter the items to iterate over:
+
+.. code-block:: twig
+
+    {% for v in sizes|filter(v => v > 38) -%}
+        {{ v }}
+    {% endfor %}
+    {# output 40 42 #}
+
+It also works with mappings:
+
+.. code-block:: twig
+
+    {% set sizes = {
+        xs: 34,
+        s:  36,
+        m:  38,
+        l:  40,
+        xl: 42,
+    } %}
+
+    {% for k, v in sizes|filter(v => v > 38) -%}
+        {{ k }} = {{ v }}
+    {% endfor %}
+    {# output l = 40 xl = 42 #}
+
+The arrow function also receives the key as a second argument:
+
+.. code-block:: twig
+
+    {% for k, v in sizes|filter((v, k) => v > 38 and k != "xl") -%}
+        {{ k }} = {{ v }}
+    {% endfor %}
+    {# output l = 40 #}
+
+Note that the arrow function has access to the current context.
+
+Arguments
+---------
+
+* ``array``: The sequence or mapping
+* ``arrow``: The arrow function
diff --git a/vendor/twig/twig/doc/filters/first.rst b/vendor/twig/twig/doc/filters/first.rst
index 674c1f9e..8d7081a5 100644
--- a/vendor/twig/twig/doc/filters/first.rst
+++ b/vendor/twig/twig/doc/filters/first.rst
@@ -1,13 +1,10 @@
 ``first``
 =========
 
-.. versionadded:: 1.12.2
-    The ``first`` filter was added in Twig 1.12.2.
-
 The ``first`` filter returns the first "element" of a sequence, a mapping, or
 a string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ [1, 2, 3, 4]|first }}
     {# outputs 1 #}
@@ -22,4 +19,4 @@ a string:
 
     It also works with objects implementing the `Traversable`_ interface.
 
-.. _`Traversable`: http://php.net/manual/en/class.traversable.php
+.. _`Traversable`: https://secure.php.net/manual/en/class.traversable.php
diff --git a/vendor/twig/twig/doc/filters/format.rst b/vendor/twig/twig/doc/filters/format.rst
index f8effd9a..c0c96ee3 100644
--- a/vendor/twig/twig/doc/filters/format.rst
+++ b/vendor/twig/twig/doc/filters/format.rst
@@ -4,13 +4,13 @@
 The ``format`` filter formats a given string by replacing the placeholders
 (placeholders follows the `sprintf`_ notation):
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ "I like %s and %s."|format(foo, "bar") }}
 
     {# outputs I like foo and bar
        if the foo parameter equals to the foo string. #}
 
-.. _`sprintf`: http://www.php.net/sprintf
+.. _`sprintf`: https://secure.php.net/sprintf
 
 .. seealso:: :doc:`replace<replace>`
diff --git a/vendor/twig/twig/doc/filters/index.rst b/vendor/twig/twig/doc/filters/index.rst
index 8daa9611..f3468f68 100644
--- a/vendor/twig/twig/doc/filters/index.rst
+++ b/vendor/twig/twig/doc/filters/index.rst
@@ -7,11 +7,13 @@ Filters
     abs
     batch
     capitalize
+    column
     convert_encoding
     date
     date_modify
     default
     escape
+    filter
     first
     format
     join
@@ -20,15 +22,18 @@ Filters
     last
     length
     lower
+    map
     merge
     nl2br
     number_format
     raw
+    reduce
     replace
     reverse
     round
     slice
     sort
+    spaceless
     split
     striptags
     title
diff --git a/vendor/twig/twig/doc/filters/join.rst b/vendor/twig/twig/doc/filters/join.rst
index 2fab9452..a9ea147e 100644
--- a/vendor/twig/twig/doc/filters/join.rst
+++ b/vendor/twig/twig/doc/filters/join.rst
@@ -1,10 +1,13 @@
 ``join``
 ========
 
+.. versionadded:: 2.6.1
+    The ``and`` argument was added in Twig 2.6.1.
+
 The ``join`` filter returns a string which is the concatenation of the items
 of a sequence:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ [1, 2, 3]|join }}
     {# returns 123 #}
@@ -12,12 +15,21 @@ of a sequence:
 The separator between elements is an empty string per default, but you can
 define it with the optional first parameter:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ [1, 2, 3]|join('|') }}
     {# outputs 1|2|3 #}
 
+A second parameter can also be provided that will be the separator used between
+the last two items of the sequence:
+
+.. code-block:: twig
+
+    {{ [1, 2, 3]|join(', ', ' and ') }}
+    {# outputs 1, 2 and 3 #}
+
 Arguments
 ---------
 
 * ``glue``: The separator
+* ``and``: The separator for the last pair of input items
diff --git a/vendor/twig/twig/doc/filters/json_encode.rst b/vendor/twig/twig/doc/filters/json_encode.rst
index a39bb476..434e2f17 100644
--- a/vendor/twig/twig/doc/filters/json_encode.rst
+++ b/vendor/twig/twig/doc/filters/json_encode.rst
@@ -3,7 +3,7 @@
 
 The ``json_encode`` filter returns the JSON representation of a value:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ data|json_encode() }}
 
@@ -14,8 +14,10 @@ The ``json_encode`` filter returns the JSON representation of a value:
 Arguments
 ---------
 
-* ``options``: A bitmask of `json_encode options`_ (``{{
-  data|json_encode(constant('JSON_PRETTY_PRINT')) }}``)
+* ``options``: A bitmask of `json_encode options`_: ``{{
+  data|json_encode(constant('JSON_PRETTY_PRINT')) }}``.
+  Combine constants using :ref:`bitwise operators<template_logic>`:
+  ``{{ data|json_encode(constant('JSON_PRETTY_PRINT') b-or constant('JSON_HEX_QUOT')) }}``
 
-.. _`json_encode`: http://php.net/json_encode
-.. _`json_encode options`: http://www.php.net/manual/en/json.constants.php
+.. _`json_encode`: https://secure.php.net/json_encode
+.. _`json_encode options`: https://secure.php.net/manual/en/json.constants.php
diff --git a/vendor/twig/twig/doc/filters/keys.rst b/vendor/twig/twig/doc/filters/keys.rst
index e4f090c6..58609471 100644
--- a/vendor/twig/twig/doc/filters/keys.rst
+++ b/vendor/twig/twig/doc/filters/keys.rst
@@ -4,7 +4,7 @@
 The ``keys`` filter returns the keys of an array. It is useful when you want to
 iterate over the keys of an array:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for key in array|keys %}
         ...
diff --git a/vendor/twig/twig/doc/filters/last.rst b/vendor/twig/twig/doc/filters/last.rst
index 345b6573..2b7c45bd 100644
--- a/vendor/twig/twig/doc/filters/last.rst
+++ b/vendor/twig/twig/doc/filters/last.rst
@@ -1,13 +1,10 @@
 ``last``
 ========
 
-.. versionadded:: 1.12.2
-    The ``last`` filter was added in Twig 1.12.2.
-
 The ``last`` filter returns the last "element" of a sequence, a mapping, or
 a string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ [1, 2, 3, 4]|last }}
     {# outputs 4 #}
@@ -22,4 +19,4 @@ a string:
 
     It also works with objects implementing the `Traversable`_ interface.
 
-.. _`Traversable`: http://php.net/manual/en/class.traversable.php
+.. _`Traversable`: https://secure.php.net/manual/en/class.traversable.php
diff --git a/vendor/twig/twig/doc/filters/length.rst b/vendor/twig/twig/doc/filters/length.rst
index 5620f3b3..3ea6d1a6 100644
--- a/vendor/twig/twig/doc/filters/length.rst
+++ b/vendor/twig/twig/doc/filters/length.rst
@@ -1,9 +1,9 @@
 ``length``
 ==========
 
-.. versionadded:: 1.33
+.. versionadded:: 2.3
 
-    Support for the ``__toString()`` magic method has been added in Twig 1.33.
+    Support for the ``__toString()`` magic method has been added in Twig 2.3.
 
 The ``length`` filter returns the number of items of a sequence or mapping, or
 the length of a string.
@@ -14,7 +14,9 @@ return value of the ``count()`` method.
 For objects that implement the ``__toString()`` magic method (and not ``Countable``),
 it will return the length of the string provided by that method.
 
-.. code-block:: jinja
+For objects that implement the ``IteratorAggregate`` interface, ``length`` will use the return value of the ``iterator_count()`` method.
+
+.. code-block:: twig
 
     {% if users|length > 10 %}
         ...
diff --git a/vendor/twig/twig/doc/filters/lower.rst b/vendor/twig/twig/doc/filters/lower.rst
index ef9faa90..c0a0e0cd 100644
--- a/vendor/twig/twig/doc/filters/lower.rst
+++ b/vendor/twig/twig/doc/filters/lower.rst
@@ -3,7 +3,7 @@
 
 The ``lower`` filter converts a value to lowercase:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 'WELCOME'|lower }}
 
diff --git a/vendor/twig/twig/doc/filters/map.rst b/vendor/twig/twig/doc/filters/map.rst
new file mode 100644
index 00000000..777b05a7
--- /dev/null
+++ b/vendor/twig/twig/doc/filters/map.rst
@@ -0,0 +1,38 @@
+``map``
+=======
+
+.. versionadded:: 1.41
+    The ``map`` filter was added in Twig 1.41 and 2.10.
+
+The ``map`` filter applies an arrow function to the elements of a sequence or a
+mapping. The arrow function receives the value of the sequence or mapping:
+
+.. code-block:: twig
+
+    {% set people = [
+        {first: "Bob", last: "Smith"},
+        {first: "Alice", last: "Dupond"},
+    ] %}
+
+    {{ people|map(p => "#{p.first} #{p.last}")|join(', ') }}
+    {# outputs Bob Smith, Alice Dupond #}
+
+The arrow function also receives the key as a second argument:
+
+.. code-block:: twig
+
+    {% set people = {
+        "Bob": "Smith",
+        "Alice": "Dupond",
+    } %}
+
+    {{ people|map((first, last) => "#{first} #{last}")|join(', ') }}
+    {# outputs Bob Smith, Alice Dupond #}
+
+Note that the arrow function has access to the current context.
+
+Arguments
+---------
+
+* ``array``: The sequence or mapping
+* ``arrow``: The arrow function
diff --git a/vendor/twig/twig/doc/filters/merge.rst b/vendor/twig/twig/doc/filters/merge.rst
index 88780dd6..e26e51c2 100644
--- a/vendor/twig/twig/doc/filters/merge.rst
+++ b/vendor/twig/twig/doc/filters/merge.rst
@@ -3,7 +3,7 @@
 
 The ``merge`` filter merges an array with another array:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set values = [1, 2] %}
 
@@ -15,7 +15,7 @@ New values are added at the end of the existing ones.
 
 The ``merge`` filter also works on hashes:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set items = { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'unknown' } %}
 
@@ -32,7 +32,7 @@ overridden.
     If you want to ensure that some values are defined in an array (by given
     default values), reverse the two elements in the call:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %}
 
@@ -45,4 +45,4 @@ overridden.
     Internally, Twig uses the PHP `array_merge`_ function. It supports
     Traversable objects by transforming those to arrays.
 
-.. _`array_merge`: http://php.net/array_merge
+.. _`array_merge`: https://secure.php.net/array_merge
diff --git a/vendor/twig/twig/doc/filters/nl2br.rst b/vendor/twig/twig/doc/filters/nl2br.rst
index 5c923e14..1eefb04a 100644
--- a/vendor/twig/twig/doc/filters/nl2br.rst
+++ b/vendor/twig/twig/doc/filters/nl2br.rst
@@ -1,12 +1,9 @@
 ``nl2br``
 =========
 
-.. versionadded:: 1.5
-    The ``nl2br`` filter was added in Twig 1.5.
-
 The ``nl2br`` filter inserts HTML line breaks before all newlines in a string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ "I like Twig.\nYou will like it too."|nl2br }}
     {# outputs
diff --git a/vendor/twig/twig/doc/filters/number_format.rst b/vendor/twig/twig/doc/filters/number_format.rst
index f9d6705e..77b613b9 100644
--- a/vendor/twig/twig/doc/filters/number_format.rst
+++ b/vendor/twig/twig/doc/filters/number_format.rst
@@ -1,27 +1,24 @@
 ``number_format``
 =================
 
-.. versionadded:: 1.5
-    The ``number_format`` filter was added in Twig 1.5
-
 The ``number_format`` filter formats numbers.  It is a wrapper around PHP's
 `number_format`_ function:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 200.35|number_format }}
 
 You can control the number of decimal places, decimal point, and thousands
 separator using the additional arguments:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 9800.333|number_format(2, '.', ',') }}
 
 To format negative numbers, wrap the number with parentheses (needed because of
 Twig's :ref:`precedence of operators <twig-expressions>`:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ -9800.333|number_format(2, '.', ',') }} {# outputs : -9 #}
     {{ (-9800.333)|number_format(2, '.', ',') }} {# outputs : -9,800.33 #}
@@ -37,11 +34,8 @@ These defaults can be easily changed through the core extension:
 
 .. code-block:: php
 
-    $twig = new Twig_Environment($loader);
-    $twig->getExtension('Twig_Extension_Core')->setNumberFormat(3, '.', ',');
-
-    // before Twig 1.26
-    $twig->getExtension('core')->setNumberFormat(3, '.', ',');
+    $twig = new \Twig\Environment($loader);
+    $twig->getExtension(\Twig\Extension\CoreExtension::class)->setNumberFormat(3, '.', ',');
 
 The defaults set for ``number_format`` can be over-ridden upon each call using the
 additional parameters.
@@ -53,4 +47,4 @@ Arguments
 * ``decimal_point``: The character(s) to use for the decimal point
 * ``thousand_sep``:   The character(s) to use for the thousands separator
 
-.. _`number_format`: http://php.net/number_format
+.. _`number_format`: https://secure.php.net/number_format
diff --git a/vendor/twig/twig/doc/filters/raw.rst b/vendor/twig/twig/doc/filters/raw.rst
index e5e5b12e..ad74a52a 100644
--- a/vendor/twig/twig/doc/filters/raw.rst
+++ b/vendor/twig/twig/doc/filters/raw.rst
@@ -5,7 +5,7 @@ The ``raw`` filter marks the value as being "safe", which means that in an
 environment with automatic escaping enabled this variable will not be escaped
 if ``raw`` is the last filter applied to it:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% autoescape %}
         {{ var|raw }} {# var won't be escaped #}
@@ -13,9 +13,11 @@ if ``raw`` is the last filter applied to it:
 
 .. note::
 
+    **This note only applies to Twig before versions 1.39 and 2.8**.
+
     Be careful when using the ``raw`` filter inside expressions:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% autoescape %}
             {% set hello = '<strong>Hello</strong>' %}
diff --git a/vendor/twig/twig/doc/filters/reduce.rst b/vendor/twig/twig/doc/filters/reduce.rst
new file mode 100644
index 00000000..7d04d6c7
--- /dev/null
+++ b/vendor/twig/twig/doc/filters/reduce.rst
@@ -0,0 +1,33 @@
+``reduce``
+=========
+
+.. versionadded:: 1.41
+    The ``reduce`` filter was added in Twig 1.41 and 2.10.
+
+The ``reduce`` filter iteratively reduces a sequence or a mapping to a single
+value using an arrow function, so as to reduce it to a single value. The arrow
+function receives the return value of the previous iteration and the current
+value of the sequence or mapping:
+
+.. code-block:: twig
+
+    {% set numbers = [1, 2, 3] %}
+
+    {{ numbers|reduce((carry, v) => carry + v) }}
+    {# output 6 #}
+
+The ``reduce`` filter takes an ``initial`` value as a second argument:
+
+.. code-block:: twig
+
+    {{ numbers|reduce((carry, v) => carry + v, 10) }}
+    {# output 16 #}
+
+Note that the arrow function has access to the current context.
+
+Arguments
+---------
+
+* ``array``: The sequence or mapping
+* ``arrow``: The arrow function
+* ``initial``: The initial value
diff --git a/vendor/twig/twig/doc/filters/replace.rst b/vendor/twig/twig/doc/filters/replace.rst
index 8dbb7459..ceb6c009 100644
--- a/vendor/twig/twig/doc/filters/replace.rst
+++ b/vendor/twig/twig/doc/filters/replace.rst
@@ -4,13 +4,19 @@
 The ``replace`` filter formats a given string by replacing the placeholders
 (placeholders are free-form):
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ "I like %this% and %that%."|replace({'%this%': foo, '%that%': "bar"}) }}
 
     {# outputs I like foo and bar
        if the foo parameter equals to the foo string. #}
 
+    {# using % as a delimiter is purely conventional and optional #}
+
+    {{ "I like this and --that--."|replace({'this': foo, '--that--': "bar"}) }}
+
+    {# outputs I like foo and bar #}
+
 Arguments
 ---------
 
diff --git a/vendor/twig/twig/doc/filters/reverse.rst b/vendor/twig/twig/doc/filters/reverse.rst
index 76fd2c1a..c5ceb7d0 100644
--- a/vendor/twig/twig/doc/filters/reverse.rst
+++ b/vendor/twig/twig/doc/filters/reverse.rst
@@ -1,12 +1,9 @@
 ``reverse``
 ===========
 
-.. versionadded:: 1.6
-    Support for strings has been added in Twig 1.6.
-
 The ``reverse`` filter reverses a sequence, a mapping, or a string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for user in users|reverse %}
         ...
@@ -21,7 +18,7 @@ The ``reverse`` filter reverses a sequence, a mapping, or a string:
     For sequences and mappings, numeric keys are not preserved. To reverse
     them as well, pass ``true`` as an argument to the ``reverse`` filter:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% for key, value in {1: "a", 2: "b", 3: "c"}|reverse %}
             {{ key }}: {{ value }}
@@ -44,4 +41,4 @@ Arguments
 
 * ``preserve_keys``: Preserve keys when reversing a mapping or a sequence.
 
-.. _`Traversable`: http://php.net/Traversable
+.. _`Traversable`: https://secure.php.net/Traversable
diff --git a/vendor/twig/twig/doc/filters/round.rst b/vendor/twig/twig/doc/filters/round.rst
index 2521cf16..2c970b7f 100644
--- a/vendor/twig/twig/doc/filters/round.rst
+++ b/vendor/twig/twig/doc/filters/round.rst
@@ -1,12 +1,9 @@
 ``round``
 =========
 
-.. versionadded:: 1.15.0
-    The ``round`` filter was added in Twig 1.15.0.
-
 The ``round`` filter rounds a number to a given precision:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 42.55|round }}
     {# outputs 43 #}
diff --git a/vendor/twig/twig/doc/filters/slice.rst b/vendor/twig/twig/doc/filters/slice.rst
index 70bf139e..9cc0ca4e 100644
--- a/vendor/twig/twig/doc/filters/slice.rst
+++ b/vendor/twig/twig/doc/filters/slice.rst
@@ -1,12 +1,9 @@
 ``slice``
 ===========
 
-.. versionadded:: 1.6
-    The ``slice`` filter was added in Twig 1.6.
-
 The ``slice`` filter extracts a slice of a sequence, a mapping, or a string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for i in [1, 2, 3, 4, 5]|slice(1, 2) %}
         {# will iterate over 2 and 3 #}
@@ -18,7 +15,7 @@ The ``slice`` filter extracts a slice of a sequence, a mapping, or a string:
 
 You can use any valid expression for both the start and the length:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for i in [1, 2, 3, 4, 5]|slice(start, length) %}
         {# ... #}
@@ -26,7 +23,7 @@ You can use any valid expression for both the start and the length:
 
 As syntactic sugar, you can also use the ``[]`` notation:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for i in [1, 2, 3, 4, 5][start:length] %}
         {# ... #}
@@ -65,7 +62,7 @@ Arguments
 * ``length``:        The size of the slice
 * ``preserve_keys``: Whether to preserve key or not (when the input is an array)
 
-.. _`Traversable`: http://php.net/manual/en/class.traversable.php
-.. _`array_slice`: http://php.net/array_slice
-.. _`mb_substr` :  http://php.net/mb-substr
-.. _`substr`:      http://php.net/substr
+.. _`Traversable`: https://secure.php.net/manual/en/class.traversable.php
+.. _`array_slice`: https://secure.php.net/array_slice
+.. _`mb_substr` :  https://secure.php.net/mb-substr
+.. _`substr`:      https://secure.php.net/substr
diff --git a/vendor/twig/twig/doc/filters/sort.rst b/vendor/twig/twig/doc/filters/sort.rst
index 350207f8..f7c0329f 100644
--- a/vendor/twig/twig/doc/filters/sort.rst
+++ b/vendor/twig/twig/doc/filters/sort.rst
@@ -3,7 +3,7 @@
 
 The ``sort`` filter sorts an array:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for user in users|sort %}
         ...
@@ -15,4 +15,4 @@ The ``sort`` filter sorts an array:
     association. It supports Traversable objects by transforming
     those to arrays.
 
-.. _`asort`: http://php.net/asort
+.. _`asort`: https://secure.php.net/asort
diff --git a/vendor/twig/twig/doc/filters/spaceless.rst b/vendor/twig/twig/doc/filters/spaceless.rst
new file mode 100644
index 00000000..17966a81
--- /dev/null
+++ b/vendor/twig/twig/doc/filters/spaceless.rst
@@ -0,0 +1,65 @@
+``spaceless``
+=============
+
+.. versionadded:: 1.38
+
+    The ``spaceless`` filter was added in Twig 1.38.
+
+Use the ``spaceless`` filter to remove whitespace *between HTML tags*, not
+whitespace within HTML tags or whitespace in plain text:
+
+.. code-block:: twig
+
+    {{
+        "<div>
+            <strong>foo</strong>
+        </div>
+        "|spaceless }}
+
+    {# output will be <div><strong>foo</strong></div> #}
+
+You can combine ``spaceless`` with the ``apply`` tag to apply the transformation
+on large amounts of HTML:
+
+.. code-block:: twig
+
+    {% apply spaceless %}
+        <div>
+            <strong>foo</strong>
+        </div>
+    {% endapply %}
+
+    {# output will be <div><strong>foo</strong></div> #}
+
+.. note::
+
+    The ``apply`` tag was introduced in Twig 2.9; use the ``filter`` tag with
+    previous versions.
+
+This tag is not meant to "optimize" the size of the generated HTML content but
+merely to avoid extra whitespace between HTML tags to avoid browser rendering
+quirks under some circumstances.
+
+.. caution::
+
+    As the filter uses a regular expression behind the scenes, its performance
+    is directly related to the text size you are working on (remember that
+    filters are executed at runtime).
+
+.. tip::
+
+    If you want to optimize the size of the generated HTML content, gzip
+    compress the output instead.
+
+.. tip::
+
+    If you want to create a tag that actually removes all extra whitespace in
+    an HTML string, be warned that this is not as easy as it seems to be
+    (think of ``textarea`` or ``pre`` tags for instance). Using a third-party
+    library like Tidy is probably a better idea.
+
+.. tip::
+
+    For more information on whitespace control, read the
+    :ref:`dedicated section <templates-whitespace-control>` of the documentation and learn how
+    you can also use the whitespace control modifier on your tags.
diff --git a/vendor/twig/twig/doc/filters/split.rst b/vendor/twig/twig/doc/filters/split.rst
index bbc6d798..38c4b7df 100644
--- a/vendor/twig/twig/doc/filters/split.rst
+++ b/vendor/twig/twig/doc/filters/split.rst
@@ -1,28 +1,25 @@
 ``split``
 =========
 
-.. versionadded:: 1.10.3
-    The ``split`` filter was added in Twig 1.10.3.
-
 The ``split`` filter splits a string by the given delimiter and returns a list
 of strings:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set foo = "one,two,three"|split(',') %}
     {# foo contains ['one', 'two', 'three'] #}
 
 You can also pass a ``limit`` argument:
 
- * If ``limit`` is positive, the returned array will contain a maximum of
-   limit elements with the last element containing the rest of string;
+* If ``limit`` is positive, the returned array will contain a maximum of
+  limit elements with the last element containing the rest of string;
 
- * If ``limit`` is negative, all components except the last -limit are
-   returned;
+* If ``limit`` is negative, all components except the last -limit are
+  returned;
 
- * If ``limit`` is zero, then this is treated as 1.
+* If ``limit`` is zero, then this is treated as 1.
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set foo = "one,two,three,four,five"|split(',', 3) %}
     {# foo contains ['one', 'two', 'three,four,five'] #}
@@ -30,7 +27,7 @@ You can also pass a ``limit`` argument:
 If the ``delimiter`` is an empty string, then value will be split by equal
 chunks. Length is set by the ``limit`` argument (one character by default).
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set foo = "123"|split('') %}
     {# foo contains ['1', '2', '3'] #}
@@ -49,5 +46,5 @@ Arguments
 * ``delimiter``: The delimiter
 * ``limit``:     The limit argument
 
-.. _`explode`:   http://php.net/explode
-.. _`str_split`: http://php.net/str_split
+.. _`explode`:   https://secure.php.net/explode
+.. _`str_split`: https://secure.php.net/str_split
diff --git a/vendor/twig/twig/doc/filters/striptags.rst b/vendor/twig/twig/doc/filters/striptags.rst
index 82953b7b..62b2a7b3 100644
--- a/vendor/twig/twig/doc/filters/striptags.rst
+++ b/vendor/twig/twig/doc/filters/striptags.rst
@@ -4,13 +4,13 @@
 The ``striptags`` filter strips SGML/XML tags and replace adjacent whitespace
 by one space:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ some_html|striptags }}
 
 You can also provide tags which should not be stripped:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ some_html|striptags('<br><p>') }}
 
@@ -26,4 +26,4 @@ Arguments
 
 * ``allowable_tags``: Tags which should not be stripped
 
-.. _`strip_tags`: http://php.net/strip_tags
+.. _`strip_tags`: https://secure.php.net/strip_tags
diff --git a/vendor/twig/twig/doc/filters/title.rst b/vendor/twig/twig/doc/filters/title.rst
index c5a318e8..dd0311ca 100644
--- a/vendor/twig/twig/doc/filters/title.rst
+++ b/vendor/twig/twig/doc/filters/title.rst
@@ -4,7 +4,7 @@
 The ``title`` filter returns a titlecased version of the value. Words will
 start with uppercase letters, all remaining characters are lowercase:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 'my first car'|title }}
 
diff --git a/vendor/twig/twig/doc/filters/trim.rst b/vendor/twig/twig/doc/filters/trim.rst
index b598363c..81d5e041 100644
--- a/vendor/twig/twig/doc/filters/trim.rst
+++ b/vendor/twig/twig/doc/filters/trim.rst
@@ -1,16 +1,10 @@
 ``trim``
 ========
 
-.. versionadded:: 1.32
-    The ``side`` argument was added in Twig 1.32.
-
-.. versionadded:: 1.6.2
-    The ``trim`` filter was added in Twig 1.6.2.
-
 The ``trim`` filter strips whitespace (or other characters) from the beginning
 and end of a string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ '  I like Twig.  '|trim }}
 
@@ -40,6 +34,6 @@ Arguments
 * ``side``: The default is to strip from the left and the right (`both`) sides, but `left`
   and `right` will strip from either the left side or right side only
 
-.. _`trim`: http://php.net/trim
-.. _`ltrim`: http://php.net/ltrim
-.. _`rtrim`: http://php.net/rtrim
+.. _`trim`: https://secure.php.net/trim
+.. _`ltrim`: https://secure.php.net/ltrim
+.. _`rtrim`: https://secure.php.net/rtrim
diff --git a/vendor/twig/twig/doc/filters/upper.rst b/vendor/twig/twig/doc/filters/upper.rst
index 561cebe3..01c9fbb0 100644
--- a/vendor/twig/twig/doc/filters/upper.rst
+++ b/vendor/twig/twig/doc/filters/upper.rst
@@ -3,7 +3,7 @@
 
 The ``upper`` filter converts a value to uppercase:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ 'welcome'|upper }}
 
diff --git a/vendor/twig/twig/doc/filters/url_encode.rst b/vendor/twig/twig/doc/filters/url_encode.rst
index 5944e59c..50a44e5d 100644
--- a/vendor/twig/twig/doc/filters/url_encode.rst
+++ b/vendor/twig/twig/doc/filters/url_encode.rst
@@ -1,17 +1,10 @@
 ``url_encode``
 ==============
 
-.. versionadded:: 1.12.3
-    Support for encoding an array as query string was added in Twig 1.12.3.
-
-.. versionadded:: 1.16.0
-    The ``raw`` argument was removed in Twig 1.16.0. Twig now always encodes
-    according to RFC 3986.
-
 The ``url_encode`` filter percent encodes a given string as URL segment
 or an array as query string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ "path-seg*ment"|url_encode }}
     {# outputs "path-seg%2Ament" #}
@@ -24,11 +17,6 @@ or an array as query string:
 
 .. note::
 
-    Internally, Twig uses the PHP `urlencode`_ (or `rawurlencode`_ if you pass
-    ``true`` as the first parameter) or the `http_build_query`_ function. Note
-    that as of Twig 1.16.0, ``urlencode`` **always** uses ``rawurlencode`` (the
-    ``raw`` argument was removed.)
+    Internally, Twig uses the PHP ``rawurlencode``.
 
-.. _`urlencode`:        http://php.net/urlencode
-.. _`rawurlencode`:     http://php.net/rawurlencode
-.. _`http_build_query`: http://php.net/http_build_query
+.. _`rawurlencode`: https://secure.php.net/rawurlencode
diff --git a/vendor/twig/twig/doc/functions/attribute.rst b/vendor/twig/twig/doc/functions/attribute.rst
index ceba96b0..e9d9a842 100644
--- a/vendor/twig/twig/doc/functions/attribute.rst
+++ b/vendor/twig/twig/doc/functions/attribute.rst
@@ -1,13 +1,10 @@
 ``attribute``
 =============
 
-.. versionadded:: 1.2
-    The ``attribute`` function was added in Twig 1.2.
-
 The ``attribute`` function can be used to access a "dynamic" attribute of a
 variable:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ attribute(object, method) }}
     {{ attribute(object, method, arguments) }}
@@ -16,7 +13,7 @@ variable:
 In addition, the ``defined`` test can check for the existence of a dynamic
 attribute:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ attribute(object, method) is defined ? 'Method exists' : 'Method does not exist' }}
 
diff --git a/vendor/twig/twig/doc/functions/block.rst b/vendor/twig/twig/doc/functions/block.rst
index f5d683c7..01184320 100644
--- a/vendor/twig/twig/doc/functions/block.rst
+++ b/vendor/twig/twig/doc/functions/block.rst
@@ -1,16 +1,10 @@
 ``block``
 =========
 
-.. versionadded: 1.28
-    Using ``block`` with the ``defined`` test was added in Twig 1.28.
-
-.. versionadded: 1.28
-    Support for the template argument was added in Twig 1.28.
-
 When a template uses inheritance and if you want to print a block multiple
 times, use the ``block`` function:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <title>{% block title %}{% endblock %}</title>
 
@@ -18,17 +12,17 @@ times, use the ``block`` function:
 
     {% block body %}{% endblock %}
 
-The ``block`` function can also be used to display one block of another
+The ``block`` function can also be used to display one block from another
 template:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ block("title", "common_blocks.twig") }}
 
 Use the ``defined`` test to check if a block exists in the context of the
 current template:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if block("footer") is defined %}
         ...
diff --git a/vendor/twig/twig/doc/functions/constant.rst b/vendor/twig/twig/doc/functions/constant.rst
index 97aa5c8f..660bf870 100644
--- a/vendor/twig/twig/doc/functions/constant.rst
+++ b/vendor/twig/twig/doc/functions/constant.rst
@@ -1,28 +1,22 @@
 ``constant``
 ============
 
-.. versionadded: 1.12.1
-    constant now accepts object instances as the second argument.
-
-.. versionadded: 1.28
-    Using ``constant`` with the ``defined`` test was added in Twig 1.28.
-
 ``constant`` returns the constant value for a given string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ some_date|date(constant('DATE_W3C')) }}
     {{ constant('Namespace\\Classname::CONSTANT_NAME') }}
 
-As of 1.12.1 you can read constants from object instances as well:
+You can read constants from object instances as well:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ constant('RSS', date) }}
 
 Use the ``defined`` test to check if a constant is defined:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if constant('SOME_CONST') is defined %}
         ...
diff --git a/vendor/twig/twig/doc/functions/cycle.rst b/vendor/twig/twig/doc/functions/cycle.rst
index e3434932..84cff6a1 100644
--- a/vendor/twig/twig/doc/functions/cycle.rst
+++ b/vendor/twig/twig/doc/functions/cycle.rst
@@ -3,7 +3,7 @@
 
 The ``cycle`` function cycles on an array of values:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set start_year = date() | date('Y') %}
     {% set end_year = start_year + 5 %}
@@ -14,7 +14,7 @@ The ``cycle`` function cycles on an array of values:
 
 The array can contain any number of values:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set fruits = ['apple', 'orange', 'citrus'] %}
 
diff --git a/vendor/twig/twig/doc/functions/date.rst b/vendor/twig/twig/doc/functions/date.rst
index 158dd6a6..ee80a4e0 100644
--- a/vendor/twig/twig/doc/functions/date.rst
+++ b/vendor/twig/twig/doc/functions/date.rst
@@ -1,15 +1,9 @@
 ``date``
 ========
 
-.. versionadded:: 1.6
-    The date function has been added in Twig 1.6.
-
-.. versionadded:: 1.6.1
-    The default timezone support has been added in Twig 1.6.1.
-
 Converts an argument to a date to allow date comparison:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if date(user.created_at) < date('-2days') %}
         {# do something #}
@@ -19,7 +13,7 @@ The argument must be in one of PHPâ??s supported `date and time formats`_.
 
 You can pass a timezone as the second argument:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if date(user.created_at) < date('-2days', 'Europe/Paris') %}
         {# do something #}
@@ -27,7 +21,7 @@ You can pass a timezone as the second argument:
 
 If no argument is passed, the function returns the current date:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if date(user.created_at) < date() %}
         {# always! #}
@@ -40,11 +34,8 @@ If no argument is passed, the function returns the current date:
 
     .. code-block:: php
 
-        $twig = new Twig_Environment($loader);
-        $twig->getExtension('Twig_Extension_Core')->setTimezone('Europe/Paris');
-
-        // before Twig 1.26
-        $twig->getExtension('core')->setTimezone('Europe/Paris');
+        $twig = new \Twig\Environment($loader);
+        $twig->getExtension(\Twig\Extension\CoreExtension::class)->setTimezone('Europe/Paris');
 
 Arguments
 ---------
@@ -52,4 +43,4 @@ Arguments
 * ``date``:     The date
 * ``timezone``: The timezone
 
-.. _`date and time formats`: http://php.net/manual/en/datetime.formats.php
+.. _`date and time formats`: https://secure.php.net/manual/en/datetime.formats.php
diff --git a/vendor/twig/twig/doc/functions/dump.rst b/vendor/twig/twig/doc/functions/dump.rst
index a231f089..b295b875 100644
--- a/vendor/twig/twig/doc/functions/dump.rst
+++ b/vendor/twig/twig/doc/functions/dump.rst
@@ -1,28 +1,25 @@
 ``dump``
 ========
 
-.. versionadded:: 1.5
-    The ``dump`` function was added in Twig 1.5.
-
 The ``dump`` function dumps information about a template variable. This is
 mostly useful to debug a template that does not behave as expected by
 introspecting its variables:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ dump(user) }}
 
 .. note::
 
     The ``dump`` function is not available by default. You must add the
-    ``Twig_Extension_Debug`` extension explicitly when creating your Twig
+    ``\Twig\Extension\DebugExtension`` extension explicitly when creating your Twig
     environment::
 
-        $twig = new Twig_Environment($loader, array(
+        $twig = new \Twig\Environment($loader, [
             'debug' => true,
             // ...
-        ));
-        $twig->addExtension(new Twig_Extension_Debug());
+        ]);
+        $twig->addExtension(new \Twig\Extension\DebugExtension());
 
     Even when enabled, the ``dump`` function won't display anything if the
     ``debug`` option on the environment is not enabled (to avoid leaking debug
@@ -31,7 +28,7 @@ introspecting its variables:
 In an HTML context, wrap the output with a ``pre`` tag to make it easier to
 read:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <pre>
         {{ dump(user) }}
@@ -45,14 +42,14 @@ read:
 
 You can debug several variables by passing them as additional arguments:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ dump(user, categories) }}
 
 If you don't pass any value, all variables from the current context are
 dumped:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ dump() }}
 
@@ -65,5 +62,5 @@ Arguments
 
 * ``context``: The context to dump
 
-.. _`XDebug`:   http://xdebug.org/docs/display
-.. _`var_dump`: http://php.net/var_dump
+.. _`XDebug`:   https://xdebug.org/docs/display
+.. _`var_dump`: https://secure.php.net/var_dump
diff --git a/vendor/twig/twig/doc/functions/include.rst b/vendor/twig/twig/doc/functions/include.rst
index 2f88ed77..f49971a8 100644
--- a/vendor/twig/twig/doc/functions/include.rst
+++ b/vendor/twig/twig/doc/functions/include.rst
@@ -1,12 +1,9 @@
 ``include``
 ===========
 
-.. versionadded:: 1.12
-    The ``include`` function was added in Twig 1.12.
-
 The ``include`` function returns the rendered content of a template:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ include('template.html') }}
     {{ include(some_var) }}
@@ -19,7 +16,7 @@ paths defined by it.
 The context is passed by default to the template but you can also pass
 additional variables:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# template.html will have access to the variables from the current context and the additional ones provided #}
     {{ include('template.html', {foo: 'bar'}) }}
@@ -27,40 +24,36 @@ additional variables:
 You can disable access to the context by setting ``with_context`` to
 ``false``:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# only the foo variable will be accessible #}
     {{ include('template.html', {foo: 'bar'}, with_context = false) }}
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# no variables will be accessible #}
     {{ include('template.html', with_context = false) }}
 
-And if the expression evaluates to a ``Twig_Template`` or a
-``Twig_TemplateWrapper`` instance, Twig will use it directly::
+And if the expression evaluates to a ``\Twig\Template`` or a
+``\Twig\TemplateWrapper`` instance, Twig will use it directly::
 
     // {{ include(template) }}
 
-    // deprecated as of Twig 1.28
-    $template = $twig->loadTemplate('some_template.twig');
-
-    // as of Twig 1.28
     $template = $twig->load('some_template.twig');
 
-    $twig->display('template.twig', array('template' => $template));
+    $twig->display('template.twig', ['template' => $template]);
 
 When you set the ``ignore_missing`` flag, Twig will return an empty string if
 the template does not exist:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ include('sidebar.html', ignore_missing = true) }}
 
 You can also provide a list of templates that are checked for existence before
 inclusion. The first template that exists will be rendered:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ include(['page_detailed.html', 'page.html']) }}
 
@@ -70,7 +63,7 @@ of the templates exist, otherwise it will throw an exception.
 When including a template created by an end user, you should consider
 sandboxing it:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ include('page.html', sandboxed = true) }}
 
diff --git a/vendor/twig/twig/doc/functions/max.rst b/vendor/twig/twig/doc/functions/max.rst
index 6f3cfc53..230b3c8f 100644
--- a/vendor/twig/twig/doc/functions/max.rst
+++ b/vendor/twig/twig/doc/functions/max.rst
@@ -1,19 +1,16 @@
 ``max``
 =======
 
-.. versionadded:: 1.15
-    The ``max`` function was added in Twig 1.15.
-
 ``max`` returns the biggest value of a sequence or a set of values:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ max(1, 3, 2) }}
     {{ max([1, 3, 2]) }}
 
 When called with a mapping, max ignores keys and only compares values:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ max({2: "e", 1: "a", 3: "b", 5: "d", 4: "c"}) }}
     {# returns "e" #}
diff --git a/vendor/twig/twig/doc/functions/min.rst b/vendor/twig/twig/doc/functions/min.rst
index 7b6a65e1..65318580 100644
--- a/vendor/twig/twig/doc/functions/min.rst
+++ b/vendor/twig/twig/doc/functions/min.rst
@@ -1,19 +1,16 @@
 ``min``
 =======
 
-.. versionadded:: 1.15
-    The ``min`` function was added in Twig 1.15.
-
 ``min`` returns the lowest value of a sequence or a set of values:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ min(1, 3, 2) }}
     {{ min([1, 3, 2]) }}
 
 When called with a mapping, min ignores keys and only compares values:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ min({2: "e", 3: "a", 1: "b", 5: "d", 4: "c"}) }}
     {# returns "a" #}
diff --git a/vendor/twig/twig/doc/functions/parent.rst b/vendor/twig/twig/doc/functions/parent.rst
index f5bd2001..9beb5d21 100644
--- a/vendor/twig/twig/doc/functions/parent.rst
+++ b/vendor/twig/twig/doc/functions/parent.rst
@@ -4,7 +4,7 @@
 When a template uses inheritance, it's possible to render the contents of the
 parent block when overriding a block by using the ``parent`` function:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends "base.html" %}
 
diff --git a/vendor/twig/twig/doc/functions/random.rst b/vendor/twig/twig/doc/functions/random.rst
index 168e74f8..baaaf962 100644
--- a/vendor/twig/twig/doc/functions/random.rst
+++ b/vendor/twig/twig/doc/functions/random.rst
@@ -1,11 +1,8 @@
 ``random``
 ==========
 
-.. versionadded:: 1.5
-    The ``random`` function was added in Twig 1.5.
-
-.. versionadded:: 1.6
-    String and integer handling was added in Twig 1.6.
+.. versionadded:: 2.7
+    The "max" argument was added in Twig 2.7.
 
 The ``random`` function returns a random value depending on the supplied
 parameter type:
@@ -13,17 +10,21 @@ parameter type:
 * a random item from a sequence;
 * a random character from a string;
 * a random integer between 0 and the integer parameter (inclusive).
+* a random integer between the integer parameter (when negative) and 0 (inclusive).
+* a random integer between the first integer and the second integer parameter (inclusive).
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ random(['apple', 'orange', 'citrus']) }} {# example output: orange #}
     {{ random('ABC') }}                         {# example output: C #}
     {{ random() }}                              {# example output: 15386094 (works as the native PHP mt_rand function) #}
     {{ random(5) }}                             {# example output: 3 #}
+    {{ random(50, 100) }}                       {# example output: 63 #}
 
 Arguments
 ---------
 
 * ``values``: The values
+* ``max``: The max value when values is an integer
 
-.. _`mt_rand`: http://php.net/mt_rand
+.. _`mt_rand`: https://secure.php.net/mt_rand
diff --git a/vendor/twig/twig/doc/functions/range.rst b/vendor/twig/twig/doc/functions/range.rst
index 5c9db089..a1f0e7c0 100644
--- a/vendor/twig/twig/doc/functions/range.rst
+++ b/vendor/twig/twig/doc/functions/range.rst
@@ -3,7 +3,7 @@
 
 Returns a list containing an arithmetic progression of integers:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for i in range(0, 3) %}
         {{ i }},
@@ -14,7 +14,7 @@ Returns a list containing an arithmetic progression of integers:
 When step is given (as the third parameter), it specifies the increment (or
 decrement for negative values):
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for i in range(0, 6, 2) %}
         {{ i }},
@@ -27,7 +27,7 @@ decrement for negative values):
     Note that if the start is greater than the end, ``range`` assumes a step of
     ``-1``:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% for i in range(3, 0) %}
             {{ i }},
@@ -38,7 +38,7 @@ decrement for negative values):
 The Twig built-in ``..`` operator is just syntactic sugar for the ``range``
 function (with a step of ``1``, or ``-1`` if the start is greater than the end):
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for i in 0..3 %}
         {{ i }},
@@ -55,4 +55,4 @@ Arguments
 * ``high``: The highest possible value of the sequence.
 * ``step``: The increment between elements of the sequence.
 
-.. _`range`: http://php.net/range
+.. _`range`: https://secure.php.net/range
diff --git a/vendor/twig/twig/doc/functions/source.rst b/vendor/twig/twig/doc/functions/source.rst
index 3c921b1c..080e2bef 100644
--- a/vendor/twig/twig/doc/functions/source.rst
+++ b/vendor/twig/twig/doc/functions/source.rst
@@ -1,15 +1,9 @@
 ``source``
 ==========
 
-.. versionadded:: 1.15
-    The ``source`` function was added in Twig 1.15.
-
-.. versionadded:: 1.18.3
-    The ``ignore_missing`` flag was added in Twig 1.18.3.
-
 The ``source`` function returns the content of a template without rendering it:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ source('template.html') }}
     {{ source(some_var) }}
@@ -17,7 +11,7 @@ The ``source`` function returns the content of a template without rendering it:
 When you set the ``ignore_missing`` flag, Twig will return an empty string if
 the template does not exist:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ source('template.html', ignore_missing = true) }}
 
diff --git a/vendor/twig/twig/doc/functions/template_from_string.rst b/vendor/twig/twig/doc/functions/template_from_string.rst
index ce6a60dc..fd61871c 100644
--- a/vendor/twig/twig/doc/functions/template_from_string.rst
+++ b/vendor/twig/twig/doc/functions/template_from_string.rst
@@ -1,24 +1,31 @@
 ``template_from_string``
 ========================
 
-.. versionadded:: 1.11
-    The ``template_from_string`` function was added in Twig 1.11.
+.. versionadded:: 2.8
+    The name argument was added in Twig 2.8.
 
 The ``template_from_string`` function loads a template from a string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ include(template_from_string("Hello {{ name }}")) }}
     {{ include(template_from_string(page.template)) }}
 
+To ease debugging, you can also give the template a name that will be part of
+any related error message:
+
+.. code-block:: twig
+
+    {{ include(template_from_string(page.template, "template for page " ~ page.name)) }}
+
 .. note::
 
     The ``template_from_string`` function is not available by default. You
-    must add the ``Twig_Extension_StringLoader`` extension explicitly when
+    must add the ``\Twig\Extension\StringLoaderExtension`` extension explicitly when
     creating your Twig environment::
 
-        $twig = new Twig_Environment(...);
-        $twig->addExtension(new Twig_Extension_StringLoader());
+        $twig = new \Twig\Environment(...);
+        $twig->addExtension(new \Twig\Extension\StringLoaderExtension());
 
 .. note::
 
@@ -30,3 +37,4 @@ Arguments
 ---------
 
 * ``template``: The template
+* ``name``: A name for the template
diff --git a/vendor/twig/twig/doc/installation.rst b/vendor/twig/twig/doc/installation.rst
index afdcf165..d6bd29ac 100644
--- a/vendor/twig/twig/doc/installation.rst
+++ b/vendor/twig/twig/doc/installation.rst
@@ -1,116 +1,10 @@
 Installation
 ============
 
-You have multiple ways to install Twig.
-
-Installing the Twig PHP package
--------------------------------
-
-Installing via Composer (recommended)
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
 Install `Composer`_ and run the following command to get the latest version:
 
 .. code-block:: bash
 
-    composer require twig/twig:~1.0
-
-Installing from the tarball release
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-1. Download the most recent tarball from the `download page`_
-2. Verify the integrity of the tarball http://fabien.potencier.org/article/73/signing-project-releases
-3. Unpack the tarball
-4. Move the files somewhere in your project
-
-Installing the development version
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. code-block:: bash
-
-    git clone git://github.com/twigphp/Twig.git
-
-Installing the PEAR package
-~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-.. note::
-
-    Using PEAR for installing Twig is deprecated and Twig 1.15.1 was the last
-    version published on the PEAR channel; use Composer instead.
-
-.. code-block:: bash
-
-    pear channel-discover pear.twig-project.org
-    pear install twig/Twig
-
-Installing the C extension
---------------------------
-
-.. versionadded:: 1.4
-    The C extension was added in Twig 1.4.
-
-.. note::
-
-    The C extension is **optional** but it brings some nice performance
-    improvements. Note that the extension is not a replacement for the PHP
-    code; it only implements a small part of the PHP code to improve the
-    performance at runtime; you must still install the regular PHP code.
-
-Twig comes with a C extension that enhances the performance of the Twig
-runtime engine; install it like any other PHP extensions:
-
-.. code-block:: bash
-
-    cd ext/twig
-    phpize
-    ./configure
-    make
-    make install
-
-.. note::
-
-    You can also install the C extension via PEAR (note that this method is
-    deprecated and newer versions of Twig are not available on the PEAR
-    channel):
-
-    .. code-block:: bash
-
-        pear channel-discover pear.twig-project.org
-        pear install twig/CTwig
-
-For Windows:
-
-1. Setup the build environment following the `PHP documentation`_
-2. Put Twig's C extension source code into ``C:\php-sdk\phpdev\vcXX\x86\php-source-directory\ext\twig``
-3. Use the ``configure --disable-all --enable-cli --enable-twig=shared`` command instead of step 14
-4. ``nmake``
-5. Copy the ``C:\php-sdk\phpdev\vcXX\x86\php-source-directory\Release_TS\php_twig.dll`` file to your PHP setup.
-
-.. tip::
-
-    For Windows ZendServer, ZTS is not enabled as mentioned in `Zend Server
-    FAQ`_.
-
-    You have to use ``configure --disable-all --disable-zts --enable-cli
-    --enable-twig=shared`` to be able to build the twig C extension for
-    ZendServer.
-
-    The built DLL will be available in
-    ``C:\\php-sdk\\phpdev\\vcXX\\x86\\php-source-directory\\Release``
-
-Finally, enable the extension in your ``php.ini`` configuration file:
-
-.. code-block:: ini
-
-    extension=twig.so #For Unix systems
-    extension=php_twig.dll #For Windows systems
-
-And from now on, Twig will automatically compile your templates to take
-advantage of the C extension. Note that this extension does not replace the
-PHP code but only provides an optimized version of the
-``Twig_Template::getAttribute()`` method.
+    composer require "twig/twig:^2.0"
 
-.. _`download page`:     https://github.com/twigphp/Twig/tags
-.. _`Composer`:          https://getcomposer.org/download/
-.. _`PHP documentation`: https://wiki.php.net/internals/windows/stepbystepbuild
-.. _`Zend Server FAQ`:   http://www.zend.com/en/products/server/faq#faqD6
+.. _`Composer`: https://getcomposer.org/download/
diff --git a/vendor/twig/twig/doc/internals.rst b/vendor/twig/twig/doc/internals.rst
index fec65e00..1a3c6084 100644
--- a/vendor/twig/twig/doc/internals.rst
+++ b/vendor/twig/twig/doc/internals.rst
@@ -16,39 +16,37 @@ The rendering of a Twig template can be summarized into four key steps:
 
   * First, the **lexer** tokenizes the template source code into small pieces
     for easier processing;
+
   * Then, the **parser** converts the token stream into a meaningful tree
     of nodes (the Abstract Syntax Tree);
-  * Eventually, the *compiler* transforms the AST into PHP code.
 
-* **Evaluate** the template: It basically means calling the ``display()``
+  * Finally, the *compiler* transforms the AST into PHP code.
+
+* **Evaluate** the template: It means calling the ``display()``
   method of the compiled template and passing it the context.
 
 The Lexer
 ---------
 
 The lexer tokenizes a template source code into a token stream (each token is
-an instance of ``Twig_Token``, and the stream is an instance of
-``Twig_TokenStream``). The default lexer recognizes 13 different token types:
-
-* ``Twig_Token::BLOCK_START_TYPE``, ``Twig_Token::BLOCK_END_TYPE``: Delimiters for blocks (``{% %}``)
-* ``Twig_Token::VAR_START_TYPE``, ``Twig_Token::VAR_END_TYPE``: Delimiters for variables (``{{ }}``)
-* ``Twig_Token::TEXT_TYPE``: A text outside an expression;
-* ``Twig_Token::NAME_TYPE``: A name in an expression;
-* ``Twig_Token::NUMBER_TYPE``: A number in an expression;
-* ``Twig_Token::STRING_TYPE``: A string in an expression;
-* ``Twig_Token::OPERATOR_TYPE``: An operator;
-* ``Twig_Token::PUNCTUATION_TYPE``: A punctuation sign;
-* ``Twig_Token::INTERPOLATION_START_TYPE``, ``Twig_Token::INTERPOLATION_END_TYPE`` (as of Twig 1.5): Delimiters for string interpolation;
-* ``Twig_Token::EOF_TYPE``: Ends of template.
+an instance of ``\Twig\Token``, and the stream is an instance of
+``\Twig\TokenStream``). The default lexer recognizes 13 different token types:
+
+* ``\Twig\Token::BLOCK_START_TYPE``, ``\Twig\Token::BLOCK_END_TYPE``: Delimiters for blocks (``{% %}``)
+* ``\Twig\Token::VAR_START_TYPE``, ``\Twig\Token::VAR_END_TYPE``: Delimiters for variables (``{{ }}``)
+* ``\Twig\Token::TEXT_TYPE``: A text outside an expression;
+* ``\Twig\Token::NAME_TYPE``: A name in an expression;
+* ``\Twig\Token::NUMBER_TYPE``: A number in an expression;
+* ``\Twig\Token::STRING_TYPE``: A string in an expression;
+* ``\Twig\Token::OPERATOR_TYPE``: An operator;
+* ``\Twig\Token::PUNCTUATION_TYPE``: A punctuation sign;
+* ``\Twig\Token::INTERPOLATION_START_TYPE``, ``\Twig\Token::INTERPOLATION_END_TYPE``: Delimiters for string interpolation;
+* ``\Twig\Token::EOF_TYPE``: Ends of template.
 
 You can manually convert a source code into a token stream by calling the
 ``tokenize()`` method of an environment::
 
-    $stream = $twig->tokenize(new Twig_Source($source, $identifier));
-
-.. versionadded:: 1.27
-    ``Twig_Source`` was introduced in version 1.27, pass the source and the
-    identifier directly on previous versions.
+    $stream = $twig->tokenize(new \Twig\Source($source, $identifier));
 
 As the stream has a ``__toString()`` method, you can have a textual
 representation of it by echoing the object::
@@ -67,7 +65,7 @@ Here is the output for the ``Hello {{ name }}`` template:
 
 .. note::
 
-    The default lexer (``Twig_Lexer``) can be changed by calling
+    The default lexer (``\Twig\Lexer``) can be changed by calling
     the ``setLexer()`` method::
 
         $twig->setLexer($lexer);
@@ -76,7 +74,7 @@ The Parser
 ----------
 
 The parser converts the token stream into an AST (Abstract Syntax Tree), or a
-node tree (an instance of ``Twig_Node_Module``). The core extension defines
+node tree (an instance of ``\Twig\Node\ModuleNode``). The core extension defines
 the basic nodes like: ``for``, ``if``, ... and the expression nodes.
 
 You can manually convert a token stream into a node tree by calling the
@@ -92,16 +90,16 @@ Here is the output for the ``Hello {{ name }}`` template:
 
 .. code-block:: text
 
-    Twig_Node_Module(
-      Twig_Node_Text(Hello )
-      Twig_Node_Print(
-        Twig_Node_Expression_Name(name)
+    \Twig\Node\ModuleNode(
+      \Twig\Node\TextNode(Hello )
+      \Twig\Node\PrintNode(
+        \Twig\Node\Expression\NameExpression(name)
       )
     )
 
 .. note::
 
-    The default parser (``Twig_TokenParser``) can be changed by calling the
+    The default parser (``\Twig\TokenParser\AbstractTokenParser``) can be changed by calling the
     ``setParser()`` method::
 
         $twig->setParser($parser);
@@ -122,9 +120,9 @@ The generated template for a ``Hello {{ name }}`` template reads as follows
 using)::
 
     /* Hello {{ name }} */
-    class __TwigTemplate_1121b6f109fe93ebe8c6e22e3712bceb extends Twig_Template
+    class __TwigTemplate_1121b6f109fe93ebe8c6e22e3712bceb extends \Twig\Template
     {
-        protected function doDisplay(array $context, array $blocks = array())
+        protected function doDisplay(array $context, array $blocks = [])
         {
             // line 1
             echo "Hello ";
@@ -136,7 +134,7 @@ using)::
 
 .. note::
 
-    The default compiler (``Twig_Compiler``) can be changed by calling the
+    The default compiler (``\Twig\Compiler``) can be changed by calling the
     ``setCompiler()`` method::
 
         $twig->setCompiler($compiler);
diff --git a/vendor/twig/twig/doc/intro.rst b/vendor/twig/twig/doc/intro.rst
index d631430f..c477c783 100644
--- a/vendor/twig/twig/doc/intro.rst
+++ b/vendor/twig/twig/doc/intro.rst
@@ -1,13 +1,11 @@
 Introduction
 ============
 
-This is the documentation for Twig, the flexible, fast, and secure template
+Welcome to the documentation for Twig, the flexible, fast, and secure template
 engine for PHP.
 
-If you have any exposure to other text-based template languages, such as
-Smarty, Django, or Jinja, you should feel right at home with Twig. It's both
-designer and developer friendly by sticking to PHP's principles and adding
-functionality useful for templating environments.
+Twig is both designer and developer friendly by sticking to PHP's principles and
+adding functionality useful for templating environments.
 
 The key-features are...
 
@@ -22,14 +20,13 @@ The key-features are...
   developer to define their own custom tags and filters, and to create their own DSL.
 
 Twig is used by many Open-Source projects like Symfony, Drupal8, eZPublish,
-phpBB, Piwik, OroCRM; and many frameworks have support for it as well like
-Slim, Yii, Laravel, Codeigniter and Kohana â?? just to name a few.
+phpBB, Matomo, OroCRM; and many frameworks have support for it as well like
+Slim, Yii, Laravel, and Codeigniter â?? just to name a few.
 
 Prerequisites
 -------------
 
-Twig needs at least **PHP 5.2.7** to run. As of 1.34, the minimum requirement
-was bumped to **PHP 5.3.3**.
+Twig needs at least **PHP 7.0.0** to run.
 
 Installation
 ------------
@@ -38,13 +35,7 @@ The recommended way to install Twig is via Composer:
 
 .. code-block:: bash
 
-    composer require "twig/twig:~1.0"
-
-.. note::
-
-    To learn more about the other installation methods, read the
-    :doc:`installation<installation>` chapter; it also explains how to install
-    the Twig C extension.
+    composer require "twig/twig:^2.0"
 
 Basic API Usage
 ---------------
@@ -55,15 +46,15 @@ This section gives you a brief introduction to the PHP API for Twig.
 
     require_once '/path/to/vendor/autoload.php';
 
-    $loader = new Twig_Loader_Array(array(
+    $loader = new \Twig\Loader\ArrayLoader([
         'index' => 'Hello {{ name }}!',
-    ));
-    $twig = new Twig_Environment($loader);
+    ]);
+    $twig = new \Twig\Environment($loader);
 
-    echo $twig->render('index', array('name' => 'Fabien'));
+    echo $twig->render('index', ['name' => 'Fabien']);
 
-Twig uses a loader (``Twig_Loader_Array``) to locate templates, and an
-environment (``Twig_Environment``) to store the configuration.
+Twig uses a loader (``\Twig\Loader\ArrayLoader``) to locate templates, and an
+environment (``\Twig\Environment``) to store its configuration.
 
 The ``render()`` method loads the template passed as a first argument and
 renders it with the variables passed as a second argument.
@@ -71,16 +62,9 @@ renders it with the variables passed as a second argument.
 As templates are generally stored on the filesystem, Twig also comes with a
 filesystem loader::
 
-    $loader = new Twig_Loader_Filesystem('/path/to/templates');
-    $twig = new Twig_Environment($loader, array(
+    $loader = new \Twig\Loader\FilesystemLoader('/path/to/templates');
+    $twig = new \Twig\Environment($loader, [
         'cache' => '/path/to/compilation_cache',
-    ));
-
-    echo $twig->render('index.html', array('name' => 'Fabien'));
-
-.. tip::
-
-    If you are not using Composer, use the Twig built-in autoloader::
+    ]);
 
-        require_once '/path/to/lib/Twig/Autoloader.php';
-        Twig_Autoloader::register();
+    echo $twig->render('index.html', ['name' => 'Fabien']);
diff --git a/vendor/twig/twig/doc/recipes.rst b/vendor/twig/twig/doc/recipes.rst
index b3ba7f4d..41e759e3 100644
--- a/vendor/twig/twig/doc/recipes.rst
+++ b/vendor/twig/twig/doc/recipes.rst
@@ -6,21 +6,18 @@ Recipes
 Displaying Deprecation Notices
 ------------------------------
 
-.. versionadded:: 1.21
-    This works as of Twig 1.21.
-
 Deprecated features generate deprecation notices (via a call to the
 ``trigger_error()`` PHP function). By default, they are silenced and never
 displayed nor logged.
 
-To easily remove all deprecated feature usages from your templates, write and
-run a script along the lines of the following::
+To remove all deprecated feature usages from your templates, write and run a
+script along the lines of the following::
 
     require_once __DIR__.'/vendor/autoload.php';
 
     $twig = create_your_twig_env();
 
-    $deprecations = new Twig_Util_DeprecationCollector($twig);
+    $deprecations = new \Twig\Util\DeprecationCollector($twig);
 
     print_r($deprecations->collectDir(__DIR__.'/templates'));
 
@@ -32,13 +29,13 @@ catches deprecation notices, and return them.
     If your templates are not stored on the filesystem, use the ``collect()``
     method instead. ``collect()`` takes a ``Traversable`` which must return
     template names as keys and template contents as values (as done by
-    ``Twig_Util_TemplateDirIterator``).
+    ``\Twig\Util\TemplateDirIterator``).
 
 However, this code won't find all deprecations (like using deprecated some Twig
 classes). To catch all notices, register a custom error handler like the one
 below::
 
-    $deprecations = array();
+    $deprecations = [];
     set_error_handler(function ($type, $msg) use (&$deprecations) {
         if (E_USER_DEPRECATED === $type) {
             $deprecations[] = $msg;
@@ -57,7 +54,7 @@ they won't be generated when templates are already cached.
     If you want to manage the deprecation notices from your PHPUnit tests, have
     a look at the `symfony/phpunit-bridge
     <https://github.com/symfony/phpunit-bridge>`_ package, which eases the
-    process a lot.
+    process.
 
 Making a Layout conditional
 ---------------------------
@@ -67,7 +64,7 @@ and sometimes decorated with a layout. As Twig layout template names can be
 any valid expression, you can pass a variable that evaluates to ``true`` when
 the request is made via Ajax and choose the layout accordingly:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends request.ajax ? "base_ajax.html" : "base.html" %}
 
@@ -81,7 +78,7 @@ Making an Include dynamic
 When including a template, its name does not need to be a string. For
 instance, the name can depend on the value of a variable:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% include var ~ '_foo.html' %}
 
@@ -91,7 +88,7 @@ rendered.
 As a matter of fact, the template name can be any valid expression, such as
 the following:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% include var|default('index') ~ '_foo.html' %}
 
@@ -114,7 +111,7 @@ Let's say that your templates are loaded from both ``.../templates/mysite``
 and ``.../templates/default`` in this order. The ``page.twig`` template,
 stored in ``.../templates/default`` reads as follows:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# page.twig #}
     {% extends "layout.twig" %}
@@ -126,7 +123,7 @@ You can replace this template by putting a file with the same name in
 ``.../templates/mysite``. And if you want to extend the original template, you
 might be tempted to write the following:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# page.twig in .../templates/mysite #}
     {% extends "page.twig" %} {# from .../templates/default #}
@@ -142,7 +139,7 @@ time you will use the "normal" paths, but in the special case of wanting to
 extend a template with an overriding version of itself we can reference its
 parent's full, unambiguous template path in the extends tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# page.twig in .../templates/mysite #}
     {% extends "default/page.twig" %} {# from .../templates #}
@@ -150,50 +147,50 @@ parent's full, unambiguous template path in the extends tag:
 .. note::
 
     This recipe was inspired by the following Django wiki page:
-    http://code.djangoproject.com/wiki/ExtendingTemplates
+    https://code.djangoproject.com/wiki/ExtendingTemplates
 
 Customizing the Syntax
 ----------------------
 
-Twig allows some syntax customization for the block delimiters. It's not
+Twig allows some syntax customization for the block delimiters. It's **not**
 recommended to use this feature as templates will be tied with your custom
 syntax. But for specific projects, it can make sense to change the defaults.
 
 To change the block delimiters, you need to create your own lexer object::
 
-    $twig = new Twig_Environment();
+    $twig = new \Twig\Environment(...);
 
-    $lexer = new Twig_Lexer($twig, array(
-        'tag_comment'   => array('{#', '#}'),
-        'tag_block'     => array('{%', '%}'),
-        'tag_variable'  => array('{{', '}}'),
-        'interpolation' => array('#{', '}'),
-    ));
+    $lexer = new \Twig\Lexer($twig, [
+        'tag_comment'   => ['{#', '#}'],
+        'tag_block'     => ['{%', '%}'],
+        'tag_variable'  => ['{{', '}}'],
+        'interpolation' => ['#{', '}'],
+    ]);
     $twig->setLexer($lexer);
 
 Here are some configuration example that simulates some other template engines
 syntax::
 
     // Ruby erb syntax
-    $lexer = new Twig_Lexer($twig, array(
-        'tag_comment'  => array('<%#', '%>'),
-        'tag_block'    => array('<%', '%>'),
-        'tag_variable' => array('<%=', '%>'),
-    ));
+    $lexer = new \Twig\Lexer($twig, [
+        'tag_comment'  => ['<%#', '%>'],
+        'tag_block'    => ['<%', '%>'],
+        'tag_variable' => ['<%=', '%>'],
+    ]);
 
     // SGML Comment Syntax
-    $lexer = new Twig_Lexer($twig, array(
-        'tag_comment'  => array('<!--#', '-->'),
-        'tag_block'    => array('<!--', '-->'),
-        'tag_variable' => array('${', '}'),
-    ));
+    $lexer = new \Twig\Lexer($twig, [
+        'tag_comment'  => ['<!--#', '-->'],
+        'tag_block'    => ['<!--', '-->'],
+        'tag_variable' => ['${', '}'],
+    ]);
 
     // Smarty like
-    $lexer = new Twig_Lexer($twig, array(
-        'tag_comment'  => array('{*', '*}'),
-        'tag_block'    => array('{', '}'),
-        'tag_variable' => array('{$', '}'),
-    ));
+    $lexer = new \Twig\Lexer($twig, [
+        'tag_comment'  => ['{*', '*}'],
+        'tag_block'    => ['{', '}'],
+        'tag_variable' => ['{$', '}'],
+    ]);
 
 Using dynamic Object Properties
 -------------------------------
@@ -202,7 +199,7 @@ When Twig encounters a variable like ``article.title``, it tries to find a
 ``title`` public property in the ``article`` object.
 
 It also works if the property does not exist but is rather defined dynamically
-thanks to the magic ``__get()`` method; you just need to also implement the
+thanks to the magic ``__get()`` method; you need to also implement the
 ``__isset()`` magic method like shown in the following snippet of code::
 
     class Article
@@ -233,16 +230,16 @@ Sometimes, when using nested loops, you need to access the parent context. The
 parent context is always accessible via the ``loop.parent`` variable. For
 instance, if you have the following template data::
 
-    $data = array(
-        'topics' => array(
-            'topic1' => array('Message 1 of topic 1', 'Message 2 of topic 1'),
-            'topic2' => array('Message 1 of topic 2', 'Message 2 of topic 2'),
-        ),
-    );
+    $data = [
+        'topics' => [
+            'topic1' => ['Message 1 of topic 1', 'Message 2 of topic 1'],
+            'topic2' => ['Message 1 of topic 2', 'Message 2 of topic 2'],
+        ],
+    ];
 
 And the following template to display all messages in all topics:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for topic, messages in topics %}
         * {{ loop.index }}: {{ topic }}
@@ -270,7 +267,7 @@ Defining undefined Functions and Filters on the Fly
 ---------------------------------------------------
 
 When a function (or a filter) is not defined, Twig defaults to throw a
-``Twig_Error_Syntax`` exception. However, it can also call a `callback`_ (any
+``\Twig\Error\SyntaxError`` exception. However, it can also call a `callback`_ (any
 valid PHP callable) which should return a function (or a filter).
 
 For filters, register callbacks with ``registerUndefinedFilterCallback()``.
@@ -280,7 +277,7 @@ For functions, use ``registerUndefinedFunctionCallback()``::
     // don't try this at home as it's not secure at all!
     $twig->registerUndefinedFunctionCallback(function ($name) {
         if (function_exists($name)) {
-            return new Twig_SimpleFunction($name, $name);
+            return new \Twig\TwigFunction($name, $name);
         }
 
         return false;
@@ -306,10 +303,10 @@ saving it. If the template code is stored in a `$template` variable, here is
 how you can do it::
 
     try {
-        $twig->parse($twig->tokenize(new Twig_Source($template)));
+        $twig->parse($twig->tokenize(new \Twig\Source($template)));
 
         // the $template is valid
-    } catch (Twig_Error_Syntax $e) {
+    } catch (\Twig\Error\SyntaxError $e) {
         // $template contains one or more syntax errors
     }
 
@@ -318,18 +315,14 @@ If you iterate over a set of files, you can pass the filename to the
 
     foreach ($files as $file) {
         try {
-            $twig->parse($twig->tokenize(new Twig_Source($template, $file->getFilename(), $file)));
+            $twig->parse($twig->tokenize(new \Twig\Source($template, $file->getFilename(), $file)));
 
             // the $template is valid
-        } catch (Twig_Error_Syntax $e) {
+        } catch (\Twig\Error\SyntaxError $e) {
             // $template contains one or more syntax errors
         }
     }
 
-.. versionadded:: 1.27
-    ``Twig_Source`` was introduced in version 1.27, pass the source and the
-    identifier directly on previous versions.
-
 .. note::
 
     This method won't catch any sandbox policy violations because the policy
@@ -345,46 +338,27 @@ cache won't update the cache.
 
 To get around this, force Twig to invalidate the bytecode cache::
 
-    $twig = new Twig_Environment($loader, array(
-        'cache' => new Twig_Cache_Filesystem('/some/cache/path', Twig_Cache_Filesystem::FORCE_BYTECODE_INVALIDATION),
+    $twig = new \Twig\Environment($loader, [
+        'cache' => new \Twig\Cache\FilesystemCache('/some/cache/path', \Twig\Cache\FilesystemCache::FORCE_BYTECODE_INVALIDATION),
         // ...
-    ));
-
-.. note::
-
-    Before Twig 1.22, you should extend ``Twig_Environment`` instead::
-
-        class OpCacheAwareTwigEnvironment extends Twig_Environment
-        {
-            protected function writeCacheFile($file, $content)
-            {
-                parent::writeCacheFile($file, $content);
-
-                // Compile cached file into bytecode cache
-                if (function_exists('opcache_invalidate')) {
-                    opcache_invalidate($file, true);
-                } elseif (function_exists('apc_compile_file')) {
-                    apc_compile_file($file);
-                }
-            }
-        }
+    ]);
 
 Reusing a stateful Node Visitor
 -------------------------------
 
-When attaching a visitor to a ``Twig_Environment`` instance, Twig uses it to
+When attaching a visitor to a ``\Twig\Environment`` instance, Twig uses it to
 visit *all* templates it compiles. If you need to keep some state information
 around, you probably want to reset it when visiting a new template.
 
 This can be easily achieved with the following code::
 
-    protected $someTemplateState = array();
+    protected $someTemplateState = [];
 
-    public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
+    public function enterNode(\Twig\Node\Node $node, \Twig\Environment $env)
     {
-        if ($node instanceof Twig_Node_Module) {
+        if ($node instanceof \Twig\Node\ModuleNode) {
             // reset the state as we are entering a new template
-            $this->someTemplateState = array();
+            $this->someTemplateState = [];
         }
 
         // ...
@@ -409,15 +383,15 @@ First, let's create a temporary in-memory SQLite3 database to work with::
     {% block content %}Hello {{ name }}{% endblock %}
     ';
     $now = time();
-    $dbh->exec("INSERT INTO templates (name, source, last_modified) VALUES ('base.twig', '$base', $now)");
-    $dbh->exec("INSERT INTO templates (name, source, last_modified) VALUES ('index.twig', '$index', $now)");
+    $dbh->prepare('INSERT INTO templates (name, source, last_modified) VALUES (?, ?, ?)')->execute(['base.twig', $base, $now]);
+    $dbh->prepare('INSERT INTO templates (name, source, last_modified) VALUES (?, ?, ?)')->execute(['index.twig', $index, $now]);
 
 We have created a simple ``templates`` table that hosts two templates:
 ``base.twig`` and ``index.twig``.
 
 Now, let's define a loader able to use this database::
 
-    class DatabaseTwigLoader implements Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
+    class DatabaseTwigLoader implements \Twig\Loader\LoaderInterface
     {
         protected $dbh;
 
@@ -426,26 +400,15 @@ Now, let's define a loader able to use this database::
             $this->dbh = $dbh;
         }
 
-        public function getSource($name)
-        {
-            if (false === $source = $this->getValue('source', $name)) {
-                throw new Twig_Error_Loader(sprintf('Template "%s" does not exist.', $name));
-            }
-
-            return $source;
-        }
-
-        // Twig_SourceContextLoaderInterface as of Twig 1.27
         public function getSourceContext($name)
         {
             if (false === $source = $this->getValue('source', $name)) {
-                throw new Twig_Error_Loader(sprintf('Template "%s" does not exist.', $name));
+                throw new \Twig\Error\LoaderError(sprintf('Template "%s" does not exist.', $name));
             }
 
-            return new Twig_Source($source, $name);
+            return new \Twig\Source($source, $name);
         }
 
-        // Twig_ExistsLoaderInterface as of Twig 1.11
         public function exists($name)
         {
             return $name === $this->getValue('name', $name);
@@ -468,7 +431,7 @@ Now, let's define a loader able to use this database::
         protected function getValue($column, $name)
         {
             $sth = $this->dbh->prepare('SELECT '.$column.' FROM templates WHERE name = :name');
-            $sth->execute(array(':name' => (string) $name));
+            $sth->execute([':name' => (string) $name]);
 
             return $sth->fetchColumn();
         }
@@ -477,9 +440,9 @@ Now, let's define a loader able to use this database::
 Finally, here is an example on how you can use it::
 
     $loader = new DatabaseTwigLoader($dbh);
-    $twig = new Twig_Environment($loader);
+    $twig = new \Twig\Environment($loader);
 
-    echo $twig->render('index.twig', array('name' => 'Fabien'));
+    echo $twig->render('index.twig', ['name' => 'Fabien']);
 
 Using different Template Sources
 --------------------------------
@@ -487,7 +450,7 @@ Using different Template Sources
 This recipe is the continuation of the previous one. Even if you store the
 contributed templates in a database, you might want to keep the original/base
 templates on the filesystem. When templates can be loaded from different
-sources, you need to use the ``Twig_Loader_Chain`` loader.
+sources, you need to use the ``\Twig\Loader\ChainLoader`` loader.
 
 As you can see in the previous recipe, we reference the template in the exact
 same way as we would have done it with a regular filesystem loader. This is
@@ -496,14 +459,14 @@ filesystem, or any other loader for that matter: the template name should be a
 logical name, and not the path from the filesystem::
 
     $loader1 = new DatabaseTwigLoader($dbh);
-    $loader2 = new Twig_Loader_Array(array(
+    $loader2 = new \Twig\Loader\ArrayLoader([
         'base.twig' => '{% block content %}{% endblock %}',
-    ));
-    $loader = new Twig_Loader_Chain(array($loader1, $loader2));
+    ]);
+    $loader = new \Twig\Loader\ChainLoader([$loader1, $loader2]);
 
-    $twig = new Twig_Environment($loader);
+    $twig = new \Twig\Environment($loader);
 
-    echo $twig->render('index.twig', array('name' => 'Fabien'));
+    echo $twig->render('index.twig', ['name' => 'Fabien']);
 
 Now that the ``base.twig`` templates is defined in an array loader, you can
 remove it from the database, and everything else will still work as before.
@@ -512,22 +475,18 @@ Loading a Template from a String
 --------------------------------
 
 From a template, you can easily load a template stored in a string via the
-``template_from_string`` function (available as of Twig 1.11 via the
-``Twig_Extension_StringLoader`` extension):
+``template_from_string`` function (via the ``\Twig\Extension\StringLoaderExtension``
+extension):
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ include(template_from_string("Hello {{ name }}")) }}
 
 From PHP, it's also possible to load a template stored in a string via
-``Twig_Environment::createTemplate()`` (available as of Twig 1.18)::
+``\Twig\Environment::createTemplate()``::
 
     $template = $twig->createTemplate('hello {{ name }}');
-    echo $template->render(array('name' => 'Fabien'));
-
-.. note::
-
-    Never use the ``Twig_Loader_String`` loader, which has severe limitations.
+    echo $template->render(['name' => 'Fabien']);
 
 Using Twig and AngularJS in the same Templates
 ----------------------------------------------
@@ -561,8 +520,8 @@ include in your templates:
 
     ..  code-block:: php
 
-        $env->setLexer(new Twig_Lexer($env, array(
-            'tag_variable' => array('{[', ']}'),
-        )));
+        $env->setLexer(new \Twig\Lexer($env, [
+            'tag_variable' => ['{[', ']}'],
+        ]));
 
-.. _callback: http://www.php.net/manual/en/function.is-callable.php
+.. _callback: https://secure.php.net/manual/en/function.is-callable.php
diff --git a/vendor/twig/twig/doc/tags/apply.rst b/vendor/twig/twig/doc/tags/apply.rst
new file mode 100644
index 00000000..2c3b00c0
--- /dev/null
+++ b/vendor/twig/twig/doc/tags/apply.rst
@@ -0,0 +1,23 @@
+``apply``
+=========
+
+.. versionadded:: 2.9
+    The ``apply`` tag was added in Twig 2.9.
+
+The ``apply`` tag allows you to apply Twig filters on a block of template data:
+
+.. code-block:: twig
+
+    {% apply upper %}
+        This text becomes uppercase
+    {% endapply %}
+
+You can also chain filters and pass arguments to them:
+
+.. code-block:: twig
+
+    {% apply lower|escape('html') %}
+        <strong>SOME TEXT</strong>
+    {% endapply %}
+
+    {# outputs "&lt;strong&gt;some text&lt;/strong&gt;" #}
diff --git a/vendor/twig/twig/doc/tags/autoescape.rst b/vendor/twig/twig/doc/tags/autoescape.rst
index 8aa8c75d..520d779d 100644
--- a/vendor/twig/twig/doc/tags/autoescape.rst
+++ b/vendor/twig/twig/doc/tags/autoescape.rst
@@ -4,7 +4,7 @@
 Whether automatic escaping is enabled or not, you can mark a section of a
 template to be escaped or not by using the ``autoescape`` tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% autoescape %}
         Everything will be automatically escaped in this block
@@ -25,31 +25,11 @@ template to be escaped or not by using the ``autoescape`` tag:
         Everything will be outputted as is in this block
     {% endautoescape %}
 
-.. note::
-
-    Before Twig 1.8, the syntax was different:
-
-    .. code-block:: jinja
-
-        {% autoescape true %}
-            Everything will be automatically escaped in this block
-            using the HTML strategy
-        {% endautoescape %}
-
-        {% autoescape false %}
-            Everything will be outputted as is in this block
-        {% endautoescape %}
-
-        {% autoescape true js %}
-            Everything will be automatically escaped in this block
-            using the js escaping strategy
-        {% endautoescape %}
-
 When automatic escaping is enabled everything is escaped by default except for
 values explicitly marked as safe. Those can be marked in the template by using
 the :doc:`raw<../filters/raw>` filter:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% autoescape %}
         {{ safe_value|raw }}
@@ -67,7 +47,7 @@ Functions returning template data (like :doc:`macros<macro>` and
 
     Twig does not escape static expressions:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% set hello = "<strong>Hello</strong>" %}
         {{ hello }}
diff --git a/vendor/twig/twig/doc/tags/deprecated.rst b/vendor/twig/twig/doc/tags/deprecated.rst
new file mode 100644
index 00000000..70b81f81
--- /dev/null
+++ b/vendor/twig/twig/doc/tags/deprecated.rst
@@ -0,0 +1,30 @@
+``deprecated``
+==============
+
+.. versionadded:: 2.6
+    The ``deprecated`` tag was added in Twig 2.6.
+
+Twig generates a deprecation notice (via a call to the ``trigger_error()``
+PHP function) where the ``deprecated`` tag is used in a template:
+
+.. code-block:: twig
+
+    {# base.twig #}
+    {% deprecated 'The "base.twig" template is deprecated, use "layout.twig" instead.' %}
+    {% extends 'layout.twig' %}
+
+Also you can deprecate a block in the following way:
+
+.. code-block:: twig
+
+    {% block hey %}
+        {% deprecated 'The "hey" block is deprecated, use "greet" instead.' %}
+        {{ block('greet') }}
+    {% endblock %}
+
+    {% block greet %}
+        Hey you!
+    {% endblock %}
+
+Note that by default, the deprecation notices are silenced and never displayed nor logged.
+See :ref:`deprecation-notices` to learn how to handle them.
diff --git a/vendor/twig/twig/doc/tags/do.rst b/vendor/twig/twig/doc/tags/do.rst
index 1c344e30..b8fe9f08 100644
--- a/vendor/twig/twig/doc/tags/do.rst
+++ b/vendor/twig/twig/doc/tags/do.rst
@@ -1,12 +1,9 @@
 ``do``
 ======
 
-.. versionadded:: 1.5
-    The ``do`` tag was added in Twig 1.5.
-
 The ``do`` tag works exactly like the regular variable expression (``{{ ...
 }}``) just that it doesn't print anything:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% do 1 + 2 %}
diff --git a/vendor/twig/twig/doc/tags/embed.rst b/vendor/twig/twig/doc/tags/embed.rst
index 66fc21b5..3ee16669 100644
--- a/vendor/twig/twig/doc/tags/embed.rst
+++ b/vendor/twig/twig/doc/tags/embed.rst
@@ -1,9 +1,6 @@
 ``embed``
 =========
 
-.. versionadded:: 1.8
-    The ``embed`` tag was added in Twig 1.8.
-
 The ``embed`` tag combines the behaviour of :doc:`include<include>` and
 :doc:`extends<extends>`.
 It allows you to include another template's contents, just like ``include``
@@ -12,7 +9,7 @@ included template, like when extending a template.
 
 Think of an embedded template as a "micro layout skeleton".
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% embed "teasers_skeleton.twig" %}
         {# These blocks are defined in "teasers_skeleton.twig" #}
@@ -88,26 +85,26 @@ two boxes side by side:
 
 Without the ``embed`` tag, you have two ways to design your templates:
 
- * Create two "intermediate" base templates that extend the master layout
-   template: one with vertically stacked boxes to be used by the "foo" and
-   "bar" pages and another one with side-by-side boxes for the "boom" and
-   "baz" pages.
+* Create two "intermediate" base templates that extend the master layout
+  template: one with vertically stacked boxes to be used by the "foo" and
+  "bar" pages and another one with side-by-side boxes for the "boom" and
+  "baz" pages.
 
- * Embed the markup for the top/bottom and left/right boxes into each page 
-   template directly.
+* Embed the markup for the top/bottom and left/right boxes into each page
+  template directly.
 
 These two solutions do not scale well because they each have a major drawback:
 
- * The first solution may indeed work for this simplified example. But imagine
-   we add a sidebar, which may again contain different, recurring structures
-   of content. Now we would need to create intermediate base templates for
-   all occurring combinations of content structure and sidebar structure...
-   and so on.
+* The first solution may indeed work for this simplified example. But imagine
+  we add a sidebar, which may again contain different, recurring structures
+  of content. Now we would need to create intermediate base templates for
+  all occurring combinations of content structure and sidebar structure...
+  and so on.
 
- * The second solution involves duplication of common code with all its negative
-   consequences: any change involves finding and editing all affected copies
-   of the structure, correctness has to be verified for each copy, copies may
-   go out of sync by careless modifications etc.
+* The second solution involves duplication of common code with all its negative
+  consequences: any change involves finding and editing all affected copies
+  of the structure, correctness has to be verified for each copy, copies may
+  go out of sync by careless modifications etc.
 
 In such a situation, the ``embed`` tag comes in handy. The common layout
 code can live in a single base template, and the two different content structures,
@@ -116,7 +113,7 @@ as necessary:
 
 Page template ``foo.twig``:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends "layout_skeleton.twig" %}
 
@@ -134,7 +131,7 @@ Page template ``foo.twig``:
 
 And here is the code for ``vertical_boxes_skeleton.twig``:
 
-.. code-block:: html+jinja
+.. code-block:: html+twig
 
     <div class="top_box">
         {% block top %}
@@ -153,7 +150,7 @@ out the HTML markup for the boxes.
 
 The ``embed`` tag takes the exact same arguments as the ``include`` tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% embed "base" with {'foo': 'bar'} %}
         ...
diff --git a/vendor/twig/twig/doc/tags/extends.rst b/vendor/twig/twig/doc/tags/extends.rst
index 8bf29c4f..e0f401d1 100644
--- a/vendor/twig/twig/doc/tags/extends.rst
+++ b/vendor/twig/twig/doc/tags/extends.rst
@@ -12,7 +12,7 @@ The ``extends`` tag can be used to extend a template from another one.
 Let's define a base template, ``base.html``, which defines a simple HTML
 skeleton document:
 
-.. code-block:: html+jinja
+.. code-block:: html+twig
 
     <!DOCTYPE html>
     <html>
@@ -43,7 +43,7 @@ Child Template
 
 A child template might look like this:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends "base.html" %}
 
@@ -79,7 +79,7 @@ know which one of the blocks' content to use.
 If you want to print a block multiple times you can however use the
 ``block`` function:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <title>{% block title %}{% endblock %}</title>
     <h1>{{ block('title') }}</h1>
@@ -92,7 +92,7 @@ It's possible to render the contents of the parent block by using the
 :doc:`parent<../functions/parent>` function. This gives back the results of
 the parent block:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% block sidebar %}
         <h3>Table Of Contents</h3>
@@ -106,7 +106,7 @@ Named Block End-Tags
 Twig allows you to put the name of the block after the end tag for better
 readability:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% block sidebar %}
         {% block inner_sidebar %}
@@ -122,7 +122,7 @@ Block Nesting and Scope
 Blocks can be nested for more complex layouts. Per default, blocks have access
 to variables from outer scopes:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for item in seq %}
         <li>{% block loop_item %}{{ item }}{% endblock %}</li>
@@ -134,13 +134,13 @@ Block Shortcuts
 For blocks with little content, it's possible to use a shortcut syntax. The
 following constructs do the same thing:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% block title %}
         {{ page_title|title }}
     {% endblock %}
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% block title page_title|title %}
 
@@ -149,30 +149,23 @@ Dynamic Inheritance
 
 Twig supports dynamic inheritance by using a variable as the base template:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends some_var %}
 
-If the variable evaluates to a ``Twig_Template`` or a ``Twig_TemplateWrapper``
+If the variable evaluates to a ``\Twig\Template`` or a ``\Twig\TemplateWrapper``
 instance, Twig will use it as the parent template::
 
     // {% extends layout %}
 
-    // deprecated as of Twig 1.28
-    $layout = $twig->loadTemplate('some_layout_template.twig');
-
-    // as of Twig 1.28
     $layout = $twig->load('some_layout_template.twig');
 
-    $twig->display('template.twig', array('layout' => $layout));
-
-.. versionadded:: 1.2
-    The possibility to pass an array of templates has been added in Twig 1.2.
+    $twig->display('template.twig', ['layout' => $layout]);
 
 You can also provide a list of templates that are checked for existence. The
 first template that exists will be used as a parent:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends ['layout.html', 'base_layout.html'] %}
 
@@ -182,7 +175,7 @@ Conditional Inheritance
 As the template name for the parent can be any valid Twig expression, it's
 possible to make the inheritance mechanism conditional:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends standalone ? "minimum.html" : "base.html" %}
 
@@ -199,7 +192,7 @@ but it does not interfere in any way with the logic around it.
 Let's take the following example to illustrate how a block works and more
 importantly, how it does not work:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# base.twig #}
 
@@ -214,7 +207,7 @@ If you render this template, the result would be exactly the same with or
 without the ``block`` tag. The ``block`` inside the ``for`` loop is just a way
 to make it overridable by a child template:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# child.twig #}
 
@@ -231,7 +224,7 @@ Now, when rendering the child template, the loop is going to use the block
 defined in the child template instead of the one defined in the base one; the
 executed template is then equivalent to the following one:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for post in posts %}
         <article>
@@ -242,7 +235,7 @@ executed template is then equivalent to the following one:
 
 Let's take another example: a block included within an ``if`` statement:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if posts is empty %}
         {% block head %}
@@ -259,7 +252,7 @@ what will be rendered when the condition is ``true``.
 If you want the output to be displayed conditionally, use the following
 instead:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% block head %}
         {{ parent() }}
diff --git a/vendor/twig/twig/doc/tags/filter.rst b/vendor/twig/twig/doc/tags/filter.rst
index 82ca5c62..f225fb25 100644
--- a/vendor/twig/twig/doc/tags/filter.rst
+++ b/vendor/twig/twig/doc/tags/filter.rst
@@ -1,20 +1,25 @@
 ``filter``
 ==========
 
+.. note::
+
+    As of Twig 2.9, you should use the ``apply`` tag instead which does the
+    same thing except that the wrapped template data is not scoped.
+
 Filter sections allow you to apply regular Twig filters on a block of template
 data. Just wrap the code in the special ``filter`` section:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% filter upper %}
         This text becomes uppercase
     {% endfilter %}
 
-You can also chain filters:
+You can also chain filters and pass arguments to them:
 
-.. code-block:: jinja
+.. code-block:: twig
 
-    {% filter lower|escape %}
+    {% filter lower|escape('html') %}
         <strong>SOME TEXT</strong>
     {% endfilter %}
 
diff --git a/vendor/twig/twig/doc/tags/flush.rst b/vendor/twig/twig/doc/tags/flush.rst
index 55ef593a..332e9825 100644
--- a/vendor/twig/twig/doc/tags/flush.rst
+++ b/vendor/twig/twig/doc/tags/flush.rst
@@ -1,12 +1,9 @@
 ``flush``
 =========
 
-.. versionadded:: 1.5
-    The flush tag was added in Twig 1.5.
-
 The ``flush`` tag tells Twig to flush the output buffer:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% flush %}
 
@@ -14,4 +11,4 @@ The ``flush`` tag tells Twig to flush the output buffer:
 
     Internally, Twig uses the PHP `flush`_ function.
 
-.. _`flush`: http://php.net/flush
+.. _`flush`: https://secure.php.net/flush
diff --git a/vendor/twig/twig/doc/tags/for.rst b/vendor/twig/twig/doc/tags/for.rst
index 0673b551..8e9b4e58 100644
--- a/vendor/twig/twig/doc/tags/for.rst
+++ b/vendor/twig/twig/doc/tags/for.rst
@@ -4,7 +4,7 @@
 Loop over each item in a sequence. For example, to display a list of users
 provided in a variable called ``users``:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <h1>Members</h1>
     <ul>
@@ -21,7 +21,7 @@ provided in a variable called ``users``:
 If you do need to iterate over a sequence of numbers, you can use the ``..``
 operator:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for i in 0..10 %}
         * {{ i }}
@@ -31,7 +31,7 @@ The above snippet of code would print all numbers from 0 to 10.
 
 It can be also useful with letters:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for letter in 'a'..'z' %}
         * {{ letter }}
@@ -39,7 +39,7 @@ It can be also useful with letters:
 
 The ``..`` operator can take any expression at both sides:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for letter in 'a'|upper..'z'|upper %}
         * {{ letter }}
@@ -68,7 +68,7 @@ Variable              Description
 ``loop.parent``       The parent context
 ===================== =============================================================
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for user in users %}
         {{ loop.index }} - {{ user.username }}
@@ -81,17 +81,21 @@ Variable              Description
     implement the ``Countable`` interface. They are also not available when
     looping with a condition.
 
-.. versionadded:: 1.2
-    The ``if`` modifier support has been added in Twig 1.2.
-
 Adding a condition
 ------------------
 
+.. tip::
+
+    As of Twig 2.10, use the :doc:`filter <../filters/filter>` filter instead,
+    or an ``if`` condition inside the ``for`` body (if your condition depends on
+    a variable updated inside the loop and you are not using the ``loop``
+    variable).
+
 Unlike in PHP, it's not possible to ``break`` or ``continue`` in a loop. You
 can however filter the sequence during iteration which allows you to skip
 items. The following example skips all the users which are not active:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <ul>
         {% for user in users if user.active %}
@@ -117,7 +121,7 @@ The `else` Clause
 If no iteration took place because the sequence was empty, you can render a
 replacement block by using ``else``:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <ul>
         {% for user in users %}
@@ -133,7 +137,7 @@ Iterating over Keys
 By default, a loop iterates over the values of the sequence. You can iterate
 on keys by using the ``keys`` filter:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <h1>Members</h1>
     <ul>
@@ -147,7 +151,7 @@ Iterating over Keys and Values
 
 You can also access both keys and values:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <h1>Members</h1>
     <ul>
@@ -162,7 +166,7 @@ Iterating over a Subset
 You might want to iterate over a subset of values. This can be achieved using
 the :doc:`slice <../filters/slice>` filter:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <h1>Top Ten Members</h1>
     <ul>
diff --git a/vendor/twig/twig/doc/tags/from.rst b/vendor/twig/twig/doc/tags/from.rst
index 39334fdd..96c439aa 100644
--- a/vendor/twig/twig/doc/tags/from.rst
+++ b/vendor/twig/twig/doc/tags/from.rst
@@ -3,6 +3,4 @@
 
 The ``from`` tag imports :doc:`macro<../tags/macro>` names into the current
 namespace. The tag is documented in detail in the documentation for the
-:doc:`import<../tags/import>` tag.
-
-.. seealso:: :doc:`macro<../tags/macro>`, :doc:`import<../tags/import>`
+:doc:`macro<../tags/macro>` tag.
diff --git a/vendor/twig/twig/doc/tags/if.rst b/vendor/twig/twig/doc/tags/if.rst
index 12edf980..2a1610c8 100644
--- a/vendor/twig/twig/doc/tags/if.rst
+++ b/vendor/twig/twig/doc/tags/if.rst
@@ -6,7 +6,7 @@ The ``if`` statement in Twig is comparable with the if statements of PHP.
 In the simplest form you can use it to test if an expression evaluates to
 ``true``:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if online == false %}
         <p>Our website is in maintenance mode. Please, come back later.</p>
@@ -14,7 +14,7 @@ In the simplest form you can use it to test if an expression evaluates to
 
 You can also test if an array is not empty:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if users %}
         <ul>
@@ -31,7 +31,7 @@ You can also test if an array is not empty:
 
 You can also use ``not`` to check for values that evaluate to ``false``:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if not user.subscribed %}
         <p>You are not subscribed to our mailing list.</p>
@@ -39,7 +39,7 @@ You can also use ``not`` to check for values that evaluate to ``false``:
 
 For multiple conditions, ``and`` and ``or`` can be used:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if temperature > 18 and temperature < 27 %}
         <p>It's a nice day for a walk in the park.</p>
@@ -48,14 +48,14 @@ For multiple conditions, ``and`` and ``or`` can be used:
 For multiple branches ``elseif`` and ``else`` can be used like in PHP. You can
 use more complex ``expressions`` there too:
 
-.. code-block:: jinja
+.. code-block:: twig
 
-    {% if kenny.sick %}
-        Kenny is sick.
-    {% elseif kenny.dead %}
-        You killed Kenny! You bastard!!!
+    {% if product.stock > 10 %}
+       Available
+    {% elseif product.stock > 0 %}
+       Only {{ product.stock }} left!
     {% else %}
-        Kenny looks okay --- so far
+       Sold-out!
     {% endif %}
 
 .. note::
@@ -68,7 +68,10 @@ use more complex ``expressions`` there too:
     ====================== ====================
     empty string           false
     numeric zero           false
+    NAN (Not A Number)     true
+    INF (Infinity)         true
     whitespace-only string true
+    string "0" or '0'      false
     empty array            false
     null                   false
     non-empty array        true
diff --git a/vendor/twig/twig/doc/tags/import.rst b/vendor/twig/twig/doc/tags/import.rst
index 21a1e198..f217479f 100644
--- a/vendor/twig/twig/doc/tags/import.rst
+++ b/vendor/twig/twig/doc/tags/import.rst
@@ -1,57 +1,6 @@
 ``import``
 ==========
 
-Twig supports putting often used code into :doc:`macros<../tags/macro>`. These
-macros can go into different templates and get imported from there.
-
-There are two ways to import templates. You can import the complete template
-into a variable or request specific macros from it.
-
-Imagine we have a helper module that renders forms (called ``forms.html``):
-
-.. code-block:: jinja
-
-    {% macro input(name, value, type, size) %}
-        <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
-    {% endmacro %}
-
-    {% macro textarea(name, value, rows, cols) %}
-        <textarea name="{{ name }}" rows="{{ rows|default(10) }}" cols="{{ cols|default(40) }}">{{ value|e }}</textarea>
-    {% endmacro %}
-
-The easiest and most flexible is importing the whole module into a variable.
-That way you can access the attributes:
-
-.. code-block:: jinja
-
-    {% import 'forms.html' as forms %}
-
-    <dl>
-        <dt>Username</dt>
-        <dd>{{ forms.input('username') }}</dd>
-        <dt>Password</dt>
-        <dd>{{ forms.input('password', null, 'password') }}</dd>
-    </dl>
-    <p>{{ forms.textarea('comment') }}</p>
-
-Alternatively you can import names from the template into the current
-namespace:
-
-.. code-block:: jinja
-
-    {% from 'forms.html' import input as input_field, textarea %}
-
-    <dl>
-        <dt>Username</dt>
-        <dd>{{ input_field('username') }}</dd>
-        <dt>Password</dt>
-        <dd>{{ input_field('password', '', 'password') }}</dd>
-    </dl>
-    <p>{{ textarea('comment') }}</p>
-
-.. tip::
-
-    To import macros from the current file, use the special ``_self`` variable
-    for the source.
-
-.. seealso:: :doc:`macro<../tags/macro>`, :doc:`from<../tags/from>`
+The ``import`` tag imports :doc:`macro<../tags/macro>` names in a local
+variable. The tag is documented in detail in the documentation for the
+:doc:`macro<../tags/macro>` tag.
diff --git a/vendor/twig/twig/doc/tags/include.rst b/vendor/twig/twig/doc/tags/include.rst
index 24ff24db..9797af1b 100644
--- a/vendor/twig/twig/doc/tags/include.rst
+++ b/vendor/twig/twig/doc/tags/include.rst
@@ -2,14 +2,45 @@
 ===========
 
 The ``include`` statement includes a template and returns the rendered content
-of that file into the current namespace:
+of that file:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% include 'header.html' %}
         Body
     {% include 'footer.html' %}
 
+.. note::
+
+    As of Twig 1.12, it is recommended to use the
+    :doc:`include<../functions/include>` function instead as it provides the
+    same features with a bit more flexibility:
+
+    * The ``include`` function is semantically more "correct" (including a
+      template outputs its rendered contents in the current scope; a tag should
+      not display anything);
+
+    * The ``include`` function is more "composable":
+
+      .. code-block:: twig
+
+          {# Store a rendered template in a variable #}
+          {% set content %}
+              {% include 'template.html' %}
+          {% endset %}
+          {# vs #}
+          {% set content = include('template.html') %}
+
+          {# Filter a rendered template #}
+          {% filter upper %}
+              {% include 'template.html' %}
+          {% endfilter %}
+          {# vs #}
+          {% include('template.html')|upper %}
+
+    * The ``include`` function does not impose any specific order for
+      arguments thanks to :ref:`named arguments <named-arguments>`.
+
 Included templates have access to the variables of the active context.
 
 If you are using the filesystem loader, the templates are looked for in the
@@ -17,7 +48,7 @@ paths defined by it.
 
 You can add additional variables by passing them after the ``with`` keyword:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# template.html will have access to the variables from the current context and the additional ones provided #}
     {% include 'template.html' with {'foo': 'bar'} %}
@@ -27,12 +58,12 @@ You can add additional variables by passing them after the ``with`` keyword:
 
 You can disable access to the context by appending the ``only`` keyword:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# only the foo variable will be accessible #}
     {% include 'template.html' with {'foo': 'bar'} only %}
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# no variables will be accessible #}
     {% include 'template.html' only %}
@@ -45,44 +76,34 @@ You can disable access to the context by appending the ``only`` keyword:
 
 The template name can be any valid Twig expression:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% include some_var %}
     {% include ajax ? 'ajax.html' : 'not_ajax.html' %}
 
-And if the expression evaluates to a ``Twig_Template`` or a
-``Twig_TemplateWrapper`` instance, Twig will use it directly::
+And if the expression evaluates to a ``\Twig\Template`` or a
+``\Twig\TemplateWrapper`` instance, Twig will use it directly::
 
     // {% include template %}
 
-    // deprecated as of Twig 1.28
-    $template = $twig->loadTemplate('some_template.twig');
-
-    // as of Twig 1.28
     $template = $twig->load('some_template.twig');
 
-    $twig->display('template.twig', array('template' => $template));
-
-.. versionadded:: 1.2
-    The ``ignore missing`` feature has been added in Twig 1.2.
+    $twig->display('template.twig', ['template' => $template]);
 
 You can mark an include with ``ignore missing`` in which case Twig will ignore
 the statement if the template to be included does not exist. It has to be
 placed just after the template name. Here some valid examples:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% include 'sidebar.html' ignore missing %}
     {% include 'sidebar.html' ignore missing with {'foo': 'bar'} %}
     {% include 'sidebar.html' ignore missing only %}
 
-.. versionadded:: 1.2
-    The possibility to pass an array of templates has been added in Twig 1.2.
-
 You can also provide a list of templates that are checked for existence before
 inclusion. The first template that exists will be included:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% include ['page_detailed.html', 'page.html'] %}
 
diff --git a/vendor/twig/twig/doc/tags/index.rst b/vendor/twig/twig/doc/tags/index.rst
index dbe2459e..530f95f1 100644
--- a/vendor/twig/twig/doc/tags/index.rst
+++ b/vendor/twig/twig/doc/tags/index.rst
@@ -4,8 +4,10 @@ Tags
 .. toctree::
     :maxdepth: 1
 
+    apply
     autoescape
     block
+    deprecated
     do
     embed
     extends
diff --git a/vendor/twig/twig/doc/tags/macro.rst b/vendor/twig/twig/doc/tags/macro.rst
index a8aa76fd..33808f5a 100644
--- a/vendor/twig/twig/doc/tags/macro.rst
+++ b/vendor/twig/twig/doc/tags/macro.rst
@@ -2,21 +2,27 @@
 =========
 
 Macros are comparable with functions in regular programming languages. They
-are useful to put often used HTML idioms into reusable elements to not repeat
-yourself.
+are useful to reuse template fragments to not repeat yourself.
 
-Here is a small example of a macro that renders a form element:
+Macros are defined in regular templates.
 
-.. code-block:: jinja
+Imagine having a generic helper template that define how to render HTML forms
+via macros (called ``forms.html``):
 
-    {% macro input(name, value, type, size) %}
-        <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
+.. code-block:: twig
+
+    {% macro input(name, value, type = "text", size = 20) %}
+        <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}" />
     {% endmacro %}
 
-Macros differ from native PHP functions in a few ways:
+    {% macro textarea(name, value, rows = 10, cols = 40) %}
+        <textarea name="{{ name }}" rows="{{ rows }}" cols="{{ cols }}">{{ value|e }}</textarea>
+    {% endmacro %}
 
-* Default argument values are defined by using the ``default`` filter in the
-  macro body;
+Each macro argument can have a default value (here ``text`` is the default value
+for ``type`` if not provided in the call).
+
+Macros differ from native PHP functions in a few ways:
 
 * Arguments of a macro are always optional.
 
@@ -31,60 +37,135 @@ variables.
     You can pass the whole context as an argument by using the special
     ``_context`` variable.
 
-Import
-------
+Importing Macros
+----------------
 
-Macros can be defined in any template, and need to be "imported" before being
-used (see the documentation for the :doc:`import<../tags/import>` tag for more
-information):
+There are two ways to import macros. You can import the complete template
+containing the macros into a local variable (via the ``import`` tag) or only
+import specific macros from the template (via the ``from`` tag).
 
-.. code-block:: jinja
+To import all macros from a template into a local variable, use the ``import``
+tag:
+
+.. code-block:: twig
 
     {% import "forms.html" as forms %}
 
-The above ``import`` call imports the "forms.html" file (which can contain only
-macros, or a template and some macros), and import the functions as items of
-the ``forms`` variable.
+The above ``import`` call imports the ``forms.html`` file (which can contain
+only macros, or a template and some macros), and import the macros as items of
+the ``forms`` local variable.
 
-The macro can then be called at will:
+The macros can then be called at will in the *current* template:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <p>{{ forms.input('username') }}</p>
     <p>{{ forms.input('password', null, 'password') }}</p>
 
-If macros are defined and used in the same template, you can use the
-special ``_self`` variable to import them:
+Alternatively you can import names from the template into the current namespace
+via the ``from`` tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
-    {% import _self as forms %}
+    {% from 'forms.html' import input as input_field, textarea %}
 
-    <p>{{ forms.input('username') }}</p>
+    <p>{{ input_field('password', '', 'password') }}</p>
+    <p>{{ textarea('comment') }}</p>
 
-.. warning::
+.. tip::
 
-    When you define a macro in the template where you are going to use it, you
-    might be tempted to call the macro directly via ``_self.input()`` instead
-    of importing it; even if seems to work, this is just a side-effect of the
-    current implementation and it won't work anymore in Twig 2.x.
+    When macro usages and definitions are in the same template, you don't need to
+    import the macros as they are automatically available under the special
+    ``_self`` variable:
 
-When you want to use a macro in another macro from the same file, you need to
-import it locally:
+    .. code-block:: twig
 
-.. code-block:: jinja
+        <p>{{ _self.input('password', '', 'password') }}</p>
 
-    {% macro input(name, value, type, size) %}
-        <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
-    {% endmacro %}
+        {% macro input(name, value, type = "text", size = 20) %}
+            <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}" />
+        {% endmacro %}
+
+    Auto-import is only available as of Twig 2.11. For older versions, import
+    macros using the special ``_self`` variable for the template name:
+
+    .. code-block:: twig
 
-    {% macro wrapped_input(name, value, type, size) %}
         {% import _self as forms %}
 
-        <div class="field">
-            {{ forms.input(name, value, type, size) }}
-        </div>
-    {% endmacro %}
+        <p>{{ forms.input('username') }}</p>
+
+.. note::
+
+    Before Twig 2.11, when you want to use a macro in another macro from the
+    same file, you need to import it locally:
+
+    .. code-block:: twig
+
+        {% macro input(name, value, type, size) %}
+            <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
+        {% endmacro %}
+
+        {% macro wrapped_input(name, value, type, size) %}
+            {% import _self as forms %}
+
+            <div class="field">
+                {{ forms.input(name, value, type, size) }}
+            </div>
+        {% endmacro %}
+
+Macros Scoping
+--------------
+
+.. versionadded:: 2.11
+
+    The scoping rules described in this paragraph are implemented as of Twig
+    2.11.
+
+The scoping rules are the same whether you imported macros via ``import`` or
+``from``.
+
+Imported macros are always **local** to the current template. It means that
+macros are available in all blocks and other macros defined in the current
+template, but they are not available in included templates or child templates;
+you need to explicitely re-import macros in each template.
+
+When calling ``import`` or ``from`` from a ``block`` tag, the imported macros
+are only defined in the current block and they override macros defined at the
+template level with the same names.
+
+When calling ``import`` or ``from`` from a ``macro`` tag, the imported macros
+are only defined in the current macro and they override macros defined at the
+template level with the same names.
+
+.. note::
+
+    Before Twig 2.11, it was possible to use macros imported in a block in a
+    "sub-block". When upgrading to 2.11, you need to either move the import in
+    the global scope or reimport the macros explicitly in the "sub-blocks".
+
+Checking if a Macro is defined
+------------------------------
+
+.. versionadded:: 2.11
+
+    Support for the ``defined`` test on macros was added in Twig 2.11.
+
+You can check if a macro is defined via the ``defined`` test:
+
+.. code-block:: twig
+
+    {% import "macros.twig" as macros %}
+
+    {% from "macros.twig" import hello %}
+
+    {% if macros.hello is defined -%}
+        OK
+    {% endif %}
+
+    {% if hello is defined -%}
+        OK
+    {% endif %}
 
 Named Macro End-Tags
 --------------------
@@ -92,12 +173,10 @@ Named Macro End-Tags
 Twig allows you to put the name of the macro after the end tag for better
 readability:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% macro input() %}
         ...
     {% endmacro input %}
 
 Of course, the name after the ``endmacro`` word must match the macro name.
-
-.. seealso:: :doc:`from<../tags/from>`, :doc:`import<../tags/import>`
diff --git a/vendor/twig/twig/doc/tags/sandbox.rst b/vendor/twig/twig/doc/tags/sandbox.rst
index e186726c..b331fdb8 100644
--- a/vendor/twig/twig/doc/tags/sandbox.rst
+++ b/vendor/twig/twig/doc/tags/sandbox.rst
@@ -4,7 +4,7 @@
 The ``sandbox`` tag can be used to enable the sandboxing mode for an included
 template, when sandboxing is not enabled globally for the Twig environment:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% sandbox %}
         {% include 'user.html' %}
@@ -21,7 +21,7 @@ template, when sandboxing is not enabled globally for the Twig environment:
     cannot be used to sandbox a section of a template. The following example
     won't work:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% sandbox %}
             {% for i in 1..2 %}
diff --git a/vendor/twig/twig/doc/tags/set.rst b/vendor/twig/twig/doc/tags/set.rst
index 3eba239a..f752fddb 100644
--- a/vendor/twig/twig/doc/tags/set.rst
+++ b/vendor/twig/twig/doc/tags/set.rst
@@ -6,22 +6,22 @@ the ``set`` tag and can have multiple targets.
 
 Here is how you can assign the ``bar`` value to the ``foo`` variable:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set foo = 'bar' %}
 
 After the ``set`` call, the ``foo`` variable is available in the template like
 any other ones:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# displays bar #}
     {{ foo }}
 
-The assigned value can be any valid :ref:`Twig expressions
+The assigned value can be any valid :ref:`Twig expression
 <twig-expressions>`:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set foo = [1, 2] %}
     {% set foo = {'foo': 'bar'} %}
@@ -29,7 +29,7 @@ The assigned value can be any valid :ref:`Twig expressions
 
 Several variables can be assigned in one block:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set foo, bar = 'foo', 'bar' %}
 
@@ -40,7 +40,7 @@ Several variables can be assigned in one block:
 
 The ``set`` tag can also be used to 'capture' chunks of text:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set foo %}
         <div id="pagination">
@@ -58,7 +58,7 @@ The ``set`` tag can also be used to 'capture' chunks of text:
     Note that loops are scoped in Twig; therefore a variable declared inside a
     ``for`` loop is not accessible outside the loop itself:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% for item in list %}
             {% set foo = item %}
@@ -68,7 +68,7 @@ The ``set`` tag can also be used to 'capture' chunks of text:
 
     If you want to access the variable, just declare it before the loop:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% set foo = "" %}
         {% for item in list %}
diff --git a/vendor/twig/twig/doc/tags/spaceless.rst b/vendor/twig/twig/doc/tags/spaceless.rst
index b39cb27e..2608538a 100644
--- a/vendor/twig/twig/doc/tags/spaceless.rst
+++ b/vendor/twig/twig/doc/tags/spaceless.rst
@@ -1,10 +1,14 @@
 ``spaceless``
 =============
 
+.. tip::
+
+    As of Twig 1.38, use the :doc:`spaceless <../filters/spaceless>` filter instead.
+
 Use the ``spaceless`` tag to remove whitespace *between HTML tags*, not
 whitespace within HTML tags or whitespace in plain text:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% spaceless %}
         <div>
diff --git a/vendor/twig/twig/doc/tags/use.rst b/vendor/twig/twig/doc/tags/use.rst
index a6fdefb4..2aca6a01 100644
--- a/vendor/twig/twig/doc/tags/use.rst
+++ b/vendor/twig/twig/doc/tags/use.rst
@@ -1,9 +1,6 @@
 ``use``
 =======
 
-.. versionadded:: 1.1
-    Horizontal reuse was added in Twig 1.1.
-
 .. note::
 
     Horizontal reuse is an advanced Twig feature that is hardly ever needed in
@@ -15,7 +12,7 @@ limited to single inheritance; a template can only extend one other template.
 This limitation makes template inheritance simple to understand and easy to
 debug:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends "base.html" %}
 
@@ -25,7 +22,7 @@ debug:
 Horizontal reuse is a way to achieve the same goal as multiple inheritance,
 but without the associated complexity:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends "base.html" %}
 
@@ -37,7 +34,7 @@ but without the associated complexity:
 The ``use`` statement tells Twig to import the blocks defined in
 ``blocks.html`` into the current template (it's like macros, but for blocks):
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# blocks.html #}
     
@@ -47,7 +44,7 @@ In this example, the ``use`` statement imports the ``sidebar`` block into the
 main template. The code is mostly equivalent to the following one (the
 imported blocks are not outputted automatically):
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends "base.html" %}
 
@@ -70,7 +67,7 @@ The main template can also override any imported block. If the template
 already defines the ``sidebar`` block, then the one defined in ``blocks.html``
 is ignored. To avoid name conflicts, you can rename imported blocks:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends "base.html" %}
 
@@ -80,14 +77,11 @@ is ignored. To avoid name conflicts, you can rename imported blocks:
     {% block title %}{% endblock %}
     {% block content %}{% endblock %}
 
-.. versionadded:: 1.3
-    The ``parent()`` support was added in Twig 1.3.
-
 The ``parent()`` function automatically determines the correct inheritance
 tree, so it can be used when overriding a block defined in an imported
 template:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends "base.html" %}
 
@@ -105,10 +99,9 @@ the ``blocks.html`` template.
 
 .. tip::
 
-    In Twig 1.2, renaming allows you to simulate inheritance by calling the
-    "parent" block:
+    Renaming allows you to simulate inheritance by calling the "parent" block:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% extends "base.html" %}
 
diff --git a/vendor/twig/twig/doc/tags/verbatim.rst b/vendor/twig/twig/doc/tags/verbatim.rst
index fe61ca1b..88c61528 100644
--- a/vendor/twig/twig/doc/tags/verbatim.rst
+++ b/vendor/twig/twig/doc/tags/verbatim.rst
@@ -1,14 +1,11 @@
 ``verbatim``
 ============
 
-.. versionadded:: 1.12
-    The ``verbatim`` tag was added in Twig 1.12 (it was named ``raw`` before).
-
 The ``verbatim`` tag marks sections as being raw text that should not be
 parsed. For example to put Twig syntax as example into a template you can use
 this snippet:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% verbatim %}
         <ul>
@@ -17,8 +14,3 @@ this snippet:
         {% endfor %}
         </ul>
     {% endverbatim %}
-
-.. note::
-
-    The ``verbatim`` tag works in the exact same way as the old ``raw`` tag,
-    but was renamed to avoid confusion with the ``raw`` filter.
\ No newline at end of file
diff --git a/vendor/twig/twig/doc/tags/with.rst b/vendor/twig/twig/doc/tags/with.rst
index 815b0699..107432f6 100644
--- a/vendor/twig/twig/doc/tags/with.rst
+++ b/vendor/twig/twig/doc/tags/with.rst
@@ -1,17 +1,14 @@
 ``with``
 ========
 
-.. versionadded:: 1.28
-    The ``with`` tag was added in Twig 1.28.
-
 Use the ``with`` tag to create a new inner scope. Variables set within this
 scope are not visible outside of the scope:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% with %}
         {% set foo = 42 %}
-        {{ foo }}           foo is 42 here
+        {{ foo }} {# foo is 42 here #}
     {% endwith %}
     foo is not visible here any longer
 
@@ -19,10 +16,10 @@ Instead of defining variables at the beginning of the scope, you can pass a
 hash of variables you want to define in the ``with`` tag; the previous example
 is equivalent to the following one:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% with { foo: 42 } %}
-        {{ foo }}           foo is 42 here
+        {{ foo }} {# foo is 42 here #}
     {% endwith %}
     foo is not visible here any longer
 
@@ -35,7 +32,7 @@ is equivalent to the following one:
 By default, the inner scope has access to the outer scope context; you can
 disable this behavior by appending the ``only`` keyword:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set bar = 'bar' %}
     {% with { foo: 42 } only %}
diff --git a/vendor/twig/twig/doc/templates.rst b/vendor/twig/twig/doc/templates.rst
index 3d60779a..3aa3ea96 100644
--- a/vendor/twig/twig/doc/templates.rst
+++ b/vendor/twig/twig/doc/templates.rst
@@ -7,18 +7,18 @@ will be most useful as reference to those creating Twig templates.
 Synopsis
 --------
 
-A template is simply a text file. It can generate any text-based format (HTML,
+A template is a regular text file. It can generate any text-based format (HTML,
 XML, CSV, LaTeX, etc.). It doesn't have a specific extension, ``.html`` or
 ``.xml`` are just fine.
 
 A template contains **variables** or **expressions**, which get replaced with
-values when the template is evaluated, and **tags**, which control the logic
-of the template.
+values when the template is evaluated, and **tags**, which control the
+template's logic.
 
 Below is a minimal template that illustrates a few basics. We will cover further
 details later on:
 
-.. code-block:: html+jinja
+.. code-block:: html+twig
 
     <!DOCTYPE html>
     <html>
@@ -38,8 +38,8 @@ details later on:
     </html>
 
 There are two kinds of delimiters: ``{% ... %}`` and ``{{ ... }}``. The first
-one is used to execute statements such as for-loops, the latter prints the
-result of an expression to the template.
+one is used to execute statements such as for-loops, the latter outputs the
+result of an expression.
 
 IDEs Integration
 ----------------
@@ -68,27 +68,16 @@ Variables
 ---------
 
 The application passes variables to the templates for manipulation in the
-template. Variables may have attributes or elements you can access,
-too. The visual representation of a variable depends heavily on the application providing
+template. Variables may have attributes or elements you can access, too. The
+visual representation of a variable depends heavily on the application providing
 it.
 
-You can use a dot (``.``) to access attributes of a variable (methods or
-properties of a PHP object, or items of a PHP array), or the so-called
-"subscript" syntax (``[]``):
+Use a dot (``.``) to access attributes of a variable (methods or properties of a
+PHP object, or items of a PHP array):
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ foo.bar }}
-    {{ foo['bar'] }}
-
-When the attribute contains special characters (like ``-`` that would be
-interpreted as the minus operator), use the ``attribute`` function instead to
-access the variable attribute:
-
-.. code-block:: jinja
-
-    {# equivalent to the non-working foo.data-foo #}
-    {{ attribute(foo, 'data-foo') }}
 
 .. note::
 
@@ -96,10 +85,6 @@ access the variable attribute:
     variable but the print statement. When accessing variables inside tags,
     don't put the braces around them.
 
-If a variable or attribute does not exist, you will receive a ``null`` value
-when the ``strict_variables`` option is set to ``false``; alternatively, if ``strict_variables``
-is set, Twig will throw an error (see :ref:`environment options<environment_options>`).
-
 .. sidebar:: Implementation
 
     For convenience's sake ``foo.bar`` does the following things on the PHP
@@ -111,24 +96,39 @@ is set, Twig will throw an error (see :ref:`environment options<environment_opti
       (even if ``bar`` is the constructor - use ``__construct()`` instead);
     * if not, and if ``foo`` is an object, check that ``getBar`` is a valid method;
     * if not, and if ``foo`` is an object, check that ``isBar`` is a valid method;
+    * if not, and if ``foo`` is an object, check that ``hasBar`` is a valid method;
     * if not, return a ``null`` value.
 
-    ``foo['bar']`` on the other hand only works with PHP arrays:
+    Twig also supports a specific syntax for accessing items on PHP arrays,
+    ``foo['bar']``:
 
     * check if ``foo`` is an array and ``bar`` a valid element;
     * if not, return a ``null`` value.
 
+If a variable or attribute does not exist, you will receive a ``null`` value
+when the ``strict_variables`` option is set to ``false``; alternatively, if ``strict_variables``
+is set, Twig will throw an error (see :ref:`environment options<environment_options>`).
+
 .. note::
 
     If you want to access a dynamic attribute of a variable, use the
     :doc:`attribute<functions/attribute>` function instead.
 
+    The ``attribute`` function is also useful when the attribute contains
+    special characters (like ``-`` that would be interpreted as the minus
+    operator):
+
+    .. code-block:: twig
+
+        {# equivalent to the non-working foo.data-foo #}
+        {{ attribute(foo, 'data-foo') }}
+
 Global Variables
 ~~~~~~~~~~~~~~~~
 
 The following variables are always available in templates:
 
-* ``_self``: references the current template;
+* ``_self``: references the current template name;
 * ``_context``: references the current context;
 * ``_charset``: references the current charset.
 
@@ -138,7 +138,7 @@ Setting Variables
 You can assign values to variables inside code blocks. Assignments use the
 :doc:`set<tags/set>` tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set foo = 'foo' %}
     {% set foo = [1, 2] %}
@@ -148,36 +148,40 @@ Filters
 -------
 
 Variables can be modified by **filters**. Filters are separated from the
-variable by a pipe symbol (``|``) and may have optional arguments in
-parentheses. Multiple filters can be chained. The output of one filter is
-applied to the next.
+variable by a pipe symbol (``|``). Multiple filters can be chained. The output
+of one filter is applied to the next.
 
 The following example removes all HTML tags from the ``name`` and title-cases
 it:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ name|striptags|title }}
 
 Filters that accept arguments have parentheses around the arguments. This
-example will join a list by commas:
+example joins the elements of a list by commas:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ list|join(', ') }}
 
-To apply a filter on a section of code, wrap it in the
-:doc:`filter<tags/filter>` tag:
+To apply a filter on a section of code, wrap it with the
+:doc:`apply<tags/apply>` tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
-    {% filter upper %}
+    {% apply upper %}
         This text becomes uppercase
-    {% endfilter %}
+    {% endapply %}
 
 Go to the :doc:`filters<filters/index>` page to learn more about built-in
 filters.
 
+.. note::
+
+    The ``apply`` tag was introduced in Twig 2.9; use the ``filter`` tag with
+    previous versions.
+
 Functions
 ---------
 
@@ -187,7 +191,7 @@ name followed by parentheses (``()``) and may have arguments.
 For instance, the ``range`` function returns a list containing an arithmetic
 progression of integers:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for i in range(0, 3) %}
         {{ i }},
@@ -196,13 +200,12 @@ progression of integers:
 Go to the :doc:`functions<functions/index>` page to learn more about the
 built-in functions.
 
+.. _named-arguments:
+
 Named Arguments
 ---------------
 
-.. versionadded:: 1.12
-    Support for named arguments was added in Twig 1.12.
-
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for i in range(low=1, high=10, step=2) %}
         {{ i }},
@@ -211,7 +214,7 @@ Named Arguments
 Using named arguments makes your templates more explicit about the meaning of
 the values you pass as arguments:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ data|convert_encoding('UTF-8', 'iso-2022-jp') }}
 
@@ -222,7 +225,7 @@ the values you pass as arguments:
 Named arguments also allow you to skip some arguments for which you don't want
 to change the default value:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# the first argument is the date format, which defaults to the global date format if null is passed #}
     {{ "now"|date(null, "Europe/Paris") }}
@@ -233,7 +236,7 @@ to change the default value:
 You can also use both positional and named arguments in one call, in which
 case positional arguments must always come before named arguments:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ "now"|date('d/m/Y H:i', timezone="Europe/Paris") }}
 
@@ -253,7 +256,7 @@ blocks.
 For example, to display a list of users provided in a variable called
 ``users``, use the :doc:`for<tags/for>` tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     <h1>Members</h1>
     <ul>
@@ -264,7 +267,7 @@ For example, to display a list of users provided in a variable called
 
 The :doc:`if<tags/if>` tag can be used to test an expression:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if users|length > 0 %}
         <ul>
@@ -283,7 +286,7 @@ To comment-out part of a line in a template, use the comment syntax ``{# ...
 #}``. This is useful for debugging or to add information for other template
 designers or yourself:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# note: disabled template because we no longer use this
         {% for user in users %}
@@ -297,7 +300,7 @@ Including other Templates
 The :doc:`include<functions/include>` function is useful to include a template
 and return the rendered content of that template into the current one:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ include('sidebar.html') }}
 
@@ -305,7 +308,7 @@ By default, included templates have access to the same context as the template
 which includes them. This means that any variable defined in the main template
 will be available in the included template too:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% for box in boxes %}
         {{ include('render_box.html') }}
@@ -313,11 +316,11 @@ will be available in the included template too:
 
 The included template ``render_box.html`` is able to access the ``box`` variable.
 
-The filename of the template depends on the template loader. For instance, the
-``Twig_Loader_Filesystem`` allows you to access other templates by giving the
+The name of the template depends on the template loader. For instance, the
+``\Twig\Loader\FilesystemLoader`` allows you to access other templates by giving the
 filename. You can access templates in subdirectories with a slash:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ include('sections/articles/sidebar.html') }}
 
@@ -331,13 +334,12 @@ allows you to build a base "skeleton" template that contains all the common
 elements of your site and defines **blocks** that child templates can
 override.
 
-Sounds complicated but it is very basic. It's easier to understand it by
-starting with an example.
+It's easier to understand the concept by starting with an example.
 
-Let's define a base template, ``base.html``, which defines a simple HTML
-skeleton document that you might use for a simple two-column page:
+Let's define a base template, ``base.html``, which defines an HTML skeleton
+document that might be used for a two-column page:
 
-.. code-block:: html+jinja
+.. code-block:: html+twig
 
     <!DOCTYPE html>
     <html>
@@ -364,7 +366,7 @@ template.
 
 A child template might look like this:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% extends "base.html" %}
 
@@ -394,7 +396,7 @@ It's possible to render the contents of the parent block by using the
 :doc:`parent<functions/parent>` function. This gives back the results of the
 parent block:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% block sidebar %}
         <h3>Table Of Contents</h3>
@@ -410,9 +412,8 @@ parent block:
 
 .. note::
 
-    Twig also supports multiple inheritance with the so called horizontal reuse
-    with the help of the :doc:`use<tags/use>` tag. This is an advanced feature
-    hardly ever needed in regular templates.
+    Twig also supports multiple inheritance via "horizontal reuse" with the help
+    of the :doc:`use<tags/use>` tag.
 
 HTML Escaping
 -------------
@@ -430,21 +431,19 @@ The automatic escaping strategy can be configured via the
 Working with Manual Escaping
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-If manual escaping is enabled, it is **your** responsibility to escape
-variables if needed. What to escape? Any variable you don't trust.
+If manual escaping is enabled, it is **your** responsibility to escape variables
+if needed. What to escape? Any variable that comes from an untrusted source.
 
-Escaping works by piping the variable through the
-:doc:`escape<filters/escape>` or ``e`` filter:
+Escaping works by using the :doc:`escape<filters/escape>` or ``e`` filter:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ user.username|e }}
 
 By default, the ``escape`` filter uses the ``html`` strategy, but depending on
-the escaping context, you might want to explicitly use any other available
-strategies:
+the escaping context, you might want to explicitly use an other strategy:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ user.username|e('js') }}
     {{ user.username|e('css') }}
@@ -458,7 +457,7 @@ Whether automatic escaping is enabled or not, you can mark a section of a
 template to be escaped or not by using the :doc:`autoescape<tags/autoescape>`
 tag:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% autoescape %}
         Everything will be automatically escaped in this block (using the HTML strategy)
@@ -468,7 +467,7 @@ By default, auto-escaping uses the ``html`` escaping strategy. If you output
 variables in other contexts, you need to explicitly escape them with the
 appropriate escaping strategy:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% autoescape 'js' %}
         Everything will be automatically escaped in this block (using the JS strategy)
@@ -485,7 +484,7 @@ variable you have to use a trick.
 The easiest way is to output the variable delimiter (``{{``) by using a variable
 expression:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ '{{' }}
 
@@ -495,73 +494,27 @@ For bigger sections it makes sense to mark a block
 Macros
 ------
 
-.. versionadded:: 1.12
-    Support for default argument values was added in Twig 1.12.
-
-Macros are comparable with functions in regular programming languages. They
-are useful to reuse often used HTML fragments to not repeat yourself.
-
-A macro is defined via the :doc:`macro<tags/macro>` tag. Here is a small example
-(subsequently called ``forms.html``) of a macro that renders a form element:
-
-.. code-block:: jinja
-
-    {% macro input(name, value, type, size) %}
-        <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
-    {% endmacro %}
-
-Macros can be defined in any template, and need to be "imported" via the
-:doc:`import<tags/import>` tag before being used:
-
-.. code-block:: jinja
-
-    {% import "forms.html" as forms %}
-
-    <p>{{ forms.input('username') }}</p>
-
-Alternatively, you can import individual macro names from a template into the
-current namespace via the :doc:`from<tags/from>` tag and optionally alias them:
-
-.. code-block:: jinja
-
-    {% from 'forms.html' import input as input_field %}
-
-    <dl>
-        <dt>Username</dt>
-        <dd>{{ input_field('username') }}</dd>
-        <dt>Password</dt>
-        <dd>{{ input_field('password', '', 'password') }}</dd>
-    </dl>
-
-A default value can also be defined for macro arguments when not provided in a
-macro call:
-
-.. code-block:: jinja
-
-    {% macro input(name, value = "", type = "text", size = 20) %}
-        <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}" />
-    {% endmacro %}
-
-If extra positional arguments are passed to a macro call, they end up in the
-special ``varargs`` variable as a list of values.
+Macros are comparable with functions in regular programming languages. They are
+useful to reuse HTML fragments to not repeat yourself. They are described in the
+:doc:`macro<tags/macro>` tag documentation.
 
 .. _twig-expressions:
 
 Expressions
 -----------
 
-Twig allows expressions everywhere. These work very similar to regular PHP and
-even if you're not working with PHP you should feel comfortable with it.
+Twig allows expressions everywhere.
 
 .. note::
 
-    The operator precedence is as follows, with the lowest-precedence
-    operators listed first: ``b-and``, ``b-xor``, ``b-or``, ``or``, ``and``,
-    ``==``, ``!=``, ``<``, ``>``, ``>=``, ``<=``, ``in``, ``matches``,
-    ``starts with``, ``ends with``, ``..``, ``+``, ``-``, ``~``, ``*``, ``/``,
-    ``//``, ``%``, ``is``, ``**``, ``|``, ``[]``, and ``.``:
+    The operator precedence is as follows, with the lowest-precedence operators
+    listed first: ``?:`` (ternary operator), ``b-and``, ``b-xor``, ``b-or``,
+    ``or``, ``and``, ``==``, ``!=``, ``<``, ``>``, ``>=``, ``<=``, ``in``,
+    ``matches``, ``starts with``, ``ends with``, ``..``, ``+``, ``-``, ``~``,
+    ``*``, ``/``, ``//``, ``%``, ``is`` (tests), ``**``, ``??``, ``|``
+    (filters), ``[]``, and ``.``.
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% set greeting = 'Hello ' %}
         {% set name = 'Fabien' %}
@@ -574,9 +527,6 @@ even if you're not working with PHP you should feel comfortable with it.
 Literals
 ~~~~~~~~
 
-.. versionadded:: 1.5
-    Support for hash keys as names and expressions was added in Twig 1.5.
-
 The simplest form of expressions are literals. Literals are representations
 for PHP types such as strings, numbers, and arrays. The following literals
 exist:
@@ -589,7 +539,7 @@ exist:
   backslash (e.g. ``'c:\Program Files'``) escape it by doubling it
   (e.g. ``'c:\\Program Files'``).
 
-* ``42`` / ``42.23``: Integers and floating point numbers are created by just
+* ``42`` / ``42.23``: Integers and floating point numbers are created by
   writing the number down. If a dot is present the number is a float,
   otherwise an integer.
 
@@ -599,18 +549,18 @@ exist:
 * ``{"foo": "bar"}``: Hashes are defined by a list of keys and values
   separated by a comma (``,``) and wrapped with curly braces (``{}``):
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
     {# keys as string #}
     { 'foo': 'foo', 'bar': 'bar' }
 
-    {# keys as names (equivalent to the previous hash) -- as of Twig 1.5 #}
+    {# keys as names (equivalent to the previous hash) #}
     { foo: 'foo', bar: 'bar' }
 
     {# keys as integer #}
     { 2: 'foo', 4: 'bar' }
 
-    {# keys as expressions (the expression must be enclosed into parentheses) -- as of Twig 1.5 #}
+    {# keys as expressions (the expression must be enclosed into parentheses) #}
     {% set foo = 'foo' %}
     { (foo): 'foo', (1 + 1): 'bar', (foo ~ 'b'): 'baz' }
 
@@ -622,22 +572,22 @@ exist:
 
 Arrays and hashes can be nested:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set foo = [1, {"foo": "bar"}] %}
 
 .. tip::
 
     Using double-quoted or single-quoted strings has no impact on performance
-    but string interpolation is only supported in double-quoted strings.
+    but :ref:`string interpolation <templates-string-interpolation>` is only
+    supported in double-quoted strings.
 
 Math
 ~~~~
 
-Twig allows you to calculate with values. This is rarely useful in templates
-but exists for completeness' sake. The following operators are supported:
+Twig allows you to do math in templates; the following operators are supported:
 
-* ``+``: Adds two objects together (the operands are casted to numbers). ``{{
+* ``+``: Adds two numbers together (the operands are casted to numbers). ``{{
   1 + 1 }}`` is ``2``.
 
 * ``-``: Subtracts the second number from the first one. ``{{ 3 - 2 }}`` is
@@ -659,6 +609,8 @@ but exists for completeness' sake. The following operators are supported:
 * ``**``: Raises the left operand to the power of the right operand. ``{{ 2 **
   3 }}`` would return ``8``.
 
+.. _template_logic:
+
 Logic
 ~~~~~
 
@@ -674,7 +626,7 @@ You can combine multiple expressions with the following operators:
 
 .. note::
 
-    Twig also support bitwise operators (``b-and``, ``b-xor``, and ``b-or``).
+    Twig also supports bitwise operators (``b-and``, ``b-xor``, and ``b-or``).
 
 .. note::
 
@@ -689,7 +641,7 @@ The following comparison operators are supported in any expression: ``==``,
 You can also check if a string ``starts with`` or ``ends with`` another
 string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if 'Fabien' starts with 'F' %}
     {% endif %}
@@ -702,7 +654,7 @@ string:
     For complex string comparisons, the ``matches`` operator allows you to use
     `regular expressions`_:
 
-    .. code-block:: jinja
+    .. code-block:: twig
 
         {% if phone matches '/^[\\d\\.]+$/' %}
         {% endif %}
@@ -710,11 +662,10 @@ string:
 Containment Operator
 ~~~~~~~~~~~~~~~~~~~~
 
-The ``in`` operator performs containment test.
-
-It returns ``true`` if the left operand is contained in the right:
+The ``in`` operator performs containment test. It returns ``true`` if the left
+operand is contained in the right:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# returns true #}
 
@@ -729,7 +680,7 @@ It returns ``true`` if the left operand is contained in the right:
 
 To perform a negative test, use the ``not in`` operator:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if 1 not in [1, 2, 3] %}
 
@@ -742,7 +693,7 @@ Test Operator
 The ``is`` operator performs tests. Tests can be used to test a variable against
 a common expression. The right operand is name of the test:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# find out if a variable is odd #}
 
@@ -750,13 +701,13 @@ a common expression. The right operand is name of the test:
 
 Tests can accept arguments too:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if post.status is constant('Post::PUBLISHED') %}
 
 Tests can be negated by using the ``is not`` operator:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if post.status is not constant('Post::PUBLISHED') %}
 
@@ -769,17 +720,14 @@ tests.
 Other Operators
 ~~~~~~~~~~~~~~~
 
-.. versionadded:: 1.12.0
-    Support for the extended ternary operator was added in Twig 1.12.0.
-
 The following operators don't fit into any of the other categories:
 
 * ``|``: Applies a filter.
 
 * ``..``: Creates a sequence based on the operand before and after the operator
-  (this is just syntactic sugar for the :doc:`range<functions/range>` function):
+  (this is syntactic sugar for the :doc:`range<functions/range>` function):
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
       {{ 1..5 }}
 
@@ -789,7 +737,7 @@ The following operators don't fit into any of the other categories:
   Note that you must use parentheses when combining it with the filter operator
   due to the :ref:`operator precedence rules <twig-expressions>`:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
       (1..5)|join(', ')
 
@@ -797,36 +745,33 @@ The following operators don't fit into any of the other categories:
   " ~ name ~ "!" }}`` would return (assuming ``name`` is ``'John'``) ``Hello
   John!``.
 
-* ``.``, ``[]``: Gets an attribute of an object.
+* ``.``, ``[]``: Gets an attribute of a variable.
 
 * ``?:``: The ternary operator:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
       {{ foo ? 'yes' : 'no' }}
-
-      {# as of Twig 1.12.0 #}
       {{ foo ?: 'no' }} is the same as {{ foo ? foo : 'no' }}
       {{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }}
 
 * ``??``: The null-coalescing operator:
 
-  .. code-block:: jinja
+  .. code-block:: twig
 
       {# returns the value of foo if it is defined and not null, 'no' otherwise #}
       {{ foo ?? 'no' }}
 
+.. _templates-string-interpolation:
+
 String Interpolation
 ~~~~~~~~~~~~~~~~~~~~
 
-.. versionadded:: 1.5
-    String interpolation was added in Twig 1.5.
-
 String interpolation (``#{expression}``) allows any valid expression to appear
 within a *double-quoted string*. The result of evaluating that expression is
 inserted into the string:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ "foo #{bar} baz" }}
     {{ "foo #{1 + 2} baz" }}
@@ -836,58 +781,73 @@ inserted into the string:
 Whitespace Control
 ------------------
 
-.. versionadded:: 1.1
-    Tag level whitespace control was added in Twig 1.1.
+.. versionadded:: 2.8
+    Tag level Line whitespace control was added in Twig 2.8.
 
-The first newline after a template tag is removed automatically (like in PHP.)
+The first newline after a template tag is removed automatically (like in PHP).
 Whitespace is not further modified by the template engine, so each whitespace
 (spaces, tabs, newlines etc.) is returned unchanged.
 
-Use the ``spaceless`` tag to remove whitespace *between HTML tags*:
+You can also control whitespace on a per tag level. By using the whitespace
+control modifiers on your tags, you can trim leading and or trailing whitespace.
 
-.. code-block:: jinja
+Twig supports two modifiers:
 
-    {% spaceless %}
-        <div>
-            <strong>foo bar</strong>
-        </div>
-    {% endspaceless %}
+* *Whitespace trimming* via the ``-`` modifier: Removes all whitespace
+  (including newlines);
 
-    {# output will be <div><strong>foo bar</strong></div> #}
+* *Line whitespace trimming* via the ``~`` modifier: Removes all whitespace
+  (excluding newlines). Using this modifier on the right disables the default
+  removal of the first newline inherited from PHP.
 
-In addition to the spaceless tag you can also control whitespace on a per tag
-level. By using the whitespace control modifier on your tags, you can trim
-leading and or trailing whitespace:
+The modifiers can be used on either side of the tags like in ``{%-`` or ``-%}``
+and they consume all whitespace for that side of the tag. It is possible to use
+the modifiers on one side of a tag or on both sides:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% set value = 'no spaces' %}
     {#- No leading/trailing whitespace -#}
     {%- if true -%}
         {{- value -}}
     {%- endif -%}
-
     {# output 'no spaces' #}
 
-The above sample shows the default whitespace control modifier, and how you can
-use it to remove whitespace around tags. Trimming space will consume all whitespace
-for that side of the tag.  It is possible to use whitespace trimming on one side
-of a tag:
+    <li>
+        {{ value }}    </li>
+    {# outputs '<li>\n    no spaces    </li>' #}
 
-.. code-block:: jinja
+    <li>
+        {{- value }}    </li>
+    {# outputs '<li>no spaces    </li>' #}
 
-    {% set value = 'no spaces' %}
-    <li>    {{- value }}    </li>
+    <li>
+        {{~ value }}    </li>
+    {# outputs '<li>\nno spaces    </li>' #}
 
-    {# outputs '<li>no spaces    </li>' #}
+.. tip::
+
+    In addition to the whitespace modifiers, Twig also has a ``spaceless`` filter
+    that removes whitespace **between HTML tags**:
+
+    .. code-block:: twig
+
+        {% apply spaceless %}
+            <div>
+                <strong>foo bar</strong>
+            </div>
+        {% endapply %}
+
+        {# output will be <div><strong>foo bar</strong></div> #}
+
+    The ``apply`` tag was introduced in Twig 2.9; use the ``filter`` tag with
+    previous versions.
 
 Extensions
 ----------
 
-Twig can be easily extended.
-
-If you are looking for new tags, filters, or functions, have a look at the Twig official
-`extension repository`_.
+Twig can be extended. If you are looking for new tags, filters, or functions,
+have a look at the Twig official `extension repository`_.
 
 If you want to create your own, read the :ref:`Creating an
 Extension<creating_extensions>` chapter.
@@ -898,12 +858,12 @@ Extension<creating_extensions>` chapter.
 .. _`Twig syntax plugin`:         http://plugins.netbeans.org/plugin/37069/php-twig
 .. _`Twig plugin`:                https://github.com/pulse00/Twig-Eclipse-Plugin
 .. _`Twig language definition`:   https://github.com/gabrielcorpse/gedit-twig-template-language
-.. _`extension repository`:       http://github.com/twigphp/Twig-extensions
+.. _`extension repository`:       https://github.com/twigphp/Twig-extensions
 .. _`Twig syntax mode`:           https://github.com/bobthecow/Twig-HTML.mode
 .. _`other Twig syntax mode`:     https://github.com/muxx/Twig-HTML.mode
 .. _`Notepad++ Twig Highlighter`: https://github.com/Banane9/notepadplusplus-twig
 .. _`web-mode.el`:                http://web-mode.org/
-.. _`regular expressions`:        http://php.net/manual/en/pcre.pattern.php
+.. _`regular expressions`:        https://secure.php.net/manual/en/pcre.pattern.php
 .. _`PHP-twig for atom`:          https://github.com/reesef/php-twig
-.. _`TwigFiddle`:                 http://twigfiddle.com/
+.. _`TwigFiddle`:                 https://twigfiddle.com/
 .. _`Twig pack`:                  https://marketplace.visualstudio.com/items?itemName=bajdzis.vscode-twig-pack
diff --git a/vendor/twig/twig/doc/tests/constant.rst b/vendor/twig/twig/doc/tests/constant.rst
index 8d0724a8..448c238b 100644
--- a/vendor/twig/twig/doc/tests/constant.rst
+++ b/vendor/twig/twig/doc/tests/constant.rst
@@ -1,13 +1,10 @@
 ``constant``
 ============
 
-.. versionadded: 1.13.1
-    constant now accepts object instances as the second argument.
-
 ``constant`` checks if a variable has the exact same value as a constant. You
 can use either global constants or class constants:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if post.status is constant('Post::PUBLISHED') %}
         the status attribute is exactly the same as Post::PUBLISHED
@@ -15,7 +12,7 @@ can use either global constants or class constants:
 
 You can test constants from object instances as well:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if post.status is constant('PUBLISHED', post) %}
         the status attribute is exactly the same as Post::PUBLISHED
diff --git a/vendor/twig/twig/doc/tests/defined.rst b/vendor/twig/twig/doc/tests/defined.rst
index 702ce725..234a2898 100644
--- a/vendor/twig/twig/doc/tests/defined.rst
+++ b/vendor/twig/twig/doc/tests/defined.rst
@@ -4,7 +4,7 @@
 ``defined`` checks if a variable is defined in the current context. This is very
 useful if you use the ``strict_variables`` option:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# defined works with variable names #}
     {% if foo is defined %}
@@ -23,7 +23,7 @@ useful if you use the ``strict_variables`` option:
 When using the ``defined`` test on an expression that uses variables in some
 method calls, be sure that they are all defined first:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if var is defined and foo.method(var) is defined %}
         ...
diff --git a/vendor/twig/twig/doc/tests/divisibleby.rst b/vendor/twig/twig/doc/tests/divisibleby.rst
index 6c693b2b..8032d349 100644
--- a/vendor/twig/twig/doc/tests/divisibleby.rst
+++ b/vendor/twig/twig/doc/tests/divisibleby.rst
@@ -1,13 +1,9 @@
 ``divisible by``
 ================
 
-.. versionadded:: 1.14.2
-    The ``divisible by`` test was added in Twig 1.14.2 as an alias for
-    ``divisibleby``.
-
 ``divisible by`` checks if a variable is divisible by a number:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if loop.index is divisible by(3) %}
         ...
diff --git a/vendor/twig/twig/doc/tests/empty.rst b/vendor/twig/twig/doc/tests/empty.rst
index 639cdcc3..2cd28069 100644
--- a/vendor/twig/twig/doc/tests/empty.rst
+++ b/vendor/twig/twig/doc/tests/empty.rst
@@ -1,9 +1,9 @@
 ``empty``
 =========
 
-.. versionadded:: 1.33
+.. versionadded:: 2.3
 
-    Support for the ``__toString()`` magic method has been added in Twig 1.33.
+    Support for the ``__toString()`` magic method has been added in Twig 2.3.
 
 ``empty`` checks if a variable is an empty string, an empty array, an empty
 hash, exactly ``false``, or exactly ``null``.
@@ -14,7 +14,7 @@ return value of the ``count()`` method.
 For objects that implement the ``__toString()`` magic method (and not ``Countable``),
 it will check if an empty string is returned.
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if foo is empty %}
         ...
diff --git a/vendor/twig/twig/doc/tests/even.rst b/vendor/twig/twig/doc/tests/even.rst
index 6ab5cc39..5d9c8769 100644
--- a/vendor/twig/twig/doc/tests/even.rst
+++ b/vendor/twig/twig/doc/tests/even.rst
@@ -3,7 +3,7 @@
 
 ``even`` returns ``true`` if the given number is even:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ var is even }}
 
diff --git a/vendor/twig/twig/doc/tests/iterable.rst b/vendor/twig/twig/doc/tests/iterable.rst
index 89a172f7..4ebfe9d8 100644
--- a/vendor/twig/twig/doc/tests/iterable.rst
+++ b/vendor/twig/twig/doc/tests/iterable.rst
@@ -1,12 +1,9 @@
 ``iterable``
 ============
 
-.. versionadded:: 1.7
-    The iterable test was added in Twig 1.7.
-
 ``iterable`` checks if a variable is an array or a traversable object:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {# evaluates to true if the foo variable is iterable #}
     {% if users is iterable %}
diff --git a/vendor/twig/twig/doc/tests/null.rst b/vendor/twig/twig/doc/tests/null.rst
index 44eec62e..9ed93f6b 100644
--- a/vendor/twig/twig/doc/tests/null.rst
+++ b/vendor/twig/twig/doc/tests/null.rst
@@ -3,7 +3,7 @@
 
 ``null`` returns ``true`` if the variable is ``null``:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ var is null }}
 
diff --git a/vendor/twig/twig/doc/tests/odd.rst b/vendor/twig/twig/doc/tests/odd.rst
index 9eece777..0546f83c 100644
--- a/vendor/twig/twig/doc/tests/odd.rst
+++ b/vendor/twig/twig/doc/tests/odd.rst
@@ -3,7 +3,7 @@
 
 ``odd`` returns ``true`` if the given number is odd:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {{ var is odd }}
 
diff --git a/vendor/twig/twig/doc/tests/sameas.rst b/vendor/twig/twig/doc/tests/sameas.rst
index 16f904d5..cd2b1ad2 100644
--- a/vendor/twig/twig/doc/tests/sameas.rst
+++ b/vendor/twig/twig/doc/tests/sameas.rst
@@ -1,13 +1,10 @@
 ``same as``
 ===========
 
-.. versionadded:: 1.14.2
-    The ``same as`` test was added in Twig 1.14.2 as an alias for ``sameas``.
-
 ``same as`` checks if a variable is the same as another variable.
 This is the equivalent to ``===`` in PHP:
 
-.. code-block:: jinja
+.. code-block:: twig
 
     {% if foo.attribute is same as(false) %}
         the foo attribute really is the 'false' PHP value
diff --git a/vendor/twig/twig/drupal_test.sh b/vendor/twig/twig/drupal_test.sh
new file mode 100755
index 00000000..3bc1f08a
--- /dev/null
+++ b/vendor/twig/twig/drupal_test.sh
@@ -0,0 +1,52 @@
+#!/bin/bash
+
+set -x
+set -e
+
+REPO=`pwd`
+cd /tmp
+rm -rf drupal-twig-test
+composer create-project --no-interaction drupal-composer/drupal-project:8.x-dev drupal-twig-test
+cd drupal-twig-test
+(cd vendor/twig && rm -rf twig && ln -sf $REPO twig)
+echo '$config["system.logging"]["error_level"] = "verbose";' >> web/sites/default/settings.php
+composer require drupal/core:8.7.x-dev webflo/drupal-core-require-dev:8.7.x-dev "egulias/email-validator:^2.0"
+php ./web/core/scripts/drupal install --no-interaction demo_umami > output
+perl -p -i -e 's/^([A-Za-z]+)\: (.+)$/export DRUPAL_\1=\2/' output
+source output
+
+wget https://get.symfony.com/cli/installer -O - | bash
+export PATH="$HOME/.symfony/bin:$PATH"
+symfony server:start -d --no-tls
+ENDPOINT=`symfony server:status -no-ansi | sed -E 's/^.+ http/http/'`
+
+curl -OLsS https://get.blackfire.io/blackfire-player.phar
+chmod +x blackfire-player.phar
+cat > drupal-tests.bkf <<EOF
+name "Drupal tests"
+
+scenario
+    name "homepage"
+    set name "admin"
+    set pass "pass"
+
+    visit url('/')
+        expect status_code() == 200
+    click link('Articles')
+        expect status_code() == 200
+    click link('Dairy-free and delicious milk chocolate')
+        expect body() matches "/Dairy\-free milk chocolate is made in largely the same way as regular chocolate/"
+        expect status_code() == 200
+    click link('Log in')
+        expect status_code() == 200
+    submit button("Log in")
+        param name name
+        param pass pass
+        expect status_code() == 303
+    follow
+        expect status_code() == 200
+    click link('Structure')
+        expect status_code() == 200
+EOF
+./blackfire-player.phar run drupal-tests.bkf --endpoint=$ENDPOINT --variable name=$DRUPAL_Username --variable pass=$DRUPAL_Password
+symfony server:stop
diff --git a/vendor/twig/twig/ext/twig/.gitignore b/vendor/twig/twig/ext/twig/.gitignore
deleted file mode 100644
index 56ea76cc..00000000
--- a/vendor/twig/twig/ext/twig/.gitignore
+++ /dev/null
@@ -1,30 +0,0 @@
-*.sw*
-.deps
-Makefile
-Makefile.fragments
-Makefile.global
-Makefile.objects
-acinclude.m4
-aclocal.m4
-build/
-config.cache
-config.guess
-config.h
-config.h.in
-config.log
-config.nice
-config.status
-config.sub
-configure
-configure.in
-install-sh
-libtool
-ltmain.sh
-missing
-mkinstalldirs
-run-tests.php
-twig.loT
-.libs/
-modules/
-twig.la
-twig.lo
diff --git a/vendor/twig/twig/ext/twig/config.m4 b/vendor/twig/twig/ext/twig/config.m4
deleted file mode 100644
index 83486be4..00000000
--- a/vendor/twig/twig/ext/twig/config.m4
+++ /dev/null
@@ -1,8 +0,0 @@
-dnl config.m4 for extension twig
-
-PHP_ARG_ENABLE(twig, whether to enable twig support,
-[  --enable-twig           Enable twig support])
-
-if test "$PHP_TWIG" != "no"; then
-  PHP_NEW_EXTENSION(twig, twig.c, $ext_shared)
-fi
diff --git a/vendor/twig/twig/ext/twig/config.w32 b/vendor/twig/twig/ext/twig/config.w32
deleted file mode 100644
index cb287b99..00000000
--- a/vendor/twig/twig/ext/twig/config.w32
+++ /dev/null
@@ -1,8 +0,0 @@
-// vim:ft=javascript
-
-ARG_ENABLE("twig", "Twig support", "no");
-
-if (PHP_TWIG != "no") {
-	AC_DEFINE('HAVE_TWIG', 1);
-	EXTENSION('twig', 'twig.c');
-}
diff --git a/vendor/twig/twig/ext/twig/php_twig.h b/vendor/twig/twig/ext/twig/php_twig.h
deleted file mode 100644
index 7fc1601e..00000000
--- a/vendor/twig/twig/ext/twig/php_twig.h
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
-   +----------------------------------------------------------------------+
-   | Twig Extension                                                       |
-   +----------------------------------------------------------------------+
-   | Copyright (c) 2011 Derick Rethans                                    |
-   +----------------------------------------------------------------------+
-   | Redistribution and use in source and binary forms, with or without   |
-   | modification, are permitted provided that the conditions mentioned   |
-   | in the accompanying LICENSE file are met (BSD-3-Clause).             |
-   +----------------------------------------------------------------------+
-   | Author: Derick Rethans <derick@xxxxxxxxxxxxxxxx>                     |
-   +----------------------------------------------------------------------+
- */
-
-#ifndef PHP_TWIG_H
-#define PHP_TWIG_H
-
-#define PHP_TWIG_VERSION "1.35.0"
-
-#include "php.h"
-
-extern zend_module_entry twig_module_entry;
-#define phpext_twig_ptr &twig_module_entry
-#ifndef PHP_WIN32
-zend_module_entry *get_module(void);
-#endif
-
-#ifdef ZTS
-#include "TSRM.h"
-#endif
-
-PHP_FUNCTION(twig_template_get_attributes);
-PHP_RSHUTDOWN_FUNCTION(twig);
-
-#endif
diff --git a/vendor/twig/twig/ext/twig/twig.c b/vendor/twig/twig/ext/twig/twig.c
deleted file mode 100644
index 6173c006..00000000
--- a/vendor/twig/twig/ext/twig/twig.c
+++ /dev/null
@@ -1,1215 +0,0 @@
-/*
-   +----------------------------------------------------------------------+
-   | Twig Extension                                                       |
-   +----------------------------------------------------------------------+
-   | Copyright (c) 2011 Derick Rethans                                    |
-   +----------------------------------------------------------------------+
-   | Redistribution and use in source and binary forms, with or without   |
-   | modification, are permitted provided that the conditions mentioned   |
-   | in the accompanying LICENSE file are met (BSD-3-Clause).             |
-   +----------------------------------------------------------------------+
-   | Author: Derick Rethans <derick@xxxxxxxxxxxxxxxx>                     |
-   +----------------------------------------------------------------------+
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "php.h"
-#include "php_twig.h"
-#include "ext/standard/php_var.h"
-#include "ext/standard/php_string.h"
-#include "ext/standard/php_smart_str.h"
-#include "ext/spl/spl_exceptions.h"
-
-#include "Zend/zend_object_handlers.h"
-#include "Zend/zend_interfaces.h"
-#include "Zend/zend_exceptions.h"
-
-#ifndef Z_ADDREF_P
-#define Z_ADDREF_P(pz)                (pz)->refcount++
-#endif
-
-#ifndef E_USER_DEPRECATED
-#define E_USER_DEPRECATED	(1<<14L)
-#endif
-
-#define FREE_DTOR(z) 	\
-	zval_dtor(z); 		\
-	efree(z);
-
-#if PHP_VERSION_ID >= 50300
-	#define APPLY_TSRMLS_DC TSRMLS_DC
-	#define APPLY_TSRMLS_CC TSRMLS_CC
-	#define APPLY_TSRMLS_FETCH()
-#else
-	#define APPLY_TSRMLS_DC
-	#define APPLY_TSRMLS_CC
-	#define APPLY_TSRMLS_FETCH() TSRMLS_FETCH()
-#endif
-
-ZEND_BEGIN_ARG_INFO_EX(twig_template_get_attribute_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 6)
-	ZEND_ARG_INFO(0, template)
-	ZEND_ARG_INFO(0, object)
-	ZEND_ARG_INFO(0, item)
-	ZEND_ARG_INFO(0, arguments)
-	ZEND_ARG_INFO(0, type)
-	ZEND_ARG_INFO(0, isDefinedTest)
-ZEND_END_ARG_INFO()
-
-#ifndef PHP_FE_END
-#define PHP_FE_END { NULL, NULL, NULL}
-#endif
-
-static const zend_function_entry twig_functions[] = {
-	PHP_FE(twig_template_get_attributes, twig_template_get_attribute_args)
-	PHP_FE_END
-};
-
-PHP_RSHUTDOWN_FUNCTION(twig)
-{
-#if ZEND_DEBUG
-	CG(unclean_shutdown) = 0; /* get rid of PHPUnit's exit() and report memleaks */
-#endif
-	return SUCCESS;
-}
-
-zend_module_entry twig_module_entry = {
-	STANDARD_MODULE_HEADER,
-	"twig",
-	twig_functions,
-	NULL,
-	NULL,
-	NULL,
-	PHP_RSHUTDOWN(twig),
-	NULL,
-	PHP_TWIG_VERSION,
-	STANDARD_MODULE_PROPERTIES
-};
-
-
-#ifdef COMPILE_DL_TWIG
-ZEND_GET_MODULE(twig)
-#endif
-
-static int TWIG_ARRAY_KEY_EXISTS(zval *array, zval *key)
-{
-	if (Z_TYPE_P(array) != IS_ARRAY) {
-		return 0;
-	}
-
-	switch (Z_TYPE_P(key)) {
-		case IS_NULL:
-			return zend_hash_exists(Z_ARRVAL_P(array), "", 1);
-
-		case IS_BOOL:
-		case IS_DOUBLE:
-			convert_to_long(key);
-		case IS_LONG:
-			return zend_hash_index_exists(Z_ARRVAL_P(array), Z_LVAL_P(key));
-
-		default:
-			convert_to_string(key);
-			return zend_symtable_exists(Z_ARRVAL_P(array), Z_STRVAL_P(key), Z_STRLEN_P(key) + 1);
-	}
-}
-
-static int TWIG_INSTANCE_OF(zval *object, zend_class_entry *interface TSRMLS_DC)
-{
-	if (Z_TYPE_P(object) != IS_OBJECT) {
-		return 0;
-	}
-	return instanceof_function(Z_OBJCE_P(object), interface TSRMLS_CC);
-}
-
-static int TWIG_INSTANCE_OF_USERLAND(zval *object, char *interface TSRMLS_DC)
-{
-	zend_class_entry **pce;
-	if (Z_TYPE_P(object) != IS_OBJECT) {
-		return 0;
-	}
-	if (zend_lookup_class(interface, strlen(interface), &pce TSRMLS_CC) == FAILURE) {
-		return 0;
-	}
-	return instanceof_function(Z_OBJCE_P(object), *pce TSRMLS_CC);
-}
-
-static zval *TWIG_GET_ARRAYOBJECT_ELEMENT(zval *object, zval *offset TSRMLS_DC)
-{
-	zend_class_entry *ce = Z_OBJCE_P(object);
-	zval *retval;
-
-	if (Z_TYPE_P(object) == IS_OBJECT) {
-		SEPARATE_ARG_IF_REF(offset);
-		zend_call_method_with_1_params(&object, ce, NULL, "offsetget", &retval, offset);
-
-		zval_ptr_dtor(&offset);
-
-		if (!retval) {
-			if (!EG(exception)) {
-				zend_error(E_ERROR, "Undefined offset for object of type %s used as array.", ce->name);
-			}
-			return NULL;
-		}
-
-		return retval;
-	}
-	return NULL;
-}
-
-static int TWIG_ISSET_ARRAYOBJECT_ELEMENT(zval *object, zval *offset TSRMLS_DC)
-{
-	zend_class_entry *ce = Z_OBJCE_P(object);
-	zval *retval;
-
-	if (Z_TYPE_P(object) == IS_OBJECT) {
-		SEPARATE_ARG_IF_REF(offset);
-		zend_call_method_with_1_params(&object, ce, NULL, "offsetexists", &retval, offset);
-
-		zval_ptr_dtor(&offset);
-
-		if (!retval) {
-			if (!EG(exception)) {
-				zend_error(E_ERROR, "Undefined offset for object of type %s used as array.", ce->name);
-			}
-			return 0;
-		}
-
-		return (retval && Z_TYPE_P(retval) == IS_BOOL && Z_LVAL_P(retval));
-	}
-	return 0;
-}
-
-static char *TWIG_STRTOLOWER(const char *str, int str_len)
-{
-	char *item_dup;
-
-	item_dup = estrndup(str, str_len);
-	php_strtolower(item_dup, str_len);
-	return item_dup;
-}
-
-static zval *TWIG_CALL_USER_FUNC_ARRAY(zval *object, char *function, zval *arguments TSRMLS_DC)
-{
-	zend_fcall_info fci;
-	zval ***args = NULL;
-	int arg_count = 0;
-	HashTable *table;
-	HashPosition pos;
-	int i = 0;
-	zval *retval_ptr;
-	zval *zfunction;
-
-	if (arguments) {
-		table = HASH_OF(arguments);
-		args = safe_emalloc(sizeof(zval **), table->nNumOfElements, 0);
-
-		zend_hash_internal_pointer_reset_ex(table, &pos);
-
-		while (zend_hash_get_current_data_ex(table, (void **)&args[i], &pos) == SUCCESS) {
-			i++;
-			zend_hash_move_forward_ex(table, &pos);
-		}
-		arg_count = table->nNumOfElements;
-	}
-
-	MAKE_STD_ZVAL(zfunction);
-	ZVAL_STRING(zfunction, function, 1);
-	fci.size = sizeof(fci);
-	fci.function_table = EG(function_table);
-	fci.function_name = zfunction;
-	fci.symbol_table = NULL;
-#if PHP_VERSION_ID >= 50300
-	fci.object_ptr = object;
-#else
-	fci.object_pp = &object;
-#endif
-	fci.retval_ptr_ptr = &retval_ptr;
-	fci.param_count = arg_count;
-	fci.params = args;
-	fci.no_separation = 0;
-
-	if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE) {
-		ALLOC_INIT_ZVAL(retval_ptr);
-		ZVAL_BOOL(retval_ptr, 0);
-	}
-
-	if (args) {
-		efree(fci.params);
-	}
-	FREE_DTOR(zfunction);
-	return retval_ptr;
-}
-
-static int TWIG_CALL_BOOLEAN(zval *object, char *functionName TSRMLS_DC)
-{
-	zval *ret;
-	int   res;
-
-	ret = TWIG_CALL_USER_FUNC_ARRAY(object, functionName, NULL TSRMLS_CC);
-	res = Z_LVAL_P(ret);
-	zval_ptr_dtor(&ret);
-	return res;
-}
-
-static zval *TWIG_GET_STATIC_PROPERTY(zval *class, char *prop_name TSRMLS_DC)
-{
-	zval **tmp_zval;
-	zend_class_entry *ce;
-
-	if (class == NULL || Z_TYPE_P(class) != IS_OBJECT) {
-		return NULL;
-	}
-
-	ce = zend_get_class_entry(class TSRMLS_CC);
-#if PHP_VERSION_ID >= 50400
-	tmp_zval = zend_std_get_static_property(ce, prop_name, strlen(prop_name), 0, NULL TSRMLS_CC);
-#else
-	tmp_zval = zend_std_get_static_property(ce, prop_name, strlen(prop_name), 0 TSRMLS_CC);
-#endif
-	return *tmp_zval;
-}
-
-static zval *TWIG_GET_ARRAY_ELEMENT_ZVAL(zval *class, zval *prop_name TSRMLS_DC)
-{
-	zval **tmp_zval;
-
-	if (class == NULL || Z_TYPE_P(class) != IS_ARRAY) {
-		if (class != NULL && Z_TYPE_P(class) == IS_OBJECT && TWIG_INSTANCE_OF(class, zend_ce_arrayaccess TSRMLS_CC)) {
-			// array access object
-			return TWIG_GET_ARRAYOBJECT_ELEMENT(class, prop_name TSRMLS_CC);
-		}
-		return NULL;
-	}
-
-	switch(Z_TYPE_P(prop_name)) {
-		case IS_NULL:
-			zend_hash_find(HASH_OF(class), "", 1, (void**) &tmp_zval);
-			return *tmp_zval;
-
-		case IS_BOOL:
-		case IS_DOUBLE:
-			convert_to_long(prop_name);
-		case IS_LONG:
-			zend_hash_index_find(HASH_OF(class), Z_LVAL_P(prop_name), (void **) &tmp_zval);
-			return *tmp_zval;
-
-		case IS_STRING:
-			zend_symtable_find(HASH_OF(class), Z_STRVAL_P(prop_name), Z_STRLEN_P(prop_name) + 1, (void**) &tmp_zval);
-			return *tmp_zval;
-	}
-
-	return NULL;
-}
-
-static zval *TWIG_GET_ARRAY_ELEMENT(zval *class, char *prop_name, int prop_name_length TSRMLS_DC)
-{
-	zval **tmp_zval;
-
-	if (class == NULL/* || Z_TYPE_P(class) != IS_ARRAY*/) {
-		return NULL;
-	}
-
-	if (class != NULL && Z_TYPE_P(class) == IS_OBJECT && TWIG_INSTANCE_OF(class, zend_ce_arrayaccess TSRMLS_CC)) {
-		// array access object
-		zval *tmp_name_zval;
-		zval *tmp_ret_zval;
-
-		ALLOC_INIT_ZVAL(tmp_name_zval);
-		ZVAL_STRING(tmp_name_zval, prop_name, 1);
-		tmp_ret_zval = TWIG_GET_ARRAYOBJECT_ELEMENT(class, tmp_name_zval TSRMLS_CC);
-		FREE_DTOR(tmp_name_zval);
-		return tmp_ret_zval;
-	}
-
-	if (zend_symtable_find(HASH_OF(class), prop_name, prop_name_length+1, (void**)&tmp_zval) == SUCCESS) {
-		return *tmp_zval;
-	}
-	return NULL;
-}
-
-static zval *TWIG_PROPERTY(zval *object, zval *propname TSRMLS_DC)
-{
-	zval *tmp = NULL;
-
-	if (Z_OBJ_HT_P(object)->read_property) {
-#if PHP_VERSION_ID >= 50400
-		tmp = Z_OBJ_HT_P(object)->read_property(object, propname, BP_VAR_IS, NULL TSRMLS_CC);
-#else
-		tmp = Z_OBJ_HT_P(object)->read_property(object, propname, BP_VAR_IS TSRMLS_CC);
-#endif
-		if (tmp == EG(uninitialized_zval_ptr)) {
-		        ZVAL_NULL(tmp);
-		}
-	}
-	return tmp;
-}
-
-static int TWIG_HAS_PROPERTY(zval *object, zval *propname TSRMLS_DC)
-{
-	if (Z_OBJ_HT_P(object)->has_property) {
-#if PHP_VERSION_ID >= 50400
-		return Z_OBJ_HT_P(object)->has_property(object, propname, 0, NULL TSRMLS_CC);
-#else
-		return Z_OBJ_HT_P(object)->has_property(object, propname, 0 TSRMLS_CC);
-#endif
-	}
-	return 0;
-}
-
-static int TWIG_HAS_DYNAMIC_PROPERTY(zval *object, char *prop, int prop_len TSRMLS_DC)
-{
-	if (Z_OBJ_HT_P(object)->get_properties) {
-		return zend_hash_quick_exists(
-				Z_OBJ_HT_P(object)->get_properties(object TSRMLS_CC), // the properties hash
-				prop,                                                 // property name
-				prop_len + 1,                                         // property length
-				zend_get_hash_value(prop, prop_len + 1)               // hash value
-			);
-	}
-	return 0;
-}
-
-static zval *TWIG_PROPERTY_CHAR(zval *object, char *propname TSRMLS_DC)
-{
-	zval *tmp_name_zval, *tmp;
-
-	ALLOC_INIT_ZVAL(tmp_name_zval);
-	ZVAL_STRING(tmp_name_zval, propname, 1);
-	tmp = TWIG_PROPERTY(object, tmp_name_zval TSRMLS_CC);
-	FREE_DTOR(tmp_name_zval);
-	return tmp;
-}
-
-static zval *TWIG_CALL_S(zval *object, char *method, char *arg0 TSRMLS_DC)
-{
-	zend_fcall_info fci;
-	zval **args[1];
-	zval *argument;
-	zval *zfunction;
-	zval *retval_ptr;
-
-	MAKE_STD_ZVAL(argument);
-	ZVAL_STRING(argument, arg0, 1);
-	args[0] = &argument;
-
-	MAKE_STD_ZVAL(zfunction);
-	ZVAL_STRING(zfunction, method, 1);
-	fci.size = sizeof(fci);
-	fci.function_table = EG(function_table);
-	fci.function_name = zfunction;
-	fci.symbol_table = NULL;
-#if PHP_VERSION_ID >= 50300
-	fci.object_ptr = object;
-#else
-	fci.object_pp = &object;
-#endif
-	fci.retval_ptr_ptr = &retval_ptr;
-	fci.param_count = 1;
-	fci.params = args;
-	fci.no_separation = 0;
-
-	if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE) {
-		FREE_DTOR(zfunction);
-		zval_ptr_dtor(&argument);
-		return 0;
-	}
-	FREE_DTOR(zfunction);
-	zval_ptr_dtor(&argument);
-	return retval_ptr;
-}
-
-static int TWIG_CALL_SB(zval *object, char *method, char *arg0 TSRMLS_DC)
-{
-	zval *retval_ptr;
-	int success;
-
-	retval_ptr = TWIG_CALL_S(object, method, arg0 TSRMLS_CC);
-	success = (retval_ptr && (Z_TYPE_P(retval_ptr) == IS_BOOL) && Z_LVAL_P(retval_ptr));
-
-	if (retval_ptr) {
-		zval_ptr_dtor(&retval_ptr);
-	}
-
-	return success;
-}
-
-static int TWIG_CALL_ZZ(zval *object, char *method, zval *arg1, zval *arg2 TSRMLS_DC)
-{
-	zend_fcall_info fci;
-	zval **args[2];
-	zval *zfunction;
-	zval *retval_ptr;
-	int   success;
-
-	args[0] = &arg1;
-	args[1] = &arg2;
-
-	MAKE_STD_ZVAL(zfunction);
-	ZVAL_STRING(zfunction, method, 1);
-	fci.size = sizeof(fci);
-	fci.function_table = EG(function_table);
-	fci.function_name = zfunction;
-	fci.symbol_table = NULL;
-#if PHP_VERSION_ID >= 50300
-	fci.object_ptr = object;
-#else
-	fci.object_pp = &object;
-#endif
-	fci.retval_ptr_ptr = &retval_ptr;
-	fci.param_count = 2;
-	fci.params = args;
-	fci.no_separation = 0;
-
-	if (zend_call_function(&fci, NULL TSRMLS_CC) == FAILURE) {
-		FREE_DTOR(zfunction);
-		return 0;
-	}
-
-	FREE_DTOR(zfunction);
-
-	success = (retval_ptr && (Z_TYPE_P(retval_ptr) == IS_BOOL) && Z_LVAL_P(retval_ptr));
-	if (retval_ptr) {
-		zval_ptr_dtor(&retval_ptr);
-	}
-
-	return success;
-}
-
-#ifndef Z_SET_REFCOUNT_P
-# define Z_SET_REFCOUNT_P(pz, rc)  pz->refcount = rc
-# define Z_UNSET_ISREF_P(pz) pz->is_ref = 0
-#endif
-
-static void TWIG_NEW(zval *object, char *class, zval *arg0, zval *arg1 TSRMLS_DC)
-{
-	zend_class_entry **pce;
-
-	if (zend_lookup_class(class, strlen(class), &pce TSRMLS_CC) == FAILURE) {
-		return;
-	}
-
-	Z_TYPE_P(object) = IS_OBJECT;
-	object_init_ex(object, *pce);
-	Z_SET_REFCOUNT_P(object, 1);
-	Z_UNSET_ISREF_P(object);
-
-	TWIG_CALL_ZZ(object, "__construct", arg0, arg1 TSRMLS_CC);
-}
-
-static int twig_add_array_key_to_string(void *pDest APPLY_TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key)
-{
-	smart_str *buf;
-	char *joiner;
-	APPLY_TSRMLS_FETCH();
-
-	buf = va_arg(args, smart_str*);
-	joiner = va_arg(args, char*);
-
-	if (buf->len != 0) {
-		smart_str_appends(buf, joiner);
-	}
-
-	if (hash_key->nKeyLength == 0) {
-		smart_str_append_long(buf, (long) hash_key->h);
-	} else {
-		char *key, *tmp_str;
-		int key_len, tmp_len;
-		key = php_addcslashes(hash_key->arKey, hash_key->nKeyLength - 1, &key_len, 0, "'\\", 2 TSRMLS_CC);
-		tmp_str = php_str_to_str_ex(key, key_len, "\0", 1, "' . \"\\0\" . '", 12, &tmp_len, 0, NULL);
-
-		smart_str_appendl(buf, tmp_str, tmp_len);
-		efree(key);
-		efree(tmp_str);
-	}
-
-	return 0;
-}
-
-static char *TWIG_IMPLODE_ARRAY_KEYS(char *joiner, zval *array TSRMLS_DC)
-{
-	smart_str collector = { 0, 0, 0 };
-
-	smart_str_appendl(&collector, "", 0);
-	zend_hash_apply_with_arguments(HASH_OF(array) APPLY_TSRMLS_CC, twig_add_array_key_to_string, 2, &collector, joiner);
-	smart_str_0(&collector);
-
-	return collector.c;
-}
-
-static void TWIG_RUNTIME_ERROR(zval *template TSRMLS_DC, char *message, ...)
-{
-	char *buffer;
-	va_list args;
-	zend_class_entry **pce;
-	zval *ex;
-	zval *constructor;
-	zval *zmessage;
-	zval *lineno;
-	zval *filename_func;
-	zval *filename;
-	zval *constructor_args[3];
-	zval *constructor_retval;
-
-	if (zend_lookup_class("Twig_Error_Runtime", strlen("Twig_Error_Runtime"), &pce TSRMLS_CC) == FAILURE) {
-		return;
-	}
-
-	va_start(args, message);
-	vspprintf(&buffer, 0, message, args);
-	va_end(args);
-
-	MAKE_STD_ZVAL(ex);
-	object_init_ex(ex, *pce);
-
-	// Call Twig_Error constructor
-	MAKE_STD_ZVAL(constructor);
-	MAKE_STD_ZVAL(zmessage);
-	MAKE_STD_ZVAL(lineno);
-	MAKE_STD_ZVAL(filename);
-	MAKE_STD_ZVAL(filename_func);
-	MAKE_STD_ZVAL(constructor_retval);
-
-	ZVAL_STRINGL(constructor, "__construct", sizeof("__construct")-1, 1);
-	ZVAL_STRING(zmessage, buffer, 1);
-	ZVAL_LONG(lineno, -1);
-
-	// Get template filename
-	ZVAL_STRINGL(filename_func, "getTemplateName", sizeof("getTemplateName")-1, 1);
-	call_user_function(EG(function_table), &template, filename_func, filename, 0, 0 TSRMLS_CC);
-
-	constructor_args[0] = zmessage;
-	constructor_args[1] = lineno;
-	constructor_args[2] = filename;
-	call_user_function(EG(function_table), &ex, constructor, constructor_retval, 3, constructor_args TSRMLS_CC);
-
-	zval_ptr_dtor(&constructor_retval);
-	zval_ptr_dtor(&zmessage);
-	zval_ptr_dtor(&lineno);
-	zval_ptr_dtor(&filename);
-	FREE_DTOR(constructor);
-	FREE_DTOR(filename_func);
-	efree(buffer);
-
-	zend_throw_exception_object(ex TSRMLS_CC);
-}
-
-static char *TWIG_GET_CLASS_NAME(zval *object TSRMLS_DC)
-{
-	char *class_name;
-	zend_uint class_name_len;
-
-	if (Z_TYPE_P(object) != IS_OBJECT) {
-		return "";
-	}
-#if PHP_API_VERSION >= 20100412
-	zend_get_object_classname(object, (const char **) &class_name, &class_name_len TSRMLS_CC);
-#else
-	zend_get_object_classname(object, &class_name, &class_name_len TSRMLS_CC);
-#endif
-	return class_name;
-}
-
-static int twig_add_method_to_class(void *pDest APPLY_TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key)
-{
-	zend_class_entry *ce;
-	zval *retval;
-	char *item;
-	size_t item_len;
-	zend_function *mptr = (zend_function *) pDest;
-	APPLY_TSRMLS_FETCH();
-
-	if (!(mptr->common.fn_flags & ZEND_ACC_PUBLIC)) {
-		return 0;
-	}
-
-	ce = *va_arg(args, zend_class_entry**);
-	retval = va_arg(args, zval*);
-
-	item_len = strlen(mptr->common.function_name);
-	item = estrndup(mptr->common.function_name, item_len);
-	php_strtolower(item, item_len);
-
-	if (strcmp("getenvironment", item) == 0) {
-		zend_class_entry **twig_template_ce;
-		if (zend_lookup_class("Twig_Template", strlen("Twig_Template"), &twig_template_ce TSRMLS_CC) == FAILURE) {
-			return 0;
-		}
-		if (instanceof_function(ce, *twig_template_ce TSRMLS_CC)) {
-			return 0;
-		}
-	}
-
-	add_assoc_stringl_ex(retval, item, item_len+1, item, item_len, 0);
-
-	return 0;
-}
-
-static int twig_add_property_to_class(void *pDest APPLY_TSRMLS_DC, int num_args, va_list args, zend_hash_key *hash_key)
-{
-	zend_class_entry *ce;
-	zval *retval;
-	char *class_name, *prop_name;
-	zend_property_info *pptr = (zend_property_info *) pDest;
-	APPLY_TSRMLS_FETCH();
-
-	if (!(pptr->flags & ZEND_ACC_PUBLIC) || (pptr->flags & ZEND_ACC_STATIC)) {
-		return 0;
-	}
-
-	ce = *va_arg(args, zend_class_entry**);
-	retval = va_arg(args, zval*);
-
-#if PHP_API_VERSION >= 20100412
-	zend_unmangle_property_name(pptr->name, pptr->name_length, (const char **) &class_name, (const char **) &prop_name);
-#else
-	zend_unmangle_property_name(pptr->name, pptr->name_length, &class_name, &prop_name);
-#endif
-
-	add_assoc_string(retval, prop_name, prop_name, 1);
-
-	return 0;
-}
-
-static void twig_add_class_to_cache(zval *cache, zval *object, char *class_name TSRMLS_DC)
-{
-	zval *class_info, *class_methods, *class_properties;
-	zend_class_entry *class_ce;
-
-	class_ce = zend_get_class_entry(object TSRMLS_CC);
-
-	ALLOC_INIT_ZVAL(class_info);
-	ALLOC_INIT_ZVAL(class_methods);
-	ALLOC_INIT_ZVAL(class_properties);
-	array_init(class_info);
-	array_init(class_methods);
-	array_init(class_properties);
-	// add all methods to self::cache[$class]['methods']
-	zend_hash_apply_with_arguments(&class_ce->function_table APPLY_TSRMLS_CC, twig_add_method_to_class, 2, &class_ce, class_methods);
-	zend_hash_apply_with_arguments(&class_ce->properties_info APPLY_TSRMLS_CC, twig_add_property_to_class, 2, &class_ce, class_properties);
-
-	add_assoc_zval(class_info, "methods", class_methods);
-	add_assoc_zval(class_info, "properties", class_properties);
-	add_assoc_zval(cache, class_name, class_info);
-}
-
-/* {{{ proto mixed twig_template_get_attributes(TwigTemplate template, mixed object, mixed item, array arguments, string type, boolean isDefinedTest, boolean ignoreStrictCheck)
-   A C implementation of TwigTemplate::getAttribute() */
-PHP_FUNCTION(twig_template_get_attributes)
-{
-	zval *template;
-	zval *object;
-	char *item;
-	int  item_len;
-	zval *zitem, ztmpitem;
-	zval *arguments = NULL;
-	zval *ret = NULL;
-	char *type = NULL;
-	int   type_len = 0;
-	zend_bool isDefinedTest = 0;
-	zend_bool ignoreStrictCheck = 0;
-	int free_ret = 0;
-	zval *tmp_self_cache;
-	char *class_name = NULL;
-	zval *tmp_class;
-	char *type_name;
-
-	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ozz|asbb", &template, &object, &zitem, &arguments, &type, &type_len, &isDefinedTest, &ignoreStrictCheck) == FAILURE) {
-		return;
-	}
-
-	// convert the item to a string
-	ztmpitem = *zitem;
-	zval_copy_ctor(&ztmpitem);
-	convert_to_string(&ztmpitem);
-	item_len = Z_STRLEN(ztmpitem);
-	item = estrndup(Z_STRVAL(ztmpitem), item_len);
-	zval_dtor(&ztmpitem);
-
-	if (!type) {
-		type = "any";
-	}
-
-/*
-	// array
-	if (Twig_Template::METHOD_CALL !== $type) {
-		$arrayItem = is_bool($item) || is_float($item) ? (int) $item : $item;
-
-		if ((is_array($object) && array_key_exists($arrayItem, $object))
-			|| ($object instanceof ArrayAccess && isset($object[$arrayItem]))
-		) {
-			if ($isDefinedTest) {
-				return true;
-			}
-
-			return $object[$arrayItem];
-		}
-*/
-
-
-	if (strcmp("method", type) != 0) {
-		if ((TWIG_ARRAY_KEY_EXISTS(object, zitem))
-			|| (TWIG_INSTANCE_OF(object, zend_ce_arrayaccess TSRMLS_CC) && TWIG_ISSET_ARRAYOBJECT_ELEMENT(object, zitem TSRMLS_CC))
-		) {
-
-			if (isDefinedTest) {
-				efree(item);
-				RETURN_TRUE;
-			}
-
-			ret = TWIG_GET_ARRAY_ELEMENT_ZVAL(object, zitem TSRMLS_CC);
-
-			if (!ret) {
-				ret = &EG(uninitialized_zval);
-			}
-			RETVAL_ZVAL(ret, 1, 0);
-			if (free_ret) {
-				zval_ptr_dtor(&ret);
-			}
-			efree(item);
-			return;
-		}
-/*
-		if (Twig_Template::ARRAY_CALL === $type) {
-			if ($isDefinedTest) {
-				return false;
-			}
-			if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-				return null;
-			}
-*/
-		if (strcmp("array", type) == 0 || Z_TYPE_P(object) != IS_OBJECT) {
-			if (isDefinedTest) {
-				efree(item);
-				RETURN_FALSE;
-			}
-			if (ignoreStrictCheck || !TWIG_CALL_BOOLEAN(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "isStrictVariables" TSRMLS_CC)) {
-				efree(item);
-				return;
-			}
-/*
-			if ($object instanceof ArrayAccess) {
-				$message = sprintf('Key "%s" in object with ArrayAccess of class "%s" does not exist', $arrayItem, get_class($object));
-			} elseif (is_object($object)) {
-				$message = sprintf('Impossible to access a key "%s" on an object of class "%s" that does not implement ArrayAccess interface', $item, get_class($object));
-			} elseif (is_array($object)) {
-				if (empty($object)) {
-					$message = sprintf('Key "%s" does not exist as the array is empty', $arrayItem);
-				} else {
-					$message = sprintf('Key "%s" for array with keys "%s" does not exist', $arrayItem, implode(', ', array_keys($object)));
-				}
-			} elseif (Twig_Template::ARRAY_CALL === $type) {
-				if (null === $object) {
-					$message = sprintf('Impossible to access a key ("%s") on a null variable', $item);
-				} else {
-					$message = sprintf('Impossible to access a key ("%s") on a %s variable ("%s")', $item, gettype($object), $object);
-				}
-			} elseif (null === $object) {
-				$message = sprintf('Impossible to access an attribute ("%s") on a null variable', $item);
-			} else {
-				$message = sprintf('Impossible to access an attribute ("%s") on a %s variable ("%s")', $item, gettype($object), $object);
-			}
-			throw new Twig_Error_Runtime($message, -1, $this->getTemplateName());
-		}
-	}
-*/
-			if (TWIG_INSTANCE_OF(object, zend_ce_arrayaccess TSRMLS_CC)) {
-				TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Key \"%s\" in object with ArrayAccess of class \"%s\" does not exist.", item, TWIG_GET_CLASS_NAME(object TSRMLS_CC));
-			} else if (Z_TYPE_P(object) == IS_OBJECT) {
-				TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Impossible to access a key \"%s\" on an object of class \"%s\" that does not implement ArrayAccess interface.", item, TWIG_GET_CLASS_NAME(object TSRMLS_CC));
-			} else if (Z_TYPE_P(object) == IS_ARRAY) {
-				if (0 == zend_hash_num_elements(Z_ARRVAL_P(object))) {
-					TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Key \"%s\" does not exist as the array is empty.", item);
-				} else {
-					char *array_keys = TWIG_IMPLODE_ARRAY_KEYS(", ", object TSRMLS_CC);
-					TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Key \"%s\" for array with keys \"%s\" does not exist.", item, array_keys);
-					efree(array_keys);
-				}
-			} else {
-				char *type_name = zend_zval_type_name(object);
-				Z_ADDREF_P(object);
-				if (Z_TYPE_P(object) == IS_NULL) {
-					convert_to_string(object);
-					TWIG_RUNTIME_ERROR(template TSRMLS_CC,
-						(strcmp("array", type) == 0)
-							? "Impossible to access a key (\"%s\") on a %s variable."
-							: "Impossible to access an attribute (\"%s\") on a %s variable.",
-						item, type_name);
-				} else {
-					convert_to_string(object);
-					TWIG_RUNTIME_ERROR(template TSRMLS_CC,
-						(strcmp("array", type) == 0)
-							? "Impossible to access a key (\"%s\") on a %s variable (\"%s\")."
-							: "Impossible to access an attribute (\"%s\") on a %s variable (\"%s\").",
-						item, type_name, Z_STRVAL_P(object));
-				}
-				zval_ptr_dtor(&object);
-			}
-			efree(item);
-			return;
-		}
-	}
-
-/*
-	if (!is_object($object)) {
-		if ($isDefinedTest) {
-			return false;
-		}
-*/
-
-	if (Z_TYPE_P(object) != IS_OBJECT) {
-		if (isDefinedTest) {
-			efree(item);
-			RETURN_FALSE;
-		}
-/*
-		if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-			return null;
-		}
-
-		if (null === $object) {
-			$message = sprintf('Impossible to invoke a method ("%s") on a null variable', $item);
-		} else {
-			$message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s")', $item, gettype($object), $object);
-		}
-
-		throw new Twig_Error_Runtime($message, -1, $this->getTemplateName());
-	}
-*/
-		if (ignoreStrictCheck || !TWIG_CALL_BOOLEAN(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "isStrictVariables" TSRMLS_CC)) {
-			efree(item);
-			return;
-		}
-
-		type_name = zend_zval_type_name(object);
-		Z_ADDREF_P(object);
-		if (Z_TYPE_P(object) == IS_NULL) {
-			convert_to_string_ex(&object);
-
-			TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Impossible to invoke a method (\"%s\") on a %s variable.", item, type_name);
-		} else {
-			convert_to_string_ex(&object);
-
-			TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Impossible to invoke a method (\"%s\") on a %s variable (\"%s\").", item, type_name, Z_STRVAL_P(object));
-		}
-
-		zval_ptr_dtor(&object);
-		efree(item);
-		return;
-	}
-/*
-	$class = get_class($object);
-*/
-
-	class_name = TWIG_GET_CLASS_NAME(object TSRMLS_CC);
-	tmp_self_cache = TWIG_GET_STATIC_PROPERTY(template, "cache" TSRMLS_CC);
-	tmp_class = TWIG_GET_ARRAY_ELEMENT(tmp_self_cache, class_name, strlen(class_name) TSRMLS_CC);
-
-	if (!tmp_class) {
-		twig_add_class_to_cache(tmp_self_cache, object, class_name TSRMLS_CC);
-		tmp_class = TWIG_GET_ARRAY_ELEMENT(tmp_self_cache, class_name, strlen(class_name) TSRMLS_CC);
-	}
-	efree(class_name);
-
-/*
-	// object property
-	if (Twig_Template::METHOD_CALL !== $type && !$object instanceof Twig_Template) {
-		if (isset($object->$item) || array_key_exists((string) $item, $object)) {
-			if ($isDefinedTest) {
-				return true;
-			}
-
-			if ($this->env->hasExtension('Twig_Extension_Sandbox')) {
-				$this->env->getExtension('Twig_Extension_Sandbox')->checkPropertyAllowed($object, $item);
-			}
-
-			return $object->$item;
-		}
-	}
-*/
-	if (strcmp("method", type) != 0 && !TWIG_INSTANCE_OF_USERLAND(object, "Twig_Template" TSRMLS_CC)) {
-		zval *tmp_properties, *tmp_item;
-
-		tmp_properties = TWIG_GET_ARRAY_ELEMENT(tmp_class, "properties", strlen("properties") TSRMLS_CC);
-		tmp_item = TWIG_GET_ARRAY_ELEMENT(tmp_properties, item, item_len TSRMLS_CC);
-
-		if (tmp_item || TWIG_HAS_PROPERTY(object, zitem TSRMLS_CC) || TWIG_HAS_DYNAMIC_PROPERTY(object, item, item_len TSRMLS_CC)) {
-			if (isDefinedTest) {
-				efree(item);
-				RETURN_TRUE;
-			}
-			if (TWIG_CALL_SB(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "hasExtension", "Twig_Extension_Sandbox" TSRMLS_CC)) {
-				TWIG_CALL_ZZ(TWIG_CALL_S(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "getExtension", "Twig_Extension_Sandbox" TSRMLS_CC), "checkPropertyAllowed", object, zitem TSRMLS_CC);
-			}
-			if (EG(exception)) {
-				efree(item);
-				return;
-			}
-
-			ret = TWIG_PROPERTY(object, zitem TSRMLS_CC);
-			efree(item);
-			RETURN_ZVAL(ret, 1, 0);
-		}
-	}
-/*
-	// object method
-	if (!isset(self::$cache[$class]['methods'])) {
-		if ($object instanceof self) {
-			$ref = new ReflectionClass($class);
-			$methods = array();
-
-			foreach ($ref->getMethods(ReflectionMethod::IS_PUBLIC) as $refMethod) {
-				$methodName = strtolower($refMethod->name);
-
-				// Accessing the environment from templates is forbidden to prevent untrusted changes to the environment
-				if ('getenvironment' !== $methodName) {
-					$methods[$methodName] = true;
-				}
-			}
-
-			self::$cache[$class]['methods'] = $methods;
-        } else {
-			self::$cache[$class]['methods'] = array_change_key_case(array_flip(get_class_methods($object)));
-        }
-	}
-
-	$call = false;
-	$lcItem = strtolower($item);
-	if (isset(self::$cache[$class]['methods'][$lcItem])) {
-		$method = (string) $item;
-	} elseif (isset(self::$cache[$class]['methods']['get'.$lcItem])) {
-		$method = 'get'.$item;
-	} elseif (isset(self::$cache[$class]['methods']['is'.$lcItem])) {
-		$method = 'is'.$item;
-	} elseif (isset(self::$cache[$class]['methods']['__call'])) {
-		$method = (string) $item;
-		$call = true;
-*/
-	{
-		int call = 0;
-		char *lcItem = TWIG_STRTOLOWER(item, item_len);
-		int   lcItem_length;
-		char *method = NULL;
-		char *methodForDeprecation = NULL;
-		char *tmp_method_name_get;
-		char *tmp_method_name_is;
-		zval *zmethod;
-		zval *tmp_methods;
-
-		lcItem_length = strlen(lcItem);
-		tmp_method_name_get = emalloc(4 + lcItem_length);
-		tmp_method_name_is  = emalloc(3 + lcItem_length);
-
-		sprintf(tmp_method_name_get, "get%s", lcItem);
-		sprintf(tmp_method_name_is, "is%s", lcItem);
-
-		tmp_methods = TWIG_GET_ARRAY_ELEMENT(tmp_class, "methods", strlen("methods") TSRMLS_CC);
-		methodForDeprecation = emalloc(item_len + 1);
-		sprintf(methodForDeprecation, "%s", item);
-
-		if (TWIG_GET_ARRAY_ELEMENT(tmp_methods, lcItem, lcItem_length TSRMLS_CC)) {
-			method = item;
-		} else if (TWIG_GET_ARRAY_ELEMENT(tmp_methods, tmp_method_name_get, lcItem_length + 3 TSRMLS_CC)) {
-			method = tmp_method_name_get;
-		} else if (TWIG_GET_ARRAY_ELEMENT(tmp_methods, tmp_method_name_is, lcItem_length + 2 TSRMLS_CC)) {
-			method = tmp_method_name_is;
-		} else if (TWIG_GET_ARRAY_ELEMENT(tmp_methods, "__call", 6 TSRMLS_CC)) {
-			method = item;
-			call = 1;
-/*
-	} else {
-		if ($isDefinedTest) {
-			return false;
-		}
-
-		if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-			return null;
-		}
-
-		throw new Twig_Error_Runtime(sprintf('Method "%s" for object "%s" does not exist.', $item, get_class($object)), -1, $this->getTemplateName());
-	}
-
-	if ($isDefinedTest) {
-		return true;
-	}
-*/
-		} else {
-			efree(tmp_method_name_get);
-			efree(tmp_method_name_is);
-			efree(lcItem);
-
-			if (isDefinedTest) {
-				efree(item);
-				RETURN_FALSE;
-			}
-			if (ignoreStrictCheck || !TWIG_CALL_BOOLEAN(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "isStrictVariables" TSRMLS_CC)) {
-				efree(item);
-				return;
-			}
-			TWIG_RUNTIME_ERROR(template TSRMLS_CC, "Neither the property \"%s\" nor one of the methods \"%s()\", \"get%s()\"/\"is%s()\" or \"__call()\" exist and have public access in class \"%s\".", item, item, item, item, TWIG_GET_CLASS_NAME(object TSRMLS_CC));
-			efree(item);
-			return;
-		}
-
-		if (isDefinedTest) {
-			efree(tmp_method_name_get);
-			efree(tmp_method_name_is);
-			efree(lcItem);efree(item);
-			RETURN_TRUE;
-		}
-/*
-	if ($this->env->hasExtension('Twig_Extension_Sandbox')) {
-		$this->env->getExtension('Twig_Extension_Sandbox')->checkMethodAllowed($object, $method);
-	}
-*/
-		MAKE_STD_ZVAL(zmethod);
-		ZVAL_STRING(zmethod, method, 1);
-		if (TWIG_CALL_SB(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "hasExtension", "Twig_Extension_Sandbox" TSRMLS_CC)) {
-			TWIG_CALL_ZZ(TWIG_CALL_S(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "getExtension", "Twig_Extension_Sandbox" TSRMLS_CC), "checkMethodAllowed", object, zmethod TSRMLS_CC);
-		}
-		zval_ptr_dtor(&zmethod);
-		if (EG(exception)) {
-			efree(tmp_method_name_get);
-			efree(tmp_method_name_is);
-			efree(lcItem);efree(item);
-			return;
-		}
-/*
-	// Some objects throw exceptions when they have __call, and the method we try
-	// to call is not supported. If ignoreStrictCheck is true, we should return null.
-	try {
-	    $ret = call_user_func_array(array($object, $method), $arguments);
-	} catch (BadMethodCallException $e) {
-	    if ($call && ($ignoreStrictCheck || !$this->env->isStrictVariables())) {
-	        return null;
-	    }
-	    throw $e;
-	}
-*/
-		ret = TWIG_CALL_USER_FUNC_ARRAY(object, method, arguments TSRMLS_CC);
-		if (EG(exception) && TWIG_INSTANCE_OF(EG(exception), spl_ce_BadMethodCallException TSRMLS_CC)) {
-			if (ignoreStrictCheck || !TWIG_CALL_BOOLEAN(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "isStrictVariables" TSRMLS_CC)) {
-				efree(tmp_method_name_get);
-				efree(tmp_method_name_is);
-				efree(lcItem);efree(item);
-				zend_clear_exception(TSRMLS_C);
-				return;
-			}
-		}
-		free_ret = 1;
-		efree(tmp_method_name_get);
-		efree(tmp_method_name_is);
-		efree(lcItem);
-/*
-	// @deprecated in 1.28
-	if ($object instanceof Twig_TemplateInterface) {
-		$self = $object->getTemplateName() === $this->getTemplateName();
-		$message = sprintf('Calling "%s" on template "%s" from template "%s" is deprecated since version 1.28 and won\'t be supported anymore in 2.0.', $item, $object->getTemplateName(), $this->getTemplateName());
-		if ('renderBlock' === $method || 'displayBlock' === $method) {
-			$message .= sprintf(' Use block("%s"%s) instead).', $arguments[0], $self ? '' : ', template');
-		} elseif ('hasBlock' === $method) {
-			$message .= sprintf(' Use "block("%s"%s) is defined" instead).', $arguments[0], $self ? '' : ', template');
-		} elseif ('render' === $method || 'display' === $method) {
-			$message .= sprintf(' Use include("%s") instead).', $object->getTemplateName());
-		}
-		@trigger_error($message, E_USER_DEPRECATED);
-
-		return $ret === '' ? '' : new Twig_Markup($ret, $this->env->getCharset());
-	}
-
-	return $ret;
-*/
-		efree(item);
-		// ret can be null, if e.g. the called method throws an exception
-		if (ret) {
-			if (TWIG_INSTANCE_OF_USERLAND(object, "Twig_TemplateInterface" TSRMLS_CC)) {
-				int self;
-				int old_error_reporting;
-				zval *object_filename;
-				zval *this_filename;
-				zval *filename_func;
-				char *deprecation_message_complement = NULL;
-				char *deprecation_message = NULL;
-
-				MAKE_STD_ZVAL(object_filename);
-				MAKE_STD_ZVAL(this_filename);
-				MAKE_STD_ZVAL(filename_func);
-
-				// Get templates names
-				ZVAL_STRINGL(filename_func, "getTemplateName", sizeof("getTemplateName")-1, 1);
-				call_user_function(EG(function_table), &object, filename_func, object_filename, 0, 0 TSRMLS_CC);
-				ZVAL_STRINGL(filename_func, "getTemplateName", sizeof("getTemplateName")-1, 1);
-				call_user_function(EG(function_table), &template, filename_func, this_filename, 0, 0 TSRMLS_CC);
-
-				self = (strcmp(Z_STRVAL_P(object_filename), Z_STRVAL_P(this_filename)) == 0);
-
-				if (strcmp(methodForDeprecation, "renderBlock") == 0 || strcmp(methodForDeprecation, "displayBlock") == 0) {
-					zval **arg0;
-					zend_hash_index_find(HASH_OF(arguments), 0, (void **) &arg0);
-					asprintf(
-						&deprecation_message_complement,
-						" Use block(\"%s\"%s) instead).",
-						Z_STRVAL_PP(arg0),
-						self ? "" : ", template"
-					);
-				} else if (strcmp(methodForDeprecation, "hasBlock") == 0) {
-					zval **arg0;
-					zend_hash_index_find(HASH_OF(arguments), 0, (void **) &arg0);
-					asprintf(
-						&deprecation_message_complement,
-						" Use \"block(\"%s\"%s) is defined\" instead).",
-						Z_STRVAL_PP(arg0),
-						self ? "" : ", template"
-					);
-				} else if (strcmp(methodForDeprecation, "render") == 0 || strcmp(methodForDeprecation, "display") == 0) {
-					asprintf(
-						&deprecation_message_complement,
-						" Use include(\"%s\") instead).",
-						Z_STRVAL_P(object_filename)
-					);
-				} else {
-					deprecation_message_complement = (char*)calloc(0, sizeof(char));
-				}
-
-				asprintf(
-					&deprecation_message,
-					"Calling \"%s\" on template \"%s\" from template \"%s\" is deprecated since version 1.28 and won't be supported anymore in 2.0.%s",
-					methodForDeprecation,
-					Z_STRVAL_P(object_filename),
-					Z_STRVAL_P(this_filename),
-					deprecation_message_complement
-				);
-
-				old_error_reporting = EG(error_reporting);
-				EG(error_reporting) = 0;
-				zend_error(E_USER_DEPRECATED, "%s", deprecation_message);
-				EG(error_reporting) = old_error_reporting;
-
-				FREE_DTOR(filename_func)
-				FREE_DTOR(object_filename)
-				FREE_DTOR(this_filename)
-				free(deprecation_message);
-				free(deprecation_message_complement);
-
-				if (Z_STRLEN_P(ret) != 0) {
-					zval *charset = TWIG_CALL_USER_FUNC_ARRAY(TWIG_PROPERTY_CHAR(template, "env" TSRMLS_CC), "getCharset", NULL TSRMLS_CC);
-					TWIG_NEW(return_value, "Twig_Markup", ret, charset TSRMLS_CC);
-					zval_ptr_dtor(&charset);
-					if (ret) {
-						zval_ptr_dtor(&ret);
-					}
-					efree(methodForDeprecation);
-					return;
-				}
-			}
-
-			RETVAL_ZVAL(ret, 1, 0);
-			if (free_ret) {
-				zval_ptr_dtor(&ret);
-			}
-		}
-
-		efree(methodForDeprecation);
-	}
-}
diff --git a/vendor/twig/twig/lib/Twig/Autoloader.php b/vendor/twig/twig/lib/Twig/Autoloader.php
deleted file mode 100644
index 212af544..00000000
--- a/vendor/twig/twig/lib/Twig/Autoloader.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Autoloader class is deprecated since version 1.21 and will be removed in 2.0. Use Composer instead.', E_USER_DEPRECATED);
-
-/**
- * Autoloads Twig classes.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.21 and will be removed in 2.0. Use Composer instead. 2.0.
- */
-class Twig_Autoloader
-{
-    /**
-     * Registers Twig_Autoloader as an SPL autoloader.
-     *
-     * @param bool $prepend whether to prepend the autoloader or not
-     */
-    public static function register($prepend = false)
-    {
-        @trigger_error('Using Twig_Autoloader is deprecated since version 1.21. Use Composer instead.', E_USER_DEPRECATED);
-
-        if (PHP_VERSION_ID < 50300) {
-            spl_autoload_register(array(__CLASS__, 'autoload'));
-        } else {
-            spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend);
-        }
-    }
-
-    /**
-     * Handles autoloading of classes.
-     *
-     * @param string $class a class name
-     */
-    public static function autoload($class)
-    {
-        if (0 !== strpos($class, 'Twig')) {
-            return;
-        }
-
-        if (is_file($file = dirname(__FILE__).'/../'.str_replace(array('_', "\0"), array('/', ''), $class).'.php')) {
-            require $file;
-        }
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php b/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php
index d8ef02fb..e1191f9e 100644
--- a/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php
+++ b/vendor/twig/twig/lib/Twig/BaseNodeVisitor.php
@@ -1,54 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\NodeVisitor\AbstractNodeVisitor;
 
-/**
- * Twig_BaseNodeVisitor can be used to make node visitors compatible with Twig 1.x and 2.x.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-abstract class Twig_BaseNodeVisitor implements Twig_NodeVisitorInterface
-{
-    final public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if (!$node instanceof Twig_Node) {
-            throw new LogicException('Twig_BaseNodeVisitor only supports Twig_Node instances.');
-        }
+class_exists('Twig\NodeVisitor\AbstractNodeVisitor');
 
-        return $this->doEnterNode($node, $env);
-    }
+@trigger_error(sprintf('Using the "Twig_BaseNodeVisitor" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\AbstractNodeVisitor" instead.'), E_USER_DEPRECATED);
 
-    final public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\AbstractNodeVisitor" instead */
+    class Twig_BaseNodeVisitor extends AbstractNodeVisitor
     {
-        if (!$node instanceof Twig_Node) {
-            throw new LogicException('Twig_BaseNodeVisitor only supports Twig_Node instances.');
-        }
-
-        return $this->doLeaveNode($node, $env);
     }
-
-    /**
-     * Called before child nodes are visited.
-     *
-     * @return Twig_Node The modified node
-     */
-    abstract protected function doEnterNode(Twig_Node $node, Twig_Environment $env);
-
-    /**
-     * Called after child nodes are visited.
-     *
-     * @return Twig_Node|false The modified node or false if the node must be removed
-     */
-    abstract protected function doLeaveNode(Twig_Node $node, Twig_Environment $env);
 }
-
-class_alias('Twig_BaseNodeVisitor', 'Twig\NodeVisitor\AbstractNodeVisitor', false);
-class_exists('Twig_Environment');
-class_exists('Twig_Node');
diff --git a/vendor/twig/twig/lib/Twig/Cache/Filesystem.php b/vendor/twig/twig/lib/Twig/Cache/Filesystem.php
index 65976282..5c7627c6 100644
--- a/vendor/twig/twig/lib/Twig/Cache/Filesystem.php
+++ b/vendor/twig/twig/lib/Twig/Cache/Filesystem.php
@@ -1,93 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Cache\FilesystemCache;
 
-/**
- * Implements a cache on the filesystem.
- *
- * @author Andrew Tch <andrew@xxxxxxx>
- */
-class Twig_Cache_Filesystem implements Twig_CacheInterface
-{
-    const FORCE_BYTECODE_INVALIDATION = 1;
+class_exists('Twig\Cache\FilesystemCache');
 
-    private $directory;
-    private $options;
+@trigger_error(sprintf('Using the "Twig_Cache_Filesystem" class is deprecated since Twig version 2.7, use "Twig\Cache\FilesystemCache" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * @param $directory string The root cache directory
-     * @param $options   int    A set of options
-     */
-    public function __construct($directory, $options = 0)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Cache\FilesystemCache" instead */
+    class Twig_Cache_Filesystem extends FilesystemCache
     {
-        $this->directory = rtrim($directory, '\/').'/';
-        $this->options = $options;
-    }
-
-    public function generateKey($name, $className)
-    {
-        $hash = hash('sha256', $className);
-
-        return $this->directory.$hash[0].$hash[1].'/'.$hash.'.php';
-    }
-
-    public function load($key)
-    {
-        if (file_exists($key)) {
-            @include_once $key;
-        }
-    }
-
-    public function write($key, $content)
-    {
-        $dir = dirname($key);
-        if (!is_dir($dir)) {
-            if (false === @mkdir($dir, 0777, true)) {
-                if (PHP_VERSION_ID >= 50300) {
-                    clearstatcache(true, $dir);
-                }
-                if (!is_dir($dir)) {
-                    throw new RuntimeException(sprintf('Unable to create the cache directory (%s).', $dir));
-                }
-            }
-        } elseif (!is_writable($dir)) {
-            throw new RuntimeException(sprintf('Unable to write in the cache directory (%s).', $dir));
-        }
-
-        $tmpFile = tempnam($dir, basename($key));
-        if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $key)) {
-            @chmod($key, 0666 & ~umask());
-
-            if (self::FORCE_BYTECODE_INVALIDATION == ($this->options & self::FORCE_BYTECODE_INVALIDATION)) {
-                // Compile cached file into bytecode cache
-                if (function_exists('opcache_invalidate')) {
-                    opcache_invalidate($key, true);
-                } elseif (function_exists('apc_compile_file')) {
-                    apc_compile_file($key);
-                }
-            }
-
-            return;
-        }
-
-        throw new RuntimeException(sprintf('Failed to write cache file "%s".', $key));
-    }
-
-    public function getTimestamp($key)
-    {
-        if (!file_exists($key)) {
-            return 0;
-        }
-
-        return (int) @filemtime($key);
     }
 }
-
-class_alias('Twig_Cache_Filesystem', 'Twig\Cache\FilesystemCache', false);
diff --git a/vendor/twig/twig/lib/Twig/Cache/Null.php b/vendor/twig/twig/lib/Twig/Cache/Null.php
index 69d1d2f9..092a2bea 100644
--- a/vendor/twig/twig/lib/Twig/Cache/Null.php
+++ b/vendor/twig/twig/lib/Twig/Cache/Null.php
@@ -1,40 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Cache\NullCache;
 
-/**
- * Implements a no-cache strategy.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Cache_Null implements Twig_CacheInterface
-{
-    public function generateKey($name, $className)
-    {
-        return '';
-    }
-
-    public function write($key, $content)
-    {
-    }
+class_exists('Twig\Cache\NullCache');
 
-    public function load($key)
-    {
-    }
+@trigger_error(sprintf('Using the "Twig_Cache_Null" class is deprecated since Twig version 2.7, use "Twig\Cache\NullCache" instead.'), E_USER_DEPRECATED);
 
-    public function getTimestamp($key)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Cache\NullCache" instead */
+    class Twig_Cache_Null extends NullCache
     {
-        return 0;
     }
 }
-
-class_alias('Twig_Cache_Null', 'Twig\Cache\NullCache', false);
diff --git a/vendor/twig/twig/lib/Twig/CacheInterface.php b/vendor/twig/twig/lib/Twig/CacheInterface.php
index 776808bf..3f5a4585 100644
--- a/vendor/twig/twig/lib/Twig/CacheInterface.php
+++ b/vendor/twig/twig/lib/Twig/CacheInterface.php
@@ -1,58 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Cache\CacheInterface;
 
-/**
- * Interface implemented by cache classes.
- *
- * It is highly recommended to always store templates on the filesystem to
- * benefit from the PHP opcode cache. This interface is mostly useful if you
- * need to implement a custom strategy for storing templates on the filesystem.
- *
- * @author Andrew Tch <andrew@xxxxxxx>
- */
-interface Twig_CacheInterface
-{
-    /**
-     * Generates a cache key for the given template class name.
-     *
-     * @param string $name      The template name
-     * @param string $className The template class name
-     *
-     * @return string
-     */
-    public function generateKey($name, $className);
+class_exists('Twig\Cache\CacheInterface');
 
-    /**
-     * Writes the compiled template to cache.
-     *
-     * @param string $key     The cache key
-     * @param string $content The template representation as a PHP class
-     */
-    public function write($key, $content);
+@trigger_error(sprintf('Using the "Twig_CacheInterface" class is deprecated since Twig version 2.7, use "Twig\Cache\CacheInterface" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * Loads a template from the cache.
-     *
-     * @param string $key The cache key
-     */
-    public function load($key);
-
-    /**
-     * Returns the modification timestamp of a key.
-     *
-     * @param string $key The cache key
-     *
-     * @return int
-     */
-    public function getTimestamp($key);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Cache\CacheInterface" instead */
+    class Twig_CacheInterface extends CacheInterface
+    {
+    }
 }
-
-class_alias('Twig_CacheInterface', 'Twig\Cache\CacheInterface', false);
diff --git a/vendor/twig/twig/lib/Twig/Compiler.php b/vendor/twig/twig/lib/Twig/Compiler.php
index e90bc987..d13d2f23 100644
--- a/vendor/twig/twig/lib/Twig/Compiler.php
+++ b/vendor/twig/twig/lib/Twig/Compiler.php
@@ -1,284 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Compiler;
 
-/**
- * Compiles a node to PHP code.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Compiler implements Twig_CompilerInterface
-{
-    protected $lastLine;
-    protected $source;
-    protected $indentation;
-    protected $env;
-    protected $debugInfo = array();
-    protected $sourceOffset;
-    protected $sourceLine;
-    protected $filename;
+class_exists('Twig\Compiler');
 
-    public function __construct(Twig_Environment $env)
-    {
-        $this->env = $env;
-    }
-
-    /**
-     * @deprecated since 1.25 (to be removed in 2.0)
-     */
-    public function getFilename()
-    {
-        @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED);
-
-        return $this->filename;
-    }
-
-    /**
-     * Returns the environment instance related to this compiler.
-     *
-     * @return Twig_Environment
-     */
-    public function getEnvironment()
-    {
-        return $this->env;
-    }
-
-    /**
-     * Gets the current PHP code after compilation.
-     *
-     * @return string The PHP code
-     */
-    public function getSource()
-    {
-        return $this->source;
-    }
-
-    /**
-     * Compiles a node.
-     *
-     * @param Twig_NodeInterface $node        The node to compile
-     * @param int                $indentation The current indentation
-     *
-     * @return $this
-     */
-    public function compile(Twig_NodeInterface $node, $indentation = 0)
-    {
-        $this->lastLine = null;
-        $this->source = '';
-        $this->debugInfo = array();
-        $this->sourceOffset = 0;
-        // source code starts at 1 (as we then increment it when we encounter new lines)
-        $this->sourceLine = 1;
-        $this->indentation = $indentation;
-
-        if ($node instanceof Twig_Node_Module) {
-            // to be removed in 2.0
-            $this->filename = $node->getTemplateName();
-        }
-
-        $node->compile($this);
-
-        return $this;
-    }
+@trigger_error(sprintf('Using the "Twig_Compiler" class is deprecated since Twig version 2.7, use "Twig\Compiler" instead.'), E_USER_DEPRECATED);
 
-    public function subcompile(Twig_NodeInterface $node, $raw = true)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Compiler" instead */
+    class Twig_Compiler extends Compiler
     {
-        if (false === $raw) {
-            $this->source .= str_repeat(' ', $this->indentation * 4);
-        }
-
-        $node->compile($this);
-
-        return $this;
-    }
-
-    /**
-     * Adds a raw string to the compiled code.
-     *
-     * @param string $string The string
-     *
-     * @return $this
-     */
-    public function raw($string)
-    {
-        $this->source .= $string;
-
-        return $this;
-    }
-
-    /**
-     * Writes a string to the compiled code by adding indentation.
-     *
-     * @return $this
-     */
-    public function write()
-    {
-        $strings = func_get_args();
-        foreach ($strings as $string) {
-            $this->source .= str_repeat(' ', $this->indentation * 4).$string;
-        }
-
-        return $this;
-    }
-
-    /**
-     * Appends an indentation to the current PHP code after compilation.
-     *
-     * @return $this
-     *
-     * @deprecated since 1.27 (to be removed in 2.0).
-     */
-    public function addIndentation()
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use write(\'\') instead.', E_USER_DEPRECATED);
-
-        $this->source .= str_repeat(' ', $this->indentation * 4);
-
-        return $this;
-    }
-
-    /**
-     * Adds a quoted string to the compiled code.
-     *
-     * @param string $value The string
-     *
-     * @return $this
-     */
-    public function string($value)
-    {
-        $this->source .= sprintf('"%s"', addcslashes($value, "\0\t\"\$\\"));
-
-        return $this;
-    }
-
-    /**
-     * Returns a PHP representation of a given value.
-     *
-     * @param mixed $value The value to convert
-     *
-     * @return $this
-     */
-    public function repr($value)
-    {
-        if (is_int($value) || is_float($value)) {
-            if (false !== $locale = setlocale(LC_NUMERIC, '0')) {
-                setlocale(LC_NUMERIC, 'C');
-            }
-
-            $this->raw($value);
-
-            if (false !== $locale) {
-                setlocale(LC_NUMERIC, $locale);
-            }
-        } elseif (null === $value) {
-            $this->raw('null');
-        } elseif (is_bool($value)) {
-            $this->raw($value ? 'true' : 'false');
-        } elseif (is_array($value)) {
-            $this->raw('array(');
-            $first = true;
-            foreach ($value as $key => $v) {
-                if (!$first) {
-                    $this->raw(', ');
-                }
-                $first = false;
-                $this->repr($key);
-                $this->raw(' => ');
-                $this->repr($v);
-            }
-            $this->raw(')');
-        } else {
-            $this->string($value);
-        }
-
-        return $this;
-    }
-
-    /**
-     * Adds debugging information.
-     *
-     * @return $this
-     */
-    public function addDebugInfo(Twig_NodeInterface $node)
-    {
-        if ($node->getTemplateLine() != $this->lastLine) {
-            $this->write(sprintf("// line %d\n", $node->getTemplateLine()));
-
-            // when mbstring.func_overload is set to 2
-            // mb_substr_count() replaces substr_count()
-            // but they have different signatures!
-            if (((int) ini_get('mbstring.func_overload')) & 2) {
-                @trigger_error('Support for having "mbstring.func_overload" different from 0 is deprecated version 1.29 and will be removed in 2.0.', E_USER_DEPRECATED);
-
-                // this is much slower than the "right" version
-                $this->sourceLine += mb_substr_count(mb_substr($this->source, $this->sourceOffset), "\n");
-            } else {
-                $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset);
-            }
-            $this->sourceOffset = strlen($this->source);
-            $this->debugInfo[$this->sourceLine] = $node->getTemplateLine();
-
-            $this->lastLine = $node->getTemplateLine();
-        }
-
-        return $this;
-    }
-
-    public function getDebugInfo()
-    {
-        ksort($this->debugInfo);
-
-        return $this->debugInfo;
-    }
-
-    /**
-     * Indents the generated code.
-     *
-     * @param int $step The number of indentation to add
-     *
-     * @return $this
-     */
-    public function indent($step = 1)
-    {
-        $this->indentation += $step;
-
-        return $this;
-    }
-
-    /**
-     * Outdents the generated code.
-     *
-     * @param int $step The number of indentation to remove
-     *
-     * @return $this
-     *
-     * @throws LogicException When trying to outdent too much so the indentation would become negative
-     */
-    public function outdent($step = 1)
-    {
-        // can't outdent by more steps than the current indentation level
-        if ($this->indentation < $step) {
-            throw new LogicException('Unable to call outdent() as the indentation would become negative.');
-        }
-
-        $this->indentation -= $step;
-
-        return $this;
-    }
-
-    public function getVarName()
-    {
-        return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false));
     }
 }
-
-class_alias('Twig_Compiler', 'Twig\Compiler', false);
-class_exists('Twig_Node');
diff --git a/vendor/twig/twig/lib/Twig/CompilerInterface.php b/vendor/twig/twig/lib/Twig/CompilerInterface.php
deleted file mode 100644
index 42872c9c..00000000
--- a/vendor/twig/twig/lib/Twig/CompilerInterface.php
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by compiler classes.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_CompilerInterface
-{
-    /**
-     * Compiles a node.
-     *
-     * @return $this
-     */
-    public function compile(Twig_NodeInterface $node);
-
-    /**
-     * Gets the current PHP code after compilation.
-     *
-     * @return string The PHP code
-     */
-    public function getSource();
-}
diff --git a/vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php b/vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php
index 814ab58b..3225057d 100644
--- a/vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php
+++ b/vendor/twig/twig/lib/Twig/ContainerRuntimeLoader.php
@@ -1,39 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\RuntimeLoader\ContainerRuntimeLoader;
 
-use Psr\Container\ContainerInterface;
+class_exists('Twig\RuntimeLoader\ContainerRuntimeLoader');
 
-/**
- * Lazily loads Twig runtime implementations from a PSR-11 container.
- *
- * Note that the runtime services MUST use their class names as identifiers.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- * @author Robin Chalas <robin.chalas@xxxxxxxxx>
- */
-class Twig_ContainerRuntimeLoader implements Twig_RuntimeLoaderInterface
-{
-    private $container;
+@trigger_error(sprintf('Using the "Twig_ContainerRuntimeLoader" class is deprecated since Twig version 2.7, use "Twig\RuntimeLoader\ContainerRuntimeLoader" instead.'), E_USER_DEPRECATED);
 
-    public function __construct(ContainerInterface $container)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\RuntimeLoader\ContainerRuntimeLoader" instead */
+    class Twig_ContainerRuntimeLoader extends ContainerRuntimeLoader
     {
-        $this->container = $container;
-    }
-
-    public function load($class)
-    {
-        if ($this->container->has($class)) {
-            return $this->container->get($class);
-        }
     }
 }
-
-class_alias('Twig_ContainerRuntimeLoader', 'Twig\RuntimeLoader\ContainerRuntimeLoader', false);
diff --git a/vendor/twig/twig/lib/Twig/Environment.php b/vendor/twig/twig/lib/Twig/Environment.php
index 5de2f27f..1bfb3695 100644
--- a/vendor/twig/twig/lib/Twig/Environment.php
+++ b/vendor/twig/twig/lib/Twig/Environment.php
@@ -1,1600 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Environment;
 
-/**
- * Stores the Twig configuration.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Environment
-{
-    const VERSION = '1.35.0';
-    const VERSION_ID = 13500;
-    const MAJOR_VERSION = 1;
-    const MINOR_VERSION = 35;
-    const RELEASE_VERSION = 0;
-    const EXTRA_VERSION = '';
+class_exists('Twig\Environment');
 
-    protected $charset;
-    protected $loader;
-    protected $debug;
-    protected $autoReload;
-    protected $cache;
-    protected $lexer;
-    protected $parser;
-    protected $compiler;
-    protected $baseTemplateClass;
-    protected $extensions;
-    protected $parsers;
-    protected $visitors;
-    protected $filters;
-    protected $tests;
-    protected $functions;
-    protected $globals;
-    protected $runtimeInitialized = false;
-    protected $extensionInitialized = false;
-    protected $loadedTemplates;
-    protected $strictVariables;
-    protected $unaryOperators;
-    protected $binaryOperators;
-    protected $templateClassPrefix = '__TwigTemplate_';
-    protected $functionCallbacks = array();
-    protected $filterCallbacks = array();
-    protected $staging;
+@trigger_error(sprintf('Using the "Twig_Environment" class is deprecated since Twig version 2.7, use "Twig\Environment" instead.'), E_USER_DEPRECATED);
 
-    private $originalCache;
-    private $bcWriteCacheFile = false;
-    private $bcGetCacheFilename = false;
-    private $lastModifiedExtension = 0;
-    private $extensionsByClass = array();
-    private $runtimeLoaders = array();
-    private $runtimes = array();
-    private $optionsHash;
-    private $loading = array();
-
-    /**
-     * Constructor.
-     *
-     * Available options:
-     *
-     *  * debug: When set to true, it automatically set "auto_reload" to true as
-     *           well (default to false).
-     *
-     *  * charset: The charset used by the templates (default to UTF-8).
-     *
-     *  * base_template_class: The base template class to use for generated
-     *                         templates (default to Twig_Template).
-     *
-     *  * cache: An absolute path where to store the compiled templates,
-     *           a Twig_Cache_Interface implementation,
-     *           or false to disable compilation cache (default).
-     *
-     *  * auto_reload: Whether to reload the template if the original source changed.
-     *                 If you don't provide the auto_reload option, it will be
-     *                 determined automatically based on the debug value.
-     *
-     *  * strict_variables: Whether to ignore invalid variables in templates
-     *                      (default to false).
-     *
-     *  * autoescape: Whether to enable auto-escaping (default to html):
-     *                  * false: disable auto-escaping
-     *                  * true: equivalent to html
-     *                  * html, js: set the autoescaping to one of the supported strategies
-     *                  * name: set the autoescaping strategy based on the template name extension
-     *                  * PHP callback: a PHP callback that returns an escaping strategy based on the template "name"
-     *
-     *  * optimizations: A flag that indicates which optimizations to apply
-     *                   (default to -1 which means that all optimizations are enabled;
-     *                   set it to 0 to disable).
-     *
-     * @param Twig_LoaderInterface $loader
-     * @param array                $options An array of options
-     */
-    public function __construct(Twig_LoaderInterface $loader = null, $options = array())
-    {
-        if (null !== $loader) {
-            $this->setLoader($loader);
-        } else {
-            @trigger_error('Not passing a Twig_LoaderInterface as the first constructor argument of Twig_Environment is deprecated since version 1.21.', E_USER_DEPRECATED);
-        }
-
-        $options = array_merge(array(
-            'debug' => false,
-            'charset' => 'UTF-8',
-            'base_template_class' => 'Twig_Template',
-            'strict_variables' => false,
-            'autoescape' => 'html',
-            'cache' => false,
-            'auto_reload' => null,
-            'optimizations' => -1,
-        ), $options);
-
-        $this->debug = (bool) $options['debug'];
-        $this->charset = strtoupper($options['charset']);
-        $this->baseTemplateClass = $options['base_template_class'];
-        $this->autoReload = null === $options['auto_reload'] ? $this->debug : (bool) $options['auto_reload'];
-        $this->strictVariables = (bool) $options['strict_variables'];
-        $this->setCache($options['cache']);
-
-        $this->addExtension(new Twig_Extension_Core());
-        $this->addExtension(new Twig_Extension_Escaper($options['autoescape']));
-        $this->addExtension(new Twig_Extension_Optimizer($options['optimizations']));
-        $this->staging = new Twig_Extension_Staging();
-
-        // For BC
-        if (is_string($this->originalCache)) {
-            $r = new ReflectionMethod($this, 'writeCacheFile');
-            if ($r->getDeclaringClass()->getName() !== __CLASS__) {
-                @trigger_error('The Twig_Environment::writeCacheFile method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
-
-                $this->bcWriteCacheFile = true;
-            }
-
-            $r = new ReflectionMethod($this, 'getCacheFilename');
-            if ($r->getDeclaringClass()->getName() !== __CLASS__) {
-                @trigger_error('The Twig_Environment::getCacheFilename method is deprecated since version 1.22 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
-
-                $this->bcGetCacheFilename = true;
-            }
-        }
-    }
-
-    /**
-     * Gets the base template class for compiled templates.
-     *
-     * @return string The base template class name
-     */
-    public function getBaseTemplateClass()
-    {
-        return $this->baseTemplateClass;
-    }
-
-    /**
-     * Sets the base template class for compiled templates.
-     *
-     * @param string $class The base template class name
-     */
-    public function setBaseTemplateClass($class)
-    {
-        $this->baseTemplateClass = $class;
-        $this->updateOptionsHash();
-    }
-
-    /**
-     * Enables debugging mode.
-     */
-    public function enableDebug()
-    {
-        $this->debug = true;
-        $this->updateOptionsHash();
-    }
-
-    /**
-     * Disables debugging mode.
-     */
-    public function disableDebug()
-    {
-        $this->debug = false;
-        $this->updateOptionsHash();
-    }
-
-    /**
-     * Checks if debug mode is enabled.
-     *
-     * @return bool true if debug mode is enabled, false otherwise
-     */
-    public function isDebug()
-    {
-        return $this->debug;
-    }
-
-    /**
-     * Enables the auto_reload option.
-     */
-    public function enableAutoReload()
-    {
-        $this->autoReload = true;
-    }
-
-    /**
-     * Disables the auto_reload option.
-     */
-    public function disableAutoReload()
-    {
-        $this->autoReload = false;
-    }
-
-    /**
-     * Checks if the auto_reload option is enabled.
-     *
-     * @return bool true if auto_reload is enabled, false otherwise
-     */
-    public function isAutoReload()
-    {
-        return $this->autoReload;
-    }
-
-    /**
-     * Enables the strict_variables option.
-     */
-    public function enableStrictVariables()
-    {
-        $this->strictVariables = true;
-        $this->updateOptionsHash();
-    }
-
-    /**
-     * Disables the strict_variables option.
-     */
-    public function disableStrictVariables()
-    {
-        $this->strictVariables = false;
-        $this->updateOptionsHash();
-    }
-
-    /**
-     * Checks if the strict_variables option is enabled.
-     *
-     * @return bool true if strict_variables is enabled, false otherwise
-     */
-    public function isStrictVariables()
-    {
-        return $this->strictVariables;
-    }
-
-    /**
-     * Gets the current cache implementation.
-     *
-     * @param bool $original Whether to return the original cache option or the real cache instance
-     *
-     * @return Twig_CacheInterface|string|false A Twig_CacheInterface implementation,
-     *                                          an absolute path to the compiled templates,
-     *                                          or false to disable cache
-     */
-    public function getCache($original = true)
-    {
-        return $original ? $this->originalCache : $this->cache;
-    }
-
-    /**
-     * Sets the current cache implementation.
-     *
-     * @param Twig_CacheInterface|string|false $cache A Twig_CacheInterface implementation,
-     *                                                an absolute path to the compiled templates,
-     *                                                or false to disable cache
-     */
-    public function setCache($cache)
-    {
-        if (is_string($cache)) {
-            $this->originalCache = $cache;
-            $this->cache = new Twig_Cache_Filesystem($cache);
-        } elseif (false === $cache) {
-            $this->originalCache = $cache;
-            $this->cache = new Twig_Cache_Null();
-        } elseif (null === $cache) {
-            @trigger_error('Using "null" as the cache strategy is deprecated since version 1.23 and will be removed in Twig 2.0.', E_USER_DEPRECATED);
-            $this->originalCache = false;
-            $this->cache = new Twig_Cache_Null();
-        } elseif ($cache instanceof Twig_CacheInterface) {
-            $this->originalCache = $this->cache = $cache;
-        } else {
-            throw new LogicException(sprintf('Cache can only be a string, false, or a Twig_CacheInterface implementation.'));
-        }
-    }
-
-    /**
-     * Gets the cache filename for a given template.
-     *
-     * @param string $name The template name
-     *
-     * @return string|false The cache file name or false when caching is disabled
-     *
-     * @deprecated since 1.22 (to be removed in 2.0)
-     */
-    public function getCacheFilename($name)
-    {
-        @trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
-        $key = $this->cache->generateKey($name, $this->getTemplateClass($name));
-
-        return !$key ? false : $key;
-    }
-
-    /**
-     * Gets the template class associated with the given string.
-     *
-     * The generated template class is based on the following parameters:
-     *
-     *  * The cache key for the given template;
-     *  * The currently enabled extensions;
-     *  * Whether the Twig C extension is available or not;
-     *  * PHP version;
-     *  * Twig version;
-     *  * Options with what environment was created.
-     *
-     * @param string   $name  The name for which to calculate the template class name
-     * @param int|null $index The index if it is an embedded template
-     *
-     * @return string The template class name
-     */
-    public function getTemplateClass($name, $index = null)
-    {
-        $key = $this->getLoader()->getCacheKey($name).$this->optionsHash;
-
-        return $this->templateClassPrefix.hash('sha256', $key).(null === $index ? '' : '_'.$index);
-    }
-
-    /**
-     * Gets the template class prefix.
-     *
-     * @return string The template class prefix
-     *
-     * @deprecated since 1.22 (to be removed in 2.0)
-     */
-    public function getTemplateClassPrefix()
-    {
-        @trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
-        return $this->templateClassPrefix;
-    }
-
-    /**
-     * Renders a template.
-     *
-     * @param string $name    The template name
-     * @param array  $context An array of parameters to pass to the template
-     *
-     * @return string The rendered template
-     *
-     * @throws Twig_Error_Loader  When the template cannot be found
-     * @throws Twig_Error_Syntax  When an error occurred during compilation
-     * @throws Twig_Error_Runtime When an error occurred during rendering
-     */
-    public function render($name, array $context = array())
-    {
-        return $this->loadTemplate($name)->render($context);
-    }
-
-    /**
-     * Displays a template.
-     *
-     * @param string $name    The template name
-     * @param array  $context An array of parameters to pass to the template
-     *
-     * @throws Twig_Error_Loader  When the template cannot be found
-     * @throws Twig_Error_Syntax  When an error occurred during compilation
-     * @throws Twig_Error_Runtime When an error occurred during rendering
-     */
-    public function display($name, array $context = array())
-    {
-        $this->loadTemplate($name)->display($context);
-    }
-
-    /**
-     * Loads a template.
-     *
-     * @param string|Twig_TemplateWrapper|Twig_Template $name The template name
-     *
-     * @throws Twig_Error_Loader  When the template cannot be found
-     * @throws Twig_Error_Runtime When a previously generated cache is corrupted
-     * @throws Twig_Error_Syntax  When an error occurred during compilation
-     *
-     * @return Twig_TemplateWrapper
-     */
-    public function load($name)
-    {
-        if ($name instanceof Twig_TemplateWrapper) {
-            return $name;
-        }
-
-        if ($name instanceof Twig_Template) {
-            return new Twig_TemplateWrapper($this, $name);
-        }
-
-        return new Twig_TemplateWrapper($this, $this->loadTemplate($name));
-    }
-
-    /**
-     * Loads a template internal representation.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param string $name  The template name
-     * @param int    $index The index if it is an embedded template
-     *
-     * @return Twig_TemplateInterface A template instance representing the given template name
-     *
-     * @throws Twig_Error_Loader  When the template cannot be found
-     * @throws Twig_Error_Runtime When a previously generated cache is corrupted
-     * @throws Twig_Error_Syntax  When an error occurred during compilation
-     *
-     * @internal
-     */
-    public function loadTemplate($name, $index = null)
-    {
-        $cls = $mainCls = $this->getTemplateClass($name);
-        if (null !== $index) {
-            $cls .= '_'.$index;
-        }
-
-        if (isset($this->loadedTemplates[$cls])) {
-            return $this->loadedTemplates[$cls];
-        }
-
-        if (!class_exists($cls, false)) {
-            if ($this->bcGetCacheFilename) {
-                $key = $this->getCacheFilename($name);
-            } else {
-                $key = $this->cache->generateKey($name, $mainCls);
-            }
-
-            if (!$this->isAutoReload() || $this->isTemplateFresh($name, $this->cache->getTimestamp($key))) {
-                $this->cache->load($key);
-            }
-
-            if (!class_exists($cls, false)) {
-                $loader = $this->getLoader();
-                if (!$loader instanceof Twig_SourceContextLoaderInterface) {
-                    $source = new Twig_Source($loader->getSource($name), $name);
-                } else {
-                    $source = $loader->getSourceContext($name);
-                }
-
-                $content = $this->compileSource($source);
-
-                if ($this->bcWriteCacheFile) {
-                    $this->writeCacheFile($key, $content);
-                } else {
-                    $this->cache->write($key, $content);
-                    $this->cache->load($key);
-                }
-
-                if (!class_exists($mainCls, false)) {
-                    /* Last line of defense if either $this->bcWriteCacheFile was used,
-                     * $this->cache is implemented as a no-op or we have a race condition
-                     * where the cache was cleared between the above calls to write to and load from
-                     * the cache.
-                     */
-                    eval('?>'.$content);
-                }
-            }
-
-            if (!class_exists($cls, false)) {
-                throw new Twig_Error_Runtime(sprintf('Failed to load Twig template "%s", index "%s": cache is corrupted.', $name, $index), -1, $source);
-            }
-        }
-
-        if (!$this->runtimeInitialized) {
-            $this->initRuntime();
-        }
-
-        if (isset($this->loading[$cls])) {
-            throw new Twig_Error_Runtime(sprintf('Circular reference detected for Twig template "%s", path: %s.', $name, implode(' -> ', array_merge($this->loading, array($name)))));
-        }
-
-        $this->loading[$cls] = $name;
-
-        try {
-            $this->loadedTemplates[$cls] = new $cls($this);
-            unset($this->loading[$cls]);
-        } catch (\Exception $e) {
-            unset($this->loading[$cls]);
-
-            throw $e;
-        }
-
-        return $this->loadedTemplates[$cls];
-    }
-
-    /**
-     * Creates a template from source.
-     *
-     * This method should not be used as a generic way to load templates.
-     *
-     * @param string $template The template name
-     *
-     * @return Twig_Template A template instance representing the given template name
-     *
-     * @throws Twig_Error_Loader When the template cannot be found
-     * @throws Twig_Error_Syntax When an error occurred during compilation
-     */
-    public function createTemplate($template)
-    {
-        $name = sprintf('__string_template__%s', hash('sha256', $template, false));
-
-        $loader = new Twig_Loader_Chain(array(
-            new Twig_Loader_Array(array($name => $template)),
-            $current = $this->getLoader(),
-        ));
-
-        $this->setLoader($loader);
-        try {
-            $template = $this->loadTemplate($name);
-        } catch (Exception $e) {
-            $this->setLoader($current);
-
-            throw $e;
-        } catch (Throwable $e) {
-            $this->setLoader($current);
-
-            throw $e;
-        }
-        $this->setLoader($current);
-
-        return $template;
-    }
-
-    /**
-     * Returns true if the template is still fresh.
-     *
-     * Besides checking the loader for freshness information,
-     * this method also checks if the enabled extensions have
-     * not changed.
-     *
-     * @param string $name The template name
-     * @param int    $time The last modification time of the cached template
-     *
-     * @return bool true if the template is fresh, false otherwise
-     */
-    public function isTemplateFresh($name, $time)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Environment" instead */
+    class Twig_Environment extends Environment
     {
-        if (0 === $this->lastModifiedExtension) {
-            foreach ($this->extensions as $extension) {
-                $r = new ReflectionObject($extension);
-                if (file_exists($r->getFileName()) && ($extensionTime = filemtime($r->getFileName())) > $this->lastModifiedExtension) {
-                    $this->lastModifiedExtension = $extensionTime;
-                }
-            }
-        }
-
-        return $this->lastModifiedExtension <= $time && $this->getLoader()->isFresh($name, $time);
-    }
-
-    /**
-     * Tries to load a template consecutively from an array.
-     *
-     * Similar to loadTemplate() but it also accepts Twig_TemplateInterface instances and an array
-     * of templates where each is tried to be loaded.
-     *
-     * @param string|Twig_Template|array $names A template or an array of templates to try consecutively
-     *
-     * @return Twig_Template
-     *
-     * @throws Twig_Error_Loader When none of the templates can be found
-     * @throws Twig_Error_Syntax When an error occurred during compilation
-     */
-    public function resolveTemplate($names)
-    {
-        if (!is_array($names)) {
-            $names = array($names);
-        }
-
-        foreach ($names as $name) {
-            if ($name instanceof Twig_Template) {
-                return $name;
-            }
-
-            try {
-                return $this->loadTemplate($name);
-            } catch (Twig_Error_Loader $e) {
-            }
-        }
-
-        if (1 === count($names)) {
-            throw $e;
-        }
-
-        throw new Twig_Error_Loader(sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names)));
-    }
-
-    /**
-     * Clears the internal template cache.
-     *
-     * @deprecated since 1.18.3 (to be removed in 2.0)
-     */
-    public function clearTemplateCache()
-    {
-        @trigger_error(sprintf('The %s method is deprecated since version 1.18.3 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
-        $this->loadedTemplates = array();
-    }
-
-    /**
-     * Clears the template cache files on the filesystem.
-     *
-     * @deprecated since 1.22 (to be removed in 2.0)
-     */
-    public function clearCacheFiles()
-    {
-        @trigger_error(sprintf('The %s method is deprecated since version 1.22 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
-        if (is_string($this->originalCache)) {
-            foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->originalCache), RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
-                if ($file->isFile()) {
-                    @unlink($file->getPathname());
-                }
-            }
-        }
-    }
-
-    /**
-     * Gets the Lexer instance.
-     *
-     * @return Twig_LexerInterface
-     *
-     * @deprecated since 1.25 (to be removed in 2.0)
-     */
-    public function getLexer()
-    {
-        @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED);
-
-        if (null === $this->lexer) {
-            $this->lexer = new Twig_Lexer($this);
-        }
-
-        return $this->lexer;
-    }
-
-    public function setLexer(Twig_LexerInterface $lexer)
-    {
-        $this->lexer = $lexer;
-    }
-
-    /**
-     * Tokenizes a source code.
-     *
-     * @param string|Twig_Source $source The template source code
-     * @param string             $name   The template name (deprecated)
-     *
-     * @return Twig_TokenStream
-     *
-     * @throws Twig_Error_Syntax When the code is syntactically wrong
-     */
-    public function tokenize($source, $name = null)
-    {
-        if (!$source instanceof Twig_Source) {
-            @trigger_error(sprintf('Passing a string as the $source argument of %s() is deprecated since version 1.27. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
-            $source = new Twig_Source($source, $name);
-        }
-
-        if (null === $this->lexer) {
-            $this->lexer = new Twig_Lexer($this);
-        }
-
-        return $this->lexer->tokenize($source);
-    }
-
-    /**
-     * Gets the Parser instance.
-     *
-     * @return Twig_ParserInterface
-     *
-     * @deprecated since 1.25 (to be removed in 2.0)
-     */
-    public function getParser()
-    {
-        @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED);
-
-        if (null === $this->parser) {
-            $this->parser = new Twig_Parser($this);
-        }
-
-        return $this->parser;
-    }
-
-    public function setParser(Twig_ParserInterface $parser)
-    {
-        $this->parser = $parser;
-    }
-
-    /**
-     * Converts a token stream to a node tree.
-     *
-     * @return Twig_Node_Module
-     *
-     * @throws Twig_Error_Syntax When the token stream is syntactically or semantically wrong
-     */
-    public function parse(Twig_TokenStream $stream)
-    {
-        if (null === $this->parser) {
-            $this->parser = new Twig_Parser($this);
-        }
-
-        return $this->parser->parse($stream);
-    }
-
-    /**
-     * Gets the Compiler instance.
-     *
-     * @return Twig_CompilerInterface
-     *
-     * @deprecated since 1.25 (to be removed in 2.0)
-     */
-    public function getCompiler()
-    {
-        @trigger_error(sprintf('The %s() method is deprecated since version 1.25 and will be removed in 2.0.', __FUNCTION__), E_USER_DEPRECATED);
-
-        if (null === $this->compiler) {
-            $this->compiler = new Twig_Compiler($this);
-        }
-
-        return $this->compiler;
-    }
-
-    public function setCompiler(Twig_CompilerInterface $compiler)
-    {
-        $this->compiler = $compiler;
-    }
-
-    /**
-     * Compiles a node and returns the PHP code.
-     *
-     * @return string The compiled PHP source code
-     */
-    public function compile(Twig_NodeInterface $node)
-    {
-        if (null === $this->compiler) {
-            $this->compiler = new Twig_Compiler($this);
-        }
-
-        return $this->compiler->compile($node)->getSource();
-    }
-
-    /**
-     * Compiles a template source code.
-     *
-     * @param string|Twig_Source $source The template source code
-     * @param string             $name   The template name (deprecated)
-     *
-     * @return string The compiled PHP source code
-     *
-     * @throws Twig_Error_Syntax When there was an error during tokenizing, parsing or compiling
-     */
-    public function compileSource($source, $name = null)
-    {
-        if (!$source instanceof Twig_Source) {
-            @trigger_error(sprintf('Passing a string as the $source argument of %s() is deprecated since version 1.27. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
-            $source = new Twig_Source($source, $name);
-        }
-
-        try {
-            return $this->compile($this->parse($this->tokenize($source)));
-        } catch (Twig_Error $e) {
-            $e->setSourceContext($source);
-            throw $e;
-        } catch (Exception $e) {
-            throw new Twig_Error_Syntax(sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $source, $e);
-        }
-    }
-
-    public function setLoader(Twig_LoaderInterface $loader)
-    {
-        if (!$loader instanceof Twig_SourceContextLoaderInterface && 0 !== strpos(get_class($loader), 'Mock_')) {
-            @trigger_error(sprintf('Twig loader "%s" should implement Twig_SourceContextLoaderInterface since version 1.27.', get_class($loader)), E_USER_DEPRECATED);
-        }
-
-        $this->loader = $loader;
-    }
-
-    /**
-     * Gets the Loader instance.
-     *
-     * @return Twig_LoaderInterface
-     */
-    public function getLoader()
-    {
-        if (null === $this->loader) {
-            throw new LogicException('You must set a loader first.');
-        }
-
-        return $this->loader;
-    }
-
-    /**
-     * Sets the default template charset.
-     *
-     * @param string $charset The default charset
-     */
-    public function setCharset($charset)
-    {
-        $this->charset = strtoupper($charset);
-    }
-
-    /**
-     * Gets the default template charset.
-     *
-     * @return string The default charset
-     */
-    public function getCharset()
-    {
-        return $this->charset;
-    }
-
-    /**
-     * Initializes the runtime environment.
-     *
-     * @deprecated since 1.23 (to be removed in 2.0)
-     */
-    public function initRuntime()
-    {
-        $this->runtimeInitialized = true;
-
-        foreach ($this->getExtensions() as $name => $extension) {
-            if (!$extension instanceof Twig_Extension_InitRuntimeInterface) {
-                $m = new ReflectionMethod($extension, 'initRuntime');
-
-                if ('Twig_Extension' !== $m->getDeclaringClass()->getName()) {
-                    @trigger_error(sprintf('Defining the initRuntime() method in the "%s" extension is deprecated since version 1.23. Use the `needs_environment` option to get the Twig_Environment instance in filters, functions, or tests; or explicitly implement Twig_Extension_InitRuntimeInterface if needed (not recommended).', $name), E_USER_DEPRECATED);
-                }
-            }
-
-            $extension->initRuntime($this);
-        }
-    }
-
-    /**
-     * Returns true if the given extension is registered.
-     *
-     * @param string $class The extension class name
-     *
-     * @return bool Whether the extension is registered or not
-     */
-    public function hasExtension($class)
-    {
-        $class = ltrim($class, '\\');
-        if (!isset($this->extensionsByClass[$class]) && class_exists($class, false)) {
-            // For BC/FC with namespaced aliases
-            $class = new ReflectionClass($class);
-            $class = $class->name;
-        }
-
-        if (isset($this->extensions[$class])) {
-            if ($class !== get_class($this->extensions[$class])) {
-                @trigger_error(sprintf('Referencing the "%s" extension by its name (defined by getName()) is deprecated since 1.26 and will be removed in Twig 2.0. Use the Fully Qualified Extension Class Name instead.', $class), E_USER_DEPRECATED);
-            }
-
-            return true;
-        }
-
-        return isset($this->extensionsByClass[$class]);
-    }
-
-    /**
-     * Adds a runtime loader.
-     */
-    public function addRuntimeLoader(Twig_RuntimeLoaderInterface $loader)
-    {
-        $this->runtimeLoaders[] = $loader;
-    }
-
-    /**
-     * Gets an extension by class name.
-     *
-     * @param string $class The extension class name
-     *
-     * @return Twig_ExtensionInterface
-     */
-    public function getExtension($class)
-    {
-        $class = ltrim($class, '\\');
-        if (!isset($this->extensionsByClass[$class]) && class_exists($class, false)) {
-            // For BC/FC with namespaced aliases
-            $class = new ReflectionClass($class);
-            $class = $class->name;
-        }
-
-        if (isset($this->extensions[$class])) {
-            if ($class !== get_class($this->extensions[$class])) {
-                @trigger_error(sprintf('Referencing the "%s" extension by its name (defined by getName()) is deprecated since 1.26 and will be removed in Twig 2.0. Use the Fully Qualified Extension Class Name instead.', $class), E_USER_DEPRECATED);
-            }
-
-            return $this->extensions[$class];
-        }
-
-        if (!isset($this->extensionsByClass[$class])) {
-            throw new Twig_Error_Runtime(sprintf('The "%s" extension is not enabled.', $class));
-        }
-
-        return $this->extensionsByClass[$class];
-    }
-
-    /**
-     * Returns the runtime implementation of a Twig element (filter/function/test).
-     *
-     * @param string $class A runtime class name
-     *
-     * @return object The runtime implementation
-     *
-     * @throws Twig_Error_Runtime When the template cannot be found
-     */
-    public function getRuntime($class)
-    {
-        if (isset($this->runtimes[$class])) {
-            return $this->runtimes[$class];
-        }
-
-        foreach ($this->runtimeLoaders as $loader) {
-            if (null !== $runtime = $loader->load($class)) {
-                return $this->runtimes[$class] = $runtime;
-            }
-        }
-
-        throw new Twig_Error_Runtime(sprintf('Unable to load the "%s" runtime.', $class));
-    }
-
-    public function addExtension(Twig_ExtensionInterface $extension)
-    {
-        if ($this->extensionInitialized) {
-            throw new LogicException(sprintf('Unable to register extension "%s" as extensions have already been initialized.', $extension->getName()));
-        }
-
-        $class = get_class($extension);
-        if ($class !== $extension->getName()) {
-            if (isset($this->extensions[$extension->getName()])) {
-                unset($this->extensions[$extension->getName()], $this->extensionsByClass[$class]);
-                @trigger_error(sprintf('The possibility to register the same extension twice ("%s") is deprecated since version 1.23 and will be removed in Twig 2.0. Use proper PHP inheritance instead.', $extension->getName()), E_USER_DEPRECATED);
-            }
-        }
-
-        $this->lastModifiedExtension = 0;
-        $this->extensionsByClass[$class] = $extension;
-        $this->extensions[$extension->getName()] = $extension;
-        $this->updateOptionsHash();
-    }
-
-    /**
-     * Removes an extension by name.
-     *
-     * This method is deprecated and you should not use it.
-     *
-     * @param string $name The extension name
-     *
-     * @deprecated since 1.12 (to be removed in 2.0)
-     */
-    public function removeExtension($name)
-    {
-        @trigger_error(sprintf('The %s method is deprecated since version 1.12 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
-        if ($this->extensionInitialized) {
-            throw new LogicException(sprintf('Unable to remove extension "%s" as extensions have already been initialized.', $name));
-        }
-
-        $class = ltrim($name, '\\');
-        if (!isset($this->extensionsByClass[$class]) && class_exists($class, false)) {
-            // For BC/FC with namespaced aliases
-            $class = new ReflectionClass($class);
-            $class = $class->name;
-        }
-
-        if (isset($this->extensions[$class])) {
-            if ($class !== get_class($this->extensions[$class])) {
-                @trigger_error(sprintf('Referencing the "%s" extension by its name (defined by getName()) is deprecated since 1.26 and will be removed in Twig 2.0. Use the Fully Qualified Extension Class Name instead.', $class), E_USER_DEPRECATED);
-            }
-
-            unset($this->extensions[$class]);
-        }
-
-        unset($this->extensions[$class]);
-        $this->updateOptionsHash();
-    }
-
-    /**
-     * Registers an array of extensions.
-     *
-     * @param array $extensions An array of extensions
-     */
-    public function setExtensions(array $extensions)
-    {
-        foreach ($extensions as $extension) {
-            $this->addExtension($extension);
-        }
-    }
-
-    /**
-     * Returns all registered extensions.
-     *
-     * @return Twig_ExtensionInterface[] An array of extensions (keys are for internal usage only and should not be relied on)
-     */
-    public function getExtensions()
-    {
-        return $this->extensions;
-    }
-
-    public function addTokenParser(Twig_TokenParserInterface $parser)
-    {
-        if ($this->extensionInitialized) {
-            throw new LogicException('Unable to add a token parser as extensions have already been initialized.');
-        }
-
-        $this->staging->addTokenParser($parser);
-    }
-
-    /**
-     * Gets the registered Token Parsers.
-     *
-     * @return Twig_TokenParserBrokerInterface
-     *
-     * @internal
-     */
-    public function getTokenParsers()
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        return $this->parsers;
-    }
-
-    /**
-     * Gets registered tags.
-     *
-     * Be warned that this method cannot return tags defined by Twig_TokenParserBrokerInterface classes.
-     *
-     * @return Twig_TokenParserInterface[]
-     *
-     * @internal
-     */
-    public function getTags()
-    {
-        $tags = array();
-        foreach ($this->getTokenParsers()->getParsers() as $parser) {
-            if ($parser instanceof Twig_TokenParserInterface) {
-                $tags[$parser->getTag()] = $parser;
-            }
-        }
-
-        return $tags;
-    }
-
-    public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
-    {
-        if ($this->extensionInitialized) {
-            throw new LogicException('Unable to add a node visitor as extensions have already been initialized.');
-        }
-
-        $this->staging->addNodeVisitor($visitor);
-    }
-
-    /**
-     * Gets the registered Node Visitors.
-     *
-     * @return Twig_NodeVisitorInterface[]
-     *
-     * @internal
-     */
-    public function getNodeVisitors()
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        return $this->visitors;
-    }
-
-    /**
-     * Registers a Filter.
-     *
-     * @param string|Twig_SimpleFilter               $name   The filter name or a Twig_SimpleFilter instance
-     * @param Twig_FilterInterface|Twig_SimpleFilter $filter
-     */
-    public function addFilter($name, $filter = null)
-    {
-        if (!$name instanceof Twig_SimpleFilter && !($filter instanceof Twig_SimpleFilter || $filter instanceof Twig_FilterInterface)) {
-            throw new LogicException('A filter must be an instance of Twig_FilterInterface or Twig_SimpleFilter.');
-        }
-
-        if ($name instanceof Twig_SimpleFilter) {
-            $filter = $name;
-            $name = $filter->getName();
-        } else {
-            @trigger_error(sprintf('Passing a name as a first argument to the %s method is deprecated since version 1.21. Pass an instance of "Twig_SimpleFilter" instead when defining filter "%s".', __METHOD__, $name), E_USER_DEPRECATED);
-        }
-
-        if ($this->extensionInitialized) {
-            throw new LogicException(sprintf('Unable to add filter "%s" as extensions have already been initialized.', $name));
-        }
-
-        $this->staging->addFilter($name, $filter);
-    }
-
-    /**
-     * Get a filter by name.
-     *
-     * Subclasses may override this method and load filters differently;
-     * so no list of filters is available.
-     *
-     * @param string $name The filter name
-     *
-     * @return Twig_Filter|false A Twig_Filter instance or false if the filter does not exist
-     *
-     * @internal
-     */
-    public function getFilter($name)
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        if (isset($this->filters[$name])) {
-            return $this->filters[$name];
-        }
-
-        foreach ($this->filters as $pattern => $filter) {
-            $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
-
-            if ($count) {
-                if (preg_match('#^'.$pattern.'$#', $name, $matches)) {
-                    array_shift($matches);
-                    $filter->setArguments($matches);
-
-                    return $filter;
-                }
-            }
-        }
-
-        foreach ($this->filterCallbacks as $callback) {
-            if (false !== $filter = call_user_func($callback, $name)) {
-                return $filter;
-            }
-        }
-
-        return false;
-    }
-
-    public function registerUndefinedFilterCallback($callable)
-    {
-        $this->filterCallbacks[] = $callable;
-    }
-
-    /**
-     * Gets the registered Filters.
-     *
-     * Be warned that this method cannot return filters defined with registerUndefinedFilterCallback.
-     *
-     * @return Twig_FilterInterface[]
-     *
-     * @see registerUndefinedFilterCallback
-     *
-     * @internal
-     */
-    public function getFilters()
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        return $this->filters;
-    }
-
-    /**
-     * Registers a Test.
-     *
-     * @param string|Twig_SimpleTest             $name The test name or a Twig_SimpleTest instance
-     * @param Twig_TestInterface|Twig_SimpleTest $test A Twig_TestInterface instance or a Twig_SimpleTest instance
-     */
-    public function addTest($name, $test = null)
-    {
-        if (!$name instanceof Twig_SimpleTest && !($test instanceof Twig_SimpleTest || $test instanceof Twig_TestInterface)) {
-            throw new LogicException('A test must be an instance of Twig_TestInterface or Twig_SimpleTest.');
-        }
-
-        if ($name instanceof Twig_SimpleTest) {
-            $test = $name;
-            $name = $test->getName();
-        } else {
-            @trigger_error(sprintf('Passing a name as a first argument to the %s method is deprecated since version 1.21. Pass an instance of "Twig_SimpleTest" instead when defining test "%s".', __METHOD__, $name), E_USER_DEPRECATED);
-        }
-
-        if ($this->extensionInitialized) {
-            throw new LogicException(sprintf('Unable to add test "%s" as extensions have already been initialized.', $name));
-        }
-
-        $this->staging->addTest($name, $test);
-    }
-
-    /**
-     * Gets the registered Tests.
-     *
-     * @return Twig_TestInterface[]
-     *
-     * @internal
-     */
-    public function getTests()
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        return $this->tests;
-    }
-
-    /**
-     * Gets a test by name.
-     *
-     * @param string $name The test name
-     *
-     * @return Twig_Test|false A Twig_Test instance or false if the test does not exist
-     *
-     * @internal
-     */
-    public function getTest($name)
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        if (isset($this->tests[$name])) {
-            return $this->tests[$name];
-        }
-
-        return false;
-    }
-
-    /**
-     * Registers a Function.
-     *
-     * @param string|Twig_SimpleFunction                 $name     The function name or a Twig_SimpleFunction instance
-     * @param Twig_FunctionInterface|Twig_SimpleFunction $function
-     */
-    public function addFunction($name, $function = null)
-    {
-        if (!$name instanceof Twig_SimpleFunction && !($function instanceof Twig_SimpleFunction || $function instanceof Twig_FunctionInterface)) {
-            throw new LogicException('A function must be an instance of Twig_FunctionInterface or Twig_SimpleFunction.');
-        }
-
-        if ($name instanceof Twig_SimpleFunction) {
-            $function = $name;
-            $name = $function->getName();
-        } else {
-            @trigger_error(sprintf('Passing a name as a first argument to the %s method is deprecated since version 1.21. Pass an instance of "Twig_SimpleFunction" instead when defining function "%s".', __METHOD__, $name), E_USER_DEPRECATED);
-        }
-
-        if ($this->extensionInitialized) {
-            throw new LogicException(sprintf('Unable to add function "%s" as extensions have already been initialized.', $name));
-        }
-
-        $this->staging->addFunction($name, $function);
-    }
-
-    /**
-     * Get a function by name.
-     *
-     * Subclasses may override this method and load functions differently;
-     * so no list of functions is available.
-     *
-     * @param string $name function name
-     *
-     * @return Twig_Function|false A Twig_Function instance or false if the function does not exist
-     *
-     * @internal
-     */
-    public function getFunction($name)
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        if (isset($this->functions[$name])) {
-            return $this->functions[$name];
-        }
-
-        foreach ($this->functions as $pattern => $function) {
-            $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
-
-            if ($count) {
-                if (preg_match('#^'.$pattern.'$#', $name, $matches)) {
-                    array_shift($matches);
-                    $function->setArguments($matches);
-
-                    return $function;
-                }
-            }
-        }
-
-        foreach ($this->functionCallbacks as $callback) {
-            if (false !== $function = call_user_func($callback, $name)) {
-                return $function;
-            }
-        }
-
-        return false;
-    }
-
-    public function registerUndefinedFunctionCallback($callable)
-    {
-        $this->functionCallbacks[] = $callable;
-    }
-
-    /**
-     * Gets registered functions.
-     *
-     * Be warned that this method cannot return functions defined with registerUndefinedFunctionCallback.
-     *
-     * @return Twig_FunctionInterface[]
-     *
-     * @see registerUndefinedFunctionCallback
-     *
-     * @internal
-     */
-    public function getFunctions()
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        return $this->functions;
-    }
-
-    /**
-     * Registers a Global.
-     *
-     * New globals can be added before compiling or rendering a template;
-     * but after, you can only update existing globals.
-     *
-     * @param string $name  The global name
-     * @param mixed  $value The global value
-     */
-    public function addGlobal($name, $value)
-    {
-        if ($this->extensionInitialized || $this->runtimeInitialized) {
-            if (null === $this->globals) {
-                $this->globals = $this->initGlobals();
-            }
-
-            if (!array_key_exists($name, $this->globals)) {
-                // The deprecation notice must be turned into the following exception in Twig 2.0
-                @trigger_error(sprintf('Registering global variable "%s" at runtime or when the extensions have already been initialized is deprecated since version 1.21.', $name), E_USER_DEPRECATED);
-                //throw new LogicException(sprintf('Unable to add global "%s" as the runtime or the extensions have already been initialized.', $name));
-            }
-        }
-
-        if ($this->extensionInitialized || $this->runtimeInitialized) {
-            // update the value
-            $this->globals[$name] = $value;
-        } else {
-            $this->staging->addGlobal($name, $value);
-        }
-    }
-
-    /**
-     * Gets the registered Globals.
-     *
-     * @return array An array of globals
-     *
-     * @internal
-     */
-    public function getGlobals()
-    {
-        if (!$this->runtimeInitialized && !$this->extensionInitialized) {
-            return $this->initGlobals();
-        }
-
-        if (null === $this->globals) {
-            $this->globals = $this->initGlobals();
-        }
-
-        return $this->globals;
-    }
-
-    /**
-     * Merges a context with the defined globals.
-     *
-     * @param array $context An array representing the context
-     *
-     * @return array The context merged with the globals
-     */
-    public function mergeGlobals(array $context)
-    {
-        // we don't use array_merge as the context being generally
-        // bigger than globals, this code is faster.
-        foreach ($this->getGlobals() as $key => $value) {
-            if (!array_key_exists($key, $context)) {
-                $context[$key] = $value;
-            }
-        }
-
-        return $context;
-    }
-
-    /**
-     * Gets the registered unary Operators.
-     *
-     * @return array An array of unary operators
-     *
-     * @internal
-     */
-    public function getUnaryOperators()
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        return $this->unaryOperators;
-    }
-
-    /**
-     * Gets the registered binary Operators.
-     *
-     * @return array An array of binary operators
-     *
-     * @internal
-     */
-    public function getBinaryOperators()
-    {
-        if (!$this->extensionInitialized) {
-            $this->initExtensions();
-        }
-
-        return $this->binaryOperators;
-    }
-
-    /**
-     * @deprecated since 1.23 (to be removed in 2.0)
-     */
-    public function computeAlternatives($name, $items)
-    {
-        @trigger_error(sprintf('The %s method is deprecated since version 1.23 and will be removed in Twig 2.0.', __METHOD__), E_USER_DEPRECATED);
-
-        return Twig_Error_Syntax::computeAlternatives($name, $items);
-    }
-
-    /**
-     * @internal
-     */
-    protected function initGlobals()
-    {
-        $globals = array();
-        foreach ($this->extensions as $name => $extension) {
-            if (!$extension instanceof Twig_Extension_GlobalsInterface) {
-                $m = new ReflectionMethod($extension, 'getGlobals');
-
-                if ('Twig_Extension' !== $m->getDeclaringClass()->getName()) {
-                    @trigger_error(sprintf('Defining the getGlobals() method in the "%s" extension without explicitly implementing Twig_Extension_GlobalsInterface is deprecated since version 1.23.', $name), E_USER_DEPRECATED);
-                }
-            }
-
-            $extGlob = $extension->getGlobals();
-            if (!is_array($extGlob)) {
-                throw new UnexpectedValueException(sprintf('"%s::getGlobals()" must return an array of globals.', get_class($extension)));
-            }
-
-            $globals[] = $extGlob;
-        }
-
-        $globals[] = $this->staging->getGlobals();
-
-        return call_user_func_array('array_merge', $globals);
-    }
-
-    /**
-     * @internal
-     */
-    protected function initExtensions()
-    {
-        if ($this->extensionInitialized) {
-            return;
-        }
-
-        $this->parsers = new Twig_TokenParserBroker(array(), array(), false);
-        $this->filters = array();
-        $this->functions = array();
-        $this->tests = array();
-        $this->visitors = array();
-        $this->unaryOperators = array();
-        $this->binaryOperators = array();
-
-        foreach ($this->extensions as $extension) {
-            $this->initExtension($extension);
-        }
-        $this->initExtension($this->staging);
-        // Done at the end only, so that an exception during initialization does not mark the environment as initialized when catching the exception
-        $this->extensionInitialized = true;
-    }
-
-    /**
-     * @internal
-     */
-    protected function initExtension(Twig_ExtensionInterface $extension)
-    {
-        // filters
-        foreach ($extension->getFilters() as $name => $filter) {
-            if ($filter instanceof Twig_SimpleFilter) {
-                $name = $filter->getName();
-            } else {
-                @trigger_error(sprintf('Using an instance of "%s" for filter "%s" is deprecated since version 1.21. Use Twig_SimpleFilter instead.', get_class($filter), $name), E_USER_DEPRECATED);
-            }
-
-            $this->filters[$name] = $filter;
-        }
-
-        // functions
-        foreach ($extension->getFunctions() as $name => $function) {
-            if ($function instanceof Twig_SimpleFunction) {
-                $name = $function->getName();
-            } else {
-                @trigger_error(sprintf('Using an instance of "%s" for function "%s" is deprecated since version 1.21. Use Twig_SimpleFunction instead.', get_class($function), $name), E_USER_DEPRECATED);
-            }
-
-            $this->functions[$name] = $function;
-        }
-
-        // tests
-        foreach ($extension->getTests() as $name => $test) {
-            if ($test instanceof Twig_SimpleTest) {
-                $name = $test->getName();
-            } else {
-                @trigger_error(sprintf('Using an instance of "%s" for test "%s" is deprecated since version 1.21. Use Twig_SimpleTest instead.', get_class($test), $name), E_USER_DEPRECATED);
-            }
-
-            $this->tests[$name] = $test;
-        }
-
-        // token parsers
-        foreach ($extension->getTokenParsers() as $parser) {
-            if ($parser instanceof Twig_TokenParserInterface) {
-                $this->parsers->addTokenParser($parser);
-            } elseif ($parser instanceof Twig_TokenParserBrokerInterface) {
-                @trigger_error('Registering a Twig_TokenParserBrokerInterface instance is deprecated since version 1.21.', E_USER_DEPRECATED);
-
-                $this->parsers->addTokenParserBroker($parser);
-            } else {
-                throw new LogicException('getTokenParsers() must return an array of Twig_TokenParserInterface or Twig_TokenParserBrokerInterface instances.');
-            }
-        }
-
-        // node visitors
-        foreach ($extension->getNodeVisitors() as $visitor) {
-            $this->visitors[] = $visitor;
-        }
-
-        // operators
-        if ($operators = $extension->getOperators()) {
-            if (!is_array($operators)) {
-                throw new InvalidArgumentException(sprintf('"%s::getOperators()" must return an array with operators, got "%s".', get_class($extension), is_object($operators) ? get_class($operators) : gettype($operators).(is_resource($operators) ? '' : '#'.$operators)));
-            }
-
-            if (2 !== count($operators)) {
-                throw new InvalidArgumentException(sprintf('"%s::getOperators()" must return an array of 2 elements, got %d.', get_class($extension), count($operators)));
-            }
-
-            $this->unaryOperators = array_merge($this->unaryOperators, $operators[0]);
-            $this->binaryOperators = array_merge($this->binaryOperators, $operators[1]);
-        }
-    }
-
-    /**
-     * @deprecated since 1.22 (to be removed in 2.0)
-     */
-    protected function writeCacheFile($file, $content)
-    {
-        $this->cache->write($file, $content);
-    }
-
-    private function updateOptionsHash()
-    {
-        $hashParts = array_merge(
-            array_keys($this->extensions),
-            array(
-                (int) function_exists('twig_template_get_attributes'),
-                PHP_MAJOR_VERSION,
-                PHP_MINOR_VERSION,
-                self::VERSION,
-                (int) $this->debug,
-                $this->baseTemplateClass,
-                (int) $this->strictVariables,
-            )
-        );
-        $this->optionsHash = implode(':', $hashParts);
     }
 }
-
-class_alias('Twig_Environment', 'Twig\Environment', false);
diff --git a/vendor/twig/twig/lib/Twig/Error.php b/vendor/twig/twig/lib/Twig/Error.php
index 787e0d09..3f49877d 100644
--- a/vendor/twig/twig/lib/Twig/Error.php
+++ b/vendor/twig/twig/lib/Twig/Error.php
@@ -1,363 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Error\Error;
 
-/**
- * Twig base exception.
- *
- * This exception class and its children must only be used when
- * an error occurs during the loading of a template, when a syntax error
- * is detected in a template, or when rendering a template. Other
- * errors must use regular PHP exception classes (like when the template
- * cache directory is not writable for instance).
- *
- * To help debugging template issues, this class tracks the original template
- * name and line where the error occurred.
- *
- * Whenever possible, you must set these information (original template name
- * and line number) yourself by passing them to the constructor. If some or all
- * these information are not available from where you throw the exception, then
- * this class will guess them automatically (when the line number is set to -1
- * and/or the name is set to null). As this is a costly operation, this
- * can be disabled by passing false for both the name and the line number
- * when creating a new instance of this class.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Error extends Exception
-{
-    protected $lineno;
-    // to be renamed to name in 2.0
-    protected $filename;
-    protected $rawMessage;
-    protected $previous;
+class_exists('Twig\Error\Error');
 
-    private $sourcePath;
-    private $sourceCode;
+@trigger_error(sprintf('Using the "Twig_Error" class is deprecated since Twig version 2.7, use "Twig\Error\Error" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * Constructor.
-     *
-     * Set both the line number and the name to false to
-     * disable automatic guessing of the original template name
-     * and line number.
-     *
-     * Set the line number to -1 to enable its automatic guessing.
-     * Set the name to null to enable its automatic guessing.
-     *
-     * By default, automatic guessing is enabled.
-     *
-     * @param string                  $message  The error message
-     * @param int                     $lineno   The template line where the error occurred
-     * @param Twig_Source|string|null $source   The source context where the error occurred
-     * @param Exception               $previous The previous exception
-     */
-    public function __construct($message, $lineno = -1, $source = null, Exception $previous = null)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Error\Error" instead */
+    class Twig_Error extends Error
     {
-        if (null === $source) {
-            $name = null;
-        } elseif (!$source instanceof Twig_Source) {
-            // for compat with the Twig C ext., passing the template name as string is accepted
-            $name = $source;
-        } else {
-            $name = $source->getName();
-            $this->sourceCode = $source->getCode();
-            $this->sourcePath = $source->getPath();
-        }
-        if (PHP_VERSION_ID < 50300) {
-            $this->previous = $previous;
-            parent::__construct('');
-        } else {
-            parent::__construct('', 0, $previous);
-        }
-
-        $this->lineno = $lineno;
-        $this->filename = $name;
-
-        if (-1 === $lineno || null === $name || null === $this->sourcePath) {
-            $this->guessTemplateInfo();
-        }
-
-        $this->rawMessage = $message;
-
-        $this->updateRepr();
-    }
-
-    /**
-     * Gets the raw message.
-     *
-     * @return string The raw message
-     */
-    public function getRawMessage()
-    {
-        return $this->rawMessage;
-    }
-
-    /**
-     * Gets the logical name where the error occurred.
-     *
-     * @return string The name
-     *
-     * @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead.
-     */
-    public function getTemplateFile()
-    {
-        @trigger_error(sprintf('The "%s" method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
-        return $this->filename;
-    }
-
-    /**
-     * Sets the logical name where the error occurred.
-     *
-     * @param string $name The name
-     *
-     * @deprecated since 1.27 (to be removed in 2.0). Use setSourceContext() instead.
-     */
-    public function setTemplateFile($name)
-    {
-        @trigger_error(sprintf('The "%s" method is deprecated since version 1.27 and will be removed in 2.0. Use setSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
-        $this->filename = $name;
-
-        $this->updateRepr();
-    }
-
-    /**
-     * Gets the logical name where the error occurred.
-     *
-     * @return string The name
-     *
-     * @deprecated since 1.29 (to be removed in 2.0). Use getSourceContext() instead.
-     */
-    public function getTemplateName()
-    {
-        @trigger_error(sprintf('The "%s" method is deprecated since version 1.29 and will be removed in 2.0. Use getSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
-        return $this->filename;
-    }
-
-    /**
-     * Sets the logical name where the error occurred.
-     *
-     * @param string $name The name
-     *
-     * @deprecated since 1.29 (to be removed in 2.0). Use setSourceContext() instead.
-     */
-    public function setTemplateName($name)
-    {
-        @trigger_error(sprintf('The "%s" method is deprecated since version 1.29 and will be removed in 2.0. Use setSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
-        $this->filename = $name;
-        $this->sourceCode = $this->sourcePath = null;
-
-        $this->updateRepr();
-    }
-
-    /**
-     * Gets the template line where the error occurred.
-     *
-     * @return int The template line
-     */
-    public function getTemplateLine()
-    {
-        return $this->lineno;
-    }
-
-    /**
-     * Sets the template line where the error occurred.
-     *
-     * @param int $lineno The template line
-     */
-    public function setTemplateLine($lineno)
-    {
-        $this->lineno = $lineno;
-
-        $this->updateRepr();
-    }
-
-    /**
-     * Gets the source context of the Twig template where the error occurred.
-     *
-     * @return Twig_Source|null
-     */
-    public function getSourceContext()
-    {
-        return $this->filename ? new Twig_Source($this->sourceCode, $this->filename, $this->sourcePath) : null;
-    }
-
-    /**
-     * Sets the source context of the Twig template where the error occurred.
-     */
-    public function setSourceContext(Twig_Source $source = null)
-    {
-        if (null === $source) {
-            $this->sourceCode = $this->filename = $this->sourcePath = null;
-        } else {
-            $this->sourceCode = $source->getCode();
-            $this->filename = $source->getName();
-            $this->sourcePath = $source->getPath();
-        }
-
-        $this->updateRepr();
-    }
-
-    public function guess()
-    {
-        $this->guessTemplateInfo();
-        $this->updateRepr();
-    }
-
-    /**
-     * For PHP < 5.3.0, provides access to the getPrevious() method.
-     *
-     * @param string $method    The method name
-     * @param array  $arguments The parameters to be passed to the method
-     *
-     * @return Exception The previous exception or null
-     *
-     * @throws BadMethodCallException
-     */
-    public function __call($method, $arguments)
-    {
-        if ('getprevious' == strtolower($method)) {
-            return $this->previous;
-        }
-
-        throw new BadMethodCallException(sprintf('Method "Twig_Error::%s()" does not exist.', $method));
-    }
-
-    public function appendMessage($rawMessage)
-    {
-        $this->rawMessage .= $rawMessage;
-        $this->updateRepr();
-    }
-
-    /**
-     * @internal
-     */
-    protected function updateRepr()
-    {
-        $this->message = $this->rawMessage;
-
-        if ($this->sourcePath && $this->lineno > 0) {
-            $this->file = $this->sourcePath;
-            $this->line = $this->lineno;
-
-            return;
-        }
-
-        $dot = false;
-        if ('.' === substr($this->message, -1)) {
-            $this->message = substr($this->message, 0, -1);
-            $dot = true;
-        }
-
-        $questionMark = false;
-        if ('?' === substr($this->message, -1)) {
-            $this->message = substr($this->message, 0, -1);
-            $questionMark = true;
-        }
-
-        if ($this->filename) {
-            if (is_string($this->filename) || (is_object($this->filename) && method_exists($this->filename, '__toString'))) {
-                $name = sprintf('"%s"', $this->filename);
-            } else {
-                $name = json_encode($this->filename);
-            }
-            $this->message .= sprintf(' in %s', $name);
-        }
-
-        if ($this->lineno && $this->lineno >= 0) {
-            $this->message .= sprintf(' at line %d', $this->lineno);
-        }
-
-        if ($dot) {
-            $this->message .= '.';
-        }
-
-        if ($questionMark) {
-            $this->message .= '?';
-        }
-    }
-
-    /**
-     * @internal
-     */
-    protected function guessTemplateInfo()
-    {
-        $template = null;
-        $templateClass = null;
-
-        if (PHP_VERSION_ID >= 50306) {
-            $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT);
-        } else {
-            $backtrace = debug_backtrace();
-        }
-
-        foreach ($backtrace as $trace) {
-            if (isset($trace['object']) && $trace['object'] instanceof Twig_Template && 'Twig_Template' !== get_class($trace['object'])) {
-                $currentClass = get_class($trace['object']);
-                $isEmbedContainer = 0 === strpos($templateClass, $currentClass);
-                if (null === $this->filename || ($this->filename == $trace['object']->getTemplateName() && !$isEmbedContainer)) {
-                    $template = $trace['object'];
-                    $templateClass = get_class($trace['object']);
-                }
-            }
-        }
-
-        // update template name
-        if (null !== $template && null === $this->filename) {
-            $this->filename = $template->getTemplateName();
-        }
-
-        // update template path if any
-        if (null !== $template && null === $this->sourcePath) {
-            $src = $template->getSourceContext();
-            $this->sourceCode = $src->getCode();
-            $this->sourcePath = $src->getPath();
-        }
-
-        if (null === $template || $this->lineno > -1) {
-            return;
-        }
-
-        $r = new ReflectionObject($template);
-        $file = $r->getFileName();
-
-        $exceptions = array($e = $this);
-        while (($e instanceof self || method_exists($e, 'getPrevious')) && $e = $e->getPrevious()) {
-            $exceptions[] = $e;
-        }
-
-        while ($e = array_pop($exceptions)) {
-            $traces = $e->getTrace();
-            array_unshift($traces, array('file' => $e->getFile(), 'line' => $e->getLine()));
-
-            while ($trace = array_shift($traces)) {
-                if (!isset($trace['file']) || !isset($trace['line']) || $file != $trace['file']) {
-                    continue;
-                }
-
-                foreach ($template->getDebugInfo() as $codeLine => $templateLine) {
-                    if ($codeLine <= $trace['line']) {
-                        // update template line
-                        $this->lineno = $templateLine;
-
-                        return;
-                    }
-                }
-            }
-        }
     }
 }
-
-class_alias('Twig_Error', 'Twig\Error\Error', false);
-class_exists('Twig_Source');
diff --git a/vendor/twig/twig/lib/Twig/Error/Loader.php b/vendor/twig/twig/lib/Twig/Error/Loader.php
index df566dd7..37522d78 100644
--- a/vendor/twig/twig/lib/Twig/Error/Loader.php
+++ b/vendor/twig/twig/lib/Twig/Error/Loader.php
@@ -1,40 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Error\LoaderError;
 
-/**
- * Exception thrown when an error occurs during template loading.
- *
- * Automatic template information guessing is always turned off as
- * if a template cannot be loaded, there is nothing to guess.
- * However, when a template is loaded from another one, then, we need
- * to find the current context and this is automatically done by
- * Twig_Template::displayWithErrorHandling().
- *
- * This strategy makes Twig_Environment::resolveTemplate() much faster.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Error_Loader extends Twig_Error
-{
-    public function __construct($message, $lineno = -1, $source = null, Exception $previous = null)
+class_exists('Twig\Error\LoaderError');
+
+@trigger_error(sprintf('Using the "Twig_Error_Loader" class is deprecated since Twig version 2.7, use "Twig\Error\LoaderError" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Error\LoaderError" instead */
+    class Twig_Error_Loader extends LoaderError
     {
-        if (PHP_VERSION_ID < 50300) {
-            $this->previous = $previous;
-            Exception::__construct('');
-        } else {
-            Exception::__construct('', 0, $previous);
-        }
-        $this->appendMessage($message);
-        $this->setTemplateLine(false);
     }
 }
-
-class_alias('Twig_Error_Loader', 'Twig\Error\LoaderError', false);
diff --git a/vendor/twig/twig/lib/Twig/Error/Runtime.php b/vendor/twig/twig/lib/Twig/Error/Runtime.php
index 3b24ad3a..48ba0a7e 100644
--- a/vendor/twig/twig/lib/Twig/Error/Runtime.php
+++ b/vendor/twig/twig/lib/Twig/Error/Runtime.php
@@ -1,22 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Error\RuntimeError;
 
-/**
- * Exception thrown when an error occurs at runtime.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Error_Runtime extends Twig_Error
-{
-}
+class_exists('Twig\Error\RuntimeError');
+
+@trigger_error(sprintf('Using the "Twig_Error_Runtime" class is deprecated since Twig version 2.7, use "Twig\Error\RuntimeError" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_Error_Runtime', 'Twig\Error\RuntimeError', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Error\RuntimeError" instead */
+    class Twig_Error_Runtime extends RuntimeError
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/Error/Syntax.php b/vendor/twig/twig/lib/Twig/Error/Syntax.php
index 9d09f217..a70dd164 100644
--- a/vendor/twig/twig/lib/Twig/Error/Syntax.php
+++ b/vendor/twig/twig/lib/Twig/Error/Syntax.php
@@ -1,55 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Error\SyntaxError;
 
-/**
- * Exception thrown when a syntax error occurs during lexing or parsing of a template.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Error_Syntax extends Twig_Error
-{
-    /**
-     * Tweaks the error message to include suggestions.
-     *
-     * @param string $name  The original name of the item that does not exist
-     * @param array  $items An array of possible items
-     */
-    public function addSuggestions($name, array $items)
-    {
-        if (!$alternatives = self::computeAlternatives($name, $items)) {
-            return;
-        }
+class_exists('Twig\Error\SyntaxError');
 
-        $this->appendMessage(sprintf(' Did you mean "%s"?', implode('", "', $alternatives)));
-    }
+@trigger_error(sprintf('Using the "Twig_Error_Syntax" class is deprecated since Twig version 2.7, use "Twig\Error\SyntaxError" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * @internal
-     *
-     * To be merged with the addSuggestions() method in 2.0.
-     */
-    public static function computeAlternatives($name, $items)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Error\SyntaxError" instead */
+    class Twig_Error_Syntax extends SyntaxError
     {
-        $alternatives = array();
-        foreach ($items as $item) {
-            $lev = levenshtein($name, $item);
-            if ($lev <= strlen($name) / 3 || false !== strpos($item, $name)) {
-                $alternatives[$item] = $lev;
-            }
-        }
-        asort($alternatives);
-
-        return array_keys($alternatives);
     }
 }
-
-class_alias('Twig_Error_Syntax', 'Twig\Error\SyntaxError', false);
diff --git a/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php b/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php
index 968cb21a..d4023f52 100644
--- a/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php
+++ b/vendor/twig/twig/lib/Twig/ExistsLoaderInterface.php
@@ -1,31 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Loader\ExistsLoaderInterface;
 
-/**
- * Adds an exists() method for loaders.
- *
- * @author Florin Patan <florinpatan@xxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_ExistsLoaderInterface
-{
-    /**
-     * Check if we have the source code of a template, given its name.
-     *
-     * @param string $name The name of the template to check if we can load
-     *
-     * @return bool If the template source code is handled by this loader or not
-     */
-    public function exists($name);
-}
+class_exists('Twig\Loader\ExistsLoaderInterface');
+
+@trigger_error(sprintf('Using the "Twig_ExistsLoaderInterface" class is deprecated since Twig version 2.7, use "Twig\Loader\ExistsLoaderInterface" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_ExistsLoaderInterface', 'Twig\Loader\ExistsLoaderInterface', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Loader\ExistsLoaderInterface" instead */
+    class Twig_ExistsLoaderInterface extends ExistsLoaderInterface
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/ExpressionParser.php b/vendor/twig/twig/lib/Twig/ExpressionParser.php
index 4906f903..4f4c175c 100644
--- a/vendor/twig/twig/lib/Twig/ExpressionParser.php
+++ b/vendor/twig/twig/lib/Twig/ExpressionParser.php
@@ -1,741 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\ExpressionParser;
 
-/**
- * Parses expressions.
- *
- * This parser implements a "Precedence climbing" algorithm.
- *
- * @see http://www.engr.mun.ca/~theo/Misc/exp_parsing.htm
- * @see http://en.wikipedia.org/wiki/Operator-precedence_parser
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @internal
- */
-class Twig_ExpressionParser
-{
-    const OPERATOR_LEFT = 1;
-    const OPERATOR_RIGHT = 2;
+class_exists('Twig\ExpressionParser');
 
-    protected $parser;
-    protected $unaryOperators;
-    protected $binaryOperators;
+@trigger_error(sprintf('Using the "Twig_ExpressionParser" class is deprecated since Twig version 2.7, use "Twig\ExpressionParser" instead.'), E_USER_DEPRECATED);
 
-    private $env;
-
-    public function __construct(Twig_Parser $parser, $env = null)
-    {
-        $this->parser = $parser;
-
-        if ($env instanceof Twig_Environment) {
-            $this->env = $env;
-            $this->unaryOperators = $env->getUnaryOperators();
-            $this->binaryOperators = $env->getBinaryOperators();
-        } else {
-            @trigger_error('Passing the operators as constructor arguments to '.__METHOD__.' is deprecated since version 1.27. Pass the environment instead.', E_USER_DEPRECATED);
-
-            $this->env = $parser->getEnvironment();
-            $this->unaryOperators = func_get_arg(1);
-            $this->binaryOperators = func_get_arg(2);
-        }
-    }
-
-    public function parseExpression($precedence = 0)
-    {
-        $expr = $this->getPrimary();
-        $token = $this->parser->getCurrentToken();
-        while ($this->isBinary($token) && $this->binaryOperators[$token->getValue()]['precedence'] >= $precedence) {
-            $op = $this->binaryOperators[$token->getValue()];
-            $this->parser->getStream()->next();
-
-            if ('is not' === $token->getValue()) {
-                $expr = $this->parseNotTestExpression($expr);
-            } elseif ('is' === $token->getValue()) {
-                $expr = $this->parseTestExpression($expr);
-            } elseif (isset($op['callable'])) {
-                $expr = call_user_func($op['callable'], $this->parser, $expr);
-            } else {
-                $expr1 = $this->parseExpression(self::OPERATOR_LEFT === $op['associativity'] ? $op['precedence'] + 1 : $op['precedence']);
-                $class = $op['class'];
-                $expr = new $class($expr, $expr1, $token->getLine());
-            }
-
-            $token = $this->parser->getCurrentToken();
-        }
-
-        if (0 === $precedence) {
-            return $this->parseConditionalExpression($expr);
-        }
-
-        return $expr;
-    }
-
-    protected function getPrimary()
-    {
-        $token = $this->parser->getCurrentToken();
-
-        if ($this->isUnary($token)) {
-            $operator = $this->unaryOperators[$token->getValue()];
-            $this->parser->getStream()->next();
-            $expr = $this->parseExpression($operator['precedence']);
-            $class = $operator['class'];
-
-            return $this->parsePostfixExpression(new $class($expr, $token->getLine()));
-        } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-            $this->parser->getStream()->next();
-            $expr = $this->parseExpression();
-            $this->parser->getStream()->expect(Twig_Token::PUNCTUATION_TYPE, ')', 'An opened parenthesis is not properly closed');
-
-            return $this->parsePostfixExpression($expr);
-        }
-
-        return $this->parsePrimaryExpression();
-    }
-
-    protected function parseConditionalExpression($expr)
-    {
-        while ($this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, '?')) {
-            if (!$this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ':')) {
-                $expr2 = $this->parseExpression();
-                if ($this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ':')) {
-                    $expr3 = $this->parseExpression();
-                } else {
-                    $expr3 = new Twig_Node_Expression_Constant('', $this->parser->getCurrentToken()->getLine());
-                }
-            } else {
-                $expr2 = $expr;
-                $expr3 = $this->parseExpression();
-            }
-
-            $expr = new Twig_Node_Expression_Conditional($expr, $expr2, $expr3, $this->parser->getCurrentToken()->getLine());
-        }
-
-        return $expr;
-    }
-
-    protected function isUnary(Twig_Token $token)
-    {
-        return $token->test(Twig_Token::OPERATOR_TYPE) && isset($this->unaryOperators[$token->getValue()]);
-    }
-
-    protected function isBinary(Twig_Token $token)
-    {
-        return $token->test(Twig_Token::OPERATOR_TYPE) && isset($this->binaryOperators[$token->getValue()]);
-    }
-
-    public function parsePrimaryExpression()
-    {
-        $token = $this->parser->getCurrentToken();
-        switch ($token->getType()) {
-            case Twig_Token::NAME_TYPE:
-                $this->parser->getStream()->next();
-                switch ($token->getValue()) {
-                    case 'true':
-                    case 'TRUE':
-                        $node = new Twig_Node_Expression_Constant(true, $token->getLine());
-                        break;
-
-                    case 'false':
-                    case 'FALSE':
-                        $node = new Twig_Node_Expression_Constant(false, $token->getLine());
-                        break;
-
-                    case 'none':
-                    case 'NONE':
-                    case 'null':
-                    case 'NULL':
-                        $node = new Twig_Node_Expression_Constant(null, $token->getLine());
-                        break;
-
-                    default:
-                        if ('(' === $this->parser->getCurrentToken()->getValue()) {
-                            $node = $this->getFunctionNode($token->getValue(), $token->getLine());
-                        } else {
-                            $node = new Twig_Node_Expression_Name($token->getValue(), $token->getLine());
-                        }
-                }
-                break;
-
-            case Twig_Token::NUMBER_TYPE:
-                $this->parser->getStream()->next();
-                $node = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
-                break;
-
-            case Twig_Token::STRING_TYPE:
-            case Twig_Token::INTERPOLATION_START_TYPE:
-                $node = $this->parseStringExpression();
-                break;
-
-            case Twig_Token::OPERATOR_TYPE:
-                if (preg_match(Twig_Lexer::REGEX_NAME, $token->getValue(), $matches) && $matches[0] == $token->getValue()) {
-                    // in this context, string operators are variable names
-                    $this->parser->getStream()->next();
-                    $node = new Twig_Node_Expression_Name($token->getValue(), $token->getLine());
-                    break;
-                } elseif (isset($this->unaryOperators[$token->getValue()])) {
-                    $class = $this->unaryOperators[$token->getValue()]['class'];
-
-                    $ref = new ReflectionClass($class);
-                    $negClass = 'Twig_Node_Expression_Unary_Neg';
-                    $posClass = 'Twig_Node_Expression_Unary_Pos';
-                    if (!(in_array($ref->getName(), array($negClass, $posClass)) || $ref->isSubclassOf($negClass) || $ref->isSubclassOf($posClass))) {
-                        throw new Twig_Error_Syntax(sprintf('Unexpected unary operator "%s".', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
-                    }
-
-                    $this->parser->getStream()->next();
-                    $expr = $this->parsePrimaryExpression();
-
-                    $node = new $class($expr, $token->getLine());
-                    break;
-                }
-
-            default:
-                if ($token->test(Twig_Token::PUNCTUATION_TYPE, '[')) {
-                    $node = $this->parseArrayExpression();
-                } elseif ($token->test(Twig_Token::PUNCTUATION_TYPE, '{')) {
-                    $node = $this->parseHashExpression();
-                } else {
-                    throw new Twig_Error_Syntax(sprintf('Unexpected token "%s" of value "%s".', Twig_Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
-                }
-        }
-
-        return $this->parsePostfixExpression($node);
-    }
-
-    public function parseStringExpression()
-    {
-        $stream = $this->parser->getStream();
-
-        $nodes = array();
-        // a string cannot be followed by another string in a single expression
-        $nextCanBeString = true;
-        while (true) {
-            if ($nextCanBeString && $token = $stream->nextIf(Twig_Token::STRING_TYPE)) {
-                $nodes[] = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
-                $nextCanBeString = false;
-            } elseif ($stream->nextIf(Twig_Token::INTERPOLATION_START_TYPE)) {
-                $nodes[] = $this->parseExpression();
-                $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
-                $nextCanBeString = true;
-            } else {
-                break;
-            }
-        }
-
-        $expr = array_shift($nodes);
-        foreach ($nodes as $node) {
-            $expr = new Twig_Node_Expression_Binary_Concat($expr, $node, $node->getTemplateLine());
-        }
-
-        return $expr;
-    }
-
-    public function parseArrayExpression()
-    {
-        $stream = $this->parser->getStream();
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '[', 'An array element was expected');
-
-        $node = new Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine());
-        $first = true;
-        while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
-            if (!$first) {
-                $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'An array element must be followed by a comma');
-
-                // trailing ,?
-                if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
-                    break;
-                }
-            }
-            $first = false;
-
-            $node->addElement($this->parseExpression());
-        }
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']', 'An opened array is not properly closed');
-
-        return $node;
-    }
-
-    public function parseHashExpression()
-    {
-        $stream = $this->parser->getStream();
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '{', 'A hash element was expected');
-
-        $node = new Twig_Node_Expression_Array(array(), $stream->getCurrent()->getLine());
-        $first = true;
-        while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, '}')) {
-            if (!$first) {
-                $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'A hash value must be followed by a comma');
-
-                // trailing ,?
-                if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '}')) {
-                    break;
-                }
-            }
-            $first = false;
-
-            // a hash key can be:
-            //
-            //  * a number -- 12
-            //  * a string -- 'a'
-            //  * a name, which is equivalent to a string -- a
-            //  * an expression, which must be enclosed in parentheses -- (1 + 2)
-            if (($token = $stream->nextIf(Twig_Token::STRING_TYPE)) || ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) || $token = $stream->nextIf(Twig_Token::NUMBER_TYPE)) {
-                $key = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
-            } elseif ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-                $key = $this->parseExpression();
-            } else {
-                $current = $stream->getCurrent();
-
-                throw new Twig_Error_Syntax(sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s".', Twig_Token::typeToEnglish($current->getType()), $current->getValue()), $current->getLine(), $stream->getSourceContext());
-            }
-
-            $stream->expect(Twig_Token::PUNCTUATION_TYPE, ':', 'A hash key must be followed by a colon (:)');
-            $value = $this->parseExpression();
-
-            $node->addElement($value, $key);
-        }
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '}', 'An opened hash is not properly closed');
-
-        return $node;
-    }
-
-    public function parsePostfixExpression($node)
-    {
-        while (true) {
-            $token = $this->parser->getCurrentToken();
-            if ($token->getType() == Twig_Token::PUNCTUATION_TYPE) {
-                if ('.' == $token->getValue() || '[' == $token->getValue()) {
-                    $node = $this->parseSubscriptExpression($node);
-                } elseif ('|' == $token->getValue()) {
-                    $node = $this->parseFilterExpression($node);
-                } else {
-                    break;
-                }
-            } else {
-                break;
-            }
-        }
-
-        return $node;
-    }
-
-    public function getFunctionNode($name, $line)
-    {
-        switch ($name) {
-            case 'parent':
-                $this->parseArguments();
-                if (!count($this->parser->getBlockStack())) {
-                    throw new Twig_Error_Syntax('Calling "parent" outside a block is forbidden.', $line, $this->parser->getStream()->getSourceContext());
-                }
-
-                if (!$this->parser->getParent() && !$this->parser->hasTraits()) {
-                    throw new Twig_Error_Syntax('Calling "parent" on a template that does not extend nor "use" another template is forbidden.', $line, $this->parser->getStream()->getSourceContext());
-                }
-
-                return new Twig_Node_Expression_Parent($this->parser->peekBlockStack(), $line);
-            case 'block':
-                $args = $this->parseArguments();
-                if (count($args) < 1) {
-                    throw new Twig_Error_Syntax('The "block" function takes one argument (the block name).', $line, $this->parser->getStream()->getSourceContext());
-                }
-
-                return new Twig_Node_Expression_BlockReference($args->getNode(0), count($args) > 1 ? $args->getNode(1) : null, $line);
-            case 'attribute':
-                $args = $this->parseArguments();
-                if (count($args) < 2) {
-                    throw new Twig_Error_Syntax('The "attribute" function takes at least two arguments (the variable and the attributes).', $line, $this->parser->getStream()->getSourceContext());
-                }
-
-                return new Twig_Node_Expression_GetAttr($args->getNode(0), $args->getNode(1), count($args) > 2 ? $args->getNode(2) : null, Twig_Template::ANY_CALL, $line);
-            default:
-                if (null !== $alias = $this->parser->getImportedSymbol('function', $name)) {
-                    $arguments = new Twig_Node_Expression_Array(array(), $line);
-                    foreach ($this->parseArguments() as $n) {
-                        $arguments->addElement($n);
-                    }
-
-                    $node = new Twig_Node_Expression_MethodCall($alias['node'], $alias['name'], $arguments, $line);
-                    $node->setAttribute('safe', true);
-
-                    return $node;
-                }
-
-                $args = $this->parseArguments(true);
-                $class = $this->getFunctionNodeClass($name, $line);
-
-                return new $class($name, $args, $line);
-        }
-    }
-
-    public function parseSubscriptExpression($node)
-    {
-        $stream = $this->parser->getStream();
-        $token = $stream->next();
-        $lineno = $token->getLine();
-        $arguments = new Twig_Node_Expression_Array(array(), $lineno);
-        $type = Twig_Template::ANY_CALL;
-        if ($token->getValue() == '.') {
-            $token = $stream->next();
-            if (
-                $token->getType() == Twig_Token::NAME_TYPE
-                ||
-                $token->getType() == Twig_Token::NUMBER_TYPE
-                ||
-                ($token->getType() == Twig_Token::OPERATOR_TYPE && preg_match(Twig_Lexer::REGEX_NAME, $token->getValue()))
-            ) {
-                $arg = new Twig_Node_Expression_Constant($token->getValue(), $lineno);
-
-                if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-                    $type = Twig_Template::METHOD_CALL;
-                    foreach ($this->parseArguments() as $n) {
-                        $arguments->addElement($n);
-                    }
-                }
-            } else {
-                throw new Twig_Error_Syntax('Expected name or number.', $lineno, $stream->getSourceContext());
-            }
-
-            if ($node instanceof Twig_Node_Expression_Name && null !== $this->parser->getImportedSymbol('template', $node->getAttribute('name'))) {
-                if (!$arg instanceof Twig_Node_Expression_Constant) {
-                    throw new Twig_Error_Syntax(sprintf('Dynamic macro names are not supported (called on "%s").', $node->getAttribute('name')), $token->getLine(), $stream->getSourceContext());
-                }
-
-                $name = $arg->getAttribute('value');
-
-                if ($this->parser->isReservedMacroName($name)) {
-                    throw new Twig_Error_Syntax(sprintf('"%s" cannot be called as macro as it is a reserved keyword.', $name), $token->getLine(), $stream->getSourceContext());
-                }
-
-                $node = new Twig_Node_Expression_MethodCall($node, 'get'.$name, $arguments, $lineno);
-                $node->setAttribute('safe', true);
-
-                return $node;
-            }
-        } else {
-            $type = Twig_Template::ARRAY_CALL;
-
-            // slice?
-            $slice = false;
-            if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ':')) {
-                $slice = true;
-                $arg = new Twig_Node_Expression_Constant(0, $token->getLine());
-            } else {
-                $arg = $this->parseExpression();
-            }
-
-            if ($stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ':')) {
-                $slice = true;
-            }
-
-            if ($slice) {
-                if ($stream->test(Twig_Token::PUNCTUATION_TYPE, ']')) {
-                    $length = new Twig_Node_Expression_Constant(null, $token->getLine());
-                } else {
-                    $length = $this->parseExpression();
-                }
-
-                $class = $this->getFilterNodeClass('slice', $token->getLine());
-                $arguments = new Twig_Node(array($arg, $length));
-                $filter = new $class($node, new Twig_Node_Expression_Constant('slice', $token->getLine()), $arguments, $token->getLine());
-
-                $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']');
-
-                return $filter;
-            }
-
-            $stream->expect(Twig_Token::PUNCTUATION_TYPE, ']');
-        }
-
-        return new Twig_Node_Expression_GetAttr($node, $arg, $arguments, $type, $lineno);
-    }
-
-    public function parseFilterExpression($node)
-    {
-        $this->parser->getStream()->next();
-
-        return $this->parseFilterExpressionRaw($node);
-    }
-
-    public function parseFilterExpressionRaw($node, $tag = null)
-    {
-        while (true) {
-            $token = $this->parser->getStream()->expect(Twig_Token::NAME_TYPE);
-
-            $name = new Twig_Node_Expression_Constant($token->getValue(), $token->getLine());
-            if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-                $arguments = new Twig_Node();
-            } else {
-                $arguments = $this->parseArguments(true);
-            }
-
-            $class = $this->getFilterNodeClass($name->getAttribute('value'), $token->getLine());
-
-            $node = new $class($node, $name, $arguments, $token->getLine(), $tag);
-
-            if (!$this->parser->getStream()->test(Twig_Token::PUNCTUATION_TYPE, '|')) {
-                break;
-            }
-
-            $this->parser->getStream()->next();
-        }
-
-        return $node;
-    }
-
-    /**
-     * Parses arguments.
-     *
-     * @param bool $namedArguments Whether to allow named arguments or not
-     * @param bool $definition     Whether we are parsing arguments for a function definition
-     *
-     * @return Twig_Node
-     *
-     * @throws Twig_Error_Syntax
-     */
-    public function parseArguments($namedArguments = false, $definition = false)
-    {
-        $args = array();
-        $stream = $this->parser->getStream();
-
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, '(', 'A list of arguments must begin with an opening parenthesis');
-        while (!$stream->test(Twig_Token::PUNCTUATION_TYPE, ')')) {
-            if (!empty($args)) {
-                $stream->expect(Twig_Token::PUNCTUATION_TYPE, ',', 'Arguments must be separated by a comma');
-            }
-
-            if ($definition) {
-                $token = $stream->expect(Twig_Token::NAME_TYPE, null, 'An argument must be a name');
-                $value = new Twig_Node_Expression_Name($token->getValue(), $this->parser->getCurrentToken()->getLine());
-            } else {
-                $value = $this->parseExpression();
-            }
-
-            $name = null;
-            if ($namedArguments && $token = $stream->nextIf(Twig_Token::OPERATOR_TYPE, '=')) {
-                if (!$value instanceof Twig_Node_Expression_Name) {
-                    throw new Twig_Error_Syntax(sprintf('A parameter name must be a string, "%s" given.', get_class($value)), $token->getLine(), $stream->getSourceContext());
-                }
-                $name = $value->getAttribute('name');
-
-                if ($definition) {
-                    $value = $this->parsePrimaryExpression();
-
-                    if (!$this->checkConstantExpression($value)) {
-                        throw new Twig_Error_Syntax(sprintf('A default value for an argument must be a constant (a boolean, a string, a number, or an array).'), $token->getLine(), $stream->getSourceContext());
-                    }
-                } else {
-                    $value = $this->parseExpression();
-                }
-            }
-
-            if ($definition) {
-                if (null === $name) {
-                    $name = $value->getAttribute('name');
-                    $value = new Twig_Node_Expression_Constant(null, $this->parser->getCurrentToken()->getLine());
-                }
-                $args[$name] = $value;
-            } else {
-                if (null === $name) {
-                    $args[] = $value;
-                } else {
-                    $args[$name] = $value;
-                }
-            }
-        }
-        $stream->expect(Twig_Token::PUNCTUATION_TYPE, ')', 'A list of arguments must be closed by a parenthesis');
-
-        return new Twig_Node($args);
-    }
-
-    public function parseAssignmentExpression()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\ExpressionParser" instead */
+    class Twig_ExpressionParser extends ExpressionParser
     {
-        $stream = $this->parser->getStream();
-        $targets = array();
-        while (true) {
-            $token = $stream->expect(Twig_Token::NAME_TYPE, null, 'Only variables can be assigned to');
-            $value = $token->getValue();
-            if (in_array(strtolower($value), array('true', 'false', 'none', 'null'))) {
-                throw new Twig_Error_Syntax(sprintf('You cannot assign a value to "%s".', $value), $token->getLine(), $stream->getSourceContext());
-            }
-            $targets[] = new Twig_Node_Expression_AssignName($value, $token->getLine());
-
-            if (!$stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) {
-                break;
-            }
-        }
-
-        return new Twig_Node($targets);
-    }
-
-    public function parseMultitargetExpression()
-    {
-        $targets = array();
-        while (true) {
-            $targets[] = $this->parseExpression();
-            if (!$this->parser->getStream()->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) {
-                break;
-            }
-        }
-
-        return new Twig_Node($targets);
-    }
-
-    private function parseNotTestExpression(Twig_NodeInterface $node)
-    {
-        return new Twig_Node_Expression_Unary_Not($this->parseTestExpression($node), $this->parser->getCurrentToken()->getLine());
-    }
-
-    private function parseTestExpression(Twig_NodeInterface $node)
-    {
-        $stream = $this->parser->getStream();
-        list($name, $test) = $this->getTest($node->getTemplateLine());
-
-        $class = $this->getTestNodeClass($test);
-        $arguments = null;
-        if ($stream->test(Twig_Token::PUNCTUATION_TYPE, '(')) {
-            $arguments = $this->parser->getExpressionParser()->parseArguments(true);
-        }
-
-        return new $class($node, $name, $arguments, $this->parser->getCurrentToken()->getLine());
-    }
-
-    private function getTest($line)
-    {
-        $stream = $this->parser->getStream();
-        $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
-        if ($test = $this->env->getTest($name)) {
-            return array($name, $test);
-        }
-
-        if ($stream->test(Twig_Token::NAME_TYPE)) {
-            // try 2-words tests
-            $name = $name.' '.$this->parser->getCurrentToken()->getValue();
-
-            if ($test = $this->env->getTest($name)) {
-                $stream->next();
-
-                return array($name, $test);
-            }
-        }
-
-        $e = new Twig_Error_Syntax(sprintf('Unknown "%s" test.', $name), $line, $stream->getSourceContext());
-        $e->addSuggestions($name, array_keys($this->env->getTests()));
-
-        throw $e;
-    }
-
-    private function getTestNodeClass($test)
-    {
-        if ($test instanceof Twig_SimpleTest && $test->isDeprecated()) {
-            $stream = $this->parser->getStream();
-            $message = sprintf('Twig Test "%s" is deprecated', $test->getName());
-            if (!is_bool($test->getDeprecatedVersion())) {
-                $message .= sprintf(' since version %s', $test->getDeprecatedVersion());
-            }
-            if ($test->getAlternative()) {
-                $message .= sprintf('. Use "%s" instead', $test->getAlternative());
-            }
-            $src = $stream->getSourceContext();
-            $message .= sprintf(' in %s at line %d.', $src->getPath() ? $src->getPath() : $src->getName(), $stream->getCurrent()->getLine());
-
-            @trigger_error($message, E_USER_DEPRECATED);
-        }
-
-        if ($test instanceof Twig_SimpleTest) {
-            return $test->getNodeClass();
-        }
-
-        return $test instanceof Twig_Test_Node ? $test->getClass() : 'Twig_Node_Expression_Test';
-    }
-
-    protected function getFunctionNodeClass($name, $line)
-    {
-        if (false === $function = $this->env->getFunction($name)) {
-            $e = new Twig_Error_Syntax(sprintf('Unknown "%s" function.', $name), $line, $this->parser->getStream()->getSourceContext());
-            $e->addSuggestions($name, array_keys($this->env->getFunctions()));
-
-            throw $e;
-        }
-
-        if ($function instanceof Twig_SimpleFunction && $function->isDeprecated()) {
-            $message = sprintf('Twig Function "%s" is deprecated', $function->getName());
-            if (!is_bool($function->getDeprecatedVersion())) {
-                $message .= sprintf(' since version %s', $function->getDeprecatedVersion());
-            }
-            if ($function->getAlternative()) {
-                $message .= sprintf('. Use "%s" instead', $function->getAlternative());
-            }
-            $src = $this->parser->getStream()->getSourceContext();
-            $message .= sprintf(' in %s at line %d.', $src->getPath() ? $src->getPath() : $src->getName(), $line);
-
-            @trigger_error($message, E_USER_DEPRECATED);
-        }
-
-        if ($function instanceof Twig_SimpleFunction) {
-            return $function->getNodeClass();
-        }
-
-        return $function instanceof Twig_Function_Node ? $function->getClass() : 'Twig_Node_Expression_Function';
-    }
-
-    protected function getFilterNodeClass($name, $line)
-    {
-        if (false === $filter = $this->env->getFilter($name)) {
-            $e = new Twig_Error_Syntax(sprintf('Unknown "%s" filter.', $name), $line, $this->parser->getStream()->getSourceContext());
-            $e->addSuggestions($name, array_keys($this->env->getFilters()));
-
-            throw $e;
-        }
-
-        if ($filter instanceof Twig_SimpleFilter && $filter->isDeprecated()) {
-            $message = sprintf('Twig Filter "%s" is deprecated', $filter->getName());
-            if (!is_bool($filter->getDeprecatedVersion())) {
-                $message .= sprintf(' since version %s', $filter->getDeprecatedVersion());
-            }
-            if ($filter->getAlternative()) {
-                $message .= sprintf('. Use "%s" instead', $filter->getAlternative());
-            }
-            $src = $this->parser->getStream()->getSourceContext();
-            $message .= sprintf(' in %s at line %d.', $src->getPath() ? $src->getPath() : $src->getName(), $line);
-
-            @trigger_error($message, E_USER_DEPRECATED);
-        }
-
-        if ($filter instanceof Twig_SimpleFilter) {
-            return $filter->getNodeClass();
-        }
-
-        return $filter instanceof Twig_Filter_Node ? $filter->getClass() : 'Twig_Node_Expression_Filter';
-    }
-
-    // checks that the node only contains "constant" elements
-    protected function checkConstantExpression(Twig_NodeInterface $node)
-    {
-        if (!($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array
-            || $node instanceof Twig_Node_Expression_Unary_Neg || $node instanceof Twig_Node_Expression_Unary_Pos
-        )) {
-            return false;
-        }
-
-        foreach ($node as $n) {
-            if (!$this->checkConstantExpression($n)) {
-                return false;
-            }
-        }
-
-        return true;
     }
 }
-
-class_alias('Twig_ExpressionParser', 'Twig\ExpressionParser', false);
diff --git a/vendor/twig/twig/lib/Twig/Extension.php b/vendor/twig/twig/lib/Twig/Extension.php
index 38084495..3d4356cb 100644
--- a/vendor/twig/twig/lib/Twig/Extension.php
+++ b/vendor/twig/twig/lib/Twig/Extension.php
@@ -1,69 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\AbstractExtension;
 
-abstract class Twig_Extension implements Twig_ExtensionInterface
-{
-    /**
-     * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_InitRuntimeInterface instead
-     */
-    public function initRuntime(Twig_Environment $environment)
-    {
-    }
-
-    public function getTokenParsers()
-    {
-        return array();
-    }
-
-    public function getNodeVisitors()
-    {
-        return array();
-    }
+class_exists('Twig\Extension\AbstractExtension');
 
-    public function getFilters()
-    {
-        return array();
-    }
+@trigger_error(sprintf('Using the "Twig_Extension" class is deprecated since Twig version 2.7, use "Twig\Extension\AbstractExtension" instead.'), E_USER_DEPRECATED);
 
-    public function getTests()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\AbstractExtension" instead */
+    class Twig_Extension extends AbstractExtension
     {
-        return array();
-    }
-
-    public function getFunctions()
-    {
-        return array();
-    }
-
-    public function getOperators()
-    {
-        return array();
-    }
-
-    /**
-     * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_GlobalsInterface instead
-     */
-    public function getGlobals()
-    {
-        return array();
-    }
-
-    /**
-     * @deprecated since 1.26 (to be removed in 2.0), not used anymore internally
-     */
-    public function getName()
-    {
-        return get_class($this);
     }
 }
-
-class_alias('Twig_Extension', 'Twig\Extension\AbstractExtension', false);
-class_exists('Twig_Environment');
diff --git a/vendor/twig/twig/lib/Twig/Extension/Core.php b/vendor/twig/twig/lib/Twig/Extension/Core.php
index 34f9ef7d..ad01942f 100644
--- a/vendor/twig/twig/lib/Twig/Extension/Core.php
+++ b/vendor/twig/twig/lib/Twig/Extension/Core.php
@@ -1,1612 +1,14 @@
 <?php
 
-if (!defined('ENT_SUBSTITUTE')) {
-    define('ENT_SUBSTITUTE', 8);
-}
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * @final
- */
-class Twig_Extension_Core extends Twig_Extension
-{
-    protected $dateFormats = array('F j, Y H:i', '%d days');
-    protected $numberFormat = array(0, '.', ',');
-    protected $timezone = null;
-    protected $escapers = array();
-
-    /**
-     * Defines a new escaper to be used via the escape filter.
-     *
-     * @param string   $strategy The strategy name that should be used as a strategy in the escape call
-     * @param callable $callable A valid PHP callable
-     */
-    public function setEscaper($strategy, $callable)
-    {
-        $this->escapers[$strategy] = $callable;
-    }
-
-    /**
-     * Gets all defined escapers.
-     *
-     * @return array An array of escapers
-     */
-    public function getEscapers()
-    {
-        return $this->escapers;
-    }
-
-    /**
-     * Sets the default format to be used by the date filter.
-     *
-     * @param string $format             The default date format string
-     * @param string $dateIntervalFormat The default date interval format string
-     */
-    public function setDateFormat($format = null, $dateIntervalFormat = null)
-    {
-        if (null !== $format) {
-            $this->dateFormats[0] = $format;
-        }
-
-        if (null !== $dateIntervalFormat) {
-            $this->dateFormats[1] = $dateIntervalFormat;
-        }
-    }
-
-    /**
-     * Gets the default format to be used by the date filter.
-     *
-     * @return array The default date format string and the default date interval format string
-     */
-    public function getDateFormat()
-    {
-        return $this->dateFormats;
-    }
-
-    /**
-     * Sets the default timezone to be used by the date filter.
-     *
-     * @param DateTimeZone|string $timezone The default timezone string or a DateTimeZone object
-     */
-    public function setTimezone($timezone)
-    {
-        $this->timezone = $timezone instanceof DateTimeZone ? $timezone : new DateTimeZone($timezone);
-    }
-
-    /**
-     * Gets the default timezone to be used by the date filter.
-     *
-     * @return DateTimeZone The default timezone currently in use
-     */
-    public function getTimezone()
-    {
-        if (null === $this->timezone) {
-            $this->timezone = new DateTimeZone(date_default_timezone_get());
-        }
-
-        return $this->timezone;
-    }
-
-    /**
-     * Sets the default format to be used by the number_format filter.
-     *
-     * @param int    $decimal      the number of decimal places to use
-     * @param string $decimalPoint the character(s) to use for the decimal point
-     * @param string $thousandSep  the character(s) to use for the thousands separator
-     */
-    public function setNumberFormat($decimal, $decimalPoint, $thousandSep)
-    {
-        $this->numberFormat = array($decimal, $decimalPoint, $thousandSep);
-    }
-
-    /**
-     * Get the default format used by the number_format filter.
-     *
-     * @return array The arguments for number_format()
-     */
-    public function getNumberFormat()
-    {
-        return $this->numberFormat;
-    }
-
-    public function getTokenParsers()
-    {
-        return array(
-            new Twig_TokenParser_For(),
-            new Twig_TokenParser_If(),
-            new Twig_TokenParser_Extends(),
-            new Twig_TokenParser_Include(),
-            new Twig_TokenParser_Block(),
-            new Twig_TokenParser_Use(),
-            new Twig_TokenParser_Filter(),
-            new Twig_TokenParser_Macro(),
-            new Twig_TokenParser_Import(),
-            new Twig_TokenParser_From(),
-            new Twig_TokenParser_Set(),
-            new Twig_TokenParser_Spaceless(),
-            new Twig_TokenParser_Flush(),
-            new Twig_TokenParser_Do(),
-            new Twig_TokenParser_Embed(),
-            new Twig_TokenParser_With(),
-        );
-    }
-
-    public function getFilters()
-    {
-        $filters = array(
-            // formatting filters
-            new Twig_SimpleFilter('date', 'twig_date_format_filter', array('needs_environment' => true)),
-            new Twig_SimpleFilter('date_modify', 'twig_date_modify_filter', array('needs_environment' => true)),
-            new Twig_SimpleFilter('format', 'sprintf'),
-            new Twig_SimpleFilter('replace', 'twig_replace_filter'),
-            new Twig_SimpleFilter('number_format', 'twig_number_format_filter', array('needs_environment' => true)),
-            new Twig_SimpleFilter('abs', 'abs'),
-            new Twig_SimpleFilter('round', 'twig_round'),
-
-            // encoding
-            new Twig_SimpleFilter('url_encode', 'twig_urlencode_filter'),
-            new Twig_SimpleFilter('json_encode', 'twig_jsonencode_filter'),
-            new Twig_SimpleFilter('convert_encoding', 'twig_convert_encoding'),
-
-            // string filters
-            new Twig_SimpleFilter('title', 'twig_title_string_filter', array('needs_environment' => true)),
-            new Twig_SimpleFilter('capitalize', 'twig_capitalize_string_filter', array('needs_environment' => true)),
-            new Twig_SimpleFilter('upper', 'strtoupper'),
-            new Twig_SimpleFilter('lower', 'strtolower'),
-            new Twig_SimpleFilter('striptags', 'strip_tags'),
-            new Twig_SimpleFilter('trim', 'twig_trim_filter'),
-            new Twig_SimpleFilter('nl2br', 'nl2br', array('pre_escape' => 'html', 'is_safe' => array('html'))),
-
-            // array helpers
-            new Twig_SimpleFilter('join', 'twig_join_filter'),
-            new Twig_SimpleFilter('split', 'twig_split_filter', array('needs_environment' => true)),
-            new Twig_SimpleFilter('sort', 'twig_sort_filter'),
-            new Twig_SimpleFilter('merge', 'twig_array_merge'),
-            new Twig_SimpleFilter('batch', 'twig_array_batch'),
-
-            // string/array filters
-            new Twig_SimpleFilter('reverse', 'twig_reverse_filter', array('needs_environment' => true)),
-            new Twig_SimpleFilter('length', 'twig_length_filter', array('needs_environment' => true)),
-            new Twig_SimpleFilter('slice', 'twig_slice', array('needs_environment' => true)),
-            new Twig_SimpleFilter('first', 'twig_first', array('needs_environment' => true)),
-            new Twig_SimpleFilter('last', 'twig_last', array('needs_environment' => true)),
-
-            // iteration and runtime
-            new Twig_SimpleFilter('default', '_twig_default_filter', array('node_class' => 'Twig_Node_Expression_Filter_Default')),
-            new Twig_SimpleFilter('keys', 'twig_get_array_keys_filter'),
-
-            // escaping
-            new Twig_SimpleFilter('escape', 'twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
-            new Twig_SimpleFilter('e', 'twig_escape_filter', array('needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe')),
-        );
-
-        if (function_exists('mb_get_info')) {
-            $filters[] = new Twig_SimpleFilter('upper', 'twig_upper_filter', array('needs_environment' => true));
-            $filters[] = new Twig_SimpleFilter('lower', 'twig_lower_filter', array('needs_environment' => true));
-        }
-
-        return $filters;
-    }
-
-    public function getFunctions()
-    {
-        return array(
-            new Twig_SimpleFunction('max', 'max'),
-            new Twig_SimpleFunction('min', 'min'),
-            new Twig_SimpleFunction('range', 'range'),
-            new Twig_SimpleFunction('constant', 'twig_constant'),
-            new Twig_SimpleFunction('cycle', 'twig_cycle'),
-            new Twig_SimpleFunction('random', 'twig_random', array('needs_environment' => true)),
-            new Twig_SimpleFunction('date', 'twig_date_converter', array('needs_environment' => true)),
-            new Twig_SimpleFunction('include', 'twig_include', array('needs_environment' => true, 'needs_context' => true, 'is_safe' => array('all'))),
-            new Twig_SimpleFunction('source', 'twig_source', array('needs_environment' => true, 'is_safe' => array('all'))),
-        );
-    }
+use Twig\Extension\CoreExtension;
 
-    public function getTests()
-    {
-        return array(
-            new Twig_SimpleTest('even', null, array('node_class' => 'Twig_Node_Expression_Test_Even')),
-            new Twig_SimpleTest('odd', null, array('node_class' => 'Twig_Node_Expression_Test_Odd')),
-            new Twig_SimpleTest('defined', null, array('node_class' => 'Twig_Node_Expression_Test_Defined')),
-            new Twig_SimpleTest('sameas', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas', 'deprecated' => '1.21', 'alternative' => 'same as')),
-            new Twig_SimpleTest('same as', null, array('node_class' => 'Twig_Node_Expression_Test_Sameas')),
-            new Twig_SimpleTest('none', null, array('node_class' => 'Twig_Node_Expression_Test_Null')),
-            new Twig_SimpleTest('null', null, array('node_class' => 'Twig_Node_Expression_Test_Null')),
-            new Twig_SimpleTest('divisibleby', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby', 'deprecated' => '1.21', 'alternative' => 'divisible by')),
-            new Twig_SimpleTest('divisible by', null, array('node_class' => 'Twig_Node_Expression_Test_Divisibleby')),
-            new Twig_SimpleTest('constant', null, array('node_class' => 'Twig_Node_Expression_Test_Constant')),
-            new Twig_SimpleTest('empty', 'twig_test_empty'),
-            new Twig_SimpleTest('iterable', 'twig_test_iterable'),
-        );
-    }
+class_exists('Twig\Extension\CoreExtension');
 
-    public function getOperators()
-    {
-        return array(
-            array(
-                'not' => array('precedence' => 50, 'class' => 'Twig_Node_Expression_Unary_Not'),
-                '-' => array('precedence' => 500, 'class' => 'Twig_Node_Expression_Unary_Neg'),
-                '+' => array('precedence' => 500, 'class' => 'Twig_Node_Expression_Unary_Pos'),
-            ),
-            array(
-                'or' => array('precedence' => 10, 'class' => 'Twig_Node_Expression_Binary_Or', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'and' => array('precedence' => 15, 'class' => 'Twig_Node_Expression_Binary_And', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'b-or' => array('precedence' => 16, 'class' => 'Twig_Node_Expression_Binary_BitwiseOr', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'b-xor' => array('precedence' => 17, 'class' => 'Twig_Node_Expression_Binary_BitwiseXor', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'b-and' => array('precedence' => 18, 'class' => 'Twig_Node_Expression_Binary_BitwiseAnd', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '==' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Equal', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '!=' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '<' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Less', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '>' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Greater', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '>=' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_GreaterEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '<=' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_LessEqual', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'not in' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_NotIn', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'in' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_In', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'matches' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_Matches', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'starts with' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_StartsWith', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'ends with' => array('precedence' => 20, 'class' => 'Twig_Node_Expression_Binary_EndsWith', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '..' => array('precedence' => 25, 'class' => 'Twig_Node_Expression_Binary_Range', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '+' => array('precedence' => 30, 'class' => 'Twig_Node_Expression_Binary_Add', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '-' => array('precedence' => 30, 'class' => 'Twig_Node_Expression_Binary_Sub', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '~' => array('precedence' => 40, 'class' => 'Twig_Node_Expression_Binary_Concat', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '*' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mul', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '/' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Div', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '//' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_FloorDiv', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '%' => array('precedence' => 60, 'class' => 'Twig_Node_Expression_Binary_Mod', 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'is' => array('precedence' => 100, 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                'is not' => array('precedence' => 100, 'associativity' => Twig_ExpressionParser::OPERATOR_LEFT),
-                '**' => array('precedence' => 200, 'class' => 'Twig_Node_Expression_Binary_Power', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT),
-                '??' => array('precedence' => 300, 'class' => 'Twig_Node_Expression_NullCoalesce', 'associativity' => Twig_ExpressionParser::OPERATOR_RIGHT),
-            ),
-        );
-    }
+@trigger_error(sprintf('Using the "Twig_Extension_Core" class is deprecated since Twig version 2.7, use "Twig\Extension\CoreExtension" instead.'), E_USER_DEPRECATED);
 
-    public function getName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\CoreExtension" instead */
+    class Twig_Extension_Core extends CoreExtension
     {
-        return 'core';
-    }
-}
-
-/**
- * Cycles over a value.
- *
- * @param ArrayAccess|array $values
- * @param int               $position The cycle position
- *
- * @return string The next value in the cycle
- */
-function twig_cycle($values, $position)
-{
-    if (!is_array($values) && !$values instanceof ArrayAccess) {
-        return $values;
-    }
-
-    return $values[$position % count($values)];
-}
-
-/**
- * Returns a random value depending on the supplied parameter type:
- * - a random item from a Traversable or array
- * - a random character from a string
- * - a random integer between 0 and the integer parameter.
- *
- * @param Twig_Environment                   $env
- * @param Traversable|array|int|float|string $values The values to pick a random item from
- *
- * @throws Twig_Error_Runtime when $values is an empty array (does not apply to an empty string which is returned as is)
- *
- * @return mixed A random value from the given sequence
- */
-function twig_random(Twig_Environment $env, $values = null)
-{
-    if (null === $values) {
-        return mt_rand();
-    }
-
-    if (is_int($values) || is_float($values)) {
-        return $values < 0 ? mt_rand($values, 0) : mt_rand(0, $values);
-    }
-
-    if ($values instanceof Traversable) {
-        $values = iterator_to_array($values);
-    } elseif (is_string($values)) {
-        if ('' === $values) {
-            return '';
-        }
-        if (null !== $charset = $env->getCharset()) {
-            if ('UTF-8' !== $charset) {
-                $values = twig_convert_encoding($values, 'UTF-8', $charset);
-            }
-
-            // unicode version of str_split()
-            // split at all positions, but not after the start and not before the end
-            $values = preg_split('/(?<!^)(?!$)/u', $values);
-
-            if ('UTF-8' !== $charset) {
-                foreach ($values as $i => $value) {
-                    $values[$i] = twig_convert_encoding($value, $charset, 'UTF-8');
-                }
-            }
-        } else {
-            return $values[mt_rand(0, strlen($values) - 1)];
-        }
-    }
-
-    if (!is_array($values)) {
-        return $values;
-    }
-
-    if (0 === count($values)) {
-        throw new Twig_Error_Runtime('The random function cannot pick from an empty array.');
-    }
-
-    return $values[array_rand($values, 1)];
-}
-
-/**
- * Converts a date to the given format.
- *
- * <pre>
- *   {{ post.published_at|date("m/d/Y") }}
- * </pre>
- *
- * @param Twig_Environment                               $env
- * @param DateTime|DateTimeInterface|DateInterval|string $date     A date
- * @param string|null                                    $format   The target format, null to use the default
- * @param DateTimeZone|string|null|false                 $timezone The target timezone, null to use the default, false to leave unchanged
- *
- * @return string The formatted date
- */
-function twig_date_format_filter(Twig_Environment $env, $date, $format = null, $timezone = null)
-{
-    if (null === $format) {
-        $formats = $env->getExtension('Twig_Extension_Core')->getDateFormat();
-        $format = $date instanceof DateInterval ? $formats[1] : $formats[0];
-    }
-
-    if ($date instanceof DateInterval) {
-        return $date->format($format);
-    }
-
-    return twig_date_converter($env, $date, $timezone)->format($format);
-}
-
-/**
- * Returns a new date object modified.
- *
- * <pre>
- *   {{ post.published_at|date_modify("-1day")|date("m/d/Y") }}
- * </pre>
- *
- * @param Twig_Environment $env
- * @param DateTime|string  $date     A date
- * @param string           $modifier A modifier string
- *
- * @return DateTime A new date object
- */
-function twig_date_modify_filter(Twig_Environment $env, $date, $modifier)
-{
-    $date = twig_date_converter($env, $date, false);
-    $resultDate = $date->modify($modifier);
-
-    // This is a hack to ensure PHP 5.2 support and support for DateTimeImmutable
-    // DateTime::modify does not return the modified DateTime object < 5.3.0
-    // and DateTimeImmutable does not modify $date.
-    return null === $resultDate ? $date : $resultDate;
-}
-
-/**
- * Converts an input to a DateTime instance.
- *
- * <pre>
- *    {% if date(user.created_at) < date('+2days') %}
- *      {# do something #}
- *    {% endif %}
- * </pre>
- *
- * @param Twig_Environment                       $env
- * @param DateTime|DateTimeInterface|string|null $date     A date
- * @param DateTimeZone|string|null|false         $timezone The target timezone, null to use the default, false to leave unchanged
- *
- * @return DateTime A DateTime instance
- */
-function twig_date_converter(Twig_Environment $env, $date = null, $timezone = null)
-{
-    // determine the timezone
-    if (false !== $timezone) {
-        if (null === $timezone) {
-            $timezone = $env->getExtension('Twig_Extension_Core')->getTimezone();
-        } elseif (!$timezone instanceof DateTimeZone) {
-            $timezone = new DateTimeZone($timezone);
-        }
     }
-
-    // immutable dates
-    if ($date instanceof DateTimeImmutable) {
-        return false !== $timezone ? $date->setTimezone($timezone) : $date;
-    }
-
-    if ($date instanceof DateTime || $date instanceof DateTimeInterface) {
-        $date = clone $date;
-        if (false !== $timezone) {
-            $date->setTimezone($timezone);
-        }
-
-        return $date;
-    }
-
-    if (null === $date || 'now' === $date) {
-        return new DateTime($date, false !== $timezone ? $timezone : $env->getExtension('Twig_Extension_Core')->getTimezone());
-    }
-
-    $asString = (string) $date;
-    if (ctype_digit($asString) || (!empty($asString) && '-' === $asString[0] && ctype_digit(substr($asString, 1)))) {
-        $date = new DateTime('@'.$date);
-    } else {
-        $date = new DateTime($date, $env->getExtension('Twig_Extension_Core')->getTimezone());
-    }
-
-    if (false !== $timezone) {
-        $date->setTimezone($timezone);
-    }
-
-    return $date;
 }
-
-/**
- * Replaces strings within a string.
- *
- * @param string            $str  String to replace in
- * @param array|Traversable $from Replace values
- * @param string|null       $to   Replace to, deprecated (@see http://php.net/manual/en/function.strtr.php)
- *
- * @return string
- */
-function twig_replace_filter($str, $from, $to = null)
-{
-    if ($from instanceof Traversable) {
-        $from = iterator_to_array($from);
-    } elseif (is_string($from) && is_string($to)) {
-        @trigger_error('Using "replace" with character by character replacement is deprecated since version 1.22 and will be removed in Twig 2.0', E_USER_DEPRECATED);
-
-        return strtr($str, $from, $to);
-    } elseif (!is_array($from)) {
-        throw new Twig_Error_Runtime(sprintf('The "replace" filter expects an array or "Traversable" as replace values, got "%s".', is_object($from) ? get_class($from) : gettype($from)));
-    }
-
-    return strtr($str, $from);
-}
-
-/**
- * Rounds a number.
- *
- * @param int|float $value     The value to round
- * @param int|float $precision The rounding precision
- * @param string    $method    The method to use for rounding
- *
- * @return int|float The rounded number
- */
-function twig_round($value, $precision = 0, $method = 'common')
-{
-    if ('common' == $method) {
-        return round($value, $precision);
-    }
-
-    if ('ceil' != $method && 'floor' != $method) {
-        throw new Twig_Error_Runtime('The round filter only supports the "common", "ceil", and "floor" methods.');
-    }
-
-    return $method($value * pow(10, $precision)) / pow(10, $precision);
-}
-
-/**
- * Number format filter.
- *
- * All of the formatting options can be left null, in that case the defaults will
- * be used.  Supplying any of the parameters will override the defaults set in the
- * environment object.
- *
- * @param Twig_Environment $env
- * @param mixed            $number       A float/int/string of the number to format
- * @param int              $decimal      the number of decimal points to display
- * @param string           $decimalPoint the character(s) to use for the decimal point
- * @param string           $thousandSep  the character(s) to use for the thousands separator
- *
- * @return string The formatted number
- */
-function twig_number_format_filter(Twig_Environment $env, $number, $decimal = null, $decimalPoint = null, $thousandSep = null)
-{
-    $defaults = $env->getExtension('Twig_Extension_Core')->getNumberFormat();
-    if (null === $decimal) {
-        $decimal = $defaults[0];
-    }
-
-    if (null === $decimalPoint) {
-        $decimalPoint = $defaults[1];
-    }
-
-    if (null === $thousandSep) {
-        $thousandSep = $defaults[2];
-    }
-
-    return number_format((float) $number, $decimal, $decimalPoint, $thousandSep);
-}
-
-/**
- * URL encodes (RFC 3986) a string as a path segment or an array as a query string.
- *
- * @param string|array $url A URL or an array of query parameters
- *
- * @return string The URL encoded value
- */
-function twig_urlencode_filter($url)
-{
-    if (is_array($url)) {
-        if (defined('PHP_QUERY_RFC3986')) {
-            return http_build_query($url, '', '&', PHP_QUERY_RFC3986);
-        }
-
-        return http_build_query($url, '', '&');
-    }
-
-    return rawurlencode($url);
-}
-
-if (PHP_VERSION_ID < 50300) {
-    /**
-     * JSON encodes a variable.
-     *
-     * @param mixed $value   the value to encode
-     * @param int   $options Not used on PHP 5.2.x
-     *
-     * @return mixed The JSON encoded value
-     */
-    function twig_jsonencode_filter($value, $options = 0)
-    {
-        if ($value instanceof Twig_Markup) {
-            $value = (string) $value;
-        } elseif (is_array($value)) {
-            array_walk_recursive($value, '_twig_markup2string');
-        }
-
-        return json_encode($value);
-    }
-} else {
-    /**
-     * JSON encodes a variable.
-     *
-     * @param mixed $value   the value to encode
-     * @param int   $options Bitmask consisting of JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT
-     *
-     * @return mixed The JSON encoded value
-     */
-    function twig_jsonencode_filter($value, $options = 0)
-    {
-        if ($value instanceof Twig_Markup) {
-            $value = (string) $value;
-        } elseif (is_array($value)) {
-            array_walk_recursive($value, '_twig_markup2string');
-        }
-
-        return json_encode($value, $options);
-    }
-}
-
-function _twig_markup2string(&$value)
-{
-    if ($value instanceof Twig_Markup) {
-        $value = (string) $value;
-    }
-}
-
-/**
- * Merges an array with another one.
- *
- * <pre>
- *  {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %}
- *
- *  {% set items = items|merge({ 'peugeot': 'car' }) %}
- *
- *  {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car' } #}
- * </pre>
- *
- * @param array|Traversable $arr1 An array
- * @param array|Traversable $arr2 An array
- *
- * @return array The merged array
- */
-function twig_array_merge($arr1, $arr2)
-{
-    if ($arr1 instanceof Traversable) {
-        $arr1 = iterator_to_array($arr1);
-    } elseif (!is_array($arr1)) {
-        throw new Twig_Error_Runtime(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as first argument.', gettype($arr1)));
-    }
-
-    if ($arr2 instanceof Traversable) {
-        $arr2 = iterator_to_array($arr2);
-    } elseif (!is_array($arr2)) {
-        throw new Twig_Error_Runtime(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as second argument.', gettype($arr2)));
-    }
-
-    return array_merge($arr1, $arr2);
-}
-
-/**
- * Slices a variable.
- *
- * @param Twig_Environment $env
- * @param mixed            $item         A variable
- * @param int              $start        Start of the slice
- * @param int              $length       Size of the slice
- * @param bool             $preserveKeys Whether to preserve key or not (when the input is an array)
- *
- * @return mixed The sliced variable
- */
-function twig_slice(Twig_Environment $env, $item, $start, $length = null, $preserveKeys = false)
-{
-    if ($item instanceof Traversable) {
-        while ($item instanceof IteratorAggregate) {
-            $item = $item->getIterator();
-        }
-
-        if ($start >= 0 && $length >= 0 && $item instanceof Iterator) {
-            try {
-                return iterator_to_array(new LimitIterator($item, $start, $length === null ? -1 : $length), $preserveKeys);
-            } catch (OutOfBoundsException $exception) {
-                return array();
-            }
-        }
-
-        $item = iterator_to_array($item, $preserveKeys);
-    }
-
-    if (is_array($item)) {
-        return array_slice($item, $start, $length, $preserveKeys);
-    }
-
-    $item = (string) $item;
-
-    if (function_exists('mb_get_info') && null !== $charset = $env->getCharset()) {
-        return (string) mb_substr($item, $start, null === $length ? mb_strlen($item, $charset) - $start : $length, $charset);
-    }
-
-    return (string) (null === $length ? substr($item, $start) : substr($item, $start, $length));
-}
-
-/**
- * Returns the first element of the item.
- *
- * @param Twig_Environment $env
- * @param mixed            $item A variable
- *
- * @return mixed The first element of the item
- */
-function twig_first(Twig_Environment $env, $item)
-{
-    $elements = twig_slice($env, $item, 0, 1, false);
-
-    return is_string($elements) ? $elements : current($elements);
-}
-
-/**
- * Returns the last element of the item.
- *
- * @param Twig_Environment $env
- * @param mixed            $item A variable
- *
- * @return mixed The last element of the item
- */
-function twig_last(Twig_Environment $env, $item)
-{
-    $elements = twig_slice($env, $item, -1, 1, false);
-
-    return is_string($elements) ? $elements : current($elements);
-}
-
-/**
- * Joins the values to a string.
- *
- * The separator between elements is an empty string per default, you can define it with the optional parameter.
- *
- * <pre>
- *  {{ [1, 2, 3]|join('|') }}
- *  {# returns 1|2|3 #}
- *
- *  {{ [1, 2, 3]|join }}
- *  {# returns 123 #}
- * </pre>
- *
- * @param array  $value An array
- * @param string $glue  The separator
- *
- * @return string The concatenated string
- */
-function twig_join_filter($value, $glue = '')
-{
-    if ($value instanceof Traversable) {
-        $value = iterator_to_array($value, false);
-    }
-
-    return implode($glue, (array) $value);
-}
-
-/**
- * Splits the string into an array.
- *
- * <pre>
- *  {{ "one,two,three"|split(',') }}
- *  {# returns [one, two, three] #}
- *
- *  {{ "one,two,three,four,five"|split(',', 3) }}
- *  {# returns [one, two, "three,four,five"] #}
- *
- *  {{ "123"|split('') }}
- *  {# returns [1, 2, 3] #}
- *
- *  {{ "aabbcc"|split('', 2) }}
- *  {# returns [aa, bb, cc] #}
- * </pre>
- *
- * @param Twig_Environment $env
- * @param string           $value     A string
- * @param string           $delimiter The delimiter
- * @param int              $limit     The limit
- *
- * @return array The split string as an array
- */
-function twig_split_filter(Twig_Environment $env, $value, $delimiter, $limit = null)
-{
-    if (!empty($delimiter)) {
-        return null === $limit ? explode($delimiter, $value) : explode($delimiter, $value, $limit);
-    }
-
-    if (!function_exists('mb_get_info') || null === $charset = $env->getCharset()) {
-        return str_split($value, null === $limit ? 1 : $limit);
-    }
-
-    if ($limit <= 1) {
-        return preg_split('/(?<!^)(?!$)/u', $value);
-    }
-
-    $length = mb_strlen($value, $charset);
-    if ($length < $limit) {
-        return array($value);
-    }
-
-    $r = array();
-    for ($i = 0; $i < $length; $i += $limit) {
-        $r[] = mb_substr($value, $i, $limit, $charset);
-    }
-
-    return $r;
-}
-
-// The '_default' filter is used internally to avoid using the ternary operator
-// which costs a lot for big contexts (before PHP 5.4). So, on average,
-// a function call is cheaper.
-/**
- * @internal
- */
-function _twig_default_filter($value, $default = '')
-{
-    if (twig_test_empty($value)) {
-        return $default;
-    }
-
-    return $value;
-}
-
-/**
- * Returns the keys for the given array.
- *
- * It is useful when you want to iterate over the keys of an array:
- *
- * <pre>
- *  {% for key in array|keys %}
- *      {# ... #}
- *  {% endfor %}
- * </pre>
- *
- * @param array $array An array
- *
- * @return array The keys
- */
-function twig_get_array_keys_filter($array)
-{
-    if ($array instanceof Traversable) {
-        while ($array instanceof IteratorAggregate) {
-            $array = $array->getIterator();
-        }
-
-        if ($array instanceof Iterator) {
-            $keys = array();
-            $array->rewind();
-            while ($array->valid()) {
-                $keys[] = $array->key();
-                $array->next();
-            }
-
-            return $keys;
-        }
-
-        $keys = array();
-        foreach ($array as $key => $item) {
-            $keys[] = $key;
-        }
-
-        return $keys;
-    }
-
-    if (!is_array($array)) {
-        return array();
-    }
-
-    return array_keys($array);
-}
-
-/**
- * Reverses a variable.
- *
- * @param Twig_Environment         $env
- * @param array|Traversable|string $item         An array, a Traversable instance, or a string
- * @param bool                     $preserveKeys Whether to preserve key or not
- *
- * @return mixed The reversed input
- */
-function twig_reverse_filter(Twig_Environment $env, $item, $preserveKeys = false)
-{
-    if ($item instanceof Traversable) {
-        return array_reverse(iterator_to_array($item), $preserveKeys);
-    }
-
-    if (is_array($item)) {
-        return array_reverse($item, $preserveKeys);
-    }
-
-    if (null !== $charset = $env->getCharset()) {
-        $string = (string) $item;
-
-        if ('UTF-8' !== $charset) {
-            $item = twig_convert_encoding($string, 'UTF-8', $charset);
-        }
-
-        preg_match_all('/./us', $item, $matches);
-
-        $string = implode('', array_reverse($matches[0]));
-
-        if ('UTF-8' !== $charset) {
-            $string = twig_convert_encoding($string, $charset, 'UTF-8');
-        }
-
-        return $string;
-    }
-
-    return strrev((string) $item);
-}
-
-/**
- * Sorts an array.
- *
- * @param array|Traversable $array
- *
- * @return array
- */
-function twig_sort_filter($array)
-{
-    if ($array instanceof Traversable) {
-        $array = iterator_to_array($array);
-    } elseif (!is_array($array)) {
-        throw new Twig_Error_Runtime(sprintf('The sort filter only works with arrays or "Traversable", got "%s".', gettype($array)));
-    }
-
-    asort($array);
-
-    return $array;
-}
-
-/**
- * @internal
- */
-function twig_in_filter($value, $compare)
-{
-    if (is_array($compare)) {
-        return in_array($value, $compare, is_object($value) || is_resource($value));
-    } elseif (is_string($compare) && (is_string($value) || is_int($value) || is_float($value))) {
-        return '' === $value || false !== strpos($compare, (string) $value);
-    } elseif ($compare instanceof Traversable) {
-        if (is_object($value) || is_resource($value)) {
-            foreach ($compare as $item) {
-                if ($item === $value) {
-                    return true;
-                }
-            }
-        } else {
-            foreach ($compare as $item) {
-                if ($item == $value) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    return false;
-}
-
-/**
- * Returns a trimmed string.
- *
- * @return string
- *
- * @throws Twig_Error_Runtime When an invalid trimming side is used (not a string or not 'left', 'right', or 'both')
- */
-function twig_trim_filter($string, $characterMask = null, $side = 'both')
-{
-    if (null === $characterMask) {
-        $characterMask = " \t\n\r\0\x0B";
-    }
-
-    switch ($side) {
-        case 'both':
-            return trim($string, $characterMask);
-        case 'left':
-            return ltrim($string, $characterMask);
-        case 'right':
-            return rtrim($string, $characterMask);
-        default:
-            throw new Twig_Error_Runtime('Trimming side must be "left", "right" or "both".');
-    }
-}
-
-/**
- * Escapes a string.
- *
- * @param Twig_Environment $env
- * @param mixed            $string     The value to be escaped
- * @param string           $strategy   The escaping strategy
- * @param string           $charset    The charset
- * @param bool             $autoescape Whether the function is called by the auto-escaping feature (true) or by the developer (false)
- *
- * @return string
- */
-function twig_escape_filter(Twig_Environment $env, $string, $strategy = 'html', $charset = null, $autoescape = false)
-{
-    if ($autoescape && $string instanceof Twig_Markup) {
-        return $string;
-    }
-
-    if (!is_string($string)) {
-        if (is_object($string) && method_exists($string, '__toString')) {
-            $string = (string) $string;
-        } elseif (in_array($strategy, array('html', 'js', 'css', 'html_attr', 'url'))) {
-            return $string;
-        }
-    }
-
-    if (null === $charset) {
-        $charset = $env->getCharset();
-    }
-
-    switch ($strategy) {
-        case 'html':
-            // see http://php.net/htmlspecialchars
-
-            // Using a static variable to avoid initializing the array
-            // each time the function is called. Moving the declaration on the
-            // top of the function slow downs other escaping strategies.
-            static $htmlspecialcharsCharsets = array(
-                'ISO-8859-1' => true, 'ISO8859-1' => true,
-                'ISO-8859-15' => true, 'ISO8859-15' => true,
-                'utf-8' => true, 'UTF-8' => true,
-                'CP866' => true, 'IBM866' => true, '866' => true,
-                'CP1251' => true, 'WINDOWS-1251' => true, 'WIN-1251' => true,
-                '1251' => true,
-                'CP1252' => true, 'WINDOWS-1252' => true, '1252' => true,
-                'KOI8-R' => true, 'KOI8-RU' => true, 'KOI8R' => true,
-                'BIG5' => true, '950' => true,
-                'GB2312' => true, '936' => true,
-                'BIG5-HKSCS' => true,
-                'SHIFT_JIS' => true, 'SJIS' => true, '932' => true,
-                'EUC-JP' => true, 'EUCJP' => true,
-                'ISO8859-5' => true, 'ISO-8859-5' => true, 'MACROMAN' => true,
-            );
-
-            if (isset($htmlspecialcharsCharsets[$charset])) {
-                return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
-            }
-
-            if (isset($htmlspecialcharsCharsets[strtoupper($charset)])) {
-                // cache the lowercase variant for future iterations
-                $htmlspecialcharsCharsets[$charset] = true;
-
-                return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
-            }
-
-            $string = twig_convert_encoding($string, 'UTF-8', $charset);
-            $string = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
-
-            return twig_convert_encoding($string, $charset, 'UTF-8');
-
-        case 'js':
-            // escape all non-alphanumeric characters
-            // into their \xHH or \uHHHH representations
-            if ('UTF-8' !== $charset) {
-                $string = twig_convert_encoding($string, 'UTF-8', $charset);
-            }
-
-            if (0 == strlen($string) ? false : 1 !== preg_match('/^./su', $string)) {
-                throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');
-            }
-
-            $string = preg_replace_callback('#[^a-zA-Z0-9,\._]#Su', '_twig_escape_js_callback', $string);
-
-            if ('UTF-8' !== $charset) {
-                $string = twig_convert_encoding($string, $charset, 'UTF-8');
-            }
-
-            return $string;
-
-        case 'css':
-            if ('UTF-8' !== $charset) {
-                $string = twig_convert_encoding($string, 'UTF-8', $charset);
-            }
-
-            if (0 == strlen($string) ? false : 1 !== preg_match('/^./su', $string)) {
-                throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');
-            }
-
-            $string = preg_replace_callback('#[^a-zA-Z0-9]#Su', '_twig_escape_css_callback', $string);
-
-            if ('UTF-8' !== $charset) {
-                $string = twig_convert_encoding($string, $charset, 'UTF-8');
-            }
-
-            return $string;
-
-        case 'html_attr':
-            if ('UTF-8' !== $charset) {
-                $string = twig_convert_encoding($string, 'UTF-8', $charset);
-            }
-
-            if (0 == strlen($string) ? false : 1 !== preg_match('/^./su', $string)) {
-                throw new Twig_Error_Runtime('The string to escape is not a valid UTF-8 string.');
-            }
-
-            $string = preg_replace_callback('#[^a-zA-Z0-9,\.\-_]#Su', '_twig_escape_html_attr_callback', $string);
-
-            if ('UTF-8' !== $charset) {
-                $string = twig_convert_encoding($string, $charset, 'UTF-8');
-            }
-
-            return $string;
-
-        case 'url':
-            if (PHP_VERSION_ID < 50300) {
-                return str_replace('%7E', '~', rawurlencode($string));
-            }
-
-            return rawurlencode($string);
-
-        default:
-            static $escapers;
-
-            if (null === $escapers) {
-                $escapers = $env->getExtension('Twig_Extension_Core')->getEscapers();
-            }
-
-            if (isset($escapers[$strategy])) {
-                return call_user_func($escapers[$strategy], $env, $string, $charset);
-            }
-
-            $validStrategies = implode(', ', array_merge(array('html', 'js', 'url', 'css', 'html_attr'), array_keys($escapers)));
-
-            throw new Twig_Error_Runtime(sprintf('Invalid escaping strategy "%s" (valid ones: %s).', $strategy, $validStrategies));
-    }
-}
-
-/**
- * @internal
- */
-function twig_escape_filter_is_safe(Twig_Node $filterArgs)
-{
-    foreach ($filterArgs as $arg) {
-        if ($arg instanceof Twig_Node_Expression_Constant) {
-            return array($arg->getAttribute('value'));
-        }
-
-        return array();
-    }
-
-    return array('html');
-}
-
-if (function_exists('mb_convert_encoding')) {
-    function twig_convert_encoding($string, $to, $from)
-    {
-        return mb_convert_encoding($string, $to, $from);
-    }
-} elseif (function_exists('iconv')) {
-    function twig_convert_encoding($string, $to, $from)
-    {
-        return iconv($from, $to, $string);
-    }
-} else {
-    function twig_convert_encoding($string, $to, $from)
-    {
-        throw new Twig_Error_Runtime('No suitable convert encoding function (use UTF-8 as your encoding or install the iconv or mbstring extension).');
-    }
-}
-
-function _twig_escape_js_callback($matches)
-{
-    $char = $matches[0];
-
-    // \xHH
-    if (!isset($char[1])) {
-        return '\\x'.strtoupper(substr('00'.bin2hex($char), -2));
-    }
-
-    // \uHHHH
-    $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8');
-    $char = strtoupper(bin2hex($char));
-
-    if (4 >= strlen($char)) {
-        return sprintf('\u%04s', $char);
-    }
-
-    return sprintf('\u%04s\u%04s', substr($char, 0, -4), substr($char, -4));
-}
-
-function _twig_escape_css_callback($matches)
-{
-    $char = $matches[0];
-
-    // \xHH
-    if (!isset($char[1])) {
-        $hex = ltrim(strtoupper(bin2hex($char)), '0');
-        if (0 === strlen($hex)) {
-            $hex = '0';
-        }
-
-        return '\\'.$hex.' ';
-    }
-
-    // \uHHHH
-    $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8');
-
-    return '\\'.ltrim(strtoupper(bin2hex($char)), '0').' ';
-}
-
-/**
- * This function is adapted from code coming from Zend Framework.
- *
- * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
- * @license   http://framework.zend.com/license/new-bsd New BSD License
- */
-function _twig_escape_html_attr_callback($matches)
-{
-    /*
-     * While HTML supports far more named entities, the lowest common denominator
-     * has become HTML5's XML Serialisation which is restricted to the those named
-     * entities that XML supports. Using HTML entities would result in this error:
-     *     XML Parsing Error: undefined entity
-     */
-    static $entityMap = array(
-        34 => 'quot', /* quotation mark */
-        38 => 'amp',  /* ampersand */
-        60 => 'lt',   /* less-than sign */
-        62 => 'gt',   /* greater-than sign */
-    );
-
-    $chr = $matches[0];
-    $ord = ord($chr);
-
-    /*
-     * The following replaces characters undefined in HTML with the
-     * hex entity for the Unicode replacement character.
-     */
-    if (($ord <= 0x1f && $chr != "\t" && $chr != "\n" && $chr != "\r") || ($ord >= 0x7f && $ord <= 0x9f)) {
-        return '&#xFFFD;';
-    }
-
-    /*
-     * Check if the current character to escape has a name entity we should
-     * replace it with while grabbing the hex value of the character.
-     */
-    if (strlen($chr) == 1) {
-        $hex = strtoupper(substr('00'.bin2hex($chr), -2));
-    } else {
-        $chr = twig_convert_encoding($chr, 'UTF-16BE', 'UTF-8');
-        $hex = strtoupper(substr('0000'.bin2hex($chr), -4));
-    }
-
-    $int = hexdec($hex);
-    if (array_key_exists($int, $entityMap)) {
-        return sprintf('&%s;', $entityMap[$int]);
-    }
-
-    /*
-     * Per OWASP recommendations, we'll use hex entities for any other
-     * characters where a named entity does not exist.
-     */
-    return sprintf('&#x%s;', $hex);
-}
-
-// add multibyte extensions if possible
-if (function_exists('mb_get_info')) {
-    /**
-     * Returns the length of a variable.
-     *
-     * @param Twig_Environment $env
-     * @param mixed            $thing A variable
-     *
-     * @return int The length of the value
-     */
-    function twig_length_filter(Twig_Environment $env, $thing)
-    {
-        if (null === $thing) {
-            return 0;
-        }
-
-        if (is_scalar($thing)) {
-            return mb_strlen($thing, $env->getCharset());
-        }
-
-        if (is_object($thing) && method_exists($thing, '__toString') && !$thing instanceof \Countable) {
-            return mb_strlen((string) $thing, $env->getCharset());
-        }
-
-        if ($thing instanceof \Countable || is_array($thing)) {
-            return count($thing);
-        }
-
-        return 1;
-    }
-
-    /**
-     * Converts a string to uppercase.
-     *
-     * @param Twig_Environment $env
-     * @param string           $string A string
-     *
-     * @return string The uppercased string
-     */
-    function twig_upper_filter(Twig_Environment $env, $string)
-    {
-        if (null !== $charset = $env->getCharset()) {
-            return mb_strtoupper($string, $charset);
-        }
-
-        return strtoupper($string);
-    }
-
-    /**
-     * Converts a string to lowercase.
-     *
-     * @param Twig_Environment $env
-     * @param string           $string A string
-     *
-     * @return string The lowercased string
-     */
-    function twig_lower_filter(Twig_Environment $env, $string)
-    {
-        if (null !== $charset = $env->getCharset()) {
-            return mb_strtolower($string, $charset);
-        }
-
-        return strtolower($string);
-    }
-
-    /**
-     * Returns a titlecased string.
-     *
-     * @param Twig_Environment $env
-     * @param string           $string A string
-     *
-     * @return string The titlecased string
-     */
-    function twig_title_string_filter(Twig_Environment $env, $string)
-    {
-        if (null !== $charset = $env->getCharset()) {
-            return mb_convert_case($string, MB_CASE_TITLE, $charset);
-        }
-
-        return ucwords(strtolower($string));
-    }
-
-    /**
-     * Returns a capitalized string.
-     *
-     * @param Twig_Environment $env
-     * @param string           $string A string
-     *
-     * @return string The capitalized string
-     */
-    function twig_capitalize_string_filter(Twig_Environment $env, $string)
-    {
-        if (null !== $charset = $env->getCharset()) {
-            return mb_strtoupper(mb_substr($string, 0, 1, $charset), $charset).mb_strtolower(mb_substr($string, 1, mb_strlen($string, $charset), $charset), $charset);
-        }
-
-        return ucfirst(strtolower($string));
-    }
-}
-// and byte fallback
-else {
-    /**
-     * Returns the length of a variable.
-     *
-     * @param Twig_Environment $env
-     * @param mixed            $thing A variable
-     *
-     * @return int The length of the value
-     */
-    function twig_length_filter(Twig_Environment $env, $thing)
-    {
-        if (null === $thing) {
-            return 0;
-        }
-
-        if (is_scalar($thing)) {
-            return strlen($thing);
-        }
-
-        if (is_object($thing) && method_exists($thing, '__toString') && !$thing instanceof \Countable) {
-            return strlen((string) $thing);
-        }
-
-        if ($thing instanceof \Countable || is_array($thing)) {
-            return count($thing);
-        }
-
-        return 1;
-    }
-
-    /**
-     * Returns a titlecased string.
-     *
-     * @param Twig_Environment $env
-     * @param string           $string A string
-     *
-     * @return string The titlecased string
-     */
-    function twig_title_string_filter(Twig_Environment $env, $string)
-    {
-        return ucwords(strtolower($string));
-    }
-
-    /**
-     * Returns a capitalized string.
-     *
-     * @param Twig_Environment $env
-     * @param string           $string A string
-     *
-     * @return string The capitalized string
-     */
-    function twig_capitalize_string_filter(Twig_Environment $env, $string)
-    {
-        return ucfirst(strtolower($string));
-    }
-}
-
-/**
- * @internal
- */
-function twig_ensure_traversable($seq)
-{
-    if ($seq instanceof Traversable || is_array($seq)) {
-        return $seq;
-    }
-
-    return array();
-}
-
-/**
- * Checks if a variable is empty.
- *
- * <pre>
- * {# evaluates to true if the foo variable is null, false, or the empty string #}
- * {% if foo is empty %}
- *     {# ... #}
- * {% endif %}
- * </pre>
- *
- * @param mixed $value A variable
- *
- * @return bool true if the value is empty, false otherwise
- */
-function twig_test_empty($value)
-{
-    if ($value instanceof Countable) {
-        return 0 == count($value);
-    }
-
-    if (is_object($value) && method_exists($value, '__toString')) {
-        return '' === (string) $value;
-    }
-
-    return '' === $value || false === $value || null === $value || array() === $value;
-}
-
-/**
- * Checks if a variable is traversable.
- *
- * <pre>
- * {# evaluates to true if the foo variable is an array or a traversable object #}
- * {% if foo is traversable %}
- *     {# ... #}
- * {% endif %}
- * </pre>
- *
- * @param mixed $value A variable
- *
- * @return bool true if the value is traversable
- */
-function twig_test_iterable($value)
-{
-    return $value instanceof Traversable || is_array($value);
-}
-
-/**
- * Renders a template.
- *
- * @param Twig_Environment $env
- * @param array            $context
- * @param string|array     $template      The template to render or an array of templates to try consecutively
- * @param array            $variables     The variables to pass to the template
- * @param bool             $withContext
- * @param bool             $ignoreMissing Whether to ignore missing templates or not
- * @param bool             $sandboxed     Whether to sandbox the template or not
- *
- * @return string The rendered template
- */
-function twig_include(Twig_Environment $env, $context, $template, $variables = array(), $withContext = true, $ignoreMissing = false, $sandboxed = false)
-{
-    $alreadySandboxed = false;
-    $sandbox = null;
-    if ($withContext) {
-        $variables = array_merge($context, $variables);
-    }
-
-    if ($isSandboxed = $sandboxed && $env->hasExtension('Twig_Extension_Sandbox')) {
-        $sandbox = $env->getExtension('Twig_Extension_Sandbox');
-        if (!$alreadySandboxed = $sandbox->isSandboxed()) {
-            $sandbox->enableSandbox();
-        }
-    }
-
-    $result = null;
-    try {
-        $result = $env->resolveTemplate($template)->render($variables);
-    } catch (Twig_Error_Loader $e) {
-        if (!$ignoreMissing) {
-            if ($isSandboxed && !$alreadySandboxed) {
-                $sandbox->disableSandbox();
-            }
-
-            throw $e;
-        }
-    } catch (Throwable $e) {
-        if ($isSandboxed && !$alreadySandboxed) {
-            $sandbox->disableSandbox();
-        }
-
-        throw $e;
-    } catch (Exception $e) {
-        if ($isSandboxed && !$alreadySandboxed) {
-            $sandbox->disableSandbox();
-        }
-
-        throw $e;
-    }
-
-    if ($isSandboxed && !$alreadySandboxed) {
-        $sandbox->disableSandbox();
-    }
-
-    return $result;
-}
-
-/**
- * Returns a template content without rendering it.
- *
- * @param Twig_Environment $env
- * @param string           $name          The template name
- * @param bool             $ignoreMissing Whether to ignore missing templates or not
- *
- * @return string The template source
- */
-function twig_source(Twig_Environment $env, $name, $ignoreMissing = false)
-{
-    $loader = $env->getLoader();
-    try {
-        if (!$loader instanceof Twig_SourceContextLoaderInterface) {
-            return $loader->getSource($name);
-        } else {
-            return $loader->getSourceContext($name)->getCode();
-        }
-    } catch (Twig_Error_Loader $e) {
-        if (!$ignoreMissing) {
-            throw $e;
-        }
-    }
-}
-
-/**
- * Provides the ability to get constants from instances as well as class/global constants.
- *
- * @param string      $constant The name of the constant
- * @param null|object $object   The object to get the constant from
- *
- * @return string
- */
-function twig_constant($constant, $object = null)
-{
-    if (null !== $object) {
-        $constant = get_class($object).'::'.$constant;
-    }
-
-    return constant($constant);
-}
-
-/**
- * Checks if a constant exists.
- *
- * @param string      $constant The name of the constant
- * @param null|object $object   The object to get the constant from
- *
- * @return bool
- */
-function twig_constant_is_defined($constant, $object = null)
-{
-    if (null !== $object) {
-        $constant = get_class($object).'::'.$constant;
-    }
-
-    return defined($constant);
-}
-
-/**
- * Batches item.
- *
- * @param array $items An array of items
- * @param int   $size  The size of the batch
- * @param mixed $fill  A value used to fill missing items
- *
- * @return array
- */
-function twig_array_batch($items, $size, $fill = null)
-{
-    if ($items instanceof Traversable) {
-        $items = iterator_to_array($items, false);
-    }
-
-    $size = ceil($size);
-
-    $result = array_chunk($items, $size, true);
-
-    if (null !== $fill && !empty($result)) {
-        $last = count($result) - 1;
-        if ($fillCount = $size - count($result[$last])) {
-            $result[$last] = array_merge(
-                $result[$last],
-                array_fill(0, $fillCount, $fill)
-            );
-        }
-    }
-
-    return $result;
-}
-
-class_alias('Twig_Extension_Core', 'Twig\Extension\CoreExtension', false);
diff --git a/vendor/twig/twig/lib/Twig/Extension/Debug.php b/vendor/twig/twig/lib/Twig/Extension/Debug.php
index d0cd1962..deee0e46 100644
--- a/vendor/twig/twig/lib/Twig/Extension/Debug.php
+++ b/vendor/twig/twig/lib/Twig/Extension/Debug.php
@@ -1,67 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\DebugExtension;
 
-/**
- * @final
- */
-class Twig_Extension_Debug extends Twig_Extension
-{
-    public function getFunctions()
-    {
-        // dump is safe if var_dump is overridden by xdebug
-        $isDumpOutputHtmlSafe = extension_loaded('xdebug')
-            // false means that it was not set (and the default is on) or it explicitly enabled
-            && (false === ini_get('xdebug.overload_var_dump') || ini_get('xdebug.overload_var_dump'))
-            // false means that it was not set (and the default is on) or it explicitly enabled
-            // xdebug.overload_var_dump produces HTML only when html_errors is also enabled
-            && (false === ini_get('html_errors') || ini_get('html_errors'))
-            || 'cli' === PHP_SAPI
-        ;
+class_exists('Twig\Extension\DebugExtension');
 
-        return array(
-            new Twig_SimpleFunction('dump', 'twig_var_dump', array('is_safe' => $isDumpOutputHtmlSafe ? array('html') : array(), 'needs_context' => true, 'needs_environment' => true)),
-        );
-    }
+@trigger_error(sprintf('Using the "Twig_Extension_Debug" class is deprecated since Twig version 2.7, use "Twig\Extension\DebugExtension" instead.'), E_USER_DEPRECATED);
 
-    public function getName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\DebugExtension" instead */
+    class Twig_Extension_Debug extends DebugExtension
     {
-        return 'debug';
     }
 }
-
-function twig_var_dump(Twig_Environment $env, $context)
-{
-    if (!$env->isDebug()) {
-        return;
-    }
-
-    ob_start();
-
-    $count = func_num_args();
-    if (2 === $count) {
-        $vars = array();
-        foreach ($context as $key => $value) {
-            if (!$value instanceof Twig_Template) {
-                $vars[$key] = $value;
-            }
-        }
-
-        var_dump($vars);
-    } else {
-        for ($i = 2; $i < $count; ++$i) {
-            var_dump(func_get_arg($i));
-        }
-    }
-
-    return ob_get_clean();
-}
-
-class_alias('Twig_Extension_Debug', 'Twig\Extension\DebugExtension', false);
diff --git a/vendor/twig/twig/lib/Twig/Extension/Escaper.php b/vendor/twig/twig/lib/Twig/Extension/Escaper.php
index 46c2d84b..f56c5c91 100644
--- a/vendor/twig/twig/lib/Twig/Extension/Escaper.php
+++ b/vendor/twig/twig/lib/Twig/Extension/Escaper.php
@@ -1,112 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\EscaperExtension;
 
-/**
- * @final
- */
-class Twig_Extension_Escaper extends Twig_Extension
-{
-    protected $defaultStrategy;
+class_exists('Twig\Extension\EscaperExtension');
 
-    /**
-     * @param string|false|callable $defaultStrategy An escaping strategy
-     *
-     * @see setDefaultStrategy()
-     */
-    public function __construct($defaultStrategy = 'html')
-    {
-        $this->setDefaultStrategy($defaultStrategy);
-    }
-
-    public function getTokenParsers()
-    {
-        return array(new Twig_TokenParser_AutoEscape());
-    }
-
-    public function getNodeVisitors()
-    {
-        return array(new Twig_NodeVisitor_Escaper());
-    }
-
-    public function getFilters()
-    {
-        return array(
-            new Twig_SimpleFilter('raw', 'twig_raw_filter', array('is_safe' => array('all'))),
-        );
-    }
-
-    /**
-     * Sets the default strategy to use when not defined by the user.
-     *
-     * The strategy can be a valid PHP callback that takes the template
-     * name as an argument and returns the strategy to use.
-     *
-     * @param string|false|callable $defaultStrategy An escaping strategy
-     */
-    public function setDefaultStrategy($defaultStrategy)
-    {
-        // for BC
-        if (true === $defaultStrategy) {
-            @trigger_error('Using "true" as the default strategy is deprecated since version 1.21. Use "html" instead.', E_USER_DEPRECATED);
+@trigger_error(sprintf('Using the "Twig_Extension_Escaper" class is deprecated since Twig version 2.7, use "Twig\Extension\EscaperExtension" instead.'), E_USER_DEPRECATED);
 
-            $defaultStrategy = 'html';
-        }
-
-        if ('filename' === $defaultStrategy) {
-            @trigger_error('Using "filename" as the default strategy is deprecated since version 1.27. Use "name" instead.', E_USER_DEPRECATED);
-
-            $defaultStrategy = 'name';
-        }
-
-        if ('name' === $defaultStrategy) {
-            $defaultStrategy = array('Twig_FileExtensionEscapingStrategy', 'guess');
-        }
-
-        $this->defaultStrategy = $defaultStrategy;
-    }
-
-    /**
-     * Gets the default strategy to use when not defined by the user.
-     *
-     * @param string $name The template name
-     *
-     * @return string|false The default strategy to use for the template
-     */
-    public function getDefaultStrategy($name)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\EscaperExtension" instead */
+    class Twig_Extension_Escaper extends EscaperExtension
     {
-        // disable string callables to avoid calling a function named html or js,
-        // or any other upcoming escaping strategy
-        if (!is_string($this->defaultStrategy) && false !== $this->defaultStrategy) {
-            return call_user_func($this->defaultStrategy, $name);
-        }
-
-        return $this->defaultStrategy;
-    }
-
-    public function getName()
-    {
-        return 'escaper';
     }
 }
-
-/**
- * Marks a variable as being safe.
- *
- * @param string $string A PHP variable
- *
- * @return string
- */
-function twig_raw_filter($string)
-{
-    return $string;
-}
-
-class_alias('Twig_Extension_Escaper', 'Twig\Extension\EscaperExtension', false);
diff --git a/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php b/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php
index 922cd2c9..a8d19a24 100644
--- a/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php
+++ b/vendor/twig/twig/lib/Twig/Extension/GlobalsInterface.php
@@ -1,24 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\GlobalsInterface;
 
-/**
- * Enables usage of the deprecated Twig_Extension::getGlobals() method.
- *
- * Explicitly implement this interface if you really need to implement the
- * deprecated getGlobals() method in your extensions.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_Extension_GlobalsInterface
-{
-}
+class_exists('Twig\Extension\GlobalsInterface');
+
+@trigger_error(sprintf('Using the "Twig_Extension_GlobalsInterface" class is deprecated since Twig version 2.7, use "Twig\Extension\GlobalsInterface" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_Extension_GlobalsInterface', 'Twig\Extension\GlobalsInterface', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\GlobalsInterface" instead */
+    class Twig_Extension_GlobalsInterface extends GlobalsInterface
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php b/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php
index 1549862f..bc926d73 100644
--- a/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php
+++ b/vendor/twig/twig/lib/Twig/Extension/InitRuntimeInterface.php
@@ -1,24 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\InitRuntimeInterface;
 
-/**
- * Enables usage of the deprecated Twig_Extension::initRuntime() method.
- *
- * Explicitly implement this interface if you really need to implement the
- * deprecated initRuntime() method in your extensions.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_Extension_InitRuntimeInterface
-{
-}
+class_exists('Twig\Extension\InitRuntimeInterface');
+
+@trigger_error(sprintf('Using the "Twig_Extension_InitRuntimeInterface" class is deprecated since Twig version 2.7, use "Twig\Extension\InitRuntimeInterface" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_Extension_InitRuntimeInterface', 'Twig\Extension\InitRuntimeInterface', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\InitRuntimeInterface" instead */
+    class Twig_Extension_InitRuntimeInterface extends InitRuntimeInterface
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/Extension/Optimizer.php b/vendor/twig/twig/lib/Twig/Extension/Optimizer.php
index 6c62e3ef..de4fdfe9 100644
--- a/vendor/twig/twig/lib/Twig/Extension/Optimizer.php
+++ b/vendor/twig/twig/lib/Twig/Extension/Optimizer.php
@@ -1,35 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\OptimizerExtension;
 
-/**
- * @final
- */
-class Twig_Extension_Optimizer extends Twig_Extension
-{
-    protected $optimizers;
+class_exists('Twig\Extension\OptimizerExtension');
 
-    public function __construct($optimizers = -1)
-    {
-        $this->optimizers = $optimizers;
-    }
-
-    public function getNodeVisitors()
-    {
-        return array(new Twig_NodeVisitor_Optimizer($this->optimizers));
-    }
+@trigger_error(sprintf('Using the "Twig_Extension_Optimizer" class is deprecated since Twig version 2.7, use "Twig\Extension\OptimizerExtension" instead.'), E_USER_DEPRECATED);
 
-    public function getName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\OptimizerExtension" instead */
+    class Twig_Extension_Optimizer extends OptimizerExtension
     {
-        return 'optimizer';
     }
 }
-
-class_alias('Twig_Extension_Optimizer', 'Twig\Extension\OptimizerExtension', false);
diff --git a/vendor/twig/twig/lib/Twig/Extension/Profiler.php b/vendor/twig/twig/lib/Twig/Extension/Profiler.php
index fcfc002b..22879c9a 100644
--- a/vendor/twig/twig/lib/Twig/Extension/Profiler.php
+++ b/vendor/twig/twig/lib/Twig/Extension/Profiler.php
@@ -1,49 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\ProfilerExtension;
 
-class Twig_Extension_Profiler extends Twig_Extension
-{
-    private $actives = array();
+class_exists('Twig\Extension\ProfilerExtension');
 
-    public function __construct(Twig_Profiler_Profile $profile)
-    {
-        $this->actives[] = $profile;
-    }
+@trigger_error(sprintf('Using the "Twig_Extension_Profiler" class is deprecated since Twig version 2.7, use "Twig\Extension\ProfilerExtension" instead.'), E_USER_DEPRECATED);
 
-    public function enter(Twig_Profiler_Profile $profile)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\ProfilerExtension" instead */
+    class Twig_Extension_Profiler extends ProfilerExtension
     {
-        $this->actives[0]->addProfile($profile);
-        array_unshift($this->actives, $profile);
-    }
-
-    public function leave(Twig_Profiler_Profile $profile)
-    {
-        $profile->leave();
-        array_shift($this->actives);
-
-        if (1 === count($this->actives)) {
-            $this->actives[0]->leave();
-        }
-    }
-
-    public function getNodeVisitors()
-    {
-        return array(new Twig_Profiler_NodeVisitor_Profiler(get_class($this)));
-    }
-
-    public function getName()
-    {
-        return 'profiler';
     }
 }
-
-class_alias('Twig_Extension_Profiler', 'Twig\Extension\ProfilerExtension', false);
-class_exists('Twig_Profiler_Profile');
diff --git a/vendor/twig/twig/lib/Twig/Extension/Sandbox.php b/vendor/twig/twig/lib/Twig/Extension/Sandbox.php
index 5cb80a71..400d1750 100644
--- a/vendor/twig/twig/lib/Twig/Extension/Sandbox.php
+++ b/vendor/twig/twig/lib/Twig/Extension/Sandbox.php
@@ -1,103 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\SandboxExtension;
 
-/**
- * @final
- */
-class Twig_Extension_Sandbox extends Twig_Extension
-{
-    protected $sandboxedGlobally;
-    protected $sandboxed;
-    protected $policy;
+class_exists('Twig\Extension\SandboxExtension');
 
-    public function __construct(Twig_Sandbox_SecurityPolicyInterface $policy, $sandboxed = false)
-    {
-        $this->policy = $policy;
-        $this->sandboxedGlobally = $sandboxed;
-    }
-
-    public function getTokenParsers()
-    {
-        return array(new Twig_TokenParser_Sandbox());
-    }
-
-    public function getNodeVisitors()
-    {
-        return array(new Twig_NodeVisitor_Sandbox());
-    }
-
-    public function enableSandbox()
-    {
-        $this->sandboxed = true;
-    }
-
-    public function disableSandbox()
-    {
-        $this->sandboxed = false;
-    }
-
-    public function isSandboxed()
-    {
-        return $this->sandboxedGlobally || $this->sandboxed;
-    }
-
-    public function isSandboxedGlobally()
-    {
-        return $this->sandboxedGlobally;
-    }
+@trigger_error(sprintf('Using the "Twig_Extension_Sandbox" class is deprecated since Twig version 2.7, use "Twig\Extension\SandboxExtension" instead.'), E_USER_DEPRECATED);
 
-    public function setSecurityPolicy(Twig_Sandbox_SecurityPolicyInterface $policy)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\SandboxExtension" instead */
+    class Twig_Extension_Sandbox extends SandboxExtension
     {
-        $this->policy = $policy;
-    }
-
-    public function getSecurityPolicy()
-    {
-        return $this->policy;
-    }
-
-    public function checkSecurity($tags, $filters, $functions)
-    {
-        if ($this->isSandboxed()) {
-            $this->policy->checkSecurity($tags, $filters, $functions);
-        }
-    }
-
-    public function checkMethodAllowed($obj, $method)
-    {
-        if ($this->isSandboxed()) {
-            $this->policy->checkMethodAllowed($obj, $method);
-        }
-    }
-
-    public function checkPropertyAllowed($obj, $method)
-    {
-        if ($this->isSandboxed()) {
-            $this->policy->checkPropertyAllowed($obj, $method);
-        }
-    }
-
-    public function ensureToStringAllowed($obj)
-    {
-        if ($this->isSandboxed() && is_object($obj)) {
-            $this->policy->checkMethodAllowed($obj, '__toString');
-        }
-
-        return $obj;
-    }
-
-    public function getName()
-    {
-        return 'sandbox';
     }
 }
-
-class_alias('Twig_Extension_Sandbox', 'Twig\Extension\SandboxExtension', false);
diff --git a/vendor/twig/twig/lib/Twig/Extension/Staging.php b/vendor/twig/twig/lib/Twig/Extension/Staging.php
index d3a0f9c9..bd200a43 100644
--- a/vendor/twig/twig/lib/Twig/Extension/Staging.php
+++ b/vendor/twig/twig/lib/Twig/Extension/Staging.php
@@ -1,112 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\StagingExtension;
 
-/**
- * Internal class.
- *
- * This class is used by Twig_Environment as a staging area and must not be used directly.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @internal
- */
-class Twig_Extension_Staging extends Twig_Extension
-{
-    protected $functions = array();
-    protected $filters = array();
-    protected $visitors = array();
-    protected $tokenParsers = array();
-    protected $globals = array();
-    protected $tests = array();
+class_exists('Twig\Extension\StagingExtension');
 
-    public function addFunction($name, $function)
-    {
-        if (isset($this->functions[$name])) {
-            @trigger_error(sprintf('Overriding function "%s" that is already registered is deprecated since version 1.30 and won\'t be possible anymore in 2.0.', $name), E_USER_DEPRECATED);
-        }
-
-        $this->functions[$name] = $function;
-    }
-
-    public function getFunctions()
-    {
-        return $this->functions;
-    }
-
-    public function addFilter($name, $filter)
-    {
-        if (isset($this->filters[$name])) {
-            @trigger_error(sprintf('Overriding filter "%s" that is already registered is deprecated since version 1.30 and won\'t be possible anymore in 2.0.', $name), E_USER_DEPRECATED);
-        }
-
-        $this->filters[$name] = $filter;
-    }
-
-    public function getFilters()
-    {
-        return $this->filters;
-    }
-
-    public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
-    {
-        $this->visitors[] = $visitor;
-    }
-
-    public function getNodeVisitors()
-    {
-        return $this->visitors;
-    }
-
-    public function addTokenParser(Twig_TokenParserInterface $parser)
-    {
-        if (isset($this->tokenParsers[$parser->getTag()])) {
-            @trigger_error(sprintf('Overriding tag "%s" that is already registered is deprecated since version 1.30 and won\'t be possible anymore in 2.0.', $parser->getTag()), E_USER_DEPRECATED);
-        }
-
-        $this->tokenParsers[$parser->getTag()] = $parser;
-    }
-
-    public function getTokenParsers()
-    {
-        return $this->tokenParsers;
-    }
-
-    public function addGlobal($name, $value)
-    {
-        $this->globals[$name] = $value;
-    }
-
-    public function getGlobals()
-    {
-        return $this->globals;
-    }
-
-    public function addTest($name, $test)
-    {
-        if (isset($this->tests[$name])) {
-            @trigger_error(sprintf('Overriding test "%s" that is already registered is deprecated since version 1.30 and won\'t be possible anymore in 2.0.', $name), E_USER_DEPRECATED);
-        }
-
-        $this->tests[$name] = $test;
-    }
+@trigger_error(sprintf('Using the "Twig_Extension_Staging" class is deprecated since Twig version 2.7, use "Twig\Extension\StagingExtension" instead.'), E_USER_DEPRECATED);
 
-    public function getTests()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\StagingExtension" instead */
+    class Twig_Extension_Staging extends StagingExtension
     {
-        return $this->tests;
-    }
-
-    public function getName()
-    {
-        return 'staging';
     }
 }
-
-class_alias('Twig_Extension_Staging', 'Twig\Extension\StagingExtension', false);
diff --git a/vendor/twig/twig/lib/Twig/Extension/StringLoader.php b/vendor/twig/twig/lib/Twig/Extension/StringLoader.php
index 2ce3c992..f77c2033 100644
--- a/vendor/twig/twig/lib/Twig/Extension/StringLoader.php
+++ b/vendor/twig/twig/lib/Twig/Extension/StringLoader.php
@@ -1,47 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\StringLoaderExtension;
 
-/**
- * @final
- */
-class Twig_Extension_StringLoader extends Twig_Extension
-{
-    public function getFunctions()
-    {
-        return array(
-            new Twig_SimpleFunction('template_from_string', 'twig_template_from_string', array('needs_environment' => true)),
-        );
-    }
+class_exists('Twig\Extension\StringLoaderExtension');
+
+@trigger_error(sprintf('Using the "Twig_Extension_StringLoader" class is deprecated since Twig version 2.7, use "Twig\Extension\StringLoaderExtension" instead.'), E_USER_DEPRECATED);
 
-    public function getName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\StringLoaderExtension" instead */
+    class Twig_Extension_StringLoader extends StringLoaderExtension
     {
-        return 'string_loader';
     }
 }
-
-/**
- * Loads a template from a string.
- *
- * <pre>
- * {{ include(template_from_string("Hello {{ name }}")) }}
- * </pre>
- *
- * @param Twig_Environment $env      A Twig_Environment instance
- * @param string           $template A template as a string or object implementing __toString()
- *
- * @return Twig_Template
- */
-function twig_template_from_string(Twig_Environment $env, $template)
-{
-    return $env->createTemplate((string) $template);
-}
-
-class_alias('Twig_Extension_StringLoader', 'Twig\Extension\StringLoaderExtension', false);
diff --git a/vendor/twig/twig/lib/Twig/ExtensionInterface.php b/vendor/twig/twig/lib/Twig/ExtensionInterface.php
index 946df500..4d5d2491 100644
--- a/vendor/twig/twig/lib/Twig/ExtensionInterface.php
+++ b/vendor/twig/twig/lib/Twig/ExtensionInterface.php
@@ -1,90 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Extension\ExtensionInterface;
 
-/**
- * Interface implemented by extension classes.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_ExtensionInterface
-{
-    /**
-     * Initializes the runtime environment.
-     *
-     * This is where you can load some file that contains filter functions for instance.
-     *
-     * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_InitRuntimeInterface instead
-     */
-    public function initRuntime(Twig_Environment $environment);
+class_exists('Twig\Extension\ExtensionInterface');
 
-    /**
-     * Returns the token parser instances to add to the existing list.
-     *
-     * @return Twig_TokenParserInterface[]
-     */
-    public function getTokenParsers();
+@trigger_error(sprintf('Using the "Twig_ExtensionInterface" class is deprecated since Twig version 2.7, use "Twig\Extension\ExtensionInterface" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * Returns the node visitor instances to add to the existing list.
-     *
-     * @return Twig_NodeVisitorInterface[]
-     */
-    public function getNodeVisitors();
-
-    /**
-     * Returns a list of filters to add to the existing list.
-     *
-     * @return Twig_SimpleFilter[]
-     */
-    public function getFilters();
-
-    /**
-     * Returns a list of tests to add to the existing list.
-     *
-     * @return Twig_SimpleTest[]
-     */
-    public function getTests();
-
-    /**
-     * Returns a list of functions to add to the existing list.
-     *
-     * @return Twig_SimpleFunction[]
-     */
-    public function getFunctions();
-
-    /**
-     * Returns a list of operators to add to the existing list.
-     *
-     * @return array<array> First array of unary operators, second array of binary operators
-     */
-    public function getOperators();
-
-    /**
-     * Returns a list of global variables to add to the existing list.
-     *
-     * @return array An array of global variables
-     *
-     * @deprecated since 1.23 (to be removed in 2.0), implement Twig_Extension_GlobalsInterface instead
-     */
-    public function getGlobals();
-
-    /**
-     * Returns the name of the extension.
-     *
-     * @return string The extension name
-     *
-     * @deprecated since 1.26 (to be removed in 2.0), not used anymore internally
-     */
-    public function getName();
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Extension\ExtensionInterface" instead */
+    class Twig_ExtensionInterface extends ExtensionInterface
+    {
+    }
 }
-
-class_alias('Twig_ExtensionInterface', 'Twig\Extension\ExtensionInterface', false);
-class_exists('Twig_Environment');
diff --git a/vendor/twig/twig/lib/Twig/ExtensionSet.php b/vendor/twig/twig/lib/Twig/ExtensionSet.php
new file mode 100644
index 00000000..6541fd68
--- /dev/null
+++ b/vendor/twig/twig/lib/Twig/ExtensionSet.php
@@ -0,0 +1,14 @@
+<?php
+
+use Twig\ExtensionSet;
+
+class_exists('Twig\ExtensionSet');
+
+@trigger_error(sprintf('Using the "Twig_ExtensionSet" class is deprecated since Twig version 2.7, use "Twig\ExtensionSet" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\ExtensionSet" instead */
+    class Twig_ExtensionSet extends ExtensionSet
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/FactoryRuntimeLoader.php b/vendor/twig/twig/lib/Twig/FactoryRuntimeLoader.php
index 2cdaded1..dc3efaaf 100644
--- a/vendor/twig/twig/lib/Twig/FactoryRuntimeLoader.php
+++ b/vendor/twig/twig/lib/Twig/FactoryRuntimeLoader.php
@@ -1,39 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\RuntimeLoader\FactoryRuntimeLoader;
 
-/**
- * Lazy loads the runtime implementations for a Twig element.
- *
- * @author Robin Chalas <robin.chalas@xxxxxxxxx>
- */
-class Twig_FactoryRuntimeLoader implements Twig_RuntimeLoaderInterface
-{
-    private $map;
+class_exists('Twig\RuntimeLoader\FactoryRuntimeLoader');
 
-    /**
-     * @param array $map An array where keys are class names and values factory callables
-     */
-    public function __construct($map = array())
-    {
-        $this->map = $map;
-    }
+@trigger_error(sprintf('Using the "Twig_FactoryRuntimeLoader" class is deprecated since Twig version 2.7, use "Twig\RuntimeLoader\FactoryRuntimeLoader" instead.'), E_USER_DEPRECATED);
 
-    public function load($class)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\RuntimeLoader\FactoryRuntimeLoader" instead */
+    class Twig_FactoryRuntimeLoader extends FactoryRuntimeLoader
     {
-        if (isset($this->map[$class])) {
-            $runtimeFactory = $this->map[$class];
-
-            return $runtimeFactory();
-        }
     }
 }
-
-class_alias('Twig_FactoryRuntimeLoader', 'Twig\RuntimeLoader\FactoryRuntimeLoader', false);
diff --git a/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php b/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php
index 8f8cd2ee..33cfe9e6 100644
--- a/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php
+++ b/vendor/twig/twig/lib/Twig/FileExtensionEscapingStrategy.php
@@ -1,60 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\FileExtensionEscapingStrategy;
 
-/**
- * Default autoescaping strategy based on file names.
- *
- * This strategy sets the HTML as the default autoescaping strategy,
- * but changes it based on the template name.
- *
- * Note that there is no runtime performance impact as the
- * default autoescaping strategy is set at compilation time.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_FileExtensionEscapingStrategy
-{
-    /**
-     * Guesses the best autoescaping strategy based on the file name.
-     *
-     * @param string $name The template name
-     *
-     * @return string|false The escaping strategy name to use or false to disable
-     */
-    public static function guess($name)
-    {
-        if (in_array(substr($name, -1), array('/', '\\'))) {
-            return 'html'; // return html for directories
-        }
-
-        if ('.twig' === substr($name, -5)) {
-            $name = substr($name, 0, -5);
-        }
-
-        $extension = pathinfo($name, PATHINFO_EXTENSION);
-
-        switch ($extension) {
-            case 'js':
-                return 'js';
+class_exists('Twig\FileExtensionEscapingStrategy');
 
-            case 'css':
-                return 'css';
+@trigger_error(sprintf('Using the "Twig_FileExtensionEscapingStrategy" class is deprecated since Twig version 2.7, use "Twig\FileExtensionEscapingStrategy" instead.'), E_USER_DEPRECATED);
 
-            case 'txt':
-                return false;
-
-            default:
-                return 'html';
-        }
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\FileExtensionEscapingStrategy" instead */
+    class Twig_FileExtensionEscapingStrategy extends FileExtensionEscapingStrategy
+    {
     }
 }
-
-class_alias('Twig_FileExtensionEscapingStrategy', 'Twig\FileExtensionEscapingStrategy', false);
diff --git a/vendor/twig/twig/lib/Twig/Filter.php b/vendor/twig/twig/lib/Twig/Filter.php
index 893d75d1..52bb4d67 100644
--- a/vendor/twig/twig/lib/Twig/Filter.php
+++ b/vendor/twig/twig/lib/Twig/Filter.php
@@ -1,84 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TwigFilter;
 
-@trigger_error('The Twig_Filter class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleFilter instead.', E_USER_DEPRECATED);
+class_exists('Twig\TwigFilter');
 
-/**
- * Represents a template filter.
- *
- * Use Twig_SimpleFilter instead.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-abstract class Twig_Filter implements Twig_FilterInterface, Twig_FilterCallableInterface
-{
-    protected $options;
-    protected $arguments = array();
+@trigger_error(sprintf('Using the "Twig_Filter" class is deprecated since Twig version 2.7, use "Twig\TwigFilter" instead.'), E_USER_DEPRECATED);
 
-    public function __construct(array $options = array())
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TwigFilter" instead */
+    class Twig_Filter extends TwigFilter
     {
-        $this->options = array_merge(array(
-            'needs_environment' => false,
-            'needs_context' => false,
-            'pre_escape' => null,
-            'preserves_safety' => null,
-            'callable' => null,
-        ), $options);
-    }
-
-    public function setArguments($arguments)
-    {
-        $this->arguments = $arguments;
-    }
-
-    public function getArguments()
-    {
-        return $this->arguments;
-    }
-
-    public function needsEnvironment()
-    {
-        return $this->options['needs_environment'];
-    }
-
-    public function needsContext()
-    {
-        return $this->options['needs_context'];
-    }
-
-    public function getSafe(Twig_Node $filterArgs)
-    {
-        if (isset($this->options['is_safe'])) {
-            return $this->options['is_safe'];
-        }
-
-        if (isset($this->options['is_safe_callback'])) {
-            return call_user_func($this->options['is_safe_callback'], $filterArgs);
-        }
-    }
-
-    public function getPreservesSafety()
-    {
-        return $this->options['preserves_safety'];
-    }
-
-    public function getPreEscape()
-    {
-        return $this->options['pre_escape'];
-    }
-
-    public function getCallable()
-    {
-        return $this->options['callable'];
     }
 }
diff --git a/vendor/twig/twig/lib/Twig/Filter/Function.php b/vendor/twig/twig/lib/Twig/Filter/Function.php
deleted file mode 100644
index 71b16554..00000000
--- a/vendor/twig/twig/lib/Twig/Filter/Function.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Filter_Function class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleFilter instead.', E_USER_DEPRECATED);
-
-/**
- * Represents a function template filter.
- *
- * Use Twig_SimpleFilter instead.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Filter_Function extends Twig_Filter
-{
-    protected $function;
-
-    public function __construct($function, array $options = array())
-    {
-        $options['callable'] = $function;
-
-        parent::__construct($options);
-
-        $this->function = $function;
-    }
-
-    public function compile()
-    {
-        return $this->function;
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/Filter/Method.php b/vendor/twig/twig/lib/Twig/Filter/Method.php
deleted file mode 100644
index 1b75676c..00000000
--- a/vendor/twig/twig/lib/Twig/Filter/Method.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Filter_Method class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleFilter instead.', E_USER_DEPRECATED);
-
-/**
- * Represents a method template filter.
- *
- * Use Twig_SimpleFilter instead.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Filter_Method extends Twig_Filter
-{
-    protected $extension;
-    protected $method;
-
-    public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
-    {
-        $options['callable'] = array($extension, $method);
-
-        parent::__construct($options);
-
-        $this->extension = $extension;
-        $this->method = $method;
-    }
-
-    public function compile()
-    {
-        return sprintf('$this->env->getExtension(\'%s\')->%s', get_class($this->extension), $this->method);
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/Filter/Node.php b/vendor/twig/twig/lib/Twig/Filter/Node.php
deleted file mode 100644
index 3e6b12ef..00000000
--- a/vendor/twig/twig/lib/Twig/Filter/Node.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Filter_Node class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleFilter instead.', E_USER_DEPRECATED);
-
-/**
- * Represents a template filter as a node.
- *
- * Use Twig_SimpleFilter instead.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Filter_Node extends Twig_Filter
-{
-    protected $class;
-
-    public function __construct($class, array $options = array())
-    {
-        parent::__construct($options);
-
-        $this->class = $class;
-    }
-
-    public function getClass()
-    {
-        return $this->class;
-    }
-
-    public function compile()
-    {
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/FilterCallableInterface.php b/vendor/twig/twig/lib/Twig/FilterCallableInterface.php
deleted file mode 100644
index 21b028c4..00000000
--- a/vendor/twig/twig/lib/Twig/FilterCallableInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a callable template filter.
- *
- * Use Twig_SimpleFilter instead.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_FilterCallableInterface
-{
-    public function getCallable();
-}
diff --git a/vendor/twig/twig/lib/Twig/FilterInterface.php b/vendor/twig/twig/lib/Twig/FilterInterface.php
deleted file mode 100644
index 9d7e9ab6..00000000
--- a/vendor/twig/twig/lib/Twig/FilterInterface.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template filter.
- *
- * Use Twig_SimpleFilter instead.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_FilterInterface
-{
-    /**
-     * Compiles a filter.
-     *
-     * @return string The PHP code for the filter
-     */
-    public function compile();
-
-    public function needsEnvironment();
-
-    public function needsContext();
-
-    public function getSafe(Twig_Node $filterArgs);
-
-    public function getPreservesSafety();
-
-    public function getPreEscape();
-
-    public function setArguments($arguments);
-
-    public function getArguments();
-}
diff --git a/vendor/twig/twig/lib/Twig/Function.php b/vendor/twig/twig/lib/Twig/Function.php
index 9dc16e90..f95b53ff 100644
--- a/vendor/twig/twig/lib/Twig/Function.php
+++ b/vendor/twig/twig/lib/Twig/Function.php
@@ -1,74 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TwigFunction;
 
-@trigger_error('The Twig_Function class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleFunction instead.', E_USER_DEPRECATED);
+class_exists('Twig\TwigFunction');
 
-/**
- * Represents a template function.
- *
- * Use Twig_SimpleFunction instead.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-abstract class Twig_Function implements Twig_FunctionInterface, Twig_FunctionCallableInterface
-{
-    protected $options;
-    protected $arguments = array();
+@trigger_error(sprintf('Using the "Twig_Function" class is deprecated since Twig version 2.7, use "Twig\TwigFunction" instead.'), E_USER_DEPRECATED);
 
-    public function __construct(array $options = array())
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TwigFunction" instead */
+    class Twig_Function extends TwigFunction
     {
-        $this->options = array_merge(array(
-            'needs_environment' => false,
-            'needs_context' => false,
-            'callable' => null,
-        ), $options);
-    }
-
-    public function setArguments($arguments)
-    {
-        $this->arguments = $arguments;
-    }
-
-    public function getArguments()
-    {
-        return $this->arguments;
-    }
-
-    public function needsEnvironment()
-    {
-        return $this->options['needs_environment'];
-    }
-
-    public function needsContext()
-    {
-        return $this->options['needs_context'];
-    }
-
-    public function getSafe(Twig_Node $functionArgs)
-    {
-        if (isset($this->options['is_safe'])) {
-            return $this->options['is_safe'];
-        }
-
-        if (isset($this->options['is_safe_callback'])) {
-            return call_user_func($this->options['is_safe_callback'], $functionArgs);
-        }
-
-        return array();
-    }
-
-    public function getCallable()
-    {
-        return $this->options['callable'];
     }
 }
diff --git a/vendor/twig/twig/lib/Twig/Function/Function.php b/vendor/twig/twig/lib/Twig/Function/Function.php
deleted file mode 100644
index 97c0eb77..00000000
--- a/vendor/twig/twig/lib/Twig/Function/Function.php
+++ /dev/null
@@ -1,41 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Function_Function class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleFunction instead.', E_USER_DEPRECATED);
-
-/**
- * Represents a function template function.
- *
- * Use Twig_SimpleFunction instead.
- *
- * @author Arnaud Le Blanc <arnaud.lb@xxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Function_Function extends Twig_Function
-{
-    protected $function;
-
-    public function __construct($function, array $options = array())
-    {
-        $options['callable'] = $function;
-
-        parent::__construct($options);
-
-        $this->function = $function;
-    }
-
-    public function compile()
-    {
-        return $this->function;
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/Function/Method.php b/vendor/twig/twig/lib/Twig/Function/Method.php
deleted file mode 100644
index 4299e118..00000000
--- a/vendor/twig/twig/lib/Twig/Function/Method.php
+++ /dev/null
@@ -1,43 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Function_Method class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleFunction instead.', E_USER_DEPRECATED);
-
-/**
- * Represents a method template function.
- *
- * Use Twig_SimpleFunction instead.
- *
- * @author Arnaud Le Blanc <arnaud.lb@xxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Function_Method extends Twig_Function
-{
-    protected $extension;
-    protected $method;
-
-    public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
-    {
-        $options['callable'] = array($extension, $method);
-
-        parent::__construct($options);
-
-        $this->extension = $extension;
-        $this->method = $method;
-    }
-
-    public function compile()
-    {
-        return sprintf('$this->env->getExtension(\'%s\')->%s', get_class($this->extension), $this->method);
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/Function/Node.php b/vendor/twig/twig/lib/Twig/Function/Node.php
deleted file mode 100644
index 0adc5d93..00000000
--- a/vendor/twig/twig/lib/Twig/Function/Node.php
+++ /dev/null
@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Function_Node class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleFunction instead.', E_USER_DEPRECATED);
-
-/**
- * Represents a template function as a node.
- *
- * Use Twig_SimpleFunction instead.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Function_Node extends Twig_Function
-{
-    protected $class;
-
-    public function __construct($class, array $options = array())
-    {
-        parent::__construct($options);
-
-        $this->class = $class;
-    }
-
-    public function getClass()
-    {
-        return $this->class;
-    }
-
-    public function compile()
-    {
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php b/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php
deleted file mode 100644
index d23d6917..00000000
--- a/vendor/twig/twig/lib/Twig/FunctionCallableInterface.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a callable template function.
- *
- * Use Twig_SimpleFunction instead.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_FunctionCallableInterface
-{
-    public function getCallable();
-}
diff --git a/vendor/twig/twig/lib/Twig/FunctionInterface.php b/vendor/twig/twig/lib/Twig/FunctionInterface.php
deleted file mode 100644
index 00d4f95c..00000000
--- a/vendor/twig/twig/lib/Twig/FunctionInterface.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template function.
- *
- * Use Twig_SimpleFunction instead.
- *
- * @author Arnaud Le Blanc <arnaud.lb@xxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_FunctionInterface
-{
-    /**
-     * Compiles a function.
-     *
-     * @return string The PHP code for the function
-     */
-    public function compile();
-
-    public function needsEnvironment();
-
-    public function needsContext();
-
-    public function getSafe(Twig_Node $filterArgs);
-
-    public function setArguments($arguments);
-
-    public function getArguments();
-}
diff --git a/vendor/twig/twig/lib/Twig/Lexer.php b/vendor/twig/twig/lib/Twig/Lexer.php
index 85390b28..421e3b2b 100644
--- a/vendor/twig/twig/lib/Twig/Lexer.php
+++ b/vendor/twig/twig/lib/Twig/Lexer.php
@@ -1,424 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Lexer;
 
-/**
- * Lexes a template string.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Lexer implements Twig_LexerInterface
-{
-    protected $tokens;
-    protected $code;
-    protected $cursor;
-    protected $lineno;
-    protected $end;
-    protected $state;
-    protected $states;
-    protected $brackets;
-    protected $env;
-    // to be renamed to $name in 2.0 (where it is private)
-    protected $filename;
-    protected $options;
-    protected $regexes;
-    protected $position;
-    protected $positions;
-    protected $currentVarBlockLine;
+class_exists('Twig\Lexer');
 
-    private $source;
+@trigger_error(sprintf('Using the "Twig_Lexer" class is deprecated since Twig version 2.7, use "Twig\Lexer" instead.'), E_USER_DEPRECATED);
 
-    const STATE_DATA = 0;
-    const STATE_BLOCK = 1;
-    const STATE_VAR = 2;
-    const STATE_STRING = 3;
-    const STATE_INTERPOLATION = 4;
-
-    const REGEX_NAME = '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A';
-    const REGEX_NUMBER = '/[0-9]+(?:\.[0-9]+)?/A';
-    const REGEX_STRING = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';
-    const REGEX_DQ_STRING_DELIM = '/"/A';
-    const REGEX_DQ_STRING_PART = '/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As';
-    const PUNCTUATION = '()[]{}?:.,|';
-
-    public function __construct(Twig_Environment $env, array $options = array())
-    {
-        $this->env = $env;
-
-        $this->options = array_merge(array(
-            'tag_comment' => array('{#', '#}'),
-            'tag_block' => array('{%', '%}'),
-            'tag_variable' => array('{{', '}}'),
-            'whitespace_trim' => '-',
-            'interpolation' => array('#{', '}'),
-        ), $options);
-
-        $this->regexes = array(
-            'lex_var' => '/\s*'.preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_variable'][1], '/').'/A',
-            'lex_block' => '/\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')\n?/A',
-            'lex_raw_data' => '/('.preg_quote($this->options['tag_block'][0].$this->options['whitespace_trim'], '/').'|'.preg_quote($this->options['tag_block'][0], '/').')\s*(?:end%s)\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/s',
-            'operator' => $this->getOperatorRegex(),
-            'lex_comment' => '/(?:'.preg_quote($this->options['whitespace_trim'], '/').preg_quote($this->options['tag_comment'][1], '/').'\s*|'.preg_quote($this->options['tag_comment'][1], '/').')\n?/s',
-            'lex_block_raw' => '/\s*(raw|verbatim)\s*(?:'.preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '/').'\s*|\s*'.preg_quote($this->options['tag_block'][1], '/').')/As',
-            'lex_block_line' => '/\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '/').'/As',
-            'lex_tokens_start' => '/('.preg_quote($this->options['tag_variable'][0], '/').'|'.preg_quote($this->options['tag_block'][0], '/').'|'.preg_quote($this->options['tag_comment'][0], '/').')('.preg_quote($this->options['whitespace_trim'], '/').')?/s',
-            'interpolation_start' => '/'.preg_quote($this->options['interpolation'][0], '/').'\s*/A',
-            'interpolation_end' => '/\s*'.preg_quote($this->options['interpolation'][1], '/').'/A',
-        );
-    }
-
-    public function tokenize($code, $name = null)
-    {
-        if (!$code instanceof Twig_Source) {
-            @trigger_error(sprintf('Passing a string as the $code argument of %s() is deprecated since version 1.27 and will be removed in 2.0. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
-            $this->source = new Twig_Source($code, $name);
-        } else {
-            $this->source = $code;
-        }
-
-        if (((int) ini_get('mbstring.func_overload')) & 2) {
-            @trigger_error('Support for having "mbstring.func_overload" different from 0 is deprecated version 1.29 and will be removed in 2.0.', E_USER_DEPRECATED);
-        }
-
-        if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) {
-            $mbEncoding = mb_internal_encoding();
-            mb_internal_encoding('ASCII');
-        } else {
-            $mbEncoding = null;
-        }
-
-        $this->code = str_replace(array("\r\n", "\r"), "\n", $this->source->getCode());
-        $this->filename = $this->source->getName();
-        $this->cursor = 0;
-        $this->lineno = 1;
-        $this->end = strlen($this->code);
-        $this->tokens = array();
-        $this->state = self::STATE_DATA;
-        $this->states = array();
-        $this->brackets = array();
-        $this->position = -1;
-
-        // find all token starts in one go
-        preg_match_all($this->regexes['lex_tokens_start'], $this->code, $matches, PREG_OFFSET_CAPTURE);
-        $this->positions = $matches;
-
-        while ($this->cursor < $this->end) {
-            // dispatch to the lexing functions depending
-            // on the current state
-            switch ($this->state) {
-                case self::STATE_DATA:
-                    $this->lexData();
-                    break;
-
-                case self::STATE_BLOCK:
-                    $this->lexBlock();
-                    break;
-
-                case self::STATE_VAR:
-                    $this->lexVar();
-                    break;
-
-                case self::STATE_STRING:
-                    $this->lexString();
-                    break;
-
-                case self::STATE_INTERPOLATION:
-                    $this->lexInterpolation();
-                    break;
-            }
-        }
-
-        $this->pushToken(Twig_Token::EOF_TYPE);
-
-        if (!empty($this->brackets)) {
-            list($expect, $lineno) = array_pop($this->brackets);
-            throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
-        }
-
-        if ($mbEncoding) {
-            mb_internal_encoding($mbEncoding);
-        }
-
-        return new Twig_TokenStream($this->tokens, $this->source);
-    }
-
-    protected function lexData()
-    {
-        // if no matches are left we return the rest of the template as simple text token
-        if ($this->position == count($this->positions[0]) - 1) {
-            $this->pushToken(Twig_Token::TEXT_TYPE, substr($this->code, $this->cursor));
-            $this->cursor = $this->end;
-
-            return;
-        }
-
-        // Find the first token after the current cursor
-        $position = $this->positions[0][++$this->position];
-        while ($position[1] < $this->cursor) {
-            if ($this->position == count($this->positions[0]) - 1) {
-                return;
-            }
-            $position = $this->positions[0][++$this->position];
-        }
-
-        // push the template text first
-        $text = $textContent = substr($this->code, $this->cursor, $position[1] - $this->cursor);
-        if (isset($this->positions[2][$this->position][0])) {
-            $text = rtrim($text);
-        }
-        $this->pushToken(Twig_Token::TEXT_TYPE, $text);
-        $this->moveCursor($textContent.$position[0]);
-
-        switch ($this->positions[1][$this->position][0]) {
-            case $this->options['tag_comment'][0]:
-                $this->lexComment();
-                break;
-
-            case $this->options['tag_block'][0]:
-                // raw data?
-                if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, null, $this->cursor)) {
-                    $this->moveCursor($match[0]);
-                    $this->lexRawData($match[1]);
-                // {% line \d+ %}
-                } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, null, $this->cursor)) {
-                    $this->moveCursor($match[0]);
-                    $this->lineno = (int) $match[1];
-                } else {
-                    $this->pushToken(Twig_Token::BLOCK_START_TYPE);
-                    $this->pushState(self::STATE_BLOCK);
-                    $this->currentVarBlockLine = $this->lineno;
-                }
-                break;
-
-            case $this->options['tag_variable'][0]:
-                $this->pushToken(Twig_Token::VAR_START_TYPE);
-                $this->pushState(self::STATE_VAR);
-                $this->currentVarBlockLine = $this->lineno;
-                break;
-        }
-    }
-
-    protected function lexBlock()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Lexer" instead */
+    class Twig_Lexer extends Lexer
     {
-        if (empty($this->brackets) && preg_match($this->regexes['lex_block'], $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::BLOCK_END_TYPE);
-            $this->moveCursor($match[0]);
-            $this->popState();
-        } else {
-            $this->lexExpression();
-        }
-    }
-
-    protected function lexVar()
-    {
-        if (empty($this->brackets) && preg_match($this->regexes['lex_var'], $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::VAR_END_TYPE);
-            $this->moveCursor($match[0]);
-            $this->popState();
-        } else {
-            $this->lexExpression();
-        }
-    }
-
-    protected function lexExpression()
-    {
-        // whitespace
-        if (preg_match('/\s+/A', $this->code, $match, null, $this->cursor)) {
-            $this->moveCursor($match[0]);
-
-            if ($this->cursor >= $this->end) {
-                throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $this->state === self::STATE_BLOCK ? 'block' : 'variable'), $this->currentVarBlockLine, $this->source);
-            }
-        }
-
-        // operators
-        if (preg_match($this->regexes['operator'], $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::OPERATOR_TYPE, preg_replace('/\s+/', ' ', $match[0]));
-            $this->moveCursor($match[0]);
-        }
-        // names
-        elseif (preg_match(self::REGEX_NAME, $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::NAME_TYPE, $match[0]);
-            $this->moveCursor($match[0]);
-        }
-        // numbers
-        elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, null, $this->cursor)) {
-            $number = (float) $match[0];  // floats
-            if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
-                $number = (int) $match[0]; // integers lower than the maximum
-            }
-            $this->pushToken(Twig_Token::NUMBER_TYPE, $number);
-            $this->moveCursor($match[0]);
-        }
-        // punctuation
-        elseif (false !== strpos(self::PUNCTUATION, $this->code[$this->cursor])) {
-            // opening bracket
-            if (false !== strpos('([{', $this->code[$this->cursor])) {
-                $this->brackets[] = array($this->code[$this->cursor], $this->lineno);
-            }
-            // closing bracket
-            elseif (false !== strpos(')]}', $this->code[$this->cursor])) {
-                if (empty($this->brackets)) {
-                    throw new Twig_Error_Syntax(sprintf('Unexpected "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
-                }
-
-                list($expect, $lineno) = array_pop($this->brackets);
-                if ($this->code[$this->cursor] != strtr($expect, '([{', ')]}')) {
-                    throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
-                }
-            }
-
-            $this->pushToken(Twig_Token::PUNCTUATION_TYPE, $this->code[$this->cursor]);
-            ++$this->cursor;
-        }
-        // strings
-        elseif (preg_match(self::REGEX_STRING, $this->code, $match, null, $this->cursor)) {
-            $this->pushToken(Twig_Token::STRING_TYPE, stripcslashes(substr($match[0], 1, -1)));
-            $this->moveCursor($match[0]);
-        }
-        // opening double quoted string
-        elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
-            $this->brackets[] = array('"', $this->lineno);
-            $this->pushState(self::STATE_STRING);
-            $this->moveCursor($match[0]);
-        }
-        // unlexable
-        else {
-            throw new Twig_Error_Syntax(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
-        }
-    }
-
-    protected function lexRawData($tag)
-    {
-        if ('raw' === $tag) {
-            @trigger_error(sprintf('Twig Tag "raw" is deprecated since version 1.21. Use "verbatim" instead in %s at line %d.', $this->filename, $this->lineno), E_USER_DEPRECATED);
-        }
-
-        if (!preg_match(str_replace('%s', $tag, $this->regexes['lex_raw_data']), $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
-            throw new Twig_Error_Syntax(sprintf('Unexpected end of file: Unclosed "%s" block.', $tag), $this->lineno, $this->source);
-        }
-
-        $text = substr($this->code, $this->cursor, $match[0][1] - $this->cursor);
-        $this->moveCursor($text.$match[0][0]);
-
-        if (false !== strpos($match[1][0], $this->options['whitespace_trim'])) {
-            $text = rtrim($text);
-        }
-
-        $this->pushToken(Twig_Token::TEXT_TYPE, $text);
-    }
-
-    protected function lexComment()
-    {
-        if (!preg_match($this->regexes['lex_comment'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
-            throw new Twig_Error_Syntax('Unclosed comment.', $this->lineno, $this->source);
-        }
-
-        $this->moveCursor(substr($this->code, $this->cursor, $match[0][1] - $this->cursor).$match[0][0]);
-    }
-
-    protected function lexString()
-    {
-        if (preg_match($this->regexes['interpolation_start'], $this->code, $match, null, $this->cursor)) {
-            $this->brackets[] = array($this->options['interpolation'][0], $this->lineno);
-            $this->pushToken(Twig_Token::INTERPOLATION_START_TYPE);
-            $this->moveCursor($match[0]);
-            $this->pushState(self::STATE_INTERPOLATION);
-        } elseif (preg_match(self::REGEX_DQ_STRING_PART, $this->code, $match, null, $this->cursor) && strlen($match[0]) > 0) {
-            $this->pushToken(Twig_Token::STRING_TYPE, stripcslashes($match[0]));
-            $this->moveCursor($match[0]);
-        } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, null, $this->cursor)) {
-            list($expect, $lineno) = array_pop($this->brackets);
-            if ($this->code[$this->cursor] != '"') {
-                throw new Twig_Error_Syntax(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
-            }
-
-            $this->popState();
-            ++$this->cursor;
-        }
-    }
-
-    protected function lexInterpolation()
-    {
-        $bracket = end($this->brackets);
-        if ($this->options['interpolation'][0] === $bracket[0] && preg_match($this->regexes['interpolation_end'], $this->code, $match, null, $this->cursor)) {
-            array_pop($this->brackets);
-            $this->pushToken(Twig_Token::INTERPOLATION_END_TYPE);
-            $this->moveCursor($match[0]);
-            $this->popState();
-        } else {
-            $this->lexExpression();
-        }
-    }
-
-    protected function pushToken($type, $value = '')
-    {
-        // do not push empty text tokens
-        if (Twig_Token::TEXT_TYPE === $type && '' === $value) {
-            return;
-        }
-
-        $this->tokens[] = new Twig_Token($type, $value, $this->lineno);
-    }
-
-    protected function moveCursor($text)
-    {
-        $this->cursor += strlen($text);
-        $this->lineno += substr_count($text, "\n");
-    }
-
-    protected function getOperatorRegex()
-    {
-        $operators = array_merge(
-            array('='),
-            array_keys($this->env->getUnaryOperators()),
-            array_keys($this->env->getBinaryOperators())
-        );
-
-        $operators = array_combine($operators, array_map('strlen', $operators));
-        arsort($operators);
-
-        $regex = array();
-        foreach ($operators as $operator => $length) {
-            // an operator that ends with a character must be followed by
-            // a whitespace or a parenthesis
-            if (ctype_alpha($operator[$length - 1])) {
-                $r = preg_quote($operator, '/').'(?=[\s()])';
-            } else {
-                $r = preg_quote($operator, '/');
-            }
-
-            // an operator with a space can be any amount of whitespaces
-            $r = preg_replace('/\s+/', '\s+', $r);
-
-            $regex[] = $r;
-        }
-
-        return '/'.implode('|', $regex).'/A';
-    }
-
-    protected function pushState($state)
-    {
-        $this->states[] = $this->state;
-        $this->state = $state;
-    }
-
-    protected function popState()
-    {
-        if (0 === count($this->states)) {
-            throw new Exception('Cannot pop state without a previous state.');
-        }
-
-        $this->state = array_pop($this->states);
     }
 }
-
-class_alias('Twig_Lexer', 'Twig\Lexer', false);
diff --git a/vendor/twig/twig/lib/Twig/LexerInterface.php b/vendor/twig/twig/lib/Twig/LexerInterface.php
deleted file mode 100644
index c10bbfec..00000000
--- a/vendor/twig/twig/lib/Twig/LexerInterface.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by lexer classes.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_LexerInterface
-{
-    /**
-     * Tokenizes a source code.
-     *
-     * @param string|Twig_Source $code The source code
-     * @param string             $name A unique identifier for the source code
-     *
-     * @return Twig_TokenStream
-     *
-     * @throws Twig_Error_Syntax When the code is syntactically wrong
-     */
-    public function tokenize($code, $name = null);
-}
diff --git a/vendor/twig/twig/lib/Twig/Loader/Array.php b/vendor/twig/twig/lib/Twig/Loader/Array.php
index 0aac7690..461e394d 100644
--- a/vendor/twig/twig/lib/Twig/Loader/Array.php
+++ b/vendor/twig/twig/lib/Twig/Loader/Array.php
@@ -1,97 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Loader\ArrayLoader;
 
-/**
- * Loads a template from an array.
- *
- * When using this loader with a cache mechanism, you should know that a new cache
- * key is generated each time a template content "changes" (the cache key being the
- * source code of the template). If you don't want to see your cache grows out of
- * control, you need to take care of clearing the old cache file by yourself.
- *
- * This loader should only be used for unit testing.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Loader_Array implements Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
-{
-    protected $templates = array();
+class_exists('Twig\Loader\ArrayLoader');
 
-    /**
-     * @param array $templates An array of templates (keys are the names, and values are the source code)
-     */
-    public function __construct(array $templates = array())
-    {
-        $this->templates = $templates;
-    }
-
-    /**
-     * Adds or overrides a template.
-     *
-     * @param string $name     The template name
-     * @param string $template The template source
-     */
-    public function setTemplate($name, $template)
-    {
-        $this->templates[(string) $name] = $template;
-    }
-
-    public function getSource($name)
-    {
-        @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', get_class($this)), E_USER_DEPRECATED);
-
-        $name = (string) $name;
-        if (!isset($this->templates[$name])) {
-            throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-        }
-
-        return $this->templates[$name];
-    }
+@trigger_error(sprintf('Using the "Twig_Loader_Array" class is deprecated since Twig version 2.7, use "Twig\Loader\ArrayLoader" instead.'), E_USER_DEPRECATED);
 
-    public function getSourceContext($name)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Loader\ArrayLoader" instead */
+    class Twig_Loader_Array extends ArrayLoader
     {
-        $name = (string) $name;
-        if (!isset($this->templates[$name])) {
-            throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-        }
-
-        return new Twig_Source($this->templates[$name], $name);
-    }
-
-    public function exists($name)
-    {
-        return isset($this->templates[(string) $name]);
-    }
-
-    public function getCacheKey($name)
-    {
-        $name = (string) $name;
-        if (!isset($this->templates[$name])) {
-            throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-        }
-
-        return $name.':'.$this->templates[$name];
-    }
-
-    public function isFresh($name, $time)
-    {
-        $name = (string) $name;
-        if (!isset($this->templates[$name])) {
-            throw new Twig_Error_Loader(sprintf('Template "%s" is not defined.', $name));
-        }
-
-        return true;
     }
 }
-
-class_alias('Twig_Loader_Array', 'Twig\Loader\ArrayLoader', false);
diff --git a/vendor/twig/twig/lib/Twig/Loader/Chain.php b/vendor/twig/twig/lib/Twig/Loader/Chain.php
index 59a33796..948959f3 100644
--- a/vendor/twig/twig/lib/Twig/Loader/Chain.php
+++ b/vendor/twig/twig/lib/Twig/Loader/Chain.php
@@ -1,151 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Loader\ChainLoader;
 
-/**
- * Loads templates from other loaders.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Loader_Chain implements Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
-{
-    private $hasSourceCache = array();
-    protected $loaders = array();
+class_exists('Twig\Loader\ChainLoader');
 
-    /**
-     * @param Twig_LoaderInterface[] $loaders
-     */
-    public function __construct(array $loaders = array())
-    {
-        foreach ($loaders as $loader) {
-            $this->addLoader($loader);
-        }
-    }
-
-    public function addLoader(Twig_LoaderInterface $loader)
-    {
-        $this->loaders[] = $loader;
-        $this->hasSourceCache = array();
-    }
-
-    public function getSource($name)
-    {
-        @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', get_class($this)), E_USER_DEPRECATED);
-
-        $exceptions = array();
-        foreach ($this->loaders as $loader) {
-            if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) {
-                continue;
-            }
-
-            try {
-                return $loader->getSource($name);
-            } catch (Twig_Error_Loader $e) {
-                $exceptions[] = $e->getMessage();
-            }
-        }
-
-        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
-    }
-
-    public function getSourceContext($name)
-    {
-        $exceptions = array();
-        foreach ($this->loaders as $loader) {
-            if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) {
-                continue;
-            }
-
-            try {
-                if ($loader instanceof Twig_SourceContextLoaderInterface) {
-                    return $loader->getSourceContext($name);
-                }
-
-                return new Twig_Source($loader->getSource($name), $name);
-            } catch (Twig_Error_Loader $e) {
-                $exceptions[] = $e->getMessage();
-            }
-        }
-
-        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
-    }
+@trigger_error(sprintf('Using the "Twig_Loader_Chain" class is deprecated since Twig version 2.7, use "Twig\Loader\ChainLoader" instead.'), E_USER_DEPRECATED);
 
-    public function exists($name)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Loader\ChainLoader" instead */
+    class Twig_Loader_Chain extends ChainLoader
     {
-        $name = (string) $name;
-
-        if (isset($this->hasSourceCache[$name])) {
-            return $this->hasSourceCache[$name];
-        }
-
-        foreach ($this->loaders as $loader) {
-            if ($loader instanceof Twig_ExistsLoaderInterface) {
-                if ($loader->exists($name)) {
-                    return $this->hasSourceCache[$name] = true;
-                }
-
-                continue;
-            }
-
-            try {
-                if ($loader instanceof Twig_SourceContextLoaderInterface) {
-                    $loader->getSourceContext($name);
-                } else {
-                    $loader->getSource($name);
-                }
-
-                return $this->hasSourceCache[$name] = true;
-            } catch (Twig_Error_Loader $e) {
-            }
-        }
-
-        return $this->hasSourceCache[$name] = false;
-    }
-
-    public function getCacheKey($name)
-    {
-        $exceptions = array();
-        foreach ($this->loaders as $loader) {
-            if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) {
-                continue;
-            }
-
-            try {
-                return $loader->getCacheKey($name);
-            } catch (Twig_Error_Loader $e) {
-                $exceptions[] = get_class($loader).': '.$e->getMessage();
-            }
-        }
-
-        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
-    }
-
-    public function isFresh($name, $time)
-    {
-        $exceptions = array();
-        foreach ($this->loaders as $loader) {
-            if ($loader instanceof Twig_ExistsLoaderInterface && !$loader->exists($name)) {
-                continue;
-            }
-
-            try {
-                return $loader->isFresh($name, $time);
-            } catch (Twig_Error_Loader $e) {
-                $exceptions[] = get_class($loader).': '.$e->getMessage();
-            }
-        }
-
-        throw new Twig_Error_Loader(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
     }
 }
-
-class_alias('Twig_Loader_Chain', 'Twig\Loader\ChainLoader', false);
diff --git a/vendor/twig/twig/lib/Twig/Loader/Filesystem.php b/vendor/twig/twig/lib/Twig/Loader/Filesystem.php
index 1275044f..16d4d506 100644
--- a/vendor/twig/twig/lib/Twig/Loader/Filesystem.php
+++ b/vendor/twig/twig/lib/Twig/Loader/Filesystem.php
@@ -1,290 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Loader\FilesystemLoader;
 
-/**
- * Loads template from the filesystem.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Loader_Filesystem implements Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
-{
-    /** Identifier of the main namespace. */
-    const MAIN_NAMESPACE = '__main__';
+class_exists('Twig\Loader\FilesystemLoader');
 
-    protected $paths = array();
-    protected $cache = array();
-    protected $errorCache = array();
+@trigger_error(sprintf('Using the "Twig_Loader_Filesystem" class is deprecated since Twig version 2.7, use "Twig\Loader\FilesystemLoader" instead.'), E_USER_DEPRECATED);
 
-    private $rootPath;
-
-    /**
-     * @param string|array $paths    A path or an array of paths where to look for templates
-     * @param string|null  $rootPath The root path common to all relative paths (null for getcwd())
-     */
-    public function __construct($paths = array(), $rootPath = null)
-    {
-        $this->rootPath = (null === $rootPath ? getcwd() : $rootPath).DIRECTORY_SEPARATOR;
-        if (false !== $realPath = realpath($rootPath)) {
-            $this->rootPath = $realPath.DIRECTORY_SEPARATOR;
-        }
-
-        if ($paths) {
-            $this->setPaths($paths);
-        }
-    }
-
-    /**
-     * Returns the paths to the templates.
-     *
-     * @param string $namespace A path namespace
-     *
-     * @return array The array of paths where to look for templates
-     */
-    public function getPaths($namespace = self::MAIN_NAMESPACE)
-    {
-        return isset($this->paths[$namespace]) ? $this->paths[$namespace] : array();
-    }
-
-    /**
-     * Returns the path namespaces.
-     *
-     * The main namespace is always defined.
-     *
-     * @return array The array of defined namespaces
-     */
-    public function getNamespaces()
-    {
-        return array_keys($this->paths);
-    }
-
-    /**
-     * Sets the paths where templates are stored.
-     *
-     * @param string|array $paths     A path or an array of paths where to look for templates
-     * @param string       $namespace A path namespace
-     */
-    public function setPaths($paths, $namespace = self::MAIN_NAMESPACE)
-    {
-        if (!is_array($paths)) {
-            $paths = array($paths);
-        }
-
-        $this->paths[$namespace] = array();
-        foreach ($paths as $path) {
-            $this->addPath($path, $namespace);
-        }
-    }
-
-    /**
-     * Adds a path where templates are stored.
-     *
-     * @param string $path      A path where to look for templates
-     * @param string $namespace A path namespace
-     *
-     * @throws Twig_Error_Loader
-     */
-    public function addPath($path, $namespace = self::MAIN_NAMESPACE)
-    {
-        // invalidate the cache
-        $this->cache = $this->errorCache = array();
-
-        $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path;
-        if (!is_dir($checkPath)) {
-            throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath));
-        }
-
-        $this->paths[$namespace][] = rtrim($path, '/\\');
-    }
-
-    /**
-     * Prepends a path where templates are stored.
-     *
-     * @param string $path      A path where to look for templates
-     * @param string $namespace A path namespace
-     *
-     * @throws Twig_Error_Loader
-     */
-    public function prependPath($path, $namespace = self::MAIN_NAMESPACE)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Loader\FilesystemLoader" instead */
+    class Twig_Loader_Filesystem extends FilesystemLoader
     {
-        // invalidate the cache
-        $this->cache = $this->errorCache = array();
-
-        $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path;
-        if (!is_dir($checkPath)) {
-            throw new Twig_Error_Loader(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath));
-        }
-
-        $path = rtrim($path, '/\\');
-
-        if (!isset($this->paths[$namespace])) {
-            $this->paths[$namespace][] = $path;
-        } else {
-            array_unshift($this->paths[$namespace], $path);
-        }
-    }
-
-    public function getSource($name)
-    {
-        @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', get_class($this)), E_USER_DEPRECATED);
-
-        return file_get_contents($this->findTemplate($name));
-    }
-
-    public function getSourceContext($name)
-    {
-        $path = $this->findTemplate($name);
-
-        return new Twig_Source(file_get_contents($path), $name, $path);
-    }
-
-    public function getCacheKey($name)
-    {
-        $path = $this->findTemplate($name);
-        $len = strlen($this->rootPath);
-        if (0 === strncmp($this->rootPath, $path, $len)) {
-            return substr($path, $len);
-        }
-
-        return $path;
-    }
-
-    public function exists($name)
-    {
-        $name = $this->normalizeName($name);
-
-        if (isset($this->cache[$name])) {
-            return true;
-        }
-
-        try {
-            return false !== $this->findTemplate($name, false);
-        } catch (Twig_Error_Loader $exception) {
-            @trigger_error(sprintf('In %s::findTemplate(), you must accept a second argument that when set to "false" returns "false" instead of throwing an exception. Not supporting this argument is deprecated since version 1.27.', get_class($this)), E_USER_DEPRECATED);
-
-            return false;
-        }
-    }
-
-    public function isFresh($name, $time)
-    {
-        return filemtime($this->findTemplate($name)) <= $time;
-    }
-
-    protected function findTemplate($name)
-    {
-        $throw = func_num_args() > 1 ? func_get_arg(1) : true;
-        $name = $this->normalizeName($name);
-
-        if (isset($this->cache[$name])) {
-            return $this->cache[$name];
-        }
-
-        if (isset($this->errorCache[$name])) {
-            if (!$throw) {
-                return false;
-            }
-
-            throw new Twig_Error_Loader($this->errorCache[$name]);
-        }
-
-        $this->validateName($name);
-
-        list($namespace, $shortname) = $this->parseName($name);
-
-        if (!isset($this->paths[$namespace])) {
-            $this->errorCache[$name] = sprintf('There are no registered paths for namespace "%s".', $namespace);
-
-            if (!$throw) {
-                return false;
-            }
-
-            throw new Twig_Error_Loader($this->errorCache[$name]);
-        }
-
-        foreach ($this->paths[$namespace] as $path) {
-            if (!$this->isAbsolutePath($path)) {
-                $path = $this->rootPath.'/'.$path;
-            }
-
-            if (is_file($path.'/'.$shortname)) {
-                if (false !== $realpath = realpath($path.'/'.$shortname)) {
-                    return $this->cache[$name] = $realpath;
-                }
-
-                return $this->cache[$name] = $path.'/'.$shortname;
-            }
-        }
-
-        $this->errorCache[$name] = sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace]));
-
-        if (!$throw) {
-            return false;
-        }
-
-        throw new Twig_Error_Loader($this->errorCache[$name]);
-    }
-
-    protected function parseName($name, $default = self::MAIN_NAMESPACE)
-    {
-        if (isset($name[0]) && '@' == $name[0]) {
-            if (false === $pos = strpos($name, '/')) {
-                throw new Twig_Error_Loader(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name));
-            }
-
-            $namespace = substr($name, 1, $pos - 1);
-            $shortname = substr($name, $pos + 1);
-
-            return array($namespace, $shortname);
-        }
-
-        return array($default, $name);
-    }
-
-    protected function normalizeName($name)
-    {
-        return preg_replace('#/{2,}#', '/', str_replace('\\', '/', (string) $name));
-    }
-
-    protected function validateName($name)
-    {
-        if (false !== strpos($name, "\0")) {
-            throw new Twig_Error_Loader('A template name cannot contain NUL bytes.');
-        }
-
-        $name = ltrim($name, '/');
-        $parts = explode('/', $name);
-        $level = 0;
-        foreach ($parts as $part) {
-            if ('..' === $part) {
-                --$level;
-            } elseif ('.' !== $part) {
-                ++$level;
-            }
-
-            if ($level < 0) {
-                throw new Twig_Error_Loader(sprintf('Looks like you try to load a template outside configured directories (%s).', $name));
-            }
-        }
-    }
-
-    private function isAbsolutePath($file)
-    {
-        return strspn($file, '/\\', 0, 1)
-            || (strlen($file) > 3 && ctype_alpha($file[0])
-                && substr($file, 1, 1) === ':'
-                && strspn($file, '/\\', 2, 1)
-            )
-            || null !== parse_url($file, PHP_URL_SCHEME)
-        ;
     }
 }
-
-class_alias('Twig_Loader_Filesystem', 'Twig\Loader\FilesystemLoader', false);
diff --git a/vendor/twig/twig/lib/Twig/Loader/String.php b/vendor/twig/twig/lib/Twig/Loader/String.php
deleted file mode 100644
index 950bd35b..00000000
--- a/vendor/twig/twig/lib/Twig/Loader/String.php
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Loader_String class is deprecated since version 1.18.1 and will be removed in 2.0. Use Twig_Loader_Array instead or Twig_Environment::createTemplate().', E_USER_DEPRECATED);
-
-/**
- * Loads a template from a string.
- *
- * This loader should NEVER be used. It only exists for Twig internal purposes.
- *
- * When using this loader with a cache mechanism, you should know that a new cache
- * key is generated each time a template content "changes" (the cache key being the
- * source code of the template). If you don't want to see your cache grows out of
- * control, you need to take care of clearing the old cache file by yourself.
- *
- * @deprecated since 1.18.1 (to be removed in 2.0)
- *
- * @internal
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Loader_String implements Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
-{
-    public function getSource($name)
-    {
-        @trigger_error(sprintf('Calling "getSource" on "%s" is deprecated since 1.27. Use getSourceContext() instead.', get_class($this)), E_USER_DEPRECATED);
-
-        return $name;
-    }
-
-    public function getSourceContext($name)
-    {
-        return new Twig_Source($name, $name);
-    }
-
-    public function exists($name)
-    {
-        return true;
-    }
-
-    public function getCacheKey($name)
-    {
-        return $name;
-    }
-
-    public function isFresh($name, $time)
-    {
-        return true;
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/LoaderInterface.php b/vendor/twig/twig/lib/Twig/LoaderInterface.php
index 459a70ab..cabd69e3 100644
--- a/vendor/twig/twig/lib/Twig/LoaderInterface.php
+++ b/vendor/twig/twig/lib/Twig/LoaderInterface.php
@@ -1,57 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Loader\LoaderInterface;
 
-/**
- * Interface all loaders must implement.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_LoaderInterface
-{
-    /**
-     * Gets the source code of a template, given its name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The template source code
-     *
-     * @throws Twig_Error_Loader When $name is not found
-     *
-     * @deprecated since 1.27 (to be removed in 2.0), implement Twig_SourceContextLoaderInterface
-     */
-    public function getSource($name);
+class_exists('Twig\Loader\LoaderInterface');
 
-    /**
-     * Gets the cache key to use for the cache for a given template name.
-     *
-     * @param string $name The name of the template to load
-     *
-     * @return string The cache key
-     *
-     * @throws Twig_Error_Loader When $name is not found
-     */
-    public function getCacheKey($name);
+@trigger_error(sprintf('Using the "Twig_LoaderInterface" class is deprecated since Twig version 2.7, use "Twig\Loader\LoaderInterface" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * Returns true if the template is still fresh.
-     *
-     * @param string $name The template name
-     * @param int    $time Timestamp of the last modification time of the
-     *                     cached template
-     *
-     * @return bool true if the template is fresh, false otherwise
-     *
-     * @throws Twig_Error_Loader When $name is not found
-     */
-    public function isFresh($name, $time);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Loader\LoaderInterface" instead */
+    class Twig_LoaderInterface extends LoaderInterface
+    {
+    }
 }
-
-class_alias('Twig_LoaderInterface', 'Twig\Loader\LoaderInterface', false);
diff --git a/vendor/twig/twig/lib/Twig/Markup.php b/vendor/twig/twig/lib/Twig/Markup.php
index 8591d1f9..f6d8eb27 100644
--- a/vendor/twig/twig/lib/Twig/Markup.php
+++ b/vendor/twig/twig/lib/Twig/Markup.php
@@ -1,39 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Markup;
 
-/**
- * Marks a content as safe.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Markup implements Countable
-{
-    protected $content;
-    protected $charset;
+class_exists('Twig\Markup');
 
-    public function __construct($content, $charset)
-    {
-        $this->content = (string) $content;
-        $this->charset = $charset;
-    }
-
-    public function __toString()
-    {
-        return $this->content;
-    }
+@trigger_error(sprintf('Using the "Twig_Markup" class is deprecated since Twig version 2.7, use "Twig\Markup" instead.'), E_USER_DEPRECATED);
 
-    public function count()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Markup" instead */
+    class Twig_Markup extends Markup
     {
-        return function_exists('mb_get_info') ? mb_strlen($this->content, $this->charset) : strlen($this->content);
     }
 }
-
-class_alias('Twig_Markup', 'Twig\Markup', false);
diff --git a/vendor/twig/twig/lib/Twig/Node.php b/vendor/twig/twig/lib/Twig/Node.php
index 89ada144..8b5dc525 100644
--- a/vendor/twig/twig/lib/Twig/Node.php
+++ b/vendor/twig/twig/lib/Twig/Node.php
@@ -1,256 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Node;
 
-/**
- * Represents a node in the AST.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node implements Twig_NodeInterface
-{
-    protected $nodes;
-    protected $attributes;
-    protected $lineno;
-    protected $tag;
+class_exists('Twig\Node\Node');
 
-    private $name;
+@trigger_error(sprintf('Using the "Twig_Node" class is deprecated since Twig version 2.7, use "Twig\Node\Node" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * Constructor.
-     *
-     * The nodes are automatically made available as properties ($this->node).
-     * The attributes are automatically made available as array items ($this['name']).
-     *
-     * @param array  $nodes      An array of named nodes
-     * @param array  $attributes An array of attributes (should not be nodes)
-     * @param int    $lineno     The line number
-     * @param string $tag        The tag name associated with the Node
-     */
-    public function __construct(array $nodes = array(), array $attributes = array(), $lineno = 0, $tag = null)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Node" instead */
+    class Twig_Node extends Node
     {
-        foreach ($nodes as $name => $node) {
-            if (!$node instanceof Twig_NodeInterface) {
-                @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', is_object($node) ? get_class($node) : null === $node ? 'null' : gettype($node), $name, get_class($this)), E_USER_DEPRECATED);
-            }
-        }
-        $this->nodes = $nodes;
-        $this->attributes = $attributes;
-        $this->lineno = $lineno;
-        $this->tag = $tag;
-    }
-
-    public function __toString()
-    {
-        $attributes = array();
-        foreach ($this->attributes as $name => $value) {
-            $attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true)));
-        }
-
-        $repr = array(get_class($this).'('.implode(', ', $attributes));
-
-        if (count($this->nodes)) {
-            foreach ($this->nodes as $name => $node) {
-                $len = strlen($name) + 4;
-                $noderepr = array();
-                foreach (explode("\n", (string) $node) as $line) {
-                    $noderepr[] = str_repeat(' ', $len).$line;
-                }
-
-                $repr[] = sprintf('  %s: %s', $name, ltrim(implode("\n", $noderepr)));
-            }
-
-            $repr[] = ')';
-        } else {
-            $repr[0] .= ')';
-        }
-
-        return implode("\n", $repr);
-    }
-
-    /**
-     * @deprecated since 1.16.1 (to be removed in 2.0)
-     */
-    public function toXml($asDom = false)
-    {
-        @trigger_error(sprintf('%s is deprecated since version 1.16.1 and will be removed in 2.0.', __METHOD__), E_USER_DEPRECATED);
-
-        $dom = new DOMDocument('1.0', 'UTF-8');
-        $dom->formatOutput = true;
-        $dom->appendChild($xml = $dom->createElement('twig'));
-
-        $xml->appendChild($node = $dom->createElement('node'));
-        $node->setAttribute('class', get_class($this));
-
-        foreach ($this->attributes as $name => $value) {
-            $node->appendChild($attribute = $dom->createElement('attribute'));
-            $attribute->setAttribute('name', $name);
-            $attribute->appendChild($dom->createTextNode($value));
-        }
-
-        foreach ($this->nodes as $name => $n) {
-            if (null === $n) {
-                continue;
-            }
-
-            $child = $n->toXml(true)->getElementsByTagName('node')->item(0);
-            $child = $dom->importNode($child, true);
-            $child->setAttribute('name', $name);
-
-            $node->appendChild($child);
-        }
-
-        return $asDom ? $dom : $dom->saveXML();
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        foreach ($this->nodes as $node) {
-            $node->compile($compiler);
-        }
-    }
-
-    public function getTemplateLine()
-    {
-        return $this->lineno;
-    }
-
-    /**
-     * @deprecated since 1.27 (to be removed in 2.0)
-     */
-    public function getLine()
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getTemplateLine() instead.', E_USER_DEPRECATED);
-
-        return $this->lineno;
-    }
-
-    public function getNodeTag()
-    {
-        return $this->tag;
-    }
-
-    /**
-     * @return bool
-     */
-    public function hasAttribute($name)
-    {
-        return array_key_exists($name, $this->attributes);
-    }
-
-    /**
-     * @return mixed
-     */
-    public function getAttribute($name)
-    {
-        if (!array_key_exists($name, $this->attributes)) {
-            throw new LogicException(sprintf('Attribute "%s" does not exist for Node "%s".', $name, get_class($this)));
-        }
-
-        return $this->attributes[$name];
-    }
-
-    /**
-     * @param string $name
-     * @param mixed  $value
-     */
-    public function setAttribute($name, $value)
-    {
-        $this->attributes[$name] = $value;
-    }
-
-    public function removeAttribute($name)
-    {
-        unset($this->attributes[$name]);
-    }
-
-    /**
-     * @return bool
-     */
-    public function hasNode($name)
-    {
-        return array_key_exists($name, $this->nodes);
-    }
-
-    /**
-     * @return Twig_Node
-     */
-    public function getNode($name)
-    {
-        if (!array_key_exists($name, $this->nodes)) {
-            throw new LogicException(sprintf('Node "%s" does not exist for Node "%s".', $name, get_class($this)));
-        }
-
-        return $this->nodes[$name];
-    }
-
-    public function setNode($name, $node = null)
-    {
-        if (!$node instanceof Twig_NodeInterface) {
-            @trigger_error(sprintf('Using "%s" for the value of node "%s" of "%s" is deprecated since version 1.25 and will be removed in 2.0.', is_object($node) ? get_class($node) : null === $node ? 'null' : gettype($node), $name, get_class($this)), E_USER_DEPRECATED);
-        }
-
-        $this->nodes[$name] = $node;
-    }
-
-    public function removeNode($name)
-    {
-        unset($this->nodes[$name]);
-    }
-
-    public function count()
-    {
-        return count($this->nodes);
-    }
-
-    public function getIterator()
-    {
-        return new ArrayIterator($this->nodes);
-    }
-
-    public function setTemplateName($name)
-    {
-        $this->name = $name;
-        foreach ($this->nodes as $node) {
-            if (null !== $node) {
-                $node->setTemplateName($name);
-            }
-        }
-    }
-
-    public function getTemplateName()
-    {
-        return $this->name;
-    }
-
-    /**
-     * @deprecated since 1.27 (to be removed in 2.0)
-     */
-    public function setFilename($name)
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use setTemplateName() instead.', E_USER_DEPRECATED);
-
-        $this->setTemplateName($name);
-    }
-
-    /**
-     * @deprecated since 1.27 (to be removed in 2.0)
-     */
-    public function getFilename()
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getTemplateName() instead.', E_USER_DEPRECATED);
-
-        return $this->name;
     }
 }
-
-class_alias('Twig_Node', 'Twig\Node\Node', false);
-class_exists('Twig_Compiler');
diff --git a/vendor/twig/twig/lib/Twig/Node/AutoEscape.php b/vendor/twig/twig/lib/Twig/Node/AutoEscape.php
index 17e4e381..34006acc 100644
--- a/vendor/twig/twig/lib/Twig/Node/AutoEscape.php
+++ b/vendor/twig/twig/lib/Twig/Node/AutoEscape.php
@@ -1,36 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\AutoEscapeNode;
 
-/**
- * Represents an autoescape node.
- *
- * The value is the escaping strategy (can be html, js, ...)
- *
- * The true value is equivalent to html.
- *
- * If autoescaping is disabled, then the value is false.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_AutoEscape extends Twig_Node
-{
-    public function __construct($value, Twig_NodeInterface $body, $lineno, $tag = 'autoescape')
-    {
-        parent::__construct(array('body' => $body), array('value' => $value), $lineno, $tag);
-    }
+class_exists('Twig\Node\AutoEscapeNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_AutoEscape" class is deprecated since Twig version 2.7, use "Twig\Node\AutoEscapeNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\AutoEscapeNode" instead */
+    class Twig_Node_AutoEscape extends AutoEscapeNode
     {
-        $compiler->subcompile($this->getNode('body'));
     }
 }
-
-class_alias('Twig_Node_AutoEscape', 'Twig\Node\AutoEscapeNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Block.php b/vendor/twig/twig/lib/Twig/Node/Block.php
index 91752ad2..51f6ff80 100644
--- a/vendor/twig/twig/lib/Twig/Node/Block.php
+++ b/vendor/twig/twig/lib/Twig/Node/Block.php
@@ -1,41 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\BlockNode;
 
-/**
- * Represents a block node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Block extends Twig_Node
-{
-    public function __construct($name, Twig_NodeInterface $body, $lineno, $tag = null)
-    {
-        parent::__construct(array('body' => $body), array('name' => $name), $lineno, $tag);
-    }
+class_exists('Twig\Node\BlockNode');
 
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write(sprintf("public function block_%s(\$context, array \$blocks = array())\n", $this->getAttribute('name')), "{\n")
-            ->indent()
-        ;
+@trigger_error(sprintf('Using the "Twig_Node_Block" class is deprecated since Twig version 2.7, use "Twig\Node\BlockNode" instead.'), E_USER_DEPRECATED);
 
-        $compiler
-            ->subcompile($this->getNode('body'))
-            ->outdent()
-            ->write("}\n\n")
-        ;
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\BlockNode" instead */
+    class Twig_Node_Block extends BlockNode
+    {
     }
 }
-
-class_alias('Twig_Node_Block', 'Twig\Node\BlockNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/BlockReference.php b/vendor/twig/twig/lib/Twig/Node/BlockReference.php
index 92a9f398..3e729a08 100644
--- a/vendor/twig/twig/lib/Twig/Node/BlockReference.php
+++ b/vendor/twig/twig/lib/Twig/Node/BlockReference.php
@@ -1,34 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\BlockReferenceNode;
 
-/**
- * Represents a block call node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_BlockReference extends Twig_Node implements Twig_NodeOutputInterface
-{
-    public function __construct($name, $lineno, $tag = null)
-    {
-        parent::__construct(array(), array('name' => $name), $lineno, $tag);
-    }
+class_exists('Twig\Node\BlockReferenceNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_BlockReference" class is deprecated since Twig version 2.7, use "Twig\Node\BlockReferenceNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\BlockReferenceNode" instead */
+    class Twig_Node_BlockReference extends BlockReferenceNode
     {
-        $compiler
-            ->addDebugInfo($this)
-            ->write(sprintf("\$this->displayBlock('%s', \$context, \$blocks);\n", $this->getAttribute('name')))
-        ;
     }
 }
-
-class_alias('Twig_Node_BlockReference', 'Twig\Node\BlockReferenceNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Body.php b/vendor/twig/twig/lib/Twig/Node/Body.php
index 07dfef8b..e8e6042f 100644
--- a/vendor/twig/twig/lib/Twig/Node/Body.php
+++ b/vendor/twig/twig/lib/Twig/Node/Body.php
@@ -1,21 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\BodyNode;
 
-/**
- * Represents a body node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Body extends Twig_Node
-{
-}
+class_exists('Twig\Node\BodyNode');
+
+@trigger_error(sprintf('Using the "Twig_Node_Body" class is deprecated since Twig version 2.7, use "Twig\Node\BodyNode" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_Node_Body', 'Twig\Node\BodyNode', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\BodyNode" instead */
+    class Twig_Node_Body extends BodyNode
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php b/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php
index 7258acb6..efc5f1aa 100644
--- a/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php
+++ b/vendor/twig/twig/lib/Twig/Node/CheckSecurity.php
@@ -1,80 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\CheckSecurityNode;
 
-/**
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_CheckSecurity extends Twig_Node
-{
-    protected $usedFilters;
-    protected $usedTags;
-    protected $usedFunctions;
+class_exists('Twig\Node\CheckSecurityNode');
 
-    public function __construct(array $usedFilters, array $usedTags, array $usedFunctions)
-    {
-        $this->usedFilters = $usedFilters;
-        $this->usedTags = $usedTags;
-        $this->usedFunctions = $usedFunctions;
-
-        parent::__construct();
-    }
+@trigger_error(sprintf('Using the "Twig_Node_CheckSecurity" class is deprecated since Twig version 2.7, use "Twig\Node\CheckSecurityNode" instead.'), E_USER_DEPRECATED);
 
-    public function compile(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\CheckSecurityNode" instead */
+    class Twig_Node_CheckSecurity extends CheckSecurityNode
     {
-        $tags = $filters = $functions = array();
-        foreach (array('tags', 'filters', 'functions') as $type) {
-            foreach ($this->{'used'.ucfirst($type)} as $name => $node) {
-                if ($node instanceof Twig_Node) {
-                    ${$type}[$name] = $node->getTemplateLine();
-                } else {
-                    ${$type}[$node] = null;
-                }
-            }
-        }
-
-        $compiler
-            ->write('$tags = ')->repr(array_filter($tags))->raw(";\n")
-            ->write('$filters = ')->repr(array_filter($filters))->raw(";\n")
-            ->write('$functions = ')->repr(array_filter($functions))->raw(";\n\n")
-            ->write("try {\n")
-            ->indent()
-            ->write("\$this->env->getExtension('Twig_Extension_Sandbox')->checkSecurity(\n")
-            ->indent()
-            ->write(!$tags ? "array(),\n" : "array('".implode("', '", array_keys($tags))."'),\n")
-            ->write(!$filters ? "array(),\n" : "array('".implode("', '", array_keys($filters))."'),\n")
-            ->write(!$functions ? "array()\n" : "array('".implode("', '", array_keys($functions))."')\n")
-            ->outdent()
-            ->write(");\n")
-            ->outdent()
-            ->write("} catch (Twig_Sandbox_SecurityError \$e) {\n")
-            ->indent()
-            ->write("\$e->setSourceContext(\$this->getSourceContext());\n\n")
-            ->write("if (\$e instanceof Twig_Sandbox_SecurityNotAllowedTagError && isset(\$tags[\$e->getTagName()])) {\n")
-            ->indent()
-            ->write("\$e->setTemplateLine(\$tags[\$e->getTagName()]);\n")
-            ->outdent()
-            ->write("} elseif (\$e instanceof Twig_Sandbox_SecurityNotAllowedFilterError && isset(\$filters[\$e->getFilterName()])) {\n")
-            ->indent()
-            ->write("\$e->setTemplateLine(\$filters[\$e->getFilterName()]);\n")
-            ->outdent()
-            ->write("} elseif (\$e instanceof Twig_Sandbox_SecurityNotAllowedFunctionError && isset(\$functions[\$e->getFunctionName()])) {\n")
-            ->indent()
-            ->write("\$e->setTemplateLine(\$functions[\$e->getFunctionName()]);\n")
-            ->outdent()
-            ->write("}\n\n")
-            ->write("throw \$e;\n")
-            ->outdent()
-            ->write("}\n\n")
-        ;
     }
 }
-
-class_alias('Twig_Node_CheckSecurity', 'Twig\Node\CheckSecurityNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Deprecated.php b/vendor/twig/twig/lib/Twig/Node/Deprecated.php
new file mode 100644
index 00000000..70af6f2a
--- /dev/null
+++ b/vendor/twig/twig/lib/Twig/Node/Deprecated.php
@@ -0,0 +1,14 @@
+<?php
+
+use Twig\Node\DeprecatedNode;
+
+class_exists('Twig\Node\DeprecatedNode');
+
+@trigger_error(sprintf('Using the "Twig_Node_Deprecated" class is deprecated since Twig version 2.7, use "Twig\Node\DeprecatedNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\DeprecatedNode" instead */
+    class Twig_Node_Deprecated extends DeprecatedNode
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/Node/Do.php b/vendor/twig/twig/lib/Twig/Node/Do.php
index cdd7e77a..70267a22 100644
--- a/vendor/twig/twig/lib/Twig/Node/Do.php
+++ b/vendor/twig/twig/lib/Twig/Node/Do.php
@@ -1,35 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\DoNode;
 
-/**
- * Represents a do node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Do extends Twig_Node
-{
-    public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
-    {
-        parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
-    }
+class_exists('Twig\Node\DoNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Do" class is deprecated since Twig version 2.7, use "Twig\Node\DoNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\DoNode" instead */
+    class Twig_Node_Do extends DoNode
     {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('')
-            ->subcompile($this->getNode('expr'))
-            ->raw(";\n")
-        ;
     }
 }
-
-class_alias('Twig_Node_Do', 'Twig\Node\DoNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Embed.php b/vendor/twig/twig/lib/Twig/Node/Embed.php
index 3785d3a9..0b7f205a 100644
--- a/vendor/twig/twig/lib/Twig/Node/Embed.php
+++ b/vendor/twig/twig/lib/Twig/Node/Embed.php
@@ -1,46 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\EmbedNode;
 
-/**
- * Represents an embed node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Embed extends Twig_Node_Include
-{
-    // we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module)
-    public function __construct($name, $index, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
-    {
-        parent::__construct(new Twig_Node_Expression_Constant('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag);
+class_exists('Twig\Node\EmbedNode');
 
-        $this->setAttribute('name', $name);
-        // to be removed in 2.0, used name instead
-        $this->setAttribute('filename', $name);
-        $this->setAttribute('index', $index);
-    }
+@trigger_error(sprintf('Using the "Twig_Node_Embed" class is deprecated since Twig version 2.7, use "Twig\Node\EmbedNode" instead.'), E_USER_DEPRECATED);
 
-    protected function addGetTemplate(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\EmbedNode" instead */
+    class Twig_Node_Embed extends EmbedNode
     {
-        $compiler
-            ->write('$this->loadTemplate(')
-            ->string($this->getAttribute('name'))
-            ->raw(', ')
-            ->repr($this->getTemplateName())
-            ->raw(', ')
-            ->repr($this->getTemplateLine())
-            ->raw(', ')
-            ->string($this->getAttribute('index'))
-            ->raw(')')
-        ;
     }
 }
-
-class_alias('Twig_Node_Embed', 'Twig\Node\EmbedNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression.php b/vendor/twig/twig/lib/Twig/Node/Expression.php
index a99c4e63..2b465cc4 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression.php
@@ -1,22 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\AbstractExpression;
 
-/**
- * Abstract class for all nodes that represents an expression.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-abstract class Twig_Node_Expression extends Twig_Node
-{
-}
+class_exists('Twig\Node\Expression\AbstractExpression');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\AbstractExpression" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_Node_Expression', 'Twig\Node\Expression\AbstractExpression', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\AbstractExpression" instead */
+    class Twig_Node_Expression extends AbstractExpression
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Array.php b/vendor/twig/twig/lib/Twig/Node/Expression/Array.php
index 0e77bb08..033aafa9 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Array.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Array.php
@@ -1,83 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Array extends Twig_Node_Expression
-{
-    protected $index;
+use Twig\Node\Expression\ArrayExpression;
 
-    public function __construct(array $elements, $lineno)
-    {
-        parent::__construct($elements, array(), $lineno);
+class_exists('Twig\Node\Expression\ArrayExpression');
 
-        $this->index = -1;
-        foreach ($this->getKeyValuePairs() as $pair) {
-            if ($pair['key'] instanceof Twig_Node_Expression_Constant && ctype_digit((string) $pair['key']->getAttribute('value')) && $pair['key']->getAttribute('value') > $this->index) {
-                $this->index = $pair['key']->getAttribute('value');
-            }
-        }
-    }
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Array" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\ArrayExpression" instead.'), E_USER_DEPRECATED);
 
-    public function getKeyValuePairs()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\ArrayExpression" instead */
+    class Twig_Node_Expression_Array extends ArrayExpression
     {
-        $pairs = array();
-
-        foreach (array_chunk($this->nodes, 2) as $pair) {
-            $pairs[] = array(
-                'key' => $pair[0],
-                'value' => $pair[1],
-            );
-        }
-
-        return $pairs;
-    }
-
-    public function hasElement(Twig_Node_Expression $key)
-    {
-        foreach ($this->getKeyValuePairs() as $pair) {
-            // we compare the string representation of the keys
-            // to avoid comparing the line numbers which are not relevant here.
-            if ((string) $key === (string) $pair['key']) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public function addElement(Twig_Node_Expression $value, Twig_Node_Expression $key = null)
-    {
-        if (null === $key) {
-            $key = new Twig_Node_Expression_Constant(++$this->index, $value->getTemplateLine());
-        }
-
-        array_push($this->nodes, $key, $value);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->raw('array(');
-        $first = true;
-        foreach ($this->getKeyValuePairs() as $pair) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $first = false;
-
-            $compiler
-                ->subcompile($pair['key'])
-                ->raw(' => ')
-                ->subcompile($pair['value'])
-            ;
-        }
-        $compiler->raw(')');
     }
 }
-
-class_alias('Twig_Node_Expression_Array', 'Twig\Node\Expression\ArrayExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php b/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php
index 2e6b4c7c..e359407c 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/AssignName.php
@@ -1,25 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\AssignNameExpression;
 
-class Twig_Node_Expression_AssignName extends Twig_Node_Expression_Name
-{
-    public function compile(Twig_Compiler $compiler)
+class_exists('Twig\Node\Expression\AssignNameExpression');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_AssignName" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\AssignNameExpression" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\AssignNameExpression" instead */
+    class Twig_Node_Expression_AssignName extends AssignNameExpression
     {
-        $compiler
-            ->raw('$context[')
-            ->string($this->getAttribute('name'))
-            ->raw(']')
-        ;
     }
 }
-
-class_alias('Twig_Node_Expression_AssignName', 'Twig\Node\Expression\AssignNameExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php
index 2b545d98..3314d652 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary.php
@@ -1,37 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-abstract class Twig_Node_Expression_Binary extends Twig_Node_Expression
-{
-    public function __construct(Twig_NodeInterface $left, Twig_NodeInterface $right, $lineno)
-    {
-        parent::__construct(array('left' => $left, 'right' => $right), array(), $lineno);
-    }
+use Twig\Node\Expression\Binary\AbstractBinary;
+
+class_exists('Twig\Node\Expression\Binary\AbstractBinary');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\AbstractBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\AbstractBinary" instead */
+    class Twig_Node_Expression_Binary extends AbstractBinary
     {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('left'))
-            ->raw(' ')
-        ;
-        $this->operator($compiler);
-        $compiler
-            ->raw(' ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
     }
-
-    abstract public function operator(Twig_Compiler $compiler);
 }
-
-class_alias('Twig_Node_Expression_Binary', 'Twig\Node\Expression\Binary\AbstractBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php
index 5a09d836..3c683a65 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Add.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Add extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\AddBinary;
+
+class_exists('Twig\Node\Expression\Binary\AddBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Add" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\AddBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\AddBinary" instead */
+    class Twig_Node_Expression_Binary_Add extends AddBinary
     {
-        return $compiler->raw('+');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Add', 'Twig\Node\Expression\Binary\AddBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php
index 9ffddce6..4c26aedc 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/And.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_And extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\AndBinary;
+
+class_exists('Twig\Node\Expression\Binary\AndBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_And" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\AndBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\AndBinary" instead */
+    class Twig_Node_Expression_Binary_And extends AndBinary
     {
-        return $compiler->raw('&&');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_And', 'Twig\Node\Expression\Binary\AndBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php
index e46e9ebf..ba93ed77 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseAnd.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_BitwiseAnd extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\BitwiseAndBinary;
+
+class_exists('Twig\Node\Expression\Binary\BitwiseAndBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_BitwiseAnd" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\BitwiseAndBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\BitwiseAndBinary" instead */
+    class Twig_Node_Expression_Binary_BitwiseAnd extends BitwiseAndBinary
     {
-        return $compiler->raw('&');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_BitwiseAnd', 'Twig\Node\Expression\Binary\BitwiseAndBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php
index 5d7f1b7c..a87e4f58 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseOr.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_BitwiseOr extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\BitwiseOrBinary;
+
+class_exists('Twig\Node\Expression\Binary\BitwiseOrBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_BitwiseOr" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\BitwiseOrBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\BitwiseOrBinary" instead */
+    class Twig_Node_Expression_Binary_BitwiseOr extends BitwiseOrBinary
     {
-        return $compiler->raw('|');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_BitwiseOr', 'Twig\Node\Expression\Binary\BitwiseOrBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php
index 82edf516..ac35fde8 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/BitwiseXor.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_BitwiseXor extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\BitwiseXorBinary;
+
+class_exists('Twig\Node\Expression\Binary\BitwiseXorBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_BitwiseXor" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\BitwiseXorBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\BitwiseXorBinary" instead */
+    class Twig_Node_Expression_Binary_BitwiseXor extends BitwiseXorBinary
     {
-        return $compiler->raw('^');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_BitwiseXor', 'Twig\Node\Expression\Binary\BitwiseXorBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php
index 91abca60..29c69972 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Concat.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Concat extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\ConcatBinary;
+
+class_exists('Twig\Node\Expression\Binary\ConcatBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Concat" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\ConcatBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\ConcatBinary" instead */
+    class Twig_Node_Expression_Binary_Concat extends ConcatBinary
     {
-        return $compiler->raw('.');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Concat', 'Twig\Node\Expression\Binary\ConcatBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php
index 38ffa30c..1c0e8843 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Div.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Div extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\DivBinary;
+
+class_exists('Twig\Node\Expression\Binary\DivBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Div" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\DivBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\DivBinary" instead */
+    class Twig_Node_Expression_Binary_Div extends DivBinary
     {
-        return $compiler->raw('/');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Div', 'Twig\Node\Expression\Binary\DivBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php
index 85c52937..0c590661 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/EndsWith.php
@@ -1,32 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_EndsWith extends Twig_Node_Expression_Binary
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $left = $compiler->getVarName();
-        $right = $compiler->getVarName();
-        $compiler
-            ->raw(sprintf('(is_string($%s = ', $left))
-            ->subcompile($this->getNode('left'))
-            ->raw(sprintf(') && is_string($%s = ', $right))
-            ->subcompile($this->getNode('right'))
-            ->raw(sprintf(') && (\'\' === $%2$s || $%2$s === substr($%1$s, -strlen($%2$s))))', $left, $right))
-        ;
-    }
+use Twig\Node\Expression\Binary\EndsWithBinary;
+
+class_exists('Twig\Node\Expression\Binary\EndsWithBinary');
 
-    public function operator(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_EndsWith" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\EndsWithBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\EndsWithBinary" instead */
+    class Twig_Node_Expression_Binary_EndsWith extends EndsWithBinary
     {
-        return $compiler->raw('');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_EndsWith', 'Twig\Node\Expression\Binary\EndsWithBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php
index a6a6946b..2f27be4b 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Equal.php
@@ -1,19 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Equal extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\EqualBinary;
+
+class_exists('Twig\Node\Expression\Binary\EqualBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Equal" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\EqualBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\EqualBinary" instead */
+    class Twig_Node_Expression_Binary_Equal extends EqualBinary
     {
-        return $compiler->raw('==');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Equal', 'Twig\Node\Expression\Binary\EqualBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php
index 7393bcb8..93590b6b 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/FloorDiv.php
@@ -1,26 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_FloorDiv extends Twig_Node_Expression_Binary
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->raw('(int) floor(');
-        parent::compile($compiler);
-        $compiler->raw(')');
-    }
+use Twig\Node\Expression\Binary\FloorDivBinary;
+
+class_exists('Twig\Node\Expression\Binary\FloorDivBinary');
 
-    public function operator(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_FloorDiv" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\FloorDivBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\FloorDivBinary" instead */
+    class Twig_Node_Expression_Binary_FloorDiv extends FloorDivBinary
     {
-        return $compiler->raw('/');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_FloorDiv', 'Twig\Node\Expression\Binary\FloorDivBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php
index 832f9797..7083b1c5 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Greater.php
@@ -1,19 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Greater extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\GreaterBinary;
+
+class_exists('Twig\Node\Expression\Binary\GreaterBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Greater" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\GreaterBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\GreaterBinary" instead */
+    class Twig_Node_Expression_Binary_Greater extends GreaterBinary
     {
-        return $compiler->raw('>');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Greater', 'Twig\Node\Expression\Binary\GreaterBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php
index c5f76245..6ef32b85 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/GreaterEqual.php
@@ -1,19 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_GreaterEqual extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\GreaterEqualBinary;
+
+class_exists('Twig\Node\Expression\Binary\GreaterEqualBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_GreaterEqual" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\GreaterEqualBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\GreaterEqualBinary" instead */
+    class Twig_Node_Expression_Binary_GreaterEqual extends GreaterEqualBinary
     {
-        return $compiler->raw('>=');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_GreaterEqual', 'Twig\Node\Expression\Binary\GreaterEqualBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php
index af112448..57aa1657 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/In.php
@@ -1,30 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_In extends Twig_Node_Expression_Binary
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('twig_in_filter(')
-            ->subcompile($this->getNode('left'))
-            ->raw(', ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
-    }
+use Twig\Node\Expression\Binary\InBinary;
+
+class_exists('Twig\Node\Expression\Binary\InBinary');
 
-    public function operator(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_In" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\InBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\InBinary" instead */
+    class Twig_Node_Expression_Binary_In extends InBinary
     {
-        return $compiler->raw('in');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_In', 'Twig\Node\Expression\Binary\InBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php
index ab8fc1f9..586813bd 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Less.php
@@ -1,19 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Less extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\LessBinary;
+
+class_exists('Twig\Node\Expression\Binary\LessBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Less" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\LessBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\LessBinary" instead */
+    class Twig_Node_Expression_Binary_Less extends LessBinary
     {
-        return $compiler->raw('<');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Less', 'Twig\Node\Expression\Binary\LessBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php
index 71a279e9..d3358798 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/LessEqual.php
@@ -1,19 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_LessEqual extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\LessEqualBinary;
+
+class_exists('Twig\Node\Expression\Binary\LessEqualBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_LessEqual" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\LessEqualBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\LessEqualBinary" instead */
+    class Twig_Node_Expression_Binary_LessEqual extends LessEqualBinary
     {
-        return $compiler->raw('<=');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_LessEqual', 'Twig\Node\Expression\Binary\LessEqualBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php
index 5cb85584..4b3df029 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Matches.php
@@ -1,30 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Matches extends Twig_Node_Expression_Binary
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('preg_match(')
-            ->subcompile($this->getNode('right'))
-            ->raw(', ')
-            ->subcompile($this->getNode('left'))
-            ->raw(')')
-        ;
-    }
+use Twig\Node\Expression\Binary\MatchesBinary;
+
+class_exists('Twig\Node\Expression\Binary\MatchesBinary');
 
-    public function operator(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Matches" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\MatchesBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\MatchesBinary" instead */
+    class Twig_Node_Expression_Binary_Matches extends MatchesBinary
     {
-        return $compiler->raw('');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Matches', 'Twig\Node\Expression\Binary\MatchesBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php
index 28109633..9bea824b 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mod.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Mod extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\ModBinary;
+
+class_exists('Twig\Node\Expression\Binary\ModBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Mod" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\ModBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\ModBinary" instead */
+    class Twig_Node_Expression_Binary_Mod extends ModBinary
     {
-        return $compiler->raw('%');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Mod', 'Twig\Node\Expression\Binary\ModBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php
index 790c6a22..0a831ac5 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Mul.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Mul extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\MulBinary;
+
+class_exists('Twig\Node\Expression\Binary\MulBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Mul" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\MulBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\MulBinary" instead */
+    class Twig_Node_Expression_Binary_Mul extends MulBinary
     {
-        return $compiler->raw('*');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Mul', 'Twig\Node\Expression\Binary\MulBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php
index bb45c9ed..fcb1d3d2 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotEqual.php
@@ -1,19 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_NotEqual extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\NotEqualBinary;
+
+class_exists('Twig\Node\Expression\Binary\NotEqualBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_NotEqual" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\NotEqualBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\NotEqualBinary" instead */
+    class Twig_Node_Expression_Binary_NotEqual extends NotEqualBinary
     {
-        return $compiler->raw('!=');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_NotEqual', 'Twig\Node\Expression\Binary\NotEqualBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php
index 9dedf92f..49a88a5b 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/NotIn.php
@@ -1,30 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_NotIn extends Twig_Node_Expression_Binary
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('!twig_in_filter(')
-            ->subcompile($this->getNode('left'))
-            ->raw(', ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
-    }
+use Twig\Node\Expression\Binary\NotInBinary;
+
+class_exists('Twig\Node\Expression\Binary\NotInBinary');
 
-    public function operator(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_NotIn" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\NotInBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\NotInBinary" instead */
+    class Twig_Node_Expression_Binary_NotIn extends NotInBinary
     {
-        return $compiler->raw('not in');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_NotIn', 'Twig\Node\Expression\Binary\NotInBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php
index dc9eece1..a5a28058 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Or.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Or extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\OrBinary;
+
+class_exists('Twig\Node\Expression\Binary\OrBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Or" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\OrBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\OrBinary" instead */
+    class Twig_Node_Expression_Binary_Or extends OrBinary
     {
-        return $compiler->raw('||');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Or', 'Twig\Node\Expression\Binary\OrBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php
index d24777bd..5785637a 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Power.php
@@ -1,34 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Power extends Twig_Node_Expression_Binary
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        if (PHP_VERSION_ID >= 50600) {
-            return parent::compile($compiler);
-        }
+use Twig\Node\Expression\Binary\PowerBinary;
 
-        $compiler
-            ->raw('pow(')
-            ->subcompile($this->getNode('left'))
-            ->raw(', ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
-    }
+class_exists('Twig\Node\Expression\Binary\PowerBinary');
 
-    public function operator(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Power" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\PowerBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\PowerBinary" instead */
+    class Twig_Node_Expression_Binary_Power extends PowerBinary
     {
-        return $compiler->raw('**');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Power', 'Twig\Node\Expression\Binary\PowerBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php
index 187f6765..a416a514 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Range.php
@@ -1,30 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Range extends Twig_Node_Expression_Binary
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('range(')
-            ->subcompile($this->getNode('left'))
-            ->raw(', ')
-            ->subcompile($this->getNode('right'))
-            ->raw(')')
-        ;
-    }
+use Twig\Node\Expression\Binary\RangeBinary;
+
+class_exists('Twig\Node\Expression\Binary\RangeBinary');
 
-    public function operator(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Range" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\RangeBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\RangeBinary" instead */
+    class Twig_Node_Expression_Binary_Range extends RangeBinary
     {
-        return $compiler->raw('..');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Range', 'Twig\Node\Expression\Binary\RangeBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php
index 7e43b8de..366c65a9 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/StartsWith.php
@@ -1,32 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_StartsWith extends Twig_Node_Expression_Binary
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $left = $compiler->getVarName();
-        $right = $compiler->getVarName();
-        $compiler
-            ->raw(sprintf('(is_string($%s = ', $left))
-            ->subcompile($this->getNode('left'))
-            ->raw(sprintf(') && is_string($%s = ', $right))
-            ->subcompile($this->getNode('right'))
-            ->raw(sprintf(') && (\'\' === $%2$s || 0 === strpos($%1$s, $%2$s)))', $left, $right))
-        ;
-    }
+use Twig\Node\Expression\Binary\StartsWithBinary;
+
+class_exists('Twig\Node\Expression\Binary\StartsWithBinary');
 
-    public function operator(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_StartsWith" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\StartsWithBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\StartsWithBinary" instead */
+    class Twig_Node_Expression_Binary_StartsWith extends StartsWithBinary
     {
-        return $compiler->raw('');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_StartsWith', 'Twig\Node\Expression\Binary\StartsWithBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php
index cff8ed07..5bb252ae 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Binary/Sub.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Binary_Sub extends Twig_Node_Expression_Binary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Binary\SubBinary;
+
+class_exists('Twig\Node\Expression\Binary\SubBinary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Binary_Sub" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Binary\SubBinary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Binary\SubBinary" instead */
+    class Twig_Node_Expression_Binary_Sub extends SubBinary
     {
-        return $compiler->raw('-');
     }
 }
-
-class_alias('Twig_Node_Expression_Binary_Sub', 'Twig\Node\Expression\Binary\SubBinary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php b/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php
index 37a3983d..8cd2cec7 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/BlockReference.php
@@ -1,93 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\BlockReferenceExpression;
 
-/**
- * Represents a block call node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_BlockReference extends Twig_Node_Expression
-{
-    /**
-     * @param Twig_Node|null $template
-     */
-    public function __construct(Twig_NodeInterface $name, $template = null, $lineno, $tag = null)
-    {
-        if (is_bool($template)) {
-            @trigger_error(sprintf('The %s method "$asString" argument is deprecated since version 1.28 and will be removed in 2.0.', __METHOD__), E_USER_DEPRECATED);
-
-            $template = null;
-        }
-
-        $nodes = array('name' => $name);
-        if (null !== $template) {
-            $nodes['template'] = $template;
-        }
-
-        parent::__construct($nodes, array('is_defined_test' => false, 'output' => false), $lineno, $tag);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        if ($this->getAttribute('is_defined_test')) {
-            $this->compileTemplateCall($compiler, 'hasBlock');
-        } else {
-            if ($this->getAttribute('output')) {
-                $compiler->addDebugInfo($this);
-
-                $this
-                    ->compileTemplateCall($compiler, 'displayBlock')
-                    ->raw(";\n");
-            } else {
-                $this->compileTemplateCall($compiler, 'renderBlock');
-            }
-        }
-    }
-
-    private function compileTemplateCall(Twig_Compiler $compiler, $method)
-    {
-        if (!$this->hasNode('template')) {
-            $compiler->write('$this');
-        } else {
-            $compiler
-                ->write('$this->loadTemplate(')
-                ->subcompile($this->getNode('template'))
-                ->raw(', ')
-                ->repr($this->getTemplateName())
-                ->raw(', ')
-                ->repr($this->getTemplateLine())
-                ->raw(')')
-            ;
-        }
-
-        $compiler->raw(sprintf('->%s', $method));
-        $this->compileBlockArguments($compiler);
+class_exists('Twig\Node\Expression\BlockReferenceExpression');
 
-        return $compiler;
-    }
+@trigger_error(sprintf('Using the "Twig_Node_Expression_BlockReference" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\BlockReferenceExpression" instead.'), E_USER_DEPRECATED);
 
-    private function compileBlockArguments(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\BlockReferenceExpression" instead */
+    class Twig_Node_Expression_BlockReference extends BlockReferenceExpression
     {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('name'))
-            ->raw(', $context');
-
-        if (!$this->hasNode('template')) {
-            $compiler->raw(', $blocks');
-        }
-
-        return $compiler->raw(')');
     }
 }
-
-class_alias('Twig_Node_Expression_BlockReference', 'Twig\Node\Expression\BlockReferenceExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Call.php b/vendor/twig/twig/lib/Twig/Node/Expression/Call.php
index d962b6a5..14fa474a 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Call.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Call.php
@@ -1,291 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-abstract class Twig_Node_Expression_Call extends Twig_Node_Expression
-{
-    private $reflector;
+use Twig\Node\Expression\CallExpression;
 
-    protected function compileCallable(Twig_Compiler $compiler)
-    {
-        $closingParenthesis = false;
-        if ($this->hasAttribute('callable') && $callable = $this->getAttribute('callable')) {
-            if (is_string($callable) && false === strpos($callable, '::')) {
-                $compiler->raw($callable);
-            } else {
-                list($r, $callable) = $this->reflectCallable($callable);
-                if ($r instanceof ReflectionMethod && is_string($callable[0])) {
-                    if ($r->isStatic()) {
-                        $compiler->raw(sprintf('%s::%s', $callable[0], $callable[1]));
-                    } else {
-                        $compiler->raw(sprintf('$this->env->getRuntime(\'%s\')->%s', $callable[0], $callable[1]));
-                    }
-                } elseif ($r instanceof ReflectionMethod && $callable[0] instanceof Twig_ExtensionInterface) {
-                    $compiler->raw(sprintf('$this->env->getExtension(\'%s\')->%s', get_class($callable[0]), $callable[1]));
-                } else {
-                    $type = ucfirst($this->getAttribute('type'));
-                    $compiler->raw(sprintf('call_user_func_array($this->env->get%s(\'%s\')->getCallable(), array', $type, $this->getAttribute('name')));
-                    $closingParenthesis = true;
-                }
-            }
-        } else {
-            $compiler->raw($this->getAttribute('thing')->compile());
-        }
-
-        $this->compileArguments($compiler);
-
-        if ($closingParenthesis) {
-            $compiler->raw(')');
-        }
-    }
-
-    protected function compileArguments(Twig_Compiler $compiler)
-    {
-        $compiler->raw('(');
-
-        $first = true;
-
-        if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
-            $compiler->raw('$this->env');
-            $first = false;
-        }
-
-        if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $compiler->raw('$context');
-            $first = false;
-        }
-
-        if ($this->hasAttribute('arguments')) {
-            foreach ($this->getAttribute('arguments') as $argument) {
-                if (!$first) {
-                    $compiler->raw(', ');
-                }
-                $compiler->string($argument);
-                $first = false;
-            }
-        }
-
-        if ($this->hasNode('node')) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $compiler->subcompile($this->getNode('node'));
-            $first = false;
-        }
-
-        if ($this->hasNode('arguments')) {
-            $callable = $this->hasAttribute('callable') ? $this->getAttribute('callable') : null;
-
-            $arguments = $this->getArguments($callable, $this->getNode('arguments'));
-
-            foreach ($arguments as $node) {
-                if (!$first) {
-                    $compiler->raw(', ');
-                }
-                $compiler->subcompile($node);
-                $first = false;
-            }
-        }
-
-        $compiler->raw(')');
-    }
-
-    protected function getArguments($callable, $arguments)
-    {
-        $callType = $this->getAttribute('type');
-        $callName = $this->getAttribute('name');
-
-        $parameters = array();
-        $named = false;
-        foreach ($arguments as $name => $node) {
-            if (!is_int($name)) {
-                $named = true;
-                $name = $this->normalizeName($name);
-            } elseif ($named) {
-                throw new Twig_Error_Syntax(sprintf('Positional arguments cannot be used after named arguments for %s "%s".', $callType, $callName));
-            }
-
-            $parameters[$name] = $node;
-        }
-
-        $isVariadic = $this->hasAttribute('is_variadic') && $this->getAttribute('is_variadic');
-        if (!$named && !$isVariadic) {
-            return $parameters;
-        }
-
-        if (!$callable) {
-            if ($named) {
-                $message = sprintf('Named arguments are not supported for %s "%s".', $callType, $callName);
-            } else {
-                $message = sprintf('Arbitrary positional arguments are not supported for %s "%s".', $callType, $callName);
-            }
+class_exists('Twig\Node\Expression\CallExpression');
 
-            throw new LogicException($message);
-        }
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Call" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\CallExpression" instead.'), E_USER_DEPRECATED);
 
-        $callableParameters = $this->getCallableParameters($callable, $isVariadic);
-        $arguments = array();
-        $names = array();
-        $missingArguments = array();
-        $optionalArguments = array();
-        $pos = 0;
-        foreach ($callableParameters as $callableParameter) {
-            $names[] = $name = $this->normalizeName($callableParameter->name);
-
-            if (array_key_exists($name, $parameters)) {
-                if (array_key_exists($pos, $parameters)) {
-                    throw new Twig_Error_Syntax(sprintf('Argument "%s" is defined twice for %s "%s".', $name, $callType, $callName));
-                }
-
-                if (count($missingArguments)) {
-                    throw new Twig_Error_Syntax(sprintf(
-                        'Argument "%s" could not be assigned for %s "%s(%s)" because it is mapped to an internal PHP function which cannot determine default value for optional argument%s "%s".',
-                        $name, $callType, $callName, implode(', ', $names), count($missingArguments) > 1 ? 's' : '', implode('", "', $missingArguments))
-                    );
-                }
-
-                $arguments = array_merge($arguments, $optionalArguments);
-                $arguments[] = $parameters[$name];
-                unset($parameters[$name]);
-                $optionalArguments = array();
-            } elseif (array_key_exists($pos, $parameters)) {
-                $arguments = array_merge($arguments, $optionalArguments);
-                $arguments[] = $parameters[$pos];
-                unset($parameters[$pos]);
-                $optionalArguments = array();
-                ++$pos;
-            } elseif ($callableParameter->isDefaultValueAvailable()) {
-                $optionalArguments[] = new Twig_Node_Expression_Constant($callableParameter->getDefaultValue(), -1);
-            } elseif ($callableParameter->isOptional()) {
-                if (empty($parameters)) {
-                    break;
-                } else {
-                    $missingArguments[] = $name;
-                }
-            } else {
-                throw new Twig_Error_Syntax(sprintf('Value for argument "%s" is required for %s "%s".', $name, $callType, $callName));
-            }
-        }
-
-        if ($isVariadic) {
-            $arbitraryArguments = new Twig_Node_Expression_Array(array(), -1);
-            foreach ($parameters as $key => $value) {
-                if (is_int($key)) {
-                    $arbitraryArguments->addElement($value);
-                } else {
-                    $arbitraryArguments->addElement($value, new Twig_Node_Expression_Constant($key, -1));
-                }
-                unset($parameters[$key]);
-            }
-
-            if ($arbitraryArguments->count()) {
-                $arguments = array_merge($arguments, $optionalArguments);
-                $arguments[] = $arbitraryArguments;
-            }
-        }
-
-        if (!empty($parameters)) {
-            $unknownParameter = null;
-            foreach ($parameters as $parameter) {
-                if ($parameter instanceof Twig_Node) {
-                    $unknownParameter = $parameter;
-                    break;
-                }
-            }
-
-            throw new Twig_Error_Syntax(sprintf(
-                'Unknown argument%s "%s" for %s "%s(%s)".',
-                count($parameters) > 1 ? 's' : '', implode('", "', array_keys($parameters)), $callType, $callName, implode(', ', $names)
-            ), $unknownParameter ? $unknownParameter->getTemplateLine() : -1);
-        }
-
-        return $arguments;
-    }
-
-    protected function normalizeName($name)
-    {
-        return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), $name));
-    }
-
-    private function getCallableParameters($callable, $isVariadic)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\CallExpression" instead */
+    class Twig_Node_Expression_Call extends CallExpression
     {
-        list($r) = $this->reflectCallable($callable);
-        if (null === $r) {
-            return array();
-        }
-
-        $parameters = $r->getParameters();
-        if ($this->hasNode('node')) {
-            array_shift($parameters);
-        }
-        if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
-            array_shift($parameters);
-        }
-        if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
-            array_shift($parameters);
-        }
-        if ($this->hasAttribute('arguments') && null !== $this->getAttribute('arguments')) {
-            foreach ($this->getAttribute('arguments') as $argument) {
-                array_shift($parameters);
-            }
-        }
-        if ($isVariadic) {
-            $argument = end($parameters);
-            if ($argument && $argument->isArray() && $argument->isDefaultValueAvailable() && array() === $argument->getDefaultValue()) {
-                array_pop($parameters);
-            } else {
-                $callableName = $r->name;
-                if ($r instanceof ReflectionMethod) {
-                    $callableName = $r->getDeclaringClass()->name.'::'.$callableName;
-                }
-
-                throw new LogicException(sprintf('The last parameter of "%s" for %s "%s" must be an array with default value, eg. "array $arg = array()".', $callableName, $this->getAttribute('type'), $this->getAttribute('name')));
-            }
-        }
-
-        return $parameters;
-    }
-
-    private function reflectCallable($callable)
-    {
-        if (null !== $this->reflector) {
-            return $this->reflector;
-        }
-
-        if (is_array($callable)) {
-            if (!method_exists($callable[0], $callable[1])) {
-                // __call()
-                return array(null, array());
-            }
-            $r = new ReflectionMethod($callable[0], $callable[1]);
-        } elseif (is_object($callable) && !$callable instanceof Closure) {
-            $r = new ReflectionObject($callable);
-            $r = $r->getMethod('__invoke');
-            $callable = array($callable, '__invoke');
-        } elseif (is_string($callable) && false !== $pos = strpos($callable, '::')) {
-            $class = substr($callable, 0, $pos);
-            $method = substr($callable, $pos + 2);
-            if (!method_exists($class, $method)) {
-                // __staticCall()
-                return array(null, array());
-            }
-            $r = new ReflectionMethod($callable);
-            $callable = array($class, $method);
-        } else {
-            $r = new ReflectionFunction($callable);
-        }
-
-        return $this->reflector = array($r, $callable);
     }
 }
-
-class_alias('Twig_Node_Expression_Call', 'Twig\Node\Expression\CallExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php b/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php
index c339d773..896d5435 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Conditional.php
@@ -1,33 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Conditional extends Twig_Node_Expression
-{
-    public function __construct(Twig_Node_Expression $expr1, Twig_Node_Expression $expr2, Twig_Node_Expression $expr3, $lineno)
-    {
-        parent::__construct(array('expr1' => $expr1, 'expr2' => $expr2, 'expr3' => $expr3), array(), $lineno);
-    }
+use Twig\Node\Expression\ConditionalExpression;
+
+class_exists('Twig\Node\Expression\ConditionalExpression');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Conditional" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\ConditionalExpression" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\ConditionalExpression" instead */
+    class Twig_Node_Expression_Conditional extends ConditionalExpression
     {
-        $compiler
-            ->raw('((')
-            ->subcompile($this->getNode('expr1'))
-            ->raw(') ? (')
-            ->subcompile($this->getNode('expr2'))
-            ->raw(') : (')
-            ->subcompile($this->getNode('expr3'))
-            ->raw('))')
-        ;
     }
 }
-
-class_alias('Twig_Node_Expression_Conditional', 'Twig\Node\Expression\ConditionalExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php b/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php
index bf4d031c..d9f7217c 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Constant.php
@@ -1,25 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Constant extends Twig_Node_Expression
-{
-    public function __construct($value, $lineno)
-    {
-        parent::__construct(array(), array('value' => $value), $lineno);
-    }
+use Twig\Node\Expression\ConstantExpression;
+
+class_exists('Twig\Node\Expression\ConstantExpression');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Constant" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\ConstantExpression" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\ConstantExpression" instead */
+    class Twig_Node_Expression_Constant extends ConstantExpression
     {
-        $compiler->repr($this->getAttribute('value'));
     }
 }
-
-class_alias('Twig_Node_Expression_Constant', 'Twig\Node\Expression\ConstantExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php b/vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php
deleted file mode 100644
index 114b5cd9..00000000
--- a/vendor/twig/twig/lib/Twig/Node/Expression/ExtensionReference.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Node_Expression_ExtensionReference class is deprecated since version 1.23 and will be removed in 2.0.', E_USER_DEPRECATED);
-
-/**
- * Represents an extension call node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.23 and will be removed in 2.0.
- */
-class Twig_Node_Expression_ExtensionReference extends Twig_Node_Expression
-{
-    public function __construct($name, $lineno, $tag = null)
-    {
-        parent::__construct(array(), array('name' => $name), $lineno, $tag);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->raw(sprintf("\$this->env->getExtension('%s')", $this->getAttribute('name')));
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php b/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php
index 12da1d67..e248f887 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Filter.php
@@ -1,41 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Filter extends Twig_Node_Expression_Call
-{
-    public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Constant $filterName, Twig_NodeInterface $arguments, $lineno, $tag = null)
-    {
-        parent::__construct(array('node' => $node, 'filter' => $filterName, 'arguments' => $arguments), array(), $lineno, $tag);
-    }
+use Twig\Node\Expression\FilterExpression;
 
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getNode('filter')->getAttribute('value');
-        $filter = $compiler->getEnvironment()->getFilter($name);
+class_exists('Twig\Node\Expression\FilterExpression');
 
-        $this->setAttribute('name', $name);
-        $this->setAttribute('type', 'filter');
-        $this->setAttribute('thing', $filter);
-        $this->setAttribute('needs_environment', $filter->needsEnvironment());
-        $this->setAttribute('needs_context', $filter->needsContext());
-        $this->setAttribute('arguments', $filter->getArguments());
-        if ($filter instanceof Twig_FilterCallableInterface || $filter instanceof Twig_SimpleFilter) {
-            $this->setAttribute('callable', $filter->getCallable());
-        }
-        if ($filter instanceof Twig_SimpleFilter) {
-            $this->setAttribute('is_variadic', $filter->isVariadic());
-        }
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Filter" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\FilterExpression" instead.'), E_USER_DEPRECATED);
 
-        $this->compileCallable($compiler);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\FilterExpression" instead */
+    class Twig_Node_Expression_Filter extends FilterExpression
+    {
     }
 }
-
-class_alias('Twig_Node_Expression_Filter', 'Twig\Node\Expression\FilterExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php b/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php
index d2e19d54..3e200234 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Filter/Default.php
@@ -1,45 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\Filter\DefaultFilter;
 
-/**
- * Returns the value or the default value when it is undefined or empty.
- *
- * <pre>
- *  {{ var.foo|default('foo item on var is not defined') }}
- * </pre>
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_Filter_Default extends Twig_Node_Expression_Filter
-{
-    public function __construct(Twig_NodeInterface $node, Twig_Node_Expression_Constant $filterName, Twig_NodeInterface $arguments, $lineno, $tag = null)
-    {
-        $default = new Twig_Node_Expression_Filter($node, new Twig_Node_Expression_Constant('default', $node->getTemplateLine()), $arguments, $node->getTemplateLine());
-
-        if ('default' === $filterName->getAttribute('value') && ($node instanceof Twig_Node_Expression_Name || $node instanceof Twig_Node_Expression_GetAttr)) {
-            $test = new Twig_Node_Expression_Test_Defined(clone $node, 'defined', new Twig_Node(), $node->getTemplateLine());
-            $false = count($arguments) ? $arguments->getNode(0) : new Twig_Node_Expression_Constant('', $node->getTemplateLine());
+class_exists('Twig\Node\Expression\Filter\DefaultFilter');
 
-            $node = new Twig_Node_Expression_Conditional($test, $default, $false, $node->getTemplateLine());
-        } else {
-            $node = $default;
-        }
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Filter_Default" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Filter\DefaultFilter" instead.'), E_USER_DEPRECATED);
 
-        parent::__construct($node, $filterName, $arguments, $lineno, $tag);
-    }
-
-    public function compile(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Filter\DefaultFilter" instead */
+    class Twig_Node_Expression_Filter_Default extends DefaultFilter
     {
-        $compiler->subcompile($this->getNode('node'));
     }
 }
-
-class_alias('Twig_Node_Expression_Filter_Default', 'Twig\Node\Expression\Filter\DefaultFilter', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Function.php b/vendor/twig/twig/lib/Twig/Node/Expression/Function.php
index cdee7c97..46b1062c 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Function.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Function.php
@@ -1,45 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Function extends Twig_Node_Expression_Call
-{
-    public function __construct($name, Twig_NodeInterface $arguments, $lineno)
-    {
-        parent::__construct(array('arguments' => $arguments), array('name' => $name, 'is_defined_test' => false), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getAttribute('name');
-        $function = $compiler->getEnvironment()->getFunction($name);
+use Twig\Node\Expression\FunctionExpression;
 
-        $this->setAttribute('name', $name);
-        $this->setAttribute('type', 'function');
-        $this->setAttribute('thing', $function);
-        $this->setAttribute('needs_environment', $function->needsEnvironment());
-        $this->setAttribute('needs_context', $function->needsContext());
-        $this->setAttribute('arguments', $function->getArguments());
-        if ($function instanceof Twig_FunctionCallableInterface || $function instanceof Twig_SimpleFunction) {
-            $callable = $function->getCallable();
-            if ('constant' === $name && $this->getAttribute('is_defined_test')) {
-                $callable = 'twig_constant_is_defined';
-            }
+class_exists('Twig\Node\Expression\FunctionExpression');
 
-            $this->setAttribute('callable', $callable);
-        }
-        if ($function instanceof Twig_SimpleFunction) {
-            $this->setAttribute('is_variadic', $function->isVariadic());
-        }
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Function" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\FunctionExpression" instead.'), E_USER_DEPRECATED);
 
-        $this->compileCallable($compiler);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\FunctionExpression" instead */
+    class Twig_Node_Expression_Function extends FunctionExpression
+    {
     }
 }
-
-class_alias('Twig_Node_Expression_Function', 'Twig\Node\Expression\FunctionExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php b/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php
index b7823acc..b64da482 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/GetAttr.php
@@ -1,74 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_GetAttr extends Twig_Node_Expression
-{
-    public function __construct(Twig_Node_Expression $node, Twig_Node_Expression $attribute, Twig_Node_Expression $arguments = null, $type, $lineno)
-    {
-        $nodes = array('node' => $node, 'attribute' => $attribute);
-        if (null !== $arguments) {
-            $nodes['arguments'] = $arguments;
-        }
-
-        parent::__construct($nodes, array('type' => $type, 'is_defined_test' => false, 'ignore_strict_check' => false, 'disable_c_ext' => false), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        if ($this->getAttribute('disable_c_ext')) {
-            @trigger_error(sprintf('Using the "disable_c_ext" attribute on %s is deprecated since version 1.30 and will be removed in 2.0.', __CLASS__), E_USER_DEPRECATED);
-        }
-
-        if (function_exists('twig_template_get_attributes') && !$this->getAttribute('disable_c_ext')) {
-            $compiler->raw('twig_template_get_attributes($this, ');
-        } else {
-            $compiler->raw('$this->getAttribute(');
-        }
-
-        if ($this->getAttribute('ignore_strict_check')) {
-            $this->getNode('node')->setAttribute('ignore_strict_check', true);
-        }
+use Twig\Node\Expression\GetAttrExpression;
 
-        $compiler->subcompile($this->getNode('node'));
+class_exists('Twig\Node\Expression\GetAttrExpression');
 
-        $compiler->raw(', ')->subcompile($this->getNode('attribute'));
+@trigger_error(sprintf('Using the "Twig_Node_Expression_GetAttr" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\GetAttrExpression" instead.'), E_USER_DEPRECATED);
 
-        // only generate optional arguments when needed (to make generated code more readable)
-        $needFourth = $this->getAttribute('ignore_strict_check');
-        $needThird = $needFourth || $this->getAttribute('is_defined_test');
-        $needSecond = $needThird || Twig_Template::ANY_CALL !== $this->getAttribute('type');
-        $needFirst = $needSecond || $this->hasNode('arguments');
-
-        if ($needFirst) {
-            if ($this->hasNode('arguments')) {
-                $compiler->raw(', ')->subcompile($this->getNode('arguments'));
-            } else {
-                $compiler->raw(', array()');
-            }
-        }
-
-        if ($needSecond) {
-            $compiler->raw(', ')->repr($this->getAttribute('type'));
-        }
-
-        if ($needThird) {
-            $compiler->raw(', ')->repr($this->getAttribute('is_defined_test'));
-        }
-
-        if ($needFourth) {
-            $compiler->raw(', ')->repr($this->getAttribute('ignore_strict_check'));
-        }
-
-        $compiler->raw(')');
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\GetAttrExpression" instead */
+    class Twig_Node_Expression_GetAttr extends GetAttrExpression
+    {
     }
 }
-
-class_alias('Twig_Node_Expression_GetAttr', 'Twig\Node\Expression\GetAttrExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php b/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php
index 709016eb..cc85b20d 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/MethodCall.php
@@ -1,43 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_MethodCall extends Twig_Node_Expression
-{
-    public function __construct(Twig_Node_Expression $node, $method, Twig_Node_Expression_Array $arguments, $lineno)
-    {
-        parent::__construct(array('node' => $node, 'arguments' => $arguments), array('method' => $method, 'safe' => false), $lineno);
+use Twig\Node\Expression\MethodCallExpression;
 
-        if ($node instanceof Twig_Node_Expression_Name) {
-            $node->setAttribute('always_defined', true);
-        }
-    }
+class_exists('Twig\Node\Expression\MethodCallExpression');
 
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->subcompile($this->getNode('node'))
-            ->raw('->')
-            ->raw($this->getAttribute('method'))
-            ->raw('(')
-        ;
-        $first = true;
-        foreach ($this->getNode('arguments')->getKeyValuePairs() as $pair) {
-            if (!$first) {
-                $compiler->raw(', ');
-            }
-            $first = false;
+@trigger_error(sprintf('Using the "Twig_Node_Expression_MethodCall" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\MethodCallExpression" instead.'), E_USER_DEPRECATED);
 
-            $compiler->subcompile($pair['value']);
-        }
-        $compiler->raw(')');
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\MethodCallExpression" instead */
+    class Twig_Node_Expression_MethodCall extends MethodCallExpression
+    {
     }
 }
-
-class_alias('Twig_Node_Expression_MethodCall', 'Twig\Node\Expression\MethodCallExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Name.php b/vendor/twig/twig/lib/Twig/Node/Expression/Name.php
index 9d5a21f8..a0b5bdf8 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Name.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Name.php
@@ -1,102 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Name extends Twig_Node_Expression
-{
-    protected $specialVars = array(
-        '_self' => '$this',
-        '_context' => '$context',
-        '_charset' => '$this->env->getCharset()',
-    );
+use Twig\Node\Expression\NameExpression;
 
-    public function __construct($name, $lineno)
-    {
-        parent::__construct(array(), array('name' => $name, 'is_defined_test' => false, 'ignore_strict_check' => false, 'always_defined' => false), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getAttribute('name');
-
-        $compiler->addDebugInfo($this);
-
-        if ($this->getAttribute('is_defined_test')) {
-            if ($this->isSpecial()) {
-                $compiler->repr(true);
-            } else {
-                $compiler->raw('array_key_exists(')->repr($name)->raw(', $context)');
-            }
-        } elseif ($this->isSpecial()) {
-            $compiler->raw($this->specialVars[$name]);
-        } elseif ($this->getAttribute('always_defined')) {
-            $compiler
-                ->raw('$context[')
-                ->string($name)
-                ->raw(']')
-            ;
-        } else {
-            if (PHP_VERSION_ID >= 70000) {
-                // use PHP 7 null coalescing operator
-                $compiler
-                    ->raw('($context[')
-                    ->string($name)
-                    ->raw('] ?? ')
-                ;
-
-                if ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables()) {
-                    $compiler->raw('null)');
-                } else {
-                    $compiler->raw('$this->getContext($context, ')->string($name)->raw('))');
-                }
-            } elseif (PHP_VERSION_ID >= 50400) {
-                // PHP 5.4 ternary operator performance was optimized
-                $compiler
-                    ->raw('(isset($context[')
-                    ->string($name)
-                    ->raw(']) ? $context[')
-                    ->string($name)
-                    ->raw('] : ')
-                ;
+class_exists('Twig\Node\Expression\NameExpression');
 
-                if ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables()) {
-                    $compiler->raw('null)');
-                } else {
-                    $compiler->raw('$this->getContext($context, ')->string($name)->raw('))');
-                }
-            } else {
-                $compiler
-                    ->raw('$this->getContext($context, ')
-                    ->string($name)
-                ;
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Name" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\NameExpression" instead.'), E_USER_DEPRECATED);
 
-                if ($this->getAttribute('ignore_strict_check')) {
-                    $compiler->raw(', true');
-                }
-
-                $compiler
-                    ->raw(')')
-                ;
-            }
-        }
-    }
-
-    public function isSpecial()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\NameExpression" instead */
+    class Twig_Node_Expression_Name extends NameExpression
     {
-        return isset($this->specialVars[$this->getAttribute('name')]);
-    }
-
-    public function isSimple()
-    {
-        return !$this->isSpecial() && !$this->getAttribute('is_defined_test');
     }
 }
-
-class_alias('Twig_Node_Expression_Name', 'Twig\Node\Expression\NameExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php b/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php
index eaafa4c9..4ac7ebe1 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/NullCoalesce.php
@@ -1,48 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_NullCoalesce extends Twig_Node_Expression_Conditional
-{
-    public function __construct(Twig_NodeInterface $left, Twig_NodeInterface $right, $lineno)
-    {
-        $test = new Twig_Node_Expression_Binary_And(
-            new Twig_Node_Expression_Test_Defined(clone $left, 'defined', new Twig_Node(), $left->getTemplateLine()),
-            new Twig_Node_Expression_Unary_Not(new Twig_Node_Expression_Test_Null($left, 'null', new Twig_Node(), $left->getTemplateLine()), $left->getTemplateLine()),
-            $left->getTemplateLine()
-        );
+use Twig\Node\Expression\NullCoalesceExpression;
 
-        parent::__construct($test, $left, $right, $lineno);
-    }
+class_exists('Twig\Node\Expression\NullCoalesceExpression');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_NullCoalesce" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\NullCoalesceExpression" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\NullCoalesceExpression" instead */
+    class Twig_Node_Expression_NullCoalesce extends NullCoalesceExpression
     {
-        /*
-         * This optimizes only one case. PHP 7 also supports more complex expressions
-         * that can return null. So, for instance, if log is defined, log("foo") ?? "..." works,
-         * but log($a["foo"]) ?? "..." does not if $a["foo"] is not defined. More advanced
-         * cases might be implemented as an optimizer node visitor, but has not been done
-         * as benefits are probably not worth the added complexity.
-         */
-        if (PHP_VERSION_ID >= 70000 && $this->getNode('expr2') instanceof Twig_Node_Expression_Name) {
-            $this->getNode('expr2')->setAttribute('always_defined', true);
-            $compiler
-                ->raw('((')
-                ->subcompile($this->getNode('expr2'))
-                ->raw(') ?? (')
-                ->subcompile($this->getNode('expr3'))
-                ->raw('))')
-            ;
-        } else {
-            parent::compile($compiler);
-        }
     }
 }
-
-class_alias('Twig_Node_Expression_NullCoalesce', 'Twig\Node\Expression\NullCoalesceExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php b/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php
index 78692db2..3b27b65e 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Parent.php
@@ -1,44 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\ParentExpression;
 
-/**
- * Represents a parent node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_Parent extends Twig_Node_Expression
-{
-    public function __construct($name, $lineno, $tag = null)
-    {
-        parent::__construct(array(), array('output' => false, 'name' => $name), $lineno, $tag);
-    }
+class_exists('Twig\Node\Expression\ParentExpression');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Parent" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\ParentExpression" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\ParentExpression" instead */
+    class Twig_Node_Expression_Parent extends ParentExpression
     {
-        if ($this->getAttribute('output')) {
-            $compiler
-                ->addDebugInfo($this)
-                ->write('$this->displayParentBlock(')
-                ->string($this->getAttribute('name'))
-                ->raw(", \$context, \$blocks);\n")
-            ;
-        } else {
-            $compiler
-                ->raw('$this->renderParentBlock(')
-                ->string($this->getAttribute('name'))
-                ->raw(', $context, $blocks)')
-            ;
-        }
     }
 }
-
-class_alias('Twig_Node_Expression_Parent', 'Twig\Node\Expression\ParentExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php b/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php
index 0a86e003..41e9d697 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/TempName.php
@@ -1,28 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_TempName extends Twig_Node_Expression
-{
-    public function __construct($name, $lineno)
-    {
-        parent::__construct(array(), array('name' => $name), $lineno);
-    }
+use Twig\Node\Expression\TempNameExpression;
+
+class_exists('Twig\Node\Expression\TempNameExpression');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_TempName" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\TempNameExpression" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\TempNameExpression" instead */
+    class Twig_Node_Expression_TempName extends TempNameExpression
     {
-        $compiler
-            ->raw('$_')
-            ->raw($this->getAttribute('name'))
-            ->raw('_')
-        ;
     }
 }
-
-class_alias('Twig_Node_Expression_TempName', 'Twig\Node\Expression\TempNameExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test.php
index ad102ba6..8e7b253e 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Test.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Test.php
@@ -1,42 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Test extends Twig_Node_Expression_Call
-{
-    public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
-    {
-        $nodes = array('node' => $node);
-        if (null !== $arguments) {
-            $nodes['arguments'] = $arguments;
-        }
-
-        parent::__construct($nodes, array('name' => $name), $lineno);
-    }
+use Twig\Node\Expression\TestExpression;
 
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getAttribute('name');
-        $test = $compiler->getEnvironment()->getTest($name);
+class_exists('Twig\Node\Expression\TestExpression');
 
-        $this->setAttribute('name', $name);
-        $this->setAttribute('type', 'test');
-        $this->setAttribute('thing', $test);
-        if ($test instanceof Twig_TestCallableInterface || $test instanceof Twig_SimpleTest) {
-            $this->setAttribute('callable', $test->getCallable());
-        }
-        if ($test instanceof Twig_SimpleTest) {
-            $this->setAttribute('is_variadic', $test->isVariadic());
-        }
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Test" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\TestExpression" instead.'), E_USER_DEPRECATED);
 
-        $this->compileCallable($compiler);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\TestExpression" instead */
+    class Twig_Node_Expression_Test extends TestExpression
+    {
     }
 }
-
-class_alias('Twig_Node_Expression_Test', 'Twig\Node\Expression\TestExpression', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php
index a51a4ba1..dd9b6a98 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Constant.php
@@ -1,48 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\Test\ConstantTest;
 
-/**
- * Checks if a variable is the exact same value as a constant.
- *
- * <pre>
- *  {% if post.status is constant('Post::PUBLISHED') %}
- *    the status attribute is exactly the same as Post::PUBLISHED
- *  {% endif %}
- * </pre>
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_Test_Constant extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('node'))
-            ->raw(' === constant(')
-        ;
+class_exists('Twig\Node\Expression\Test\ConstantTest');
 
-        if ($this->getNode('arguments')->hasNode(1)) {
-            $compiler
-                ->raw('get_class(')
-                ->subcompile($this->getNode('arguments')->getNode(1))
-                ->raw(')."::".')
-            ;
-        }
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Constant" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\ConstantTest" instead.'), E_USER_DEPRECATED);
 
-        $compiler
-            ->subcompile($this->getNode('arguments')->getNode(0))
-            ->raw('))')
-        ;
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\ConstantTest" instead */
+    class Twig_Node_Expression_Test_Constant extends ConstantTest
+    {
     }
 }
-
-class_alias('Twig_Node_Expression_Test_Constant', 'Twig\Node\Expression\Test\ConstantTest', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php
index 2136c390..892607d6 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Defined.php
@@ -1,61 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\Test\DefinedTest;
 
-/**
- * Checks if a variable is defined in the current context.
- *
- * <pre>
- * {# defined works with variable names and variable attributes #}
- * {% if foo is defined %}
- *     {# ... #}
- * {% endif %}
- * </pre>
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_Test_Defined extends Twig_Node_Expression_Test
-{
-    public function __construct(Twig_NodeInterface $node, $name, Twig_NodeInterface $arguments = null, $lineno)
-    {
-        if ($node instanceof Twig_Node_Expression_Name) {
-            $node->setAttribute('is_defined_test', true);
-        } elseif ($node instanceof Twig_Node_Expression_GetAttr) {
-            $node->setAttribute('is_defined_test', true);
-            $this->changeIgnoreStrictCheck($node);
-        } elseif ($node instanceof Twig_Node_Expression_BlockReference) {
-            $node->setAttribute('is_defined_test', true);
-        } elseif ($node instanceof Twig_Node_Expression_Function && 'constant' === $node->getAttribute('name')) {
-            $node->setAttribute('is_defined_test', true);
-        } elseif ($node instanceof Twig_Node_Expression_Constant || $node instanceof Twig_Node_Expression_Array) {
-            $node = new Twig_Node_Expression_Constant(true, $node->getTemplateLine());
-        } else {
-            throw new Twig_Error_Syntax('The "defined" test only works with simple variables.', $this->getTemplateLine());
-        }
+class_exists('Twig\Node\Expression\Test\DefinedTest');
 
-        parent::__construct($node, $name, $arguments, $lineno);
-    }
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Defined" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\DefinedTest" instead.'), E_USER_DEPRECATED);
 
-    protected function changeIgnoreStrictCheck(Twig_Node_Expression_GetAttr $node)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\DefinedTest" instead */
+    class Twig_Node_Expression_Test_Defined extends DefinedTest
     {
-        $node->setAttribute('ignore_strict_check', true);
-
-        if ($node->getNode('node') instanceof Twig_Node_Expression_GetAttr) {
-            $this->changeIgnoreStrictCheck($node->getNode('node'));
-        }
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler->subcompile($this->getNode('node'));
     }
 }
-
-class_alias('Twig_Node_Expression_Test_Defined', 'Twig\Node\Expression\Test\DefinedTest', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php
index a5d71961..b624aa6f 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Divisibleby.php
@@ -1,35 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\Test\DivisiblebyTest;
 
-/**
- * Checks if a variable is divisible by a number.
- *
- * <pre>
- *  {% if loop.index is divisible by(3) %}
- * </pre>
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_Test_Divisibleby extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
+class_exists('Twig\Node\Expression\Test\DivisiblebyTest');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Divisibleby" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\DivisiblebyTest" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\DivisiblebyTest" instead */
+    class Twig_Node_Expression_Test_Divisibleby extends DivisiblebyTest
     {
-        $compiler
-            ->raw('(0 == ')
-            ->subcompile($this->getNode('node'))
-            ->raw(' % ')
-            ->subcompile($this->getNode('arguments')->getNode(0))
-            ->raw(')')
-        ;
     }
 }
-
-class_alias('Twig_Node_Expression_Test_Divisibleby', 'Twig\Node\Expression\Test\DivisiblebyTest', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php
index 7e198bea..355ee040 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Even.php
@@ -1,34 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\Test\EvenTest;
 
-/**
- * Checks if a number is even.
- *
- * <pre>
- *  {{ var is even }}
- * </pre>
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_Test_Even extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
+class_exists('Twig\Node\Expression\Test\EvenTest');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Even" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\EvenTest" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\EvenTest" instead */
+    class Twig_Node_Expression_Test_Even extends EvenTest
     {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('node'))
-            ->raw(' % 2 == 0')
-            ->raw(')')
-        ;
     }
 }
-
-class_alias('Twig_Node_Expression_Test_Even', 'Twig\Node\Expression\Test\EvenTest', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php
index 3746e4cb..4a5c4155 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Null.php
@@ -1,33 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\Test\NullTest;
 
-/**
- * Checks that a variable is null.
- *
- * <pre>
- *  {{ var is none }}
- * </pre>
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_Test_Null extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
+class_exists('Twig\Node\Expression\Test\NullTest');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Null" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\NullTest" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\NullTest" instead */
+    class Twig_Node_Expression_Test_Null extends NullTest
     {
-        $compiler
-            ->raw('(null === ')
-            ->subcompile($this->getNode('node'))
-            ->raw(')')
-        ;
     }
 }
-
-class_alias('Twig_Node_Expression_Test_Null', 'Twig\Node\Expression\Test\NullTest', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php
index 0c6c099b..5791d675 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Odd.php
@@ -1,34 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\Test\OddTest;
 
-/**
- * Checks if a number is odd.
- *
- * <pre>
- *  {{ var is odd }}
- * </pre>
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_Test_Odd extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
+class_exists('Twig\Node\Expression\Test\OddTest');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Odd" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\OddTest" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\OddTest" instead */
+    class Twig_Node_Expression_Test_Odd extends OddTest
     {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('node'))
-            ->raw(' % 2 == 1')
-            ->raw(')')
-        ;
     }
 }
-
-class_alias('Twig_Node_Expression_Test_Odd', 'Twig\Node\Expression\Test\OddTest', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php
index e95ff1f2..67e0f0e7 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Test/Sameas.php
@@ -1,31 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\Expression\Test\SameasTest;
 
-/**
- * Checks if a variable is the same as another one (=== in PHP).
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Expression_Test_Sameas extends Twig_Node_Expression_Test
-{
-    public function compile(Twig_Compiler $compiler)
+class_exists('Twig\Node\Expression\Test\SameasTest');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Test_Sameas" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Test\SameasTest" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Test\SameasTest" instead */
+    class Twig_Node_Expression_Test_Sameas extends SameasTest
     {
-        $compiler
-            ->raw('(')
-            ->subcompile($this->getNode('node'))
-            ->raw(' === ')
-            ->subcompile($this->getNode('arguments')->getNode(0))
-            ->raw(')')
-        ;
     }
 }
-
-class_alias('Twig_Node_Expression_Test_Sameas', 'Twig\Node\Expression\Test\SameasTest', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php b/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php
index 5804485e..1319ea73 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Unary.php
@@ -1,29 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-abstract class Twig_Node_Expression_Unary extends Twig_Node_Expression
-{
-    public function __construct(Twig_NodeInterface $node, $lineno)
-    {
-        parent::__construct(array('node' => $node), array(), $lineno);
-    }
+use Twig\Node\Expression\Unary\AbstractUnary;
+
+class_exists('Twig\Node\Expression\Unary\AbstractUnary');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Unary" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Unary\AbstractUnary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Unary\AbstractUnary" instead */
+    class Twig_Node_Expression_Unary extends AbstractUnary
     {
-        $compiler->raw(' ');
-        $this->operator($compiler);
-        $compiler->subcompile($this->getNode('node'));
     }
-
-    abstract public function operator(Twig_Compiler $compiler);
 }
-
-class_alias('Twig_Node_Expression_Unary', 'Twig\Node\Expression\Unary\AbstractUnary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php b/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php
index 039d933d..11920e60 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Neg.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Unary_Neg extends Twig_Node_Expression_Unary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Unary\NegUnary;
+
+class_exists('Twig\Node\Expression\Unary\NegUnary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Unary_Neg" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Unary\NegUnary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Unary\NegUnary" instead */
+    class Twig_Node_Expression_Unary_Neg extends NegUnary
     {
-        $compiler->raw('-');
     }
 }
-
-class_alias('Twig_Node_Expression_Unary_Neg', 'Twig\Node\Expression\Unary\NegUnary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php b/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php
index a0860b18..10fda176 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Not.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Unary_Not extends Twig_Node_Expression_Unary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Unary\NotUnary;
+
+class_exists('Twig\Node\Expression\Unary\NotUnary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Unary_Not" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Unary\NotUnary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Unary\NotUnary" instead */
+    class Twig_Node_Expression_Unary_Not extends NotUnary
     {
-        $compiler->raw('!');
     }
 }
-
-class_alias('Twig_Node_Expression_Unary_Not', 'Twig\Node\Expression\Unary\NotUnary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php b/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php
index eeff5452..92378092 100644
--- a/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php
+++ b/vendor/twig/twig/lib/Twig/Node/Expression/Unary/Pos.php
@@ -1,20 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-class Twig_Node_Expression_Unary_Pos extends Twig_Node_Expression_Unary
-{
-    public function operator(Twig_Compiler $compiler)
+use Twig\Node\Expression\Unary\PosUnary;
+
+class_exists('Twig\Node\Expression\Unary\PosUnary');
+
+@trigger_error(sprintf('Using the "Twig_Node_Expression_Unary_Pos" class is deprecated since Twig version 2.7, use "Twig\Node\Expression\Unary\PosUnary" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\Expression\Unary\PosUnary" instead */
+    class Twig_Node_Expression_Unary_Pos extends PosUnary
     {
-        $compiler->raw('+');
     }
 }
-
-class_alias('Twig_Node_Expression_Unary_Pos', 'Twig\Node\Expression\Unary\PosUnary', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Flush.php b/vendor/twig/twig/lib/Twig/Node/Flush.php
index fcc461ac..76031e54 100644
--- a/vendor/twig/twig/lib/Twig/Node/Flush.php
+++ b/vendor/twig/twig/lib/Twig/Node/Flush.php
@@ -1,33 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\FlushNode;
 
-/**
- * Represents a flush node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Flush extends Twig_Node
-{
-    public function __construct($lineno, $tag)
-    {
-        parent::__construct(array(), array(), $lineno, $tag);
-    }
+class_exists('Twig\Node\FlushNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Flush" class is deprecated since Twig version 2.7, use "Twig\Node\FlushNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\FlushNode" instead */
+    class Twig_Node_Flush extends FlushNode
     {
-        $compiler
-            ->addDebugInfo($this)
-            ->write("flush();\n")
-        ;
     }
 }
-
-class_alias('Twig_Node_Flush', 'Twig\Node\FlushNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/For.php b/vendor/twig/twig/lib/Twig/Node/For.php
index 914b70c9..20b6d313 100644
--- a/vendor/twig/twig/lib/Twig/Node/For.php
+++ b/vendor/twig/twig/lib/Twig/Node/For.php
@@ -1,113 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\ForNode;
 
-/**
- * Represents a for node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_For extends Twig_Node
-{
-    protected $loop;
+class_exists('Twig\Node\ForNode');
 
-    public function __construct(Twig_Node_Expression_AssignName $keyTarget, Twig_Node_Expression_AssignName $valueTarget, Twig_Node_Expression $seq, Twig_Node_Expression $ifexpr = null, Twig_NodeInterface $body, Twig_NodeInterface $else = null, $lineno, $tag = null)
-    {
-        $body = new Twig_Node(array($body, $this->loop = new Twig_Node_ForLoop($lineno, $tag)));
-
-        if (null !== $ifexpr) {
-            $body = new Twig_Node_If(new Twig_Node(array($ifexpr, $body)), null, $lineno, $tag);
-        }
-
-        $nodes = array('key_target' => $keyTarget, 'value_target' => $valueTarget, 'seq' => $seq, 'body' => $body);
-        if (null !== $else) {
-            $nodes['else'] = $else;
-        }
-
-        parent::__construct($nodes, array('with_loop' => true, 'ifexpr' => null !== $ifexpr), $lineno, $tag);
-    }
+@trigger_error(sprintf('Using the "Twig_Node_For" class is deprecated since Twig version 2.7, use "Twig\Node\ForNode" instead.'), E_USER_DEPRECATED);
 
-    public function compile(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\ForNode" instead */
+    class Twig_Node_For extends ForNode
     {
-        $compiler
-            ->addDebugInfo($this)
-            ->write("\$context['_parent'] = \$context;\n")
-            ->write("\$context['_seq'] = twig_ensure_traversable(")
-            ->subcompile($this->getNode('seq'))
-            ->raw(");\n")
-        ;
-
-        if ($this->hasNode('else')) {
-            $compiler->write("\$context['_iterated'] = false;\n");
-        }
-
-        if ($this->getAttribute('with_loop')) {
-            $compiler
-                ->write("\$context['loop'] = array(\n")
-                ->write("  'parent' => \$context['_parent'],\n")
-                ->write("  'index0' => 0,\n")
-                ->write("  'index'  => 1,\n")
-                ->write("  'first'  => true,\n")
-                ->write(");\n")
-            ;
-
-            if (!$this->getAttribute('ifexpr')) {
-                $compiler
-                    ->write("if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {\n")
-                    ->indent()
-                    ->write("\$length = count(\$context['_seq']);\n")
-                    ->write("\$context['loop']['revindex0'] = \$length - 1;\n")
-                    ->write("\$context['loop']['revindex'] = \$length;\n")
-                    ->write("\$context['loop']['length'] = \$length;\n")
-                    ->write("\$context['loop']['last'] = 1 === \$length;\n")
-                    ->outdent()
-                    ->write("}\n")
-                ;
-            }
-        }
-
-        $this->loop->setAttribute('else', $this->hasNode('else'));
-        $this->loop->setAttribute('with_loop', $this->getAttribute('with_loop'));
-        $this->loop->setAttribute('ifexpr', $this->getAttribute('ifexpr'));
-
-        $compiler
-            ->write("foreach (\$context['_seq'] as ")
-            ->subcompile($this->getNode('key_target'))
-            ->raw(' => ')
-            ->subcompile($this->getNode('value_target'))
-            ->raw(") {\n")
-            ->indent()
-            ->subcompile($this->getNode('body'))
-            ->outdent()
-            ->write("}\n")
-        ;
-
-        if ($this->hasNode('else')) {
-            $compiler
-                ->write("if (!\$context['_iterated']) {\n")
-                ->indent()
-                ->subcompile($this->getNode('else'))
-                ->outdent()
-                ->write("}\n")
-            ;
-        }
-
-        $compiler->write("\$_parent = \$context['_parent'];\n");
-
-        // remove some "private" loop variables (needed for nested loops)
-        $compiler->write('unset($context[\'_seq\'], $context[\'_iterated\'], $context[\''.$this->getNode('key_target')->getAttribute('name').'\'], $context[\''.$this->getNode('value_target')->getAttribute('name').'\'], $context[\'_parent\'], $context[\'loop\']);'."\n");
-
-        // keep the values set in the inner context for variables defined in the outer context
-        $compiler->write("\$context = array_intersect_key(\$context, \$_parent) + \$_parent;\n");
     }
 }
-
-class_alias('Twig_Node_For', 'Twig\Node\ForNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/ForLoop.php b/vendor/twig/twig/lib/Twig/Node/ForLoop.php
index 06477cf1..9951144c 100644
--- a/vendor/twig/twig/lib/Twig/Node/ForLoop.php
+++ b/vendor/twig/twig/lib/Twig/Node/ForLoop.php
@@ -1,52 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\ForLoopNode;
 
-/**
- * Internal node used by the for node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_ForLoop extends Twig_Node
-{
-    public function __construct($lineno, $tag = null)
-    {
-        parent::__construct(array(), array('with_loop' => false, 'ifexpr' => false, 'else' => false), $lineno, $tag);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        if ($this->getAttribute('else')) {
-            $compiler->write("\$context['_iterated'] = true;\n");
-        }
+class_exists('Twig\Node\ForLoopNode');
 
-        if ($this->getAttribute('with_loop')) {
-            $compiler
-                ->write("++\$context['loop']['index0'];\n")
-                ->write("++\$context['loop']['index'];\n")
-                ->write("\$context['loop']['first'] = false;\n")
-            ;
+@trigger_error(sprintf('Using the "Twig_Node_ForLoop" class is deprecated since Twig version 2.7, use "Twig\Node\ForLoopNode" instead.'), E_USER_DEPRECATED);
 
-            if (!$this->getAttribute('ifexpr')) {
-                $compiler
-                    ->write("if (isset(\$context['loop']['length'])) {\n")
-                    ->indent()
-                    ->write("--\$context['loop']['revindex0'];\n")
-                    ->write("--\$context['loop']['revindex'];\n")
-                    ->write("\$context['loop']['last'] = 0 === \$context['loop']['revindex0'];\n")
-                    ->outdent()
-                    ->write("}\n")
-                ;
-            }
-        }
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\ForLoopNode" instead */
+    class Twig_Node_ForLoop extends ForLoopNode
+    {
     }
 }
-
-class_alias('Twig_Node_ForLoop', 'Twig\Node\ForLoopNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/If.php b/vendor/twig/twig/lib/Twig/Node/If.php
index d82edec7..879b5905 100644
--- a/vendor/twig/twig/lib/Twig/Node/If.php
+++ b/vendor/twig/twig/lib/Twig/Node/If.php
@@ -1,68 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\IfNode;
 
-/**
- * Represents an if node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_If extends Twig_Node
-{
-    public function __construct(Twig_NodeInterface $tests, Twig_NodeInterface $else = null, $lineno, $tag = null)
-    {
-        $nodes = array('tests' => $tests);
-        if (null !== $else) {
-            $nodes['else'] = $else;
-        }
+class_exists('Twig\Node\IfNode');
 
-        parent::__construct($nodes, array(), $lineno, $tag);
-    }
+@trigger_error(sprintf('Using the "Twig_Node_If" class is deprecated since Twig version 2.7, use "Twig\Node\IfNode" instead.'), E_USER_DEPRECATED);
 
-    public function compile(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\IfNode" instead */
+    class Twig_Node_If extends IfNode
     {
-        $compiler->addDebugInfo($this);
-        for ($i = 0, $count = count($this->getNode('tests')); $i < $count; $i += 2) {
-            if ($i > 0) {
-                $compiler
-                    ->outdent()
-                    ->write('} elseif (')
-                ;
-            } else {
-                $compiler
-                    ->write('if (')
-                ;
-            }
-
-            $compiler
-                ->subcompile($this->getNode('tests')->getNode($i))
-                ->raw(") {\n")
-                ->indent()
-                ->subcompile($this->getNode('tests')->getNode($i + 1))
-            ;
-        }
-
-        if ($this->hasNode('else')) {
-            $compiler
-                ->outdent()
-                ->write("} else {\n")
-                ->indent()
-                ->subcompile($this->getNode('else'))
-            ;
-        }
-
-        $compiler
-            ->outdent()
-            ->write("}\n");
     }
 }
-
-class_alias('Twig_Node_If', 'Twig\Node\IfNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Import.php b/vendor/twig/twig/lib/Twig/Node/Import.php
index c77e320b..9640e352 100644
--- a/vendor/twig/twig/lib/Twig/Node/Import.php
+++ b/vendor/twig/twig/lib/Twig/Node/Import.php
@@ -1,51 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\ImportNode;
 
-/**
- * Represents an import node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Import extends Twig_Node
-{
-    public function __construct(Twig_Node_Expression $expr, Twig_Node_Expression $var, $lineno, $tag = null)
-    {
-        parent::__construct(array('expr' => $expr, 'var' => $var), array(), $lineno, $tag);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('')
-            ->subcompile($this->getNode('var'))
-            ->raw(' = ')
-        ;
+class_exists('Twig\Node\ImportNode');
 
-        if ($this->getNode('expr') instanceof Twig_Node_Expression_Name && '_self' === $this->getNode('expr')->getAttribute('name')) {
-            $compiler->raw('$this');
-        } else {
-            $compiler
-                ->raw('$this->loadTemplate(')
-                ->subcompile($this->getNode('expr'))
-                ->raw(', ')
-                ->repr($this->getTemplateName())
-                ->raw(', ')
-                ->repr($this->getTemplateLine())
-                ->raw(')')
-            ;
-        }
+@trigger_error(sprintf('Using the "Twig_Node_Import" class is deprecated since Twig version 2.7, use "Twig\Node\ImportNode" instead.'), E_USER_DEPRECATED);
 
-        $compiler->raw(";\n");
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\ImportNode" instead */
+    class Twig_Node_Import extends ImportNode
+    {
     }
 }
-
-class_alias('Twig_Node_Import', 'Twig\Node\ImportNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Include.php b/vendor/twig/twig/lib/Twig/Node/Include.php
index 2a5114cb..38b6742a 100644
--- a/vendor/twig/twig/lib/Twig/Node/Include.php
+++ b/vendor/twig/twig/lib/Twig/Node/Include.php
@@ -1,90 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\IncludeNode;
 
-/**
- * Represents an include node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Include extends Twig_Node implements Twig_NodeOutputInterface
-{
-    public function __construct(Twig_Node_Expression $expr, Twig_Node_Expression $variables = null, $only = false, $ignoreMissing = false, $lineno, $tag = null)
-    {
-        $nodes = array('expr' => $expr);
-        if (null !== $variables) {
-            $nodes['variables'] = $variables;
-        }
+class_exists('Twig\Node\IncludeNode');
 
-        parent::__construct($nodes, array('only' => (bool) $only, 'ignore_missing' => (bool) $ignoreMissing), $lineno, $tag);
-    }
+@trigger_error(sprintf('Using the "Twig_Node_Include" class is deprecated since Twig version 2.7, use "Twig\Node\IncludeNode" instead.'), E_USER_DEPRECATED);
 
-    public function compile(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\IncludeNode" instead */
+    class Twig_Node_Include extends IncludeNode
     {
-        $compiler->addDebugInfo($this);
-
-        if ($this->getAttribute('ignore_missing')) {
-            $compiler
-                ->write("try {\n")
-                ->indent()
-            ;
-        }
-
-        $this->addGetTemplate($compiler);
-
-        $compiler->raw('->display(');
-
-        $this->addTemplateArguments($compiler);
-
-        $compiler->raw(");\n");
-
-        if ($this->getAttribute('ignore_missing')) {
-            $compiler
-                ->outdent()
-                ->write("} catch (Twig_Error_Loader \$e) {\n")
-                ->indent()
-                ->write("// ignore missing template\n")
-                ->outdent()
-                ->write("}\n\n")
-            ;
-        }
-    }
-
-    protected function addGetTemplate(Twig_Compiler $compiler)
-    {
-        $compiler
-             ->write('$this->loadTemplate(')
-             ->subcompile($this->getNode('expr'))
-             ->raw(', ')
-             ->repr($this->getTemplateName())
-             ->raw(', ')
-             ->repr($this->getTemplateLine())
-             ->raw(')')
-         ;
-    }
-
-    protected function addTemplateArguments(Twig_Compiler $compiler)
-    {
-        if (!$this->hasNode('variables')) {
-            $compiler->raw(false === $this->getAttribute('only') ? '$context' : 'array()');
-        } elseif (false === $this->getAttribute('only')) {
-            $compiler
-                ->raw('array_merge($context, ')
-                ->subcompile($this->getNode('variables'))
-                ->raw(')')
-            ;
-        } else {
-            $compiler->subcompile($this->getNode('variables'));
-        }
     }
 }
-
-class_alias('Twig_Node_Include', 'Twig\Node\IncludeNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Macro.php b/vendor/twig/twig/lib/Twig/Node/Macro.php
index 3cf54977..1b0a1559 100644
--- a/vendor/twig/twig/lib/Twig/Node/Macro.php
+++ b/vendor/twig/twig/lib/Twig/Node/Macro.php
@@ -1,125 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\MacroNode;
 
-/**
- * Represents a macro node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Macro extends Twig_Node
-{
-    const VARARGS_NAME = 'varargs';
+class_exists('Twig\Node\MacroNode');
 
-    public function __construct($name, Twig_NodeInterface $body, Twig_NodeInterface $arguments, $lineno, $tag = null)
-    {
-        foreach ($arguments as $argumentName => $argument) {
-            if (self::VARARGS_NAME === $argumentName) {
-                throw new Twig_Error_Syntax(sprintf('The argument "%s" in macro "%s" cannot be defined because the variable "%s" is reserved for arbitrary arguments.', self::VARARGS_NAME, $name, self::VARARGS_NAME), $argument->getTemplateLine());
-            }
-        }
-
-        parent::__construct(array('body' => $body, 'arguments' => $arguments), array('name' => $name), $lineno, $tag);
-    }
+@trigger_error(sprintf('Using the "Twig_Node_Macro" class is deprecated since Twig version 2.7, use "Twig\Node\MacroNode" instead.'), E_USER_DEPRECATED);
 
-    public function compile(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\MacroNode" instead */
+    class Twig_Node_Macro extends MacroNode
     {
-        $compiler
-            ->addDebugInfo($this)
-            ->write(sprintf('public function get%s(', $this->getAttribute('name')))
-        ;
-
-        $count = count($this->getNode('arguments'));
-        $pos = 0;
-        foreach ($this->getNode('arguments') as $name => $default) {
-            $compiler
-                ->raw('$__'.$name.'__ = ')
-                ->subcompile($default)
-            ;
-
-            if (++$pos < $count) {
-                $compiler->raw(', ');
-            }
-        }
-
-        if (PHP_VERSION_ID >= 50600) {
-            if ($count) {
-                $compiler->raw(', ');
-            }
-
-            $compiler->raw('...$__varargs__');
-        }
-
-        $compiler
-            ->raw(")\n")
-            ->write("{\n")
-            ->indent()
-        ;
-
-        $compiler
-            ->write("\$context = \$this->env->mergeGlobals(array(\n")
-            ->indent()
-        ;
-
-        foreach ($this->getNode('arguments') as $name => $default) {
-            $compiler
-                ->write('')
-                ->string($name)
-                ->raw(' => $__'.$name.'__')
-                ->raw(",\n")
-            ;
-        }
-
-        $compiler
-            ->write('')
-            ->string(self::VARARGS_NAME)
-            ->raw(' => ')
-        ;
-
-        if (PHP_VERSION_ID >= 50600) {
-            $compiler->raw("\$__varargs__,\n");
-        } else {
-            $compiler
-                ->raw('func_num_args() > ')
-                ->repr($count)
-                ->raw(' ? array_slice(func_get_args(), ')
-                ->repr($count)
-                ->raw(") : array(),\n")
-            ;
-        }
-
-        $compiler
-            ->outdent()
-            ->write("));\n\n")
-            ->write("\$blocks = array();\n\n")
-            ->write("ob_start();\n")
-            ->write("try {\n")
-            ->indent()
-            ->subcompile($this->getNode('body'))
-            ->outdent()
-            ->write("} catch (Exception \$e) {\n")
-            ->indent()
-            ->write("ob_end_clean();\n\n")
-            ->write("throw \$e;\n")
-            ->outdent()
-            ->write("} catch (Throwable \$e) {\n")
-            ->indent()
-            ->write("ob_end_clean();\n\n")
-            ->write("throw \$e;\n")
-            ->outdent()
-            ->write("}\n\n")
-            ->write("return ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());\n")
-            ->outdent()
-            ->write("}\n\n")
-        ;
     }
 }
-
-class_alias('Twig_Node_Macro', 'Twig\Node\MacroNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Module.php b/vendor/twig/twig/lib/Twig/Node/Module.php
index 5cd8d050..528b52a6 100644
--- a/vendor/twig/twig/lib/Twig/Node/Module.php
+++ b/vendor/twig/twig/lib/Twig/Node/Module.php
@@ -1,461 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\ModuleNode;
 
-/**
- * Represents a module node.
- *
- * Consider this class as being final. If you need to customize the behavior of
- * the generated class, consider adding nodes to the following nodes: display_start,
- * display_end, constructor_start, constructor_end, and class_end.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Module extends Twig_Node
-{
-    private $source;
+class_exists('Twig\Node\ModuleNode');
 
-    public function __construct(Twig_NodeInterface $body, Twig_Node_Expression $parent = null, Twig_NodeInterface $blocks, Twig_NodeInterface $macros, Twig_NodeInterface $traits, $embeddedTemplates, $name, $source = '')
-    {
-        if (!$name instanceof Twig_Source) {
-            @trigger_error(sprintf('Passing a string as the $name argument of %s() is deprecated since version 1.27. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
-            $this->source = new Twig_Source($source, $name);
-        } else {
-            $this->source = $name;
-        }
-
-        $nodes = array(
-            'body' => $body,
-            'blocks' => $blocks,
-            'macros' => $macros,
-            'traits' => $traits,
-            'display_start' => new Twig_Node(),
-            'display_end' => new Twig_Node(),
-            'constructor_start' => new Twig_Node(),
-            'constructor_end' => new Twig_Node(),
-            'class_end' => new Twig_Node(),
-        );
-        if (null !== $parent) {
-            $nodes['parent'] = $parent;
-        }
-
-        // embedded templates are set as attributes so that they are only visited once by the visitors
-        parent::__construct($nodes, array(
-            // source to be remove in 2.0
-            'source' => $this->source->getCode(),
-            // filename to be remove in 2.0 (use getTemplateName() instead)
-            'filename' => $this->source->getName(),
-            'index' => null,
-            'embedded_templates' => $embeddedTemplates,
-        ), 1);
-
-        // populate the template name of all node children
-        $this->setTemplateName($this->source->getName());
-    }
-
-    public function setIndex($index)
-    {
-        $this->setAttribute('index', $index);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $this->compileTemplate($compiler);
-
-        foreach ($this->getAttribute('embedded_templates') as $template) {
-            $compiler->subcompile($template);
-        }
-    }
-
-    protected function compileTemplate(Twig_Compiler $compiler)
-    {
-        if (!$this->getAttribute('index')) {
-            $compiler->write('<?php');
-        }
-
-        $this->compileClassHeader($compiler);
-
-        if (
-            count($this->getNode('blocks'))
-            || count($this->getNode('traits'))
-            || !$this->hasNode('parent')
-            || $this->getNode('parent') instanceof Twig_Node_Expression_Constant
-            || count($this->getNode('constructor_start'))
-            || count($this->getNode('constructor_end'))
-        ) {
-            $this->compileConstructor($compiler);
-        }
-
-        $this->compileGetParent($compiler);
-
-        $this->compileDisplay($compiler);
-
-        $compiler->subcompile($this->getNode('blocks'));
-
-        $this->compileMacros($compiler);
-
-        $this->compileGetTemplateName($compiler);
-
-        $this->compileIsTraitable($compiler);
-
-        $this->compileDebugInfo($compiler);
-
-        $this->compileGetSource($compiler);
-
-        $this->compileGetSourceContext($compiler);
-
-        $this->compileClassFooter($compiler);
-    }
-
-    protected function compileGetParent(Twig_Compiler $compiler)
-    {
-        if (!$this->hasNode('parent')) {
-            return;
-        }
-        $parent = $this->getNode('parent');
-
-        $compiler
-            ->write("protected function doGetParent(array \$context)\n", "{\n")
-            ->indent()
-            ->addDebugInfo($parent)
-            ->write('return ')
-        ;
-
-        if ($parent instanceof Twig_Node_Expression_Constant) {
-            $compiler->subcompile($parent);
-        } else {
-            $compiler
-                ->raw('$this->loadTemplate(')
-                ->subcompile($parent)
-                ->raw(', ')
-                ->repr($this->source->getName())
-                ->raw(', ')
-                ->repr($parent->getTemplateLine())
-                ->raw(')')
-            ;
-        }
-
-        $compiler
-            ->raw(";\n")
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileClassHeader(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("\n\n")
-            // if the template name contains */, add a blank to avoid a PHP parse error
-            ->write('/* '.str_replace('*/', '* /', $this->source->getName())." */\n")
-            ->write('class '.$compiler->getEnvironment()->getTemplateClass($this->source->getName(), $this->getAttribute('index')))
-            ->raw(sprintf(" extends %s\n", $compiler->getEnvironment()->getBaseTemplateClass()))
-            ->write("{\n")
-            ->indent()
-        ;
-    }
-
-    protected function compileConstructor(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("public function __construct(Twig_Environment \$env)\n", "{\n")
-            ->indent()
-            ->subcompile($this->getNode('constructor_start'))
-            ->write("parent::__construct(\$env);\n\n")
-        ;
-
-        // parent
-        if (!$this->hasNode('parent')) {
-            $compiler->write("\$this->parent = false;\n\n");
-        } elseif (($parent = $this->getNode('parent')) && $parent instanceof Twig_Node_Expression_Constant) {
-            $compiler
-                ->addDebugInfo($parent)
-                ->write('$this->parent = $this->loadTemplate(')
-                ->subcompile($parent)
-                ->raw(', ')
-                ->repr($this->source->getName())
-                ->raw(', ')
-                ->repr($parent->getTemplateLine())
-                ->raw(");\n")
-            ;
-        }
-
-        $countTraits = count($this->getNode('traits'));
-        if ($countTraits) {
-            // traits
-            foreach ($this->getNode('traits') as $i => $trait) {
-                $this->compileLoadTemplate($compiler, $trait->getNode('template'), sprintf('$_trait_%s', $i));
-
-                $compiler
-                    ->addDebugInfo($trait->getNode('template'))
-                    ->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n", $i))
-                    ->indent()
-                    ->write("throw new Twig_Error_Runtime('Template \"'.")
-                    ->subcompile($trait->getNode('template'))
-                    ->raw(".'\" cannot be used as a trait.');\n")
-                    ->outdent()
-                    ->write("}\n")
-                    ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n", $i, $i))
-                ;
-
-                foreach ($trait->getNode('targets') as $key => $value) {
-                    $compiler
-                        ->write(sprintf('if (!isset($_trait_%s_blocks[', $i))
-                        ->string($key)
-                        ->raw("])) {\n")
-                        ->indent()
-                        ->write("throw new Twig_Error_Runtime(sprintf('Block ")
-                        ->string($key)
-                        ->raw(' is not defined in trait ')
-                        ->subcompile($trait->getNode('template'))
-                        ->raw(".'));\n")
-                        ->outdent()
-                        ->write("}\n\n")
-
-                        ->write(sprintf('$_trait_%s_blocks[', $i))
-                        ->subcompile($value)
-                        ->raw(sprintf('] = $_trait_%s_blocks[', $i))
-                        ->string($key)
-                        ->raw(sprintf(']; unset($_trait_%s_blocks[', $i))
-                        ->string($key)
-                        ->raw("]);\n\n")
-                    ;
-                }
-            }
+@trigger_error(sprintf('Using the "Twig_Node_Module" class is deprecated since Twig version 2.7, use "Twig\Node\ModuleNode" instead.'), E_USER_DEPRECATED);
 
-            if ($countTraits > 1) {
-                $compiler
-                    ->write("\$this->traits = array_merge(\n")
-                    ->indent()
-                ;
-
-                for ($i = 0; $i < $countTraits; ++$i) {
-                    $compiler
-                        ->write(sprintf('$_trait_%s_blocks'.($i == $countTraits - 1 ? '' : ',')."\n", $i))
-                    ;
-                }
-
-                $compiler
-                    ->outdent()
-                    ->write(");\n\n")
-                ;
-            } else {
-                $compiler
-                    ->write("\$this->traits = \$_trait_0_blocks;\n\n")
-                ;
-            }
-
-            $compiler
-                ->write("\$this->blocks = array_merge(\n")
-                ->indent()
-                ->write("\$this->traits,\n")
-                ->write("array(\n")
-            ;
-        } else {
-            $compiler
-                ->write("\$this->blocks = array(\n")
-            ;
-        }
-
-        // blocks
-        $compiler
-            ->indent()
-        ;
-
-        foreach ($this->getNode('blocks') as $name => $node) {
-            $compiler
-                ->write(sprintf("'%s' => array(\$this, 'block_%s'),\n", $name, $name))
-            ;
-        }
-
-        if ($countTraits) {
-            $compiler
-                ->outdent()
-                ->write(")\n")
-            ;
-        }
-
-        $compiler
-            ->outdent()
-            ->write(");\n")
-            ->outdent()
-            ->subcompile($this->getNode('constructor_end'))
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileDisplay(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("protected function doDisplay(array \$context, array \$blocks = array())\n", "{\n")
-            ->indent()
-            ->subcompile($this->getNode('display_start'))
-            ->subcompile($this->getNode('body'))
-        ;
-
-        if ($this->hasNode('parent')) {
-            $parent = $this->getNode('parent');
-            $compiler->addDebugInfo($parent);
-            if ($parent instanceof Twig_Node_Expression_Constant) {
-                $compiler->write('$this->parent');
-            } else {
-                $compiler->write('$this->getParent($context)');
-            }
-            $compiler->raw("->display(\$context, array_merge(\$this->blocks, \$blocks));\n");
-        }
-
-        $compiler
-            ->subcompile($this->getNode('display_end'))
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileClassFooter(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->subcompile($this->getNode('class_end'))
-            ->outdent()
-            ->write("}\n")
-        ;
-    }
-
-    protected function compileMacros(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\ModuleNode" instead */
+    class Twig_Node_Module extends ModuleNode
     {
-        $compiler->subcompile($this->getNode('macros'));
-    }
-
-    protected function compileGetTemplateName(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("public function getTemplateName()\n", "{\n")
-            ->indent()
-            ->write('return ')
-            ->repr($this->source->getName())
-            ->raw(";\n")
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileIsTraitable(Twig_Compiler $compiler)
-    {
-        // A template can be used as a trait if:
-        //   * it has no parent
-        //   * it has no macros
-        //   * it has no body
-        //
-        // Put another way, a template can be used as a trait if it
-        // only contains blocks and use statements.
-        $traitable = !$this->hasNode('parent') && 0 === count($this->getNode('macros'));
-        if ($traitable) {
-            if ($this->getNode('body') instanceof Twig_Node_Body) {
-                $nodes = $this->getNode('body')->getNode(0);
-            } else {
-                $nodes = $this->getNode('body');
-            }
-
-            if (!count($nodes)) {
-                $nodes = new Twig_Node(array($nodes));
-            }
-
-            foreach ($nodes as $node) {
-                if (!count($node)) {
-                    continue;
-                }
-
-                if ($node instanceof Twig_Node_Text && ctype_space($node->getAttribute('data'))) {
-                    continue;
-                }
-
-                if ($node instanceof Twig_Node_BlockReference) {
-                    continue;
-                }
-
-                $traitable = false;
-                break;
-            }
-        }
-
-        if ($traitable) {
-            return;
-        }
-
-        $compiler
-            ->write("public function isTraitable()\n", "{\n")
-            ->indent()
-            ->write(sprintf("return %s;\n", $traitable ? 'true' : 'false'))
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileDebugInfo(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("public function getDebugInfo()\n", "{\n")
-            ->indent()
-            ->write(sprintf("return %s;\n", str_replace("\n", '', var_export(array_reverse($compiler->getDebugInfo(), true), true))))
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileGetSource(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("/** @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead */\n")
-            ->write("public function getSource()\n", "{\n")
-            ->indent()
-            ->write("@trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', E_USER_DEPRECATED);\n\n")
-            ->write('return $this->getSourceContext()->getCode();')
-            ->raw("\n")
-            ->outdent()
-            ->write("}\n\n")
-        ;
-    }
-
-    protected function compileGetSourceContext(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->write("public function getSourceContext()\n", "{\n")
-            ->indent()
-            ->write('return new Twig_Source(')
-            ->string($compiler->getEnvironment()->isDebug() ? $this->source->getCode() : '')
-            ->raw(', ')
-            ->string($this->source->getName())
-            ->raw(', ')
-            ->string($this->source->getPath())
-            ->raw(");\n")
-            ->outdent()
-            ->write("}\n")
-        ;
-    }
-
-    protected function compileLoadTemplate(Twig_Compiler $compiler, $node, $var)
-    {
-        if ($node instanceof Twig_Node_Expression_Constant) {
-            $compiler
-                ->write(sprintf('%s = $this->loadTemplate(', $var))
-                ->subcompile($node)
-                ->raw(', ')
-                ->repr($node->getTemplateName())
-                ->raw(', ')
-                ->repr($node->getTemplateLine())
-                ->raw(");\n")
-            ;
-        } else {
-            throw new LogicException('Trait templates can only be constant nodes.');
-        }
     }
 }
-
-class_alias('Twig_Node_Module', 'Twig\Node\ModuleNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Print.php b/vendor/twig/twig/lib/Twig/Node/Print.php
index 374db89b..ffb5f113 100644
--- a/vendor/twig/twig/lib/Twig/Node/Print.php
+++ b/vendor/twig/twig/lib/Twig/Node/Print.php
@@ -1,36 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\PrintNode;
 
-/**
- * Represents a node that outputs an expression.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Print extends Twig_Node implements Twig_NodeOutputInterface
-{
-    public function __construct(Twig_Node_Expression $expr, $lineno, $tag = null)
-    {
-        parent::__construct(array('expr' => $expr), array(), $lineno, $tag);
-    }
+class_exists('Twig\Node\PrintNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Print" class is deprecated since Twig version 2.7, use "Twig\Node\PrintNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\PrintNode" instead */
+    class Twig_Node_Print extends PrintNode
     {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('echo ')
-            ->subcompile($this->getNode('expr'))
-            ->raw(";\n")
-        ;
     }
 }
-
-class_alias('Twig_Node_Print', 'Twig\Node\PrintNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Sandbox.php b/vendor/twig/twig/lib/Twig/Node/Sandbox.php
index 44b30ab9..4f387056 100644
--- a/vendor/twig/twig/lib/Twig/Node/Sandbox.php
+++ b/vendor/twig/twig/lib/Twig/Node/Sandbox.php
@@ -1,44 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\SandboxNode;
 
-/**
- * Represents a sandbox node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Sandbox extends Twig_Node
-{
-    public function __construct(Twig_NodeInterface $body, $lineno, $tag = null)
-    {
-        parent::__construct(array('body' => $body), array(), $lineno, $tag);
-    }
+class_exists('Twig\Node\SandboxNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Sandbox" class is deprecated since Twig version 2.7, use "Twig\Node\SandboxNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\SandboxNode" instead */
+    class Twig_Node_Sandbox extends SandboxNode
     {
-        $compiler
-            ->addDebugInfo($this)
-            ->write("\$sandbox = \$this->env->getExtension('Twig_Extension_Sandbox');\n")
-            ->write("if (!\$alreadySandboxed = \$sandbox->isSandboxed()) {\n")
-            ->indent()
-            ->write("\$sandbox->enableSandbox();\n")
-            ->outdent()
-            ->write("}\n")
-            ->subcompile($this->getNode('body'))
-            ->write("if (!\$alreadySandboxed) {\n")
-            ->indent()
-            ->write("\$sandbox->disableSandbox();\n")
-            ->outdent()
-            ->write("}\n")
-        ;
     }
 }
-
-class_alias('Twig_Node_Sandbox', 'Twig\Node\SandboxNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php b/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php
index a08f21f5..a17e305d 100644
--- a/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php
+++ b/vendor/twig/twig/lib/Twig/Node/SandboxedPrint.php
@@ -1,51 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\SandboxedPrintNode;
 
-/**
- * Twig_Node_SandboxedPrint adds a check for the __toString() method
- * when the variable is an object and the sandbox is activated.
- *
- * When there is a simple Print statement, like {{ article }},
- * and if the sandbox is enabled, we need to check that the __toString()
- * method is allowed if 'article' is an object.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_SandboxedPrint extends Twig_Node_Print
-{
-    public function compile(Twig_Compiler $compiler)
-    {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('echo $this->env->getExtension(\'Twig_Extension_Sandbox\')->ensureToStringAllowed(')
-            ->subcompile($this->getNode('expr'))
-            ->raw(");\n")
-        ;
-    }
+class_exists('Twig\Node\SandboxedPrintNode');
 
-    /**
-     * Removes node filters.
-     *
-     * This is mostly needed when another visitor adds filters (like the escaper one).
-     *
-     * @return Twig_Node
-     */
-    protected function removeNodeFilter(Twig_Node $node)
-    {
-        if ($node instanceof Twig_Node_Expression_Filter) {
-            return $this->removeNodeFilter($node->getNode('node'));
-        }
+@trigger_error(sprintf('Using the "Twig_Node_SandboxedPrint" class is deprecated since Twig version 2.7, use "Twig\Node\SandboxedPrintNode" instead.'), E_USER_DEPRECATED);
 
-        return $node;
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\SandboxedPrintNode" instead */
+    class Twig_Node_SandboxedPrint extends SandboxedPrintNode
+    {
     }
 }
-
-class_alias('Twig_Node_SandboxedPrint', 'Twig\Node\SandboxedPrintNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Set.php b/vendor/twig/twig/lib/Twig/Node/Set.php
index 6c6743ee..db48657d 100644
--- a/vendor/twig/twig/lib/Twig/Node/Set.php
+++ b/vendor/twig/twig/lib/Twig/Node/Set.php
@@ -1,98 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\SetNode;
 
-/**
- * Represents a set node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Set extends Twig_Node implements Twig_NodeCaptureInterface
-{
-    public function __construct($capture, Twig_NodeInterface $names, Twig_NodeInterface $values, $lineno, $tag = null)
-    {
-        parent::__construct(array('names' => $names, 'values' => $values), array('capture' => $capture, 'safe' => false), $lineno, $tag);
-
-        /*
-         * Optimizes the node when capture is used for a large block of text.
-         *
-         * {% set foo %}foo{% endset %} is compiled to $context['foo'] = new Twig_Markup("foo");
-         */
-        if ($this->getAttribute('capture')) {
-            $this->setAttribute('safe', true);
+class_exists('Twig\Node\SetNode');
 
-            $values = $this->getNode('values');
-            if ($values instanceof Twig_Node_Text) {
-                $this->setNode('values', new Twig_Node_Expression_Constant($values->getAttribute('data'), $values->getTemplateLine()));
-                $this->setAttribute('capture', false);
-            }
-        }
-    }
+@trigger_error(sprintf('Using the "Twig_Node_Set" class is deprecated since Twig version 2.7, use "Twig\Node\SetNode" instead.'), E_USER_DEPRECATED);
 
-    public function compile(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\SetNode" instead */
+    class Twig_Node_Set extends SetNode
     {
-        $compiler->addDebugInfo($this);
-
-        if (count($this->getNode('names')) > 1) {
-            $compiler->write('list(');
-            foreach ($this->getNode('names') as $idx => $node) {
-                if ($idx) {
-                    $compiler->raw(', ');
-                }
-
-                $compiler->subcompile($node);
-            }
-            $compiler->raw(')');
-        } else {
-            if ($this->getAttribute('capture')) {
-                $compiler
-                    ->write("ob_start();\n")
-                    ->subcompile($this->getNode('values'))
-                ;
-            }
-
-            $compiler->subcompile($this->getNode('names'), false);
-
-            if ($this->getAttribute('capture')) {
-                $compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())");
-            }
-        }
-
-        if (!$this->getAttribute('capture')) {
-            $compiler->raw(' = ');
-
-            if (count($this->getNode('names')) > 1) {
-                $compiler->write('array(');
-                foreach ($this->getNode('values') as $idx => $value) {
-                    if ($idx) {
-                        $compiler->raw(', ');
-                    }
-
-                    $compiler->subcompile($value);
-                }
-                $compiler->raw(')');
-            } else {
-                if ($this->getAttribute('safe')) {
-                    $compiler
-                        ->raw("('' === \$tmp = ")
-                        ->subcompile($this->getNode('values'))
-                        ->raw(") ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())")
-                    ;
-                } else {
-                    $compiler->subcompile($this->getNode('values'));
-                }
-            }
-        }
-
-        $compiler->raw(";\n");
     }
 }
-
-class_alias('Twig_Node_Set', 'Twig\Node\SetNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/SetTemp.php b/vendor/twig/twig/lib/Twig/Node/SetTemp.php
deleted file mode 100644
index 996fdcde..00000000
--- a/vendor/twig/twig/lib/Twig/Node/SetTemp.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * @internal
- */
-class Twig_Node_SetTemp extends Twig_Node
-{
-    public function __construct($name, $lineno)
-    {
-        parent::__construct(array(), array('name' => $name), $lineno);
-    }
-
-    public function compile(Twig_Compiler $compiler)
-    {
-        $name = $this->getAttribute('name');
-        $compiler
-            ->addDebugInfo($this)
-            ->write('if (isset($context[')
-            ->string($name)
-            ->raw('])) { $_')
-            ->raw($name)
-            ->raw('_ = $context[')
-            ->repr($name)
-            ->raw(']; } else { $_')
-            ->raw($name)
-            ->raw("_ = null; }\n")
-        ;
-    }
-}
-
-class_alias('Twig_Node_SetTemp', 'Twig\Node\SetTempNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Spaceless.php b/vendor/twig/twig/lib/Twig/Node/Spaceless.php
index 76f90cde..9f0fd0a6 100644
--- a/vendor/twig/twig/lib/Twig/Node/Spaceless.php
+++ b/vendor/twig/twig/lib/Twig/Node/Spaceless.php
@@ -1,37 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\SpacelessNode;
 
-/**
- * Represents a spaceless node.
- *
- * It removes spaces between HTML tags.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Spaceless extends Twig_Node
-{
-    public function __construct(Twig_NodeInterface $body, $lineno, $tag = 'spaceless')
-    {
-        parent::__construct(array('body' => $body), array(), $lineno, $tag);
-    }
+class_exists('Twig\Node\SpacelessNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Spaceless" class is deprecated since Twig version 2.7, use "Twig\Node\SpacelessNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\SpacelessNode" instead */
+    class Twig_Node_Spaceless extends SpacelessNode
     {
-        $compiler
-            ->addDebugInfo($this)
-            ->write("ob_start();\n")
-            ->subcompile($this->getNode('body'))
-            ->write("echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));\n")
-        ;
     }
 }
-
-class_alias('Twig_Node_Spaceless', 'Twig\Node\SpacelessNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/Text.php b/vendor/twig/twig/lib/Twig/Node/Text.php
index f4577fee..f85ab37f 100644
--- a/vendor/twig/twig/lib/Twig/Node/Text.php
+++ b/vendor/twig/twig/lib/Twig/Node/Text.php
@@ -1,36 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\TextNode;
 
-/**
- * Represents a text node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_Text extends Twig_Node implements Twig_NodeOutputInterface
-{
-    public function __construct($data, $lineno)
-    {
-        parent::__construct(array(), array('data' => $data), $lineno);
-    }
+class_exists('Twig\Node\TextNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Node_Text" class is deprecated since Twig version 2.7, use "Twig\Node\TextNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\TextNode" instead */
+    class Twig_Node_Text extends TextNode
     {
-        $compiler
-            ->addDebugInfo($this)
-            ->write('echo ')
-            ->string($this->getAttribute('data'))
-            ->raw(";\n")
-        ;
     }
 }
-
-class_alias('Twig_Node_Text', 'Twig\Node\TextNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Node/With.php b/vendor/twig/twig/lib/Twig/Node/With.php
index 2ab0ea5d..3c6321d1 100644
--- a/vendor/twig/twig/lib/Twig/Node/With.php
+++ b/vendor/twig/twig/lib/Twig/Node/With.php
@@ -1,64 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\WithNode;
 
-/**
- * Represents a nested "with" scope.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Node_With extends Twig_Node
-{
-    public function __construct(Twig_Node $body, Twig_Node $variables = null, $only = false, $lineno, $tag = null)
-    {
-        $nodes = array('body' => $body);
-        if (null !== $variables) {
-            $nodes['variables'] = $variables;
-        }
+class_exists('Twig\Node\WithNode');
 
-        parent::__construct($nodes, array('only' => (bool) $only), $lineno, $tag);
-    }
+@trigger_error(sprintf('Using the "Twig_Node_With" class is deprecated since Twig version 2.7, use "Twig\Node\WithNode" instead.'), E_USER_DEPRECATED);
 
-    public function compile(Twig_Compiler $compiler)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\WithNode" instead */
+    class Twig_Node_With extends WithNode
     {
-        $compiler->addDebugInfo($this);
-
-        if ($this->hasNode('variables')) {
-            $varsName = $compiler->getVarName();
-            $compiler
-                ->write(sprintf('$%s = ', $varsName))
-                ->subcompile($this->getNode('variables'))
-                ->raw(";\n")
-                ->write(sprintf("if (!is_array(\$%s)) {\n", $varsName))
-                ->indent()
-                ->write("throw new Twig_Error_Runtime('Variables passed to the \"with\" tag must be a hash.');\n")
-                ->outdent()
-                ->write("}\n")
-            ;
-
-            if ($this->getAttribute('only')) {
-                $compiler->write("\$context = array('_parent' => \$context);\n");
-            } else {
-                $compiler->write("\$context['_parent'] = \$context;\n");
-            }
-
-            $compiler->write(sprintf("\$context = array_merge(\$context, \$%s);\n", $varsName));
-        } else {
-            $compiler->write("\$context['_parent'] = \$context;\n");
-        }
-
-        $compiler
-            ->subcompile($this->getNode('body'))
-            ->write("\$context = \$context['_parent'];\n")
-        ;
     }
 }
-
-class_alias('Twig_Node_With', 'Twig\Node\WithNode', false);
diff --git a/vendor/twig/twig/lib/Twig/NodeCaptureInterface.php b/vendor/twig/twig/lib/Twig/NodeCaptureInterface.php
index 6638834b..d3cfb1e9 100644
--- a/vendor/twig/twig/lib/Twig/NodeCaptureInterface.php
+++ b/vendor/twig/twig/lib/Twig/NodeCaptureInterface.php
@@ -1,21 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\NodeCaptureInterface;
 
-/**
- * Represents a node that captures any nested displayable nodes.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_NodeCaptureInterface
-{
-}
+class_exists('Twig\Node\NodeCaptureInterface');
+
+@trigger_error(sprintf('Using the "Twig_NodeCaptureInterface" class is deprecated since Twig version 2.7, use "Twig\Node\NodeCaptureInterface" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_NodeCaptureInterface', 'Twig\Node\NodeCaptureInterface', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\NodeCaptureInterface" instead */
+    class Twig_NodeCaptureInterface extends NodeCaptureInterface
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/NodeInterface.php b/vendor/twig/twig/lib/Twig/NodeInterface.php
deleted file mode 100644
index 78e758bd..00000000
--- a/vendor/twig/twig/lib/Twig/NodeInterface.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a node in the AST.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_NodeInterface extends Countable, IteratorAggregate
-{
-    /**
-     * Compiles the node to PHP.
-     */
-    public function compile(Twig_Compiler $compiler);
-
-    /**
-     * @deprecated since 1.27 (to be removed in 2.0)
-     */
-    public function getLine();
-
-    public function getNodeTag();
-}
diff --git a/vendor/twig/twig/lib/Twig/NodeOutputInterface.php b/vendor/twig/twig/lib/Twig/NodeOutputInterface.php
index 5a8eaa9c..4268e2fc 100644
--- a/vendor/twig/twig/lib/Twig/NodeOutputInterface.php
+++ b/vendor/twig/twig/lib/Twig/NodeOutputInterface.php
@@ -1,21 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Node\NodeOutputInterface;
 
-/**
- * Represents a displayable node in the AST.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_NodeOutputInterface
-{
-}
+class_exists('Twig\Node\NodeOutputInterface');
+
+@trigger_error(sprintf('Using the "Twig_NodeOutputInterface" class is deprecated since Twig version 2.7, use "Twig\Node\NodeOutputInterface" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_NodeOutputInterface', 'Twig\Node\NodeOutputInterface', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Node\NodeOutputInterface" instead */
+    class Twig_NodeOutputInterface extends NodeOutputInterface
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/NodeTraverser.php b/vendor/twig/twig/lib/Twig/NodeTraverser.php
index 787629ce..66d8fe89 100644
--- a/vendor/twig/twig/lib/Twig/NodeTraverser.php
+++ b/vendor/twig/twig/lib/Twig/NodeTraverser.php
@@ -1,84 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\NodeTraverser;
 
-/**
- * Twig_NodeTraverser is a node traverser.
- *
- * It visits all nodes and their children and calls the given visitor for each.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_NodeTraverser
-{
-    protected $env;
-    protected $visitors = array();
+class_exists('Twig\NodeTraverser');
 
-    /**
-     * @param Twig_Environment            $env
-     * @param Twig_NodeVisitorInterface[] $visitors
-     */
-    public function __construct(Twig_Environment $env, array $visitors = array())
-    {
-        $this->env = $env;
-        foreach ($visitors as $visitor) {
-            $this->addVisitor($visitor);
-        }
-    }
-
-    public function addVisitor(Twig_NodeVisitorInterface $visitor)
-    {
-        if (!isset($this->visitors[$visitor->getPriority()])) {
-            $this->visitors[$visitor->getPriority()] = array();
-        }
-
-        $this->visitors[$visitor->getPriority()][] = $visitor;
-    }
-
-    /**
-     * Traverses a node and calls the registered visitors.
-     *
-     * @return Twig_NodeInterface
-     */
-    public function traverse(Twig_NodeInterface $node)
-    {
-        ksort($this->visitors);
-        foreach ($this->visitors as $visitors) {
-            foreach ($visitors as $visitor) {
-                $node = $this->traverseForVisitor($visitor, $node);
-            }
-        }
-
-        return $node;
-    }
+@trigger_error(sprintf('Using the "Twig_NodeTraverser" class is deprecated since Twig version 2.7, use "Twig\NodeTraverser" instead.'), E_USER_DEPRECATED);
 
-    protected function traverseForVisitor(Twig_NodeVisitorInterface $visitor, Twig_NodeInterface $node = null)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\NodeTraverser" instead */
+    class Twig_NodeTraverser extends NodeTraverser
     {
-        if (null === $node) {
-            return;
-        }
-
-        $node = $visitor->enterNode($node, $this->env);
-
-        foreach ($node as $k => $n) {
-            if (false !== $n = $this->traverseForVisitor($visitor, $n)) {
-                $node->setNode($k, $n);
-            } else {
-                $node->removeNode($k);
-            }
-        }
-
-        return $visitor->leaveNode($node, $this->env);
     }
 }
-
-class_alias('Twig_NodeTraverser', 'Twig\NodeTraverser', false);
diff --git a/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php b/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php
index 1a1ae66f..d1fd6c29 100644
--- a/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php
+++ b/vendor/twig/twig/lib/Twig/NodeVisitor/Escaper.php
@@ -1,154 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\NodeVisitor\EscaperNodeVisitor;
 
-/**
- * Twig_NodeVisitor_Escaper implements output escaping.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_NodeVisitor_Escaper extends Twig_BaseNodeVisitor
-{
-    protected $statusStack = array();
-    protected $blocks = array();
-    protected $safeAnalysis;
-    protected $traverser;
-    protected $defaultStrategy = false;
-    protected $safeVars = array();
+class_exists('Twig\NodeVisitor\EscaperNodeVisitor');
 
-    public function __construct()
-    {
-        $this->safeAnalysis = new Twig_NodeVisitor_SafeAnalysis();
-    }
+@trigger_error(sprintf('Using the "Twig_NodeVisitor_Escaper" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\EscaperNodeVisitor" instead.'), E_USER_DEPRECATED);
 
-    protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\EscaperNodeVisitor" instead */
+    class Twig_NodeVisitor_Escaper extends EscaperNodeVisitor
     {
-        if ($node instanceof Twig_Node_Module) {
-            if ($env->hasExtension('Twig_Extension_Escaper') && $defaultStrategy = $env->getExtension('Twig_Extension_Escaper')->getDefaultStrategy($node->getTemplateName())) {
-                $this->defaultStrategy = $defaultStrategy;
-            }
-            $this->safeVars = array();
-            $this->blocks = array();
-        } elseif ($node instanceof Twig_Node_AutoEscape) {
-            $this->statusStack[] = $node->getAttribute('value');
-        } elseif ($node instanceof Twig_Node_Block) {
-            $this->statusStack[] = isset($this->blocks[$node->getAttribute('name')]) ? $this->blocks[$node->getAttribute('name')] : $this->needEscaping($env);
-        } elseif ($node instanceof Twig_Node_Import) {
-            $this->safeVars[] = $node->getNode('var')->getAttribute('name');
-        }
-
-        return $node;
-    }
-
-    protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_Module) {
-            $this->defaultStrategy = false;
-            $this->safeVars = array();
-            $this->blocks = array();
-        } elseif ($node instanceof Twig_Node_Expression_Filter) {
-            return $this->preEscapeFilterNode($node, $env);
-        } elseif ($node instanceof Twig_Node_Print) {
-            return $this->escapePrintNode($node, $env, $this->needEscaping($env));
-        }
-
-        if ($node instanceof Twig_Node_AutoEscape || $node instanceof Twig_Node_Block) {
-            array_pop($this->statusStack);
-        } elseif ($node instanceof Twig_Node_BlockReference) {
-            $this->blocks[$node->getAttribute('name')] = $this->needEscaping($env);
-        }
-
-        return $node;
-    }
-
-    protected function escapePrintNode(Twig_Node_Print $node, Twig_Environment $env, $type)
-    {
-        if (false === $type) {
-            return $node;
-        }
-
-        $expression = $node->getNode('expr');
-
-        if ($this->isSafeFor($type, $expression, $env)) {
-            return $node;
-        }
-
-        $class = get_class($node);
-
-        return new $class(
-            $this->getEscaperFilter($type, $expression),
-            $node->getTemplateLine()
-        );
-    }
-
-    protected function preEscapeFilterNode(Twig_Node_Expression_Filter $filter, Twig_Environment $env)
-    {
-        $name = $filter->getNode('filter')->getAttribute('value');
-
-        $type = $env->getFilter($name)->getPreEscape();
-        if (null === $type) {
-            return $filter;
-        }
-
-        $node = $filter->getNode('node');
-        if ($this->isSafeFor($type, $node, $env)) {
-            return $filter;
-        }
-
-        $filter->setNode('node', $this->getEscaperFilter($type, $node));
-
-        return $filter;
-    }
-
-    protected function isSafeFor($type, Twig_NodeInterface $expression, $env)
-    {
-        $safe = $this->safeAnalysis->getSafe($expression);
-
-        if (null === $safe) {
-            if (null === $this->traverser) {
-                $this->traverser = new Twig_NodeTraverser($env, array($this->safeAnalysis));
-            }
-
-            $this->safeAnalysis->setSafeVars($this->safeVars);
-
-            $this->traverser->traverse($expression);
-            $safe = $this->safeAnalysis->getSafe($expression);
-        }
-
-        return in_array($type, $safe) || in_array('all', $safe);
-    }
-
-    protected function needEscaping(Twig_Environment $env)
-    {
-        if (count($this->statusStack)) {
-            return $this->statusStack[count($this->statusStack) - 1];
-        }
-
-        return $this->defaultStrategy ? $this->defaultStrategy : false;
-    }
-
-    protected function getEscaperFilter($type, Twig_NodeInterface $node)
-    {
-        $line = $node->getTemplateLine();
-        $name = new Twig_Node_Expression_Constant('escape', $line);
-        $args = new Twig_Node(array(new Twig_Node_Expression_Constant((string) $type, $line), new Twig_Node_Expression_Constant(null, $line), new Twig_Node_Expression_Constant(true, $line)));
-
-        return new Twig_Node_Expression_Filter($node, $name, $args, $line);
-    }
-
-    public function getPriority()
-    {
-        return 0;
     }
 }
-
-class_alias('Twig_NodeVisitor_Escaper', 'Twig\NodeVisitor\EscaperNodeVisitor', false);
diff --git a/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php b/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php
index 2fa19f3d..6c7b202e 100644
--- a/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php
+++ b/vendor/twig/twig/lib/Twig/NodeVisitor/Optimizer.php
@@ -1,253 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\NodeVisitor\OptimizerNodeVisitor;
 
-/**
- * Twig_NodeVisitor_Optimizer tries to optimizes the AST.
- *
- * This visitor is always the last registered one.
- *
- * You can configure which optimizations you want to activate via the
- * optimizer mode.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_NodeVisitor_Optimizer extends Twig_BaseNodeVisitor
-{
-    const OPTIMIZE_ALL = -1;
-    const OPTIMIZE_NONE = 0;
-    const OPTIMIZE_FOR = 2;
-    const OPTIMIZE_RAW_FILTER = 4;
-    const OPTIMIZE_VAR_ACCESS = 8;
+class_exists('Twig\NodeVisitor\OptimizerNodeVisitor');
 
-    protected $loops = array();
-    protected $loopsTargets = array();
-    protected $optimizers;
-    protected $prependedNodes = array();
-    protected $inABody = false;
+@trigger_error(sprintf('Using the "Twig_NodeVisitor_Optimizer" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\OptimizerNodeVisitor" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * @param int $optimizers The optimizer mode
-     */
-    public function __construct($optimizers = -1)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\OptimizerNodeVisitor" instead */
+    class Twig_NodeVisitor_Optimizer extends OptimizerNodeVisitor
     {
-        if (!is_int($optimizers) || $optimizers > (self::OPTIMIZE_FOR | self::OPTIMIZE_RAW_FILTER | self::OPTIMIZE_VAR_ACCESS)) {
-            throw new InvalidArgumentException(sprintf('Optimizer mode "%s" is not valid.', $optimizers));
-        }
-
-        $this->optimizers = $optimizers;
-    }
-
-    protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
-    {
-        if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
-            $this->enterOptimizeFor($node, $env);
-        }
-
-        if (PHP_VERSION_ID < 50400 && self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('Twig_Extension_Sandbox')) {
-            if ($this->inABody) {
-                if (!$node instanceof Twig_Node_Expression) {
-                    if (get_class($node) !== 'Twig_Node') {
-                        array_unshift($this->prependedNodes, array());
-                    }
-                } else {
-                    $node = $this->optimizeVariables($node, $env);
-                }
-            } elseif ($node instanceof Twig_Node_Body) {
-                $this->inABody = true;
-            }
-        }
-
-        return $node;
-    }
-
-    protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
-    {
-        $expression = $node instanceof Twig_Node_Expression;
-
-        if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
-            $this->leaveOptimizeFor($node, $env);
-        }
-
-        if (self::OPTIMIZE_RAW_FILTER === (self::OPTIMIZE_RAW_FILTER & $this->optimizers)) {
-            $node = $this->optimizeRawFilter($node, $env);
-        }
-
-        $node = $this->optimizePrintNode($node, $env);
-
-        if (self::OPTIMIZE_VAR_ACCESS === (self::OPTIMIZE_VAR_ACCESS & $this->optimizers) && !$env->isStrictVariables() && !$env->hasExtension('Twig_Extension_Sandbox')) {
-            if ($node instanceof Twig_Node_Body) {
-                $this->inABody = false;
-            } elseif ($this->inABody) {
-                if (!$expression && get_class($node) !== 'Twig_Node' && $prependedNodes = array_shift($this->prependedNodes)) {
-                    $nodes = array();
-                    foreach (array_unique($prependedNodes) as $name) {
-                        $nodes[] = new Twig_Node_SetTemp($name, $node->getTemplateLine());
-                    }
-
-                    $nodes[] = $node;
-                    $node = new Twig_Node($nodes);
-                }
-            }
-        }
-
-        return $node;
-    }
-
-    protected function optimizeVariables(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if ('Twig_Node_Expression_Name' === get_class($node) && $node->isSimple()) {
-            $this->prependedNodes[0][] = $node->getAttribute('name');
-
-            return new Twig_Node_Expression_TempName($node->getAttribute('name'), $node->getTemplateLine());
-        }
-
-        return $node;
-    }
-
-    /**
-     * Optimizes print nodes.
-     *
-     * It replaces:
-     *
-     *   * "echo $this->render(Parent)Block()" with "$this->display(Parent)Block()"
-     *
-     * @return Twig_NodeInterface
-     */
-    protected function optimizePrintNode(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if (!$node instanceof Twig_Node_Print) {
-            return $node;
-        }
-
-        $exprNode = $node->getNode('expr');
-        if (
-            $exprNode instanceof Twig_Node_Expression_BlockReference ||
-            $exprNode instanceof Twig_Node_Expression_Parent
-        ) {
-            $exprNode->setAttribute('output', true);
-
-            return $exprNode;
-        }
-
-        return $node;
-    }
-
-    /**
-     * Removes "raw" filters.
-     *
-     * @return Twig_NodeInterface
-     */
-    protected function optimizeRawFilter(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_Expression_Filter && 'raw' == $node->getNode('filter')->getAttribute('value')) {
-            return $node->getNode('node');
-        }
-
-        return $node;
-    }
-
-    /**
-     * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
-     */
-    protected function enterOptimizeFor(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_For) {
-            // disable the loop variable by default
-            $node->setAttribute('with_loop', false);
-            array_unshift($this->loops, $node);
-            array_unshift($this->loopsTargets, $node->getNode('value_target')->getAttribute('name'));
-            array_unshift($this->loopsTargets, $node->getNode('key_target')->getAttribute('name'));
-        } elseif (!$this->loops) {
-            // we are outside a loop
-            return;
-        }
-
-        // when do we need to add the loop variable back?
-
-        // the loop variable is referenced for the current loop
-        elseif ($node instanceof Twig_Node_Expression_Name && 'loop' === $node->getAttribute('name')) {
-            $node->setAttribute('always_defined', true);
-            $this->addLoopToCurrent();
-        }
-
-        // optimize access to loop targets
-        elseif ($node instanceof Twig_Node_Expression_Name && in_array($node->getAttribute('name'), $this->loopsTargets)) {
-            $node->setAttribute('always_defined', true);
-        }
-
-        // block reference
-        elseif ($node instanceof Twig_Node_BlockReference || $node instanceof Twig_Node_Expression_BlockReference) {
-            $this->addLoopToCurrent();
-        }
-
-        // include without the only attribute
-        elseif ($node instanceof Twig_Node_Include && !$node->getAttribute('only')) {
-            $this->addLoopToAll();
-        }
-
-        // include function without the with_context=false parameter
-        elseif ($node instanceof Twig_Node_Expression_Function
-            && 'include' === $node->getAttribute('name')
-            && (!$node->getNode('arguments')->hasNode('with_context')
-                 || false !== $node->getNode('arguments')->getNode('with_context')->getAttribute('value')
-               )
-        ) {
-            $this->addLoopToAll();
-        }
-
-        // the loop variable is referenced via an attribute
-        elseif ($node instanceof Twig_Node_Expression_GetAttr
-            && (!$node->getNode('attribute') instanceof Twig_Node_Expression_Constant
-                || 'parent' === $node->getNode('attribute')->getAttribute('value')
-               )
-            && (true === $this->loops[0]->getAttribute('with_loop')
-                || ($node->getNode('node') instanceof Twig_Node_Expression_Name
-                    && 'loop' === $node->getNode('node')->getAttribute('name')
-                   )
-               )
-        ) {
-            $this->addLoopToAll();
-        }
-    }
-
-    /**
-     * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
-     */
-    protected function leaveOptimizeFor(Twig_NodeInterface $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_For) {
-            array_shift($this->loops);
-            array_shift($this->loopsTargets);
-            array_shift($this->loopsTargets);
-        }
-    }
-
-    protected function addLoopToCurrent()
-    {
-        $this->loops[0]->setAttribute('with_loop', true);
-    }
-
-    protected function addLoopToAll()
-    {
-        foreach ($this->loops as $loop) {
-            $loop->setAttribute('with_loop', true);
-        }
-    }
-
-    public function getPriority()
-    {
-        return 255;
     }
 }
-
-class_alias('Twig_NodeVisitor_Optimizer', 'Twig\NodeVisitor\OptimizerNodeVisitor', false);
diff --git a/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php b/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php
index ca31c8fc..58cbd897 100644
--- a/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php
+++ b/vendor/twig/twig/lib/Twig/NodeVisitor/SafeAnalysis.php
@@ -1,150 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\NodeVisitor\SafeAnalysisNodeVisitor;
 
-/**
- * @final
- */
-class Twig_NodeVisitor_SafeAnalysis extends Twig_BaseNodeVisitor
-{
-    protected $data = array();
-    protected $safeVars = array();
+class_exists('Twig\NodeVisitor\SafeAnalysisNodeVisitor');
 
-    public function setSafeVars($safeVars)
-    {
-        $this->safeVars = $safeVars;
-    }
-
-    public function getSafe(Twig_NodeInterface $node)
-    {
-        $hash = spl_object_hash($node);
-        if (!isset($this->data[$hash])) {
-            return;
-        }
-
-        foreach ($this->data[$hash] as $bucket) {
-            if ($bucket['key'] !== $node) {
-                continue;
-            }
-
-            if (in_array('html_attr', $bucket['value'])) {
-                $bucket['value'][] = 'html';
-            }
-
-            return $bucket['value'];
-        }
-    }
-
-    protected function setSafe(Twig_NodeInterface $node, array $safe)
-    {
-        $hash = spl_object_hash($node);
-        if (isset($this->data[$hash])) {
-            foreach ($this->data[$hash] as &$bucket) {
-                if ($bucket['key'] === $node) {
-                    $bucket['value'] = $safe;
-
-                    return;
-                }
-            }
-        }
-        $this->data[$hash][] = array(
-            'key' => $node,
-            'value' => $safe,
-        );
-    }
-
-    protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
-    {
-        return $node;
-    }
+@trigger_error(sprintf('Using the "Twig_NodeVisitor_SafeAnalysis" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\SafeAnalysisNodeVisitor" instead.'), E_USER_DEPRECATED);
 
-    protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\SafeAnalysisNodeVisitor" instead */
+    class Twig_NodeVisitor_SafeAnalysis extends SafeAnalysisNodeVisitor
     {
-        if ($node instanceof Twig_Node_Expression_Constant) {
-            // constants are marked safe for all
-            $this->setSafe($node, array('all'));
-        } elseif ($node instanceof Twig_Node_Expression_BlockReference) {
-            // blocks are safe by definition
-            $this->setSafe($node, array('all'));
-        } elseif ($node instanceof Twig_Node_Expression_Parent) {
-            // parent block is safe by definition
-            $this->setSafe($node, array('all'));
-        } elseif ($node instanceof Twig_Node_Expression_Conditional) {
-            // intersect safeness of both operands
-            $safe = $this->intersectSafe($this->getSafe($node->getNode('expr2')), $this->getSafe($node->getNode('expr3')));
-            $this->setSafe($node, $safe);
-        } elseif ($node instanceof Twig_Node_Expression_Filter) {
-            // filter expression is safe when the filter is safe
-            $name = $node->getNode('filter')->getAttribute('value');
-            $args = $node->getNode('arguments');
-            if (false !== $filter = $env->getFilter($name)) {
-                $safe = $filter->getSafe($args);
-                if (null === $safe) {
-                    $safe = $this->intersectSafe($this->getSafe($node->getNode('node')), $filter->getPreservesSafety());
-                }
-                $this->setSafe($node, $safe);
-            } else {
-                $this->setSafe($node, array());
-            }
-        } elseif ($node instanceof Twig_Node_Expression_Function) {
-            // function expression is safe when the function is safe
-            $name = $node->getAttribute('name');
-            $args = $node->getNode('arguments');
-            $function = $env->getFunction($name);
-            if (false !== $function) {
-                $this->setSafe($node, $function->getSafe($args));
-            } else {
-                $this->setSafe($node, array());
-            }
-        } elseif ($node instanceof Twig_Node_Expression_MethodCall) {
-            if ($node->getAttribute('safe')) {
-                $this->setSafe($node, array('all'));
-            } else {
-                $this->setSafe($node, array());
-            }
-        } elseif ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name) {
-            $name = $node->getNode('node')->getAttribute('name');
-            // attributes on template instances are safe
-            if ('_self' == $name || in_array($name, $this->safeVars)) {
-                $this->setSafe($node, array('all'));
-            } else {
-                $this->setSafe($node, array());
-            }
-        } else {
-            $this->setSafe($node, array());
-        }
-
-        return $node;
-    }
-
-    protected function intersectSafe(array $a = null, array $b = null)
-    {
-        if (null === $a || null === $b) {
-            return array();
-        }
-
-        if (in_array('all', $a)) {
-            return $b;
-        }
-
-        if (in_array('all', $b)) {
-            return $a;
-        }
-
-        return array_intersect($a, $b);
-    }
-
-    public function getPriority()
-    {
-        return 0;
     }
 }
-
-class_alias('Twig_NodeVisitor_SafeAnalysis', 'Twig\NodeVisitor\SafeAnalysisNodeVisitor', false);
diff --git a/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php b/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php
index b631b29d..38a0d9aa 100644
--- a/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php
+++ b/vendor/twig/twig/lib/Twig/NodeVisitor/Sandbox.php
@@ -1,77 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\NodeVisitor\SandboxNodeVisitor;
 
-/**
- * Twig_NodeVisitor_Sandbox implements sandboxing.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_NodeVisitor_Sandbox extends Twig_BaseNodeVisitor
-{
-    protected $inAModule = false;
-    protected $tags;
-    protected $filters;
-    protected $functions;
+class_exists('Twig\NodeVisitor\SandboxNodeVisitor');
 
-    protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_Module) {
-            $this->inAModule = true;
-            $this->tags = array();
-            $this->filters = array();
-            $this->functions = array();
-
-            return $node;
-        } elseif ($this->inAModule) {
-            // look for tags
-            if ($node->getNodeTag() && !isset($this->tags[$node->getNodeTag()])) {
-                $this->tags[$node->getNodeTag()] = $node;
-            }
-
-            // look for filters
-            if ($node instanceof Twig_Node_Expression_Filter && !isset($this->filters[$node->getNode('filter')->getAttribute('value')])) {
-                $this->filters[$node->getNode('filter')->getAttribute('value')] = $node;
-            }
-
-            // look for functions
-            if ($node instanceof Twig_Node_Expression_Function && !isset($this->functions[$node->getAttribute('name')])) {
-                $this->functions[$node->getAttribute('name')] = $node;
-            }
-
-            // wrap print to check __toString() calls
-            if ($node instanceof Twig_Node_Print) {
-                return new Twig_Node_SandboxedPrint($node->getNode('expr'), $node->getTemplateLine(), $node->getNodeTag());
-            }
-        }
-
-        return $node;
-    }
+@trigger_error(sprintf('Using the "Twig_NodeVisitor_Sandbox" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\SandboxNodeVisitor" instead.'), E_USER_DEPRECATED);
 
-    protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\SandboxNodeVisitor" instead */
+    class Twig_NodeVisitor_Sandbox extends SandboxNodeVisitor
     {
-        if ($node instanceof Twig_Node_Module) {
-            $this->inAModule = false;
-
-            $node->setNode('display_start', new Twig_Node(array(new Twig_Node_CheckSecurity($this->filters, $this->tags, $this->functions), $node->getNode('display_start'))));
-        }
-
-        return $node;
-    }
-
-    public function getPriority()
-    {
-        return 0;
     }
 }
-
-class_alias('Twig_NodeVisitor_Sandbox', 'Twig\NodeVisitor\SandboxNodeVisitor', false);
diff --git a/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php b/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php
index 1270a372..36f837f4 100644
--- a/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php
+++ b/vendor/twig/twig/lib/Twig/NodeVisitorInterface.php
@@ -1,45 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\NodeVisitor\NodeVisitorInterface;
 
-/**
- * Twig_NodeVisitorInterface is the interface the all node visitor classes must implement.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_NodeVisitorInterface
-{
-    /**
-     * Called before child nodes are visited.
-     *
-     * @return Twig_NodeInterface The modified node
-     */
-    public function enterNode(Twig_NodeInterface $node, Twig_Environment $env);
+class_exists('Twig\NodeVisitor\NodeVisitorInterface');
 
-    /**
-     * Called after child nodes are visited.
-     *
-     * @return Twig_NodeInterface|false The modified node or false if the node must be removed
-     */
-    public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env);
+@trigger_error(sprintf('Using the "Twig_NodeVisitorInterface" class is deprecated since Twig version 2.7, use "Twig\NodeVisitor\NodeVisitorInterface" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * Returns the priority for this visitor.
-     *
-     * Priority should be between -10 and 10 (0 is the default).
-     *
-     * @return int The priority level
-     */
-    public function getPriority();
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\NodeVisitor\NodeVisitorInterface" instead */
+    class Twig_NodeVisitorInterface extends NodeVisitorInterface
+    {
+    }
 }
-
-class_alias('Twig_NodeVisitorInterface', 'Twig\NodeVisitor\NodeVisitorInterface', false);
-class_exists('Twig_Environment');
-class_exists('Twig_Node');
diff --git a/vendor/twig/twig/lib/Twig/Parser.php b/vendor/twig/twig/lib/Twig/Parser.php
index e796f197..a676499b 100644
--- a/vendor/twig/twig/lib/Twig/Parser.php
+++ b/vendor/twig/twig/lib/Twig/Parser.php
@@ -1,410 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Parser;
 
-/**
- * Default parser implementation.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Parser implements Twig_ParserInterface
-{
-    protected $stack = array();
-    protected $stream;
-    protected $parent;
-    protected $handlers;
-    protected $visitors;
-    protected $expressionParser;
-    protected $blocks;
-    protected $blockStack;
-    protected $macros;
-    protected $env;
-    protected $reservedMacroNames;
-    protected $importedSymbols;
-    protected $traits;
-    protected $embeddedTemplates = array();
+class_exists('Twig\Parser');
 
-    public function __construct(Twig_Environment $env)
-    {
-        $this->env = $env;
-    }
-
-    /**
-     * @deprecated since 1.27 (to be removed in 2.0)
-     */
-    public function getEnvironment()
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0.', E_USER_DEPRECATED);
-
-        return $this->env;
-    }
-
-    public function getVarName()
-    {
-        return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false));
-    }
-
-    /**
-     * @deprecated since 1.27 (to be removed in 2.0). Use $parser->getStream()->getSourceContext()->getPath() instead.
-     */
-    public function getFilename()
-    {
-        @trigger_error(sprintf('The "%s" method is deprecated since version 1.27 and will be removed in 2.0. Use $parser->getStream()->getSourceContext()->getPath() instead.', __METHOD__), E_USER_DEPRECATED);
-
-        return $this->stream->getSourceContext()->getName();
-    }
-
-    public function parse(Twig_TokenStream $stream, $test = null, $dropNeedle = false)
-    {
-        // push all variables into the stack to keep the current state of the parser
-        // using get_object_vars() instead of foreach would lead to https://bugs.php.net/71336
-        // This hack can be removed when min version if PHP 7.0
-        $vars = array();
-        foreach ($this as $k => $v) {
-            $vars[$k] = $v;
-        }
-
-        unset($vars['stack'], $vars['env'], $vars['handlers'], $vars['visitors'], $vars['expressionParser'], $vars['reservedMacroNames']);
-        $this->stack[] = $vars;
-
-        // tag handlers
-        if (null === $this->handlers) {
-            $this->handlers = $this->env->getTokenParsers();
-            $this->handlers->setParser($this);
-        }
-
-        // node visitors
-        if (null === $this->visitors) {
-            $this->visitors = $this->env->getNodeVisitors();
-        }
-
-        if (null === $this->expressionParser) {
-            $this->expressionParser = new Twig_ExpressionParser($this, $this->env);
-        }
-
-        $this->stream = $stream;
-        $this->parent = null;
-        $this->blocks = array();
-        $this->macros = array();
-        $this->traits = array();
-        $this->blockStack = array();
-        $this->importedSymbols = array(array());
-        $this->embeddedTemplates = array();
-
-        try {
-            $body = $this->subparse($test, $dropNeedle);
-
-            if (null !== $this->parent && null === $body = $this->filterBodyNodes($body)) {
-                $body = new Twig_Node();
-            }
-        } catch (Twig_Error_Syntax $e) {
-            if (!$e->getSourceContext()) {
-                $e->setSourceContext($this->stream->getSourceContext());
-            }
-
-            if (!$e->getTemplateLine()) {
-                $e->setTemplateLine($this->stream->getCurrent()->getLine());
-            }
-
-            throw $e;
-        }
-
-        $node = new Twig_Node_Module(new Twig_Node_Body(array($body)), $this->parent, new Twig_Node($this->blocks), new Twig_Node($this->macros), new Twig_Node($this->traits), $this->embeddedTemplates, $stream->getSourceContext());
-
-        $traverser = new Twig_NodeTraverser($this->env, $this->visitors);
-
-        $node = $traverser->traverse($node);
-
-        // restore previous stack so previous parse() call can resume working
-        foreach (array_pop($this->stack) as $key => $val) {
-            $this->$key = $val;
-        }
-
-        return $node;
-    }
-
-    public function subparse($test, $dropNeedle = false)
-    {
-        $lineno = $this->getCurrentToken()->getLine();
-        $rv = array();
-        while (!$this->stream->isEOF()) {
-            switch ($this->getCurrentToken()->getType()) {
-                case Twig_Token::TEXT_TYPE:
-                    $token = $this->stream->next();
-                    $rv[] = new Twig_Node_Text($token->getValue(), $token->getLine());
-                    break;
-
-                case Twig_Token::VAR_START_TYPE:
-                    $token = $this->stream->next();
-                    $expr = $this->expressionParser->parseExpression();
-                    $this->stream->expect(Twig_Token::VAR_END_TYPE);
-                    $rv[] = new Twig_Node_Print($expr, $token->getLine());
-                    break;
-
-                case Twig_Token::BLOCK_START_TYPE:
-                    $this->stream->next();
-                    $token = $this->getCurrentToken();
-
-                    if ($token->getType() !== Twig_Token::NAME_TYPE) {
-                        throw new Twig_Error_Syntax('A block must start with a tag name.', $token->getLine(), $this->stream->getSourceContext());
-                    }
-
-                    if (null !== $test && call_user_func($test, $token)) {
-                        if ($dropNeedle) {
-                            $this->stream->next();
-                        }
-
-                        if (1 === count($rv)) {
-                            return $rv[0];
-                        }
-
-                        return new Twig_Node($rv, array(), $lineno);
-                    }
-
-                    $subparser = $this->handlers->getTokenParser($token->getValue());
-                    if (null === $subparser) {
-                        if (null !== $test) {
-                            $e = new Twig_Error_Syntax(sprintf('Unexpected "%s" tag', $token->getValue()), $token->getLine(), $this->stream->getSourceContext());
-
-                            if (is_array($test) && isset($test[0]) && $test[0] instanceof Twig_TokenParserInterface) {
-                                $e->appendMessage(sprintf(' (expecting closing tag for the "%s" tag defined near line %s).', $test[0]->getTag(), $lineno));
-                            }
-                        } else {
-                            $e = new Twig_Error_Syntax(sprintf('Unknown "%s" tag.', $token->getValue()), $token->getLine(), $this->stream->getSourceContext());
-                            $e->addSuggestions($token->getValue(), array_keys($this->env->getTags()));
-                        }
-
-                        throw $e;
-                    }
-
-                    $this->stream->next();
-
-                    $node = $subparser->parse($token);
-                    if (null !== $node) {
-                        $rv[] = $node;
-                    }
-                    break;
-
-                default:
-                    throw new Twig_Error_Syntax('Lexer or parser ended up in unsupported state.', $this->getCurrentToken()->getLine(), $this->stream->getSourceContext());
-            }
-        }
-
-        if (1 === count($rv)) {
-            return $rv[0];
-        }
-
-        return new Twig_Node($rv, array(), $lineno);
-    }
-
-    /**
-     * @deprecated since 1.27 (to be removed in 2.0)
-     */
-    public function addHandler($name, $class)
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0.', E_USER_DEPRECATED);
-
-        $this->handlers[$name] = $class;
-    }
-
-    /**
-     * @deprecated since 1.27 (to be removed in 2.0)
-     */
-    public function addNodeVisitor(Twig_NodeVisitorInterface $visitor)
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0.', E_USER_DEPRECATED);
-
-        $this->visitors[] = $visitor;
-    }
-
-    public function getBlockStack()
-    {
-        return $this->blockStack;
-    }
-
-    public function peekBlockStack()
-    {
-        return $this->blockStack[count($this->blockStack) - 1];
-    }
-
-    public function popBlockStack()
-    {
-        array_pop($this->blockStack);
-    }
-
-    public function pushBlockStack($name)
-    {
-        $this->blockStack[] = $name;
-    }
+@trigger_error(sprintf('Using the "Twig_Parser" class is deprecated since Twig version 2.7, use "Twig\Parser" instead.'), E_USER_DEPRECATED);
 
-    public function hasBlock($name)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Parser" instead */
+    class Twig_Parser extends Parser
     {
-        return isset($this->blocks[$name]);
-    }
-
-    public function getBlock($name)
-    {
-        return $this->blocks[$name];
-    }
-
-    public function setBlock($name, Twig_Node_Block $value)
-    {
-        $this->blocks[$name] = new Twig_Node_Body(array($value), array(), $value->getTemplateLine());
-    }
-
-    public function hasMacro($name)
-    {
-        return isset($this->macros[$name]);
-    }
-
-    public function setMacro($name, Twig_Node_Macro $node)
-    {
-        if ($this->isReservedMacroName($name)) {
-            throw new Twig_Error_Syntax(sprintf('"%s" cannot be used as a macro name as it is a reserved keyword.', $name), $node->getTemplateLine(), $this->stream->getSourceContext());
-        }
-
-        $this->macros[$name] = $node;
-    }
-
-    public function isReservedMacroName($name)
-    {
-        if (null === $this->reservedMacroNames) {
-            $this->reservedMacroNames = array();
-            $r = new ReflectionClass($this->env->getBaseTemplateClass());
-            foreach ($r->getMethods() as $method) {
-                $methodName = strtolower($method->getName());
-
-                if ('get' === substr($methodName, 0, 3) && isset($methodName[3])) {
-                    $this->reservedMacroNames[] = substr($methodName, 3);
-                }
-            }
-        }
-
-        return in_array(strtolower($name), $this->reservedMacroNames);
-    }
-
-    public function addTrait($trait)
-    {
-        $this->traits[] = $trait;
-    }
-
-    public function hasTraits()
-    {
-        return count($this->traits) > 0;
-    }
-
-    public function embedTemplate(Twig_Node_Module $template)
-    {
-        $template->setIndex(mt_rand());
-
-        $this->embeddedTemplates[] = $template;
-    }
-
-    public function addImportedSymbol($type, $alias, $name = null, Twig_Node_Expression $node = null)
-    {
-        $this->importedSymbols[0][$type][$alias] = array('name' => $name, 'node' => $node);
-    }
-
-    public function getImportedSymbol($type, $alias)
-    {
-        foreach ($this->importedSymbols as $functions) {
-            if (isset($functions[$type][$alias])) {
-                return $functions[$type][$alias];
-            }
-        }
-    }
-
-    public function isMainScope()
-    {
-        return 1 === count($this->importedSymbols);
-    }
-
-    public function pushLocalScope()
-    {
-        array_unshift($this->importedSymbols, array());
-    }
-
-    public function popLocalScope()
-    {
-        array_shift($this->importedSymbols);
-    }
-
-    /**
-     * @return Twig_ExpressionParser
-     */
-    public function getExpressionParser()
-    {
-        return $this->expressionParser;
-    }
-
-    public function getParent()
-    {
-        return $this->parent;
-    }
-
-    public function setParent($parent)
-    {
-        $this->parent = $parent;
-    }
-
-    /**
-     * @return Twig_TokenStream
-     */
-    public function getStream()
-    {
-        return $this->stream;
-    }
-
-    /**
-     * @return Twig_Token
-     */
-    public function getCurrentToken()
-    {
-        return $this->stream->getCurrent();
-    }
-
-    protected function filterBodyNodes(Twig_NodeInterface $node)
-    {
-        // check that the body does not contain non-empty output nodes
-        if (
-            ($node instanceof Twig_Node_Text && !ctype_space($node->getAttribute('data')))
-            ||
-            (!$node instanceof Twig_Node_Text && !$node instanceof Twig_Node_BlockReference && $node instanceof Twig_NodeOutputInterface)
-        ) {
-            if (false !== strpos((string) $node, chr(0xEF).chr(0xBB).chr(0xBF))) {
-                throw new Twig_Error_Syntax('A template that extends another one cannot start with a byte order mark (BOM); it must be removed.', $node->getTemplateLine(), $this->stream->getSourceContext());
-            }
-
-            throw new Twig_Error_Syntax('A template that extends another one cannot include contents outside Twig blocks. Did you forget to put the contents inside a {% block %} tag?', $node->getTemplateLine(), $this->stream->getSourceContext());
-        }
-
-        // bypass nodes that will "capture" the output
-        if ($node instanceof Twig_NodeCaptureInterface) {
-            return $node;
-        }
-
-        if ($node instanceof Twig_NodeOutputInterface) {
-            return;
-        }
-
-        foreach ($node as $k => $n) {
-            if (null !== $n && null === $this->filterBodyNodes($n)) {
-                $node->removeNode($k);
-            }
-        }
-
-        return $node;
     }
 }
-
-class_alias('Twig_Parser', 'Twig\Parser', false);
-class_exists('Twig_Node');
-class_exists('Twig_TokenStream');
diff --git a/vendor/twig/twig/lib/Twig/ParserInterface.php b/vendor/twig/twig/lib/Twig/ParserInterface.php
deleted file mode 100644
index 85c6e67b..00000000
--- a/vendor/twig/twig/lib/Twig/ParserInterface.php
+++ /dev/null
@@ -1,29 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by parser classes.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_ParserInterface
-{
-    /**
-     * Converts a token stream to a node tree.
-     *
-     * @return Twig_Node_Module
-     *
-     * @throws Twig_Error_Syntax When the token stream is syntactically or semantically wrong
-     */
-    public function parse(Twig_TokenStream $stream);
-}
diff --git a/vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php b/vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php
index 913afd4f..484eeca4 100644
--- a/vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php
+++ b/vendor/twig/twig/lib/Twig/Profiler/Dumper/Base.php
@@ -1,62 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Profiler\Dumper\BaseDumper;
 
-/**
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-abstract class Twig_Profiler_Dumper_Base
-{
-    private $root;
+class_exists('Twig\Profiler\Dumper\BaseDumper');
 
-    public function dump(Twig_Profiler_Profile $profile)
-    {
-        return $this->dumpProfile($profile);
-    }
-
-    abstract protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix);
-
-    abstract protected function formatNonTemplate(Twig_Profiler_Profile $profile, $prefix);
-
-    abstract protected function formatTime(Twig_Profiler_Profile $profile, $percent);
+@trigger_error(sprintf('Using the "Twig_Profiler_Dumper_Base" class is deprecated since Twig version 2.7, use "Twig\Profiler\Dumper\BaseDumper" instead.'), E_USER_DEPRECATED);
 
-    private function dumpProfile(Twig_Profiler_Profile $profile, $prefix = '', $sibling = false)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Profiler\Dumper\BaseDumper" instead */
+    class Twig_Profiler_Dumper_Base extends BaseDumper
     {
-        if ($profile->isRoot()) {
-            $this->root = $profile->getDuration();
-            $start = $profile->getName();
-        } else {
-            if ($profile->isTemplate()) {
-                $start = $this->formatTemplate($profile, $prefix);
-            } else {
-                $start = $this->formatNonTemplate($profile, $prefix);
-            }
-            $prefix .= $sibling ? 'â?? ' : '  ';
-        }
-
-        $percent = $this->root ? $profile->getDuration() / $this->root * 100 : 0;
-
-        if ($profile->getDuration() * 1000 < 1) {
-            $str = $start."\n";
-        } else {
-            $str = sprintf("%s %s\n", $start, $this->formatTime($profile, $percent));
-        }
-
-        $nCount = count($profile->getProfiles());
-        foreach ($profile as $i => $p) {
-            $str .= $this->dumpProfile($p, $prefix, $i + 1 !== $nCount);
-        }
-
-        return $str;
     }
 }
-
-class_alias('Twig_Profiler_Dumper_Base', 'Twig\Profiler\Dumper\BaseDumper', false);
-class_exists('Twig_Profiler_Profile');
diff --git a/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php b/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php
index 7a33baf2..673d5704 100644
--- a/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php
+++ b/vendor/twig/twig/lib/Twig/Profiler/Dumper/Blackfire.php
@@ -1,72 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Profiler\Dumper\BlackfireDumper;
 
-/**
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @final
- */
-class Twig_Profiler_Dumper_Blackfire
-{
-    public function dump(Twig_Profiler_Profile $profile)
-    {
-        $data = array();
-        $this->dumpProfile('main()', $profile, $data);
-        $this->dumpChildren('main()', $profile, $data);
-
-        $start = sprintf('%f', microtime(true));
-        $str = <<<EOF
-file-format: BlackfireProbe
-cost-dimensions: wt mu pmu
-request-start: {$start}
-
-
-EOF;
-
-        foreach ($data as $name => $values) {
-            $str .= "{$name}//{$values['ct']} {$values['wt']} {$values['mu']} {$values['pmu']}\n";
-        }
+class_exists('Twig\Profiler\Dumper\BlackfireDumper');
 
-        return $str;
-    }
+@trigger_error(sprintf('Using the "Twig_Profiler_Dumper_Blackfire" class is deprecated since Twig version 2.7, use "Twig\Profiler\Dumper\BlackfireDumper" instead.'), E_USER_DEPRECATED);
 
-    private function dumpChildren($parent, Twig_Profiler_Profile $profile, &$data)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Profiler\Dumper\BlackfireDumper" instead */
+    class Twig_Profiler_Dumper_Blackfire extends BlackfireDumper
     {
-        foreach ($profile as $p) {
-            if ($p->isTemplate()) {
-                $name = $p->getTemplate();
-            } else {
-                $name = sprintf('%s::%s(%s)', $p->getTemplate(), $p->getType(), $p->getName());
-            }
-            $this->dumpProfile(sprintf('%s==>%s', $parent, $name), $p, $data);
-            $this->dumpChildren($name, $p, $data);
-        }
-    }
-
-    private function dumpProfile($edge, Twig_Profiler_Profile $profile, &$data)
-    {
-        if (isset($data[$edge])) {
-            $data[$edge]['ct'] += 1;
-            $data[$edge]['wt'] += floor($profile->getDuration() * 1000000);
-            $data[$edge]['mu'] += $profile->getMemoryUsage();
-            $data[$edge]['pmu'] += $profile->getPeakMemoryUsage();
-        } else {
-            $data[$edge] = array(
-                'ct' => 1,
-                'wt' => floor($profile->getDuration() * 1000000),
-                'mu' => $profile->getMemoryUsage(),
-                'pmu' => $profile->getPeakMemoryUsage(),
-            );
-        }
     }
 }
-
-class_alias('Twig_Profiler_Dumper_Blackfire', 'Twig\Profiler\Dumper\BlackfireDumper', false);
diff --git a/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php b/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php
index b57a2551..114d7046 100644
--- a/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php
+++ b/vendor/twig/twig/lib/Twig/Profiler/Dumper/Html.php
@@ -1,47 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Profiler\Dumper\HtmlDumper;
 
-/**
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @final
- */
-class Twig_Profiler_Dumper_Html extends Twig_Profiler_Dumper_Base
-{
-    private static $colors = array(
-        'block' => '#dfd',
-        'macro' => '#ddf',
-        'template' => '#ffd',
-        'big' => '#d44',
-    );
+class_exists('Twig\Profiler\Dumper\HtmlDumper');
 
-    public function dump(Twig_Profiler_Profile $profile)
-    {
-        return '<pre>'.parent::dump($profile).'</pre>';
-    }
-
-    protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix)
-    {
-        return sprintf('%sâ?? <span style="background-color: %s">%s</span>', $prefix, self::$colors['template'], $profile->getTemplate());
-    }
+@trigger_error(sprintf('Using the "Twig_Profiler_Dumper_Html" class is deprecated since Twig version 2.7, use "Twig\Profiler\Dumper\HtmlDumper" instead.'), E_USER_DEPRECATED);
 
-    protected function formatNonTemplate(Twig_Profiler_Profile $profile, $prefix)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Profiler\Dumper\HtmlDumper" instead */
+    class Twig_Profiler_Dumper_Html extends HtmlDumper
     {
-        return sprintf('%sâ?? %s::%s(<span style="background-color: %s">%s</span>)', $prefix, $profile->getTemplate(), $profile->getType(), isset(self::$colors[$profile->getType()]) ? self::$colors[$profile->getType()] : 'auto', $profile->getName());
-    }
-
-    protected function formatTime(Twig_Profiler_Profile $profile, $percent)
-    {
-        return sprintf('<span style="color: %s">%.2fms/%.0f%%</span>', $percent > 20 ? self::$colors['big'] : 'auto', $profile->getDuration() * 1000, $percent);
     }
 }
-
-class_alias('Twig_Profiler_Dumper_Html', 'Twig\Profiler\Dumper\HtmlDumper', false);
diff --git a/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php b/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php
index 69d2c4bf..907e3178 100644
--- a/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php
+++ b/vendor/twig/twig/lib/Twig/Profiler/Dumper/Text.php
@@ -1,35 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Profiler\Dumper\TextDumper;
 
-/**
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @final
- */
-class Twig_Profiler_Dumper_Text extends Twig_Profiler_Dumper_Base
-{
-    protected function formatTemplate(Twig_Profiler_Profile $profile, $prefix)
-    {
-        return sprintf('%sâ?? %s', $prefix, $profile->getTemplate());
-    }
+class_exists('Twig\Profiler\Dumper\TextDumper');
 
-    protected function formatNonTemplate(Twig_Profiler_Profile $profile, $prefix)
-    {
-        return sprintf('%sâ?? %s::%s(%s)', $prefix, $profile->getTemplate(), $profile->getType(), $profile->getName());
-    }
+@trigger_error(sprintf('Using the "Twig_Profiler_Dumper_Text" class is deprecated since Twig version 2.7, use "Twig\Profiler\Dumper\TextDumper" instead.'), E_USER_DEPRECATED);
 
-    protected function formatTime(Twig_Profiler_Profile $profile, $percent)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Profiler\Dumper\TextDumper" instead */
+    class Twig_Profiler_Dumper_Text extends TextDumper
     {
-        return sprintf('%.2fms/%.0f%%', $profile->getDuration() * 1000, $percent);
     }
 }
-
-class_alias('Twig_Profiler_Dumper_Text', 'Twig\Profiler\Dumper\TextDumper', false);
diff --git a/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php b/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php
index 69c8f797..0ca0d8e6 100644
--- a/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php
+++ b/vendor/twig/twig/lib/Twig/Profiler/Node/EnterProfile.php
@@ -1,39 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Profiler\Node\EnterProfileNode;
 
-/**
- * Represents a profile enter node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Profiler_Node_EnterProfile extends Twig_Node
-{
-    public function __construct($extensionName, $type, $name, $varName)
-    {
-        parent::__construct(array(), array('extension_name' => $extensionName, 'name' => $name, 'type' => $type, 'var_name' => $varName));
-    }
+class_exists('Twig\Profiler\Node\EnterProfileNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Profiler_Node_EnterProfile" class is deprecated since Twig version 2.7, use "Twig\Profiler\Node\EnterProfileNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Profiler\Node\EnterProfileNode" instead */
+    class Twig_Profiler_Node_EnterProfile extends EnterProfileNode
     {
-        $compiler
-            ->write(sprintf('$%s = $this->env->getExtension(', $this->getAttribute('var_name')))
-            ->repr($this->getAttribute('extension_name'))
-            ->raw(");\n")
-            ->write(sprintf('$%s->enter($%s = new Twig_Profiler_Profile($this->getTemplateName(), ', $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof'))
-            ->repr($this->getAttribute('type'))
-            ->raw(', ')
-            ->repr($this->getAttribute('name'))
-            ->raw("));\n\n")
-        ;
     }
 }
-
-class_alias('Twig_Profiler_Node_EnterProfile', 'Twig\Profiler\Node\EnterProfileNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php b/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php
index d1d6a7cc..c582a159 100644
--- a/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php
+++ b/vendor/twig/twig/lib/Twig/Profiler/Node/LeaveProfile.php
@@ -1,33 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Profiler\Node\LeaveProfileNode;
 
-/**
- * Represents a profile leave node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Profiler_Node_LeaveProfile extends Twig_Node
-{
-    public function __construct($varName)
-    {
-        parent::__construct(array(), array('var_name' => $varName));
-    }
+class_exists('Twig\Profiler\Node\LeaveProfileNode');
 
-    public function compile(Twig_Compiler $compiler)
+@trigger_error(sprintf('Using the "Twig_Profiler_Node_LeaveProfile" class is deprecated since Twig version 2.7, use "Twig\Profiler\Node\LeaveProfileNode" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Profiler\Node\LeaveProfileNode" instead */
+    class Twig_Profiler_Node_LeaveProfile extends LeaveProfileNode
     {
-        $compiler
-            ->write("\n")
-            ->write(sprintf("\$%s->leave(\$%s);\n\n", $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof'))
-        ;
     }
 }
-
-class_alias('Twig_Profiler_Node_LeaveProfile', 'Twig\Profiler\Node\LeaveProfileNode', false);
diff --git a/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php b/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php
index a395ae7f..897e251c 100644
--- a/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php
+++ b/vendor/twig/twig/lib/Twig/Profiler/NodeVisitor/Profiler.php
@@ -1,67 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Profiler\NodeVisitor\ProfilerNodeVisitor;
 
-/**
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @final
- */
-class Twig_Profiler_NodeVisitor_Profiler extends Twig_BaseNodeVisitor
-{
-    private $extensionName;
+class_exists('Twig\Profiler\NodeVisitor\ProfilerNodeVisitor');
 
-    public function __construct($extensionName)
-    {
-        $this->extensionName = $extensionName;
-    }
+@trigger_error(sprintf('Using the "Twig_Profiler_NodeVisitor_Profiler" class is deprecated since Twig version 2.7, use "Twig\Profiler\NodeVisitor\ProfilerNodeVisitor" instead.'), E_USER_DEPRECATED);
 
-    protected function doEnterNode(Twig_Node $node, Twig_Environment $env)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Profiler\NodeVisitor\ProfilerNodeVisitor" instead */
+    class Twig_Profiler_NodeVisitor_Profiler extends ProfilerNodeVisitor
     {
-        return $node;
-    }
-
-    protected function doLeaveNode(Twig_Node $node, Twig_Environment $env)
-    {
-        if ($node instanceof Twig_Node_Module) {
-            $varName = $this->getVarName();
-            $node->setNode('display_start', new Twig_Node(array(new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::TEMPLATE, $node->getTemplateName(), $varName), $node->getNode('display_start'))));
-            $node->setNode('display_end', new Twig_Node(array(new Twig_Profiler_Node_LeaveProfile($varName), $node->getNode('display_end'))));
-        } elseif ($node instanceof Twig_Node_Block) {
-            $varName = $this->getVarName();
-            $node->setNode('body', new Twig_Node_Body(array(
-                new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::BLOCK, $node->getAttribute('name'), $varName),
-                $node->getNode('body'),
-                new Twig_Profiler_Node_LeaveProfile($varName),
-            )));
-        } elseif ($node instanceof Twig_Node_Macro) {
-            $varName = $this->getVarName();
-            $node->setNode('body', new Twig_Node_Body(array(
-                new Twig_Profiler_Node_EnterProfile($this->extensionName, Twig_Profiler_Profile::MACRO, $node->getAttribute('name'), $varName),
-                $node->getNode('body'),
-                new Twig_Profiler_Node_LeaveProfile($varName),
-            )));
-        }
-
-        return $node;
-    }
-
-    private function getVarName()
-    {
-        return sprintf('__internal_%s', hash('sha256', uniqid(mt_rand(), true), false));
-    }
-
-    public function getPriority()
-    {
-        return 0;
     }
 }
-
-class_alias('Twig_Profiler_NodeVisitor_Profiler', 'Twig\Profiler\NodeVisitor\ProfilerNodeVisitor', false);
diff --git a/vendor/twig/twig/lib/Twig/Profiler/Profile.php b/vendor/twig/twig/lib/Twig/Profiler/Profile.php
index 3fdc1a8a..0d38befd 100644
--- a/vendor/twig/twig/lib/Twig/Profiler/Profile.php
+++ b/vendor/twig/twig/lib/Twig/Profiler/Profile.php
@@ -1,170 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Profiler\Profile;
 
-/**
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @final
- */
-class Twig_Profiler_Profile implements IteratorAggregate, Serializable
-{
-    const ROOT = 'ROOT';
-    const BLOCK = 'block';
-    const TEMPLATE = 'template';
-    const MACRO = 'macro';
+class_exists('Twig\Profiler\Profile');
 
-    private $template;
-    private $name;
-    private $type;
-    private $starts = array();
-    private $ends = array();
-    private $profiles = array();
+@trigger_error(sprintf('Using the "Twig_Profiler_Profile" class is deprecated since Twig version 2.7, use "Twig\Profiler\Profile" instead.'), E_USER_DEPRECATED);
 
-    public function __construct($template = 'main', $type = self::ROOT, $name = 'main')
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Profiler\Profile" instead */
+    class Twig_Profiler_Profile extends Profile
     {
-        $this->template = $template;
-        $this->type = $type;
-        $this->name = 0 === strpos($name, '__internal_') ? 'INTERNAL' : $name;
-        $this->enter();
-    }
-
-    public function getTemplate()
-    {
-        return $this->template;
-    }
-
-    public function getType()
-    {
-        return $this->type;
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function isRoot()
-    {
-        return self::ROOT === $this->type;
-    }
-
-    public function isTemplate()
-    {
-        return self::TEMPLATE === $this->type;
-    }
-
-    public function isBlock()
-    {
-        return self::BLOCK === $this->type;
-    }
-
-    public function isMacro()
-    {
-        return self::MACRO === $this->type;
-    }
-
-    public function getProfiles()
-    {
-        return $this->profiles;
-    }
-
-    public function addProfile(Twig_Profiler_Profile $profile)
-    {
-        $this->profiles[] = $profile;
-    }
-
-    /**
-     * Returns the duration in microseconds.
-     *
-     * @return int
-     */
-    public function getDuration()
-    {
-        if ($this->isRoot() && $this->profiles) {
-            // for the root node with children, duration is the sum of all child durations
-            $duration = 0;
-            foreach ($this->profiles as $profile) {
-                $duration += $profile->getDuration();
-            }
-
-            return $duration;
-        }
-
-        return isset($this->ends['wt']) && isset($this->starts['wt']) ? $this->ends['wt'] - $this->starts['wt'] : 0;
-    }
-
-    /**
-     * Returns the memory usage in bytes.
-     *
-     * @return int
-     */
-    public function getMemoryUsage()
-    {
-        return isset($this->ends['mu']) && isset($this->starts['mu']) ? $this->ends['mu'] - $this->starts['mu'] : 0;
-    }
-
-    /**
-     * Returns the peak memory usage in bytes.
-     *
-     * @return int
-     */
-    public function getPeakMemoryUsage()
-    {
-        return isset($this->ends['pmu']) && isset($this->starts['pmu']) ? $this->ends['pmu'] - $this->starts['pmu'] : 0;
-    }
-
-    /**
-     * Starts the profiling.
-     */
-    public function enter()
-    {
-        $this->starts = array(
-            'wt' => microtime(true),
-            'mu' => memory_get_usage(),
-            'pmu' => memory_get_peak_usage(),
-        );
-    }
-
-    /**
-     * Stops the profiling.
-     */
-    public function leave()
-    {
-        $this->ends = array(
-            'wt' => microtime(true),
-            'mu' => memory_get_usage(),
-            'pmu' => memory_get_peak_usage(),
-        );
-    }
-
-    public function reset()
-    {
-        $this->starts = $this->ends = $this->profiles = array();
-        $this->enter();
-    }
-
-    public function getIterator()
-    {
-        return new ArrayIterator($this->profiles);
-    }
-
-    public function serialize()
-    {
-        return serialize(array($this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles));
-    }
-
-    public function unserialize($data)
-    {
-        list($this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles) = unserialize($data);
     }
 }
-
-class_alias('Twig_Profiler_Profile', 'Twig\Profiler\Profile', false);
diff --git a/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php b/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php
index f5eb14e0..8edf61ac 100644
--- a/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php
+++ b/vendor/twig/twig/lib/Twig/RuntimeLoaderInterface.php
@@ -1,29 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\RuntimeLoader\RuntimeLoaderInterface;
 
-/**
- * Creates runtime implementations for Twig elements (filters/functions/tests).
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_RuntimeLoaderInterface
-{
-    /**
-     * Creates the runtime implementation of a Twig element (filter/function/test).
-     *
-     * @param string $class A runtime class
-     *
-     * @return object|null The runtime instance or null if the loader does not know how to create the runtime for this class
-     */
-    public function load($class);
-}
+class_exists('Twig\RuntimeLoader\RuntimeLoaderInterface');
+
+@trigger_error(sprintf('Using the "Twig_RuntimeLoaderInterface" class is deprecated since Twig version 2.7, use "Twig\RuntimeLoader\RuntimeLoaderInterface" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_RuntimeLoaderInterface', 'Twig\RuntimeLoader\RuntimeLoaderInterface', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\RuntimeLoader\RuntimeLoaderInterface" instead */
+    class Twig_RuntimeLoaderInterface extends RuntimeLoaderInterface
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php
index b6707e38..aa972698 100644
--- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php
+++ b/vendor/twig/twig/lib/Twig/Sandbox/SecurityError.php
@@ -1,21 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Sandbox\SecurityError;
 
-/**
- * Exception thrown when a security error occurs at runtime.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Sandbox_SecurityError extends Twig_Error
-{
-}
+class_exists('Twig\Sandbox\SecurityError');
+
+@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityError" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_Sandbox_SecurityError', 'Twig\Sandbox\SecurityError', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityError" instead */
+    class Twig_Sandbox_SecurityError extends SecurityError
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php
index 0ba33276..a68cb9ea 100644
--- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php
+++ b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFilterError.php
@@ -1,33 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Sandbox\SecurityNotAllowedFilterError;
 
-/**
- * Exception thrown when a not allowed filter is used in a template.
- *
- * @author Martin HasoÅ? <martin.hason@xxxxxxxxx>
- */
-class Twig_Sandbox_SecurityNotAllowedFilterError extends Twig_Sandbox_SecurityError
-{
-    private $filterName;
+class_exists('Twig\Sandbox\SecurityNotAllowedFilterError');
 
-    public function __construct($message, $functionName, $lineno = -1, $filename = null, Exception $previous = null)
-    {
-        parent::__construct($message, $lineno, $filename, $previous);
-        $this->filterName = $functionName;
-    }
+@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedFilterError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedFilterError" instead.'), E_USER_DEPRECATED);
 
-    public function getFilterName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedFilterError" instead */
+    class Twig_Sandbox_SecurityNotAllowedFilterError extends SecurityNotAllowedFilterError
     {
-        return $this->filterName;
     }
 }
-
-class_alias('Twig_Sandbox_SecurityNotAllowedFilterError', 'Twig\Sandbox\SecurityNotAllowedFilterError', false);
diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php
index aa391429..c1e851c2 100644
--- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php
+++ b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedFunctionError.php
@@ -1,33 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Sandbox\SecurityNotAllowedFunctionError;
 
-/**
- * Exception thrown when a not allowed function is used in a template.
- *
- * @author Martin HasoÅ? <martin.hason@xxxxxxxxx>
- */
-class Twig_Sandbox_SecurityNotAllowedFunctionError extends Twig_Sandbox_SecurityError
-{
-    private $functionName;
+class_exists('Twig\Sandbox\SecurityNotAllowedFunctionError');
 
-    public function __construct($message, $functionName, $lineno = -1, $filename = null, Exception $previous = null)
-    {
-        parent::__construct($message, $lineno, $filename, $previous);
-        $this->functionName = $functionName;
-    }
+@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedFunctionError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedFunctionError" instead.'), E_USER_DEPRECATED);
 
-    public function getFunctionName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedFunctionError" instead */
+    class Twig_Sandbox_SecurityNotAllowedFunctionError extends SecurityNotAllowedFunctionError
     {
-        return $this->functionName;
     }
 }
-
-class_alias('Twig_Sandbox_SecurityNotAllowedFunctionError', 'Twig\Sandbox\SecurityNotAllowedFunctionError', false);
diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php
index 93012fe9..96812ce7 100644
--- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php
+++ b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedMethodError.php
@@ -1,40 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Sandbox\SecurityNotAllowedMethodError;
 
-/**
- * Exception thrown when a not allowed class method is used in a template.
- *
- * @author Kit Burton-Senior <mail@xxxxxxxxx>
- */
-class Twig_Sandbox_SecurityNotAllowedMethodError extends Twig_Sandbox_SecurityError
-{
-    private $className;
-    private $methodName;
+class_exists('Twig\Sandbox\SecurityNotAllowedMethodError');
 
-    public function __construct($message, $className, $methodName, $lineno = -1, $filename = null, Exception $previous = null)
-    {
-        parent::__construct($message, $lineno, $filename, $previous);
-        $this->className = $className;
-        $this->methodName = $methodName;
-    }
-
-    public function getClassName()
-    {
-        return $this->className;
-    }
+@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedMethodError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedMethodError" instead.'), E_USER_DEPRECATED);
 
-    public function getMethodName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedMethodError" instead */
+    class Twig_Sandbox_SecurityNotAllowedMethodError extends SecurityNotAllowedMethodError
     {
-        return $this->methodName;
     }
 }
-
-class_alias('Twig_Sandbox_SecurityNotAllowedMethodError', 'Twig\Sandbox\SecurityNotAllowedMethodError', false);
diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php
index f27969c1..c1cc32b0 100644
--- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php
+++ b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedPropertyError.php
@@ -1,40 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Sandbox\SecurityNotAllowedPropertyError;
 
-/**
- * Exception thrown when a not allowed class property is used in a template.
- *
- * @author Kit Burton-Senior <mail@xxxxxxxxx>
- */
-class Twig_Sandbox_SecurityNotAllowedPropertyError extends Twig_Sandbox_SecurityError
-{
-    private $className;
-    private $propertyName;
+class_exists('Twig\Sandbox\SecurityNotAllowedPropertyError');
 
-    public function __construct($message, $className, $propertyName, $lineno = -1, $filename = null, Exception $previous = null)
-    {
-        parent::__construct($message, $lineno, $filename, $previous);
-        $this->className = $className;
-        $this->propertyName = $propertyName;
-    }
-
-    public function getClassName()
-    {
-        return $this->className;
-    }
+@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedPropertyError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedPropertyError" instead.'), E_USER_DEPRECATED);
 
-    public function getPropertyName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedPropertyError" instead */
+    class Twig_Sandbox_SecurityNotAllowedPropertyError extends SecurityNotAllowedPropertyError
     {
-        return $this->propertyName;
     }
 }
-
-class_alias('Twig_Sandbox_SecurityNotAllowedPropertyError', 'Twig\Sandbox\SecurityNotAllowedPropertyError', false);
diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php
index 4bbd2238..85a1e3b9 100644
--- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php
+++ b/vendor/twig/twig/lib/Twig/Sandbox/SecurityNotAllowedTagError.php
@@ -1,33 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Sandbox\SecurityNotAllowedTagError;
 
-/**
- * Exception thrown when a not allowed tag is used in a template.
- *
- * @author Martin HasoÅ? <martin.hason@xxxxxxxxx>
- */
-class Twig_Sandbox_SecurityNotAllowedTagError extends Twig_Sandbox_SecurityError
-{
-    private $tagName;
+class_exists('Twig\Sandbox\SecurityNotAllowedTagError');
 
-    public function __construct($message, $tagName, $lineno = -1, $filename = null, Exception $previous = null)
-    {
-        parent::__construct($message, $lineno, $filename, $previous);
-        $this->tagName = $tagName;
-    }
+@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityNotAllowedTagError" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityNotAllowedTagError" instead.'), E_USER_DEPRECATED);
 
-    public function getTagName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityNotAllowedTagError" instead */
+    class Twig_Sandbox_SecurityNotAllowedTagError extends SecurityNotAllowedTagError
     {
-        return $this->tagName;
     }
 }
-
-class_alias('Twig_Sandbox_SecurityNotAllowedTagError', 'Twig\Sandbox\SecurityNotAllowedTagError', false);
diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php
index dca0b82b..599e74b9 100644
--- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php
+++ b/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicy.php
@@ -1,125 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Sandbox\SecurityPolicy;
 
-/**
- * Represents a security policy which need to be enforced when sandbox mode is enabled.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Sandbox_SecurityPolicy implements Twig_Sandbox_SecurityPolicyInterface
-{
-    protected $allowedTags;
-    protected $allowedFilters;
-    protected $allowedMethods;
-    protected $allowedProperties;
-    protected $allowedFunctions;
+class_exists('Twig\Sandbox\SecurityPolicy');
 
-    public function __construct(array $allowedTags = array(), array $allowedFilters = array(), array $allowedMethods = array(), array $allowedProperties = array(), array $allowedFunctions = array())
-    {
-        $this->allowedTags = $allowedTags;
-        $this->allowedFilters = $allowedFilters;
-        $this->setAllowedMethods($allowedMethods);
-        $this->allowedProperties = $allowedProperties;
-        $this->allowedFunctions = $allowedFunctions;
-    }
-
-    public function setAllowedTags(array $tags)
-    {
-        $this->allowedTags = $tags;
-    }
-
-    public function setAllowedFilters(array $filters)
-    {
-        $this->allowedFilters = $filters;
-    }
+@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityPolicy" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityPolicy" instead.'), E_USER_DEPRECATED);
 
-    public function setAllowedMethods(array $methods)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityPolicy" instead */
+    class Twig_Sandbox_SecurityPolicy extends SecurityPolicy
     {
-        $this->allowedMethods = array();
-        foreach ($methods as $class => $m) {
-            $this->allowedMethods[$class] = array_map('strtolower', is_array($m) ? $m : array($m));
-        }
-    }
-
-    public function setAllowedProperties(array $properties)
-    {
-        $this->allowedProperties = $properties;
-    }
-
-    public function setAllowedFunctions(array $functions)
-    {
-        $this->allowedFunctions = $functions;
-    }
-
-    public function checkSecurity($tags, $filters, $functions)
-    {
-        foreach ($tags as $tag) {
-            if (!in_array($tag, $this->allowedTags)) {
-                throw new Twig_Sandbox_SecurityNotAllowedTagError(sprintf('Tag "%s" is not allowed.', $tag), $tag);
-            }
-        }
-
-        foreach ($filters as $filter) {
-            if (!in_array($filter, $this->allowedFilters)) {
-                throw new Twig_Sandbox_SecurityNotAllowedFilterError(sprintf('Filter "%s" is not allowed.', $filter), $filter);
-            }
-        }
-
-        foreach ($functions as $function) {
-            if (!in_array($function, $this->allowedFunctions)) {
-                throw new Twig_Sandbox_SecurityNotAllowedFunctionError(sprintf('Function "%s" is not allowed.', $function), $function);
-            }
-        }
-    }
-
-    public function checkMethodAllowed($obj, $method)
-    {
-        if ($obj instanceof Twig_TemplateInterface || $obj instanceof Twig_Markup) {
-            return true;
-        }
-
-        $allowed = false;
-        $method = strtolower($method);
-        foreach ($this->allowedMethods as $class => $methods) {
-            if ($obj instanceof $class) {
-                $allowed = in_array($method, $methods);
-
-                break;
-            }
-        }
-
-        if (!$allowed) {
-            $class = get_class($obj);
-            throw new Twig_Sandbox_SecurityNotAllowedMethodError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, $class), $class, $method);
-        }
-    }
-
-    public function checkPropertyAllowed($obj, $property)
-    {
-        $allowed = false;
-        foreach ($this->allowedProperties as $class => $properties) {
-            if ($obj instanceof $class) {
-                $allowed = in_array($property, is_array($properties) ? $properties : array($properties));
-
-                break;
-            }
-        }
-
-        if (!$allowed) {
-            $class = get_class($obj);
-            throw new Twig_Sandbox_SecurityNotAllowedPropertyError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, $class), $class, $property);
-        }
     }
 }
-
-class_alias('Twig_Sandbox_SecurityPolicy', 'Twig\Sandbox\SecurityPolicy', false);
diff --git a/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php b/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php
index 88f64447..1c961de0 100644
--- a/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php
+++ b/vendor/twig/twig/lib/Twig/Sandbox/SecurityPolicyInterface.php
@@ -1,26 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Sandbox\SecurityPolicyInterface;
 
-/**
- * Interfaces that all security policy classes must implements.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_Sandbox_SecurityPolicyInterface
-{
-    public function checkSecurity($tags, $filters, $functions);
+class_exists('Twig\Sandbox\SecurityPolicyInterface');
 
-    public function checkMethodAllowed($obj, $method);
+@trigger_error(sprintf('Using the "Twig_Sandbox_SecurityPolicyInterface" class is deprecated since Twig version 2.7, use "Twig\Sandbox\SecurityPolicyInterface" instead.'), E_USER_DEPRECATED);
 
-    public function checkPropertyAllowed($obj, $method);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Sandbox\SecurityPolicyInterface" instead */
+    class Twig_Sandbox_SecurityPolicyInterface extends SecurityPolicyInterface
+    {
+    }
 }
-
-class_alias('Twig_Sandbox_SecurityPolicyInterface', 'Twig\Sandbox\SecurityPolicyInterface', false);
diff --git a/vendor/twig/twig/lib/Twig/SimpleFilter.php b/vendor/twig/twig/lib/Twig/SimpleFilter.php
index ee4c0aeb..8c59f5ff 100644
--- a/vendor/twig/twig/lib/Twig/SimpleFilter.php
+++ b/vendor/twig/twig/lib/Twig/SimpleFilter.php
@@ -9,113 +9,18 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Represents a template filter.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_SimpleFilter
-{
-    protected $name;
-    protected $callable;
-    protected $options;
-    protected $arguments = array();
-
-    public function __construct($name, $callable, array $options = array())
-    {
-        $this->name = $name;
-        $this->callable = $callable;
-        $this->options = array_merge(array(
-            'needs_environment' => false,
-            'needs_context' => false,
-            'is_variadic' => false,
-            'is_safe' => null,
-            'is_safe_callback' => null,
-            'pre_escape' => null,
-            'preserves_safety' => null,
-            'node_class' => 'Twig_Node_Expression_Filter',
-            'deprecated' => false,
-            'alternative' => null,
-        ), $options);
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function getCallable()
-    {
-        return $this->callable;
-    }
-
-    public function getNodeClass()
-    {
-        return $this->options['node_class'];
-    }
-
-    public function setArguments($arguments)
-    {
-        $this->arguments = $arguments;
-    }
-
-    public function getArguments()
-    {
-        return $this->arguments;
-    }
-
-    public function needsEnvironment()
-    {
-        return $this->options['needs_environment'];
-    }
+use Twig\TwigFilter;
 
-    public function needsContext()
-    {
-        return $this->options['needs_context'];
-    }
-
-    public function getSafe(Twig_Node $filterArgs)
-    {
-        if (null !== $this->options['is_safe']) {
-            return $this->options['is_safe'];
-        }
-
-        if (null !== $this->options['is_safe_callback']) {
-            return call_user_func($this->options['is_safe_callback'], $filterArgs);
-        }
-    }
-
-    public function getPreservesSafety()
-    {
-        return $this->options['preserves_safety'];
-    }
-
-    public function getPreEscape()
-    {
-        return $this->options['pre_escape'];
-    }
-
-    public function isVariadic()
-    {
-        return $this->options['is_variadic'];
-    }
-
-    public function isDeprecated()
-    {
-        return (bool) $this->options['deprecated'];
-    }
+/*
+ * For Twig 1.x compatibility.
+ */
+class_exists(TwigFilter::class);
 
-    public function getDeprecatedVersion()
-    {
-        return $this->options['deprecated'];
-    }
+@trigger_error(sprintf('Using the "Twig_SimpleFilter" class is deprecated since Twig version 2.7, use "Twig\TwigFilter" instead.'), E_USER_DEPRECATED);
 
-    public function getAlternative()
+if (false) {
+    /** @deprecated since Twig 2.7, use "Twig\TwigFilter" instead */
+    final class Twig_SimpleFilter extends TwigFilter
     {
-        return $this->options['alternative'];
     }
 }
-
-class_alias('Twig_SimpleFilter', 'Twig\TwigFilter', false);
diff --git a/vendor/twig/twig/lib/Twig/SimpleFunction.php b/vendor/twig/twig/lib/Twig/SimpleFunction.php
index a6aa7ca7..989a8de4 100644
--- a/vendor/twig/twig/lib/Twig/SimpleFunction.php
+++ b/vendor/twig/twig/lib/Twig/SimpleFunction.php
@@ -9,103 +9,18 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Represents a template function.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_SimpleFunction
-{
-    protected $name;
-    protected $callable;
-    protected $options;
-    protected $arguments = array();
-
-    public function __construct($name, $callable, array $options = array())
-    {
-        $this->name = $name;
-        $this->callable = $callable;
-        $this->options = array_merge(array(
-            'needs_environment' => false,
-            'needs_context' => false,
-            'is_variadic' => false,
-            'is_safe' => null,
-            'is_safe_callback' => null,
-            'node_class' => 'Twig_Node_Expression_Function',
-            'deprecated' => false,
-            'alternative' => null,
-        ), $options);
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function getCallable()
-    {
-        return $this->callable;
-    }
-
-    public function getNodeClass()
-    {
-        return $this->options['node_class'];
-    }
-
-    public function setArguments($arguments)
-    {
-        $this->arguments = $arguments;
-    }
-
-    public function getArguments()
-    {
-        return $this->arguments;
-    }
+use Twig\TwigFunction;
 
-    public function needsEnvironment()
-    {
-        return $this->options['needs_environment'];
-    }
-
-    public function needsContext()
-    {
-        return $this->options['needs_context'];
-    }
-
-    public function getSafe(Twig_Node $functionArgs)
-    {
-        if (null !== $this->options['is_safe']) {
-            return $this->options['is_safe'];
-        }
-
-        if (null !== $this->options['is_safe_callback']) {
-            return call_user_func($this->options['is_safe_callback'], $functionArgs);
-        }
-
-        return array();
-    }
-
-    public function isVariadic()
-    {
-        return $this->options['is_variadic'];
-    }
-
-    public function isDeprecated()
-    {
-        return (bool) $this->options['deprecated'];
-    }
+/*
+ * For Twig 1.x compatibility.
+ */
+class_exists(TwigFunction::class);
 
-    public function getDeprecatedVersion()
-    {
-        return $this->options['deprecated'];
-    }
+@trigger_error(sprintf('Using the "Twig_SimpleFunction" class is deprecated since Twig version 2.7, use "Twig\TwigFunction" instead.'), E_USER_DEPRECATED);
 
-    public function getAlternative()
+if (false) {
+    /** @deprecated since Twig 2.7, use "Twig\TwigFunction" instead */
+    final class Twig_SimpleFunction extends TwigFunction
     {
-        return $this->options['alternative'];
     }
 }
-
-class_alias('Twig_SimpleFunction', 'Twig\TwigFunction', false);
diff --git a/vendor/twig/twig/lib/Twig/SimpleTest.php b/vendor/twig/twig/lib/Twig/SimpleTest.php
index fee5778b..3e101b3e 100644
--- a/vendor/twig/twig/lib/Twig/SimpleTest.php
+++ b/vendor/twig/twig/lib/Twig/SimpleTest.php
@@ -9,65 +9,18 @@
  * file that was distributed with this source code.
  */
 
-/**
- * Represents a template test.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_SimpleTest
-{
-    protected $name;
-    protected $callable;
-    protected $options;
+use Twig\TwigTest;
 
-    public function __construct($name, $callable, array $options = array())
-    {
-        $this->name = $name;
-        $this->callable = $callable;
-        $this->options = array_merge(array(
-            'is_variadic' => false,
-            'node_class' => 'Twig_Node_Expression_Test',
-            'deprecated' => false,
-            'alternative' => null,
-        ), $options);
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-
-    public function getCallable()
-    {
-        return $this->callable;
-    }
-
-    public function getNodeClass()
-    {
-        return $this->options['node_class'];
-    }
-
-    public function isVariadic()
-    {
-        return $this->options['is_variadic'];
-    }
-
-    public function isDeprecated()
-    {
-        return (bool) $this->options['deprecated'];
-    }
+/*
+ * For Twig 1.x compatibility.
+ */
+class_exists(TwigTest::class);
 
-    public function getDeprecatedVersion()
-    {
-        return $this->options['deprecated'];
-    }
+@trigger_error(sprintf('Using the "Twig_SimpleTest" class is deprecated since Twig version 2.7, use "Twig\TwigTest" instead.'), E_USER_DEPRECATED);
 
-    public function getAlternative()
+if (false) {
+    /** @deprecated since Twig 2.7, use "Twig\TwigTest" instead */
+    final class Twig_SimpleTest extends TwigTest
     {
-        return $this->options['alternative'];
     }
 }
-
-class_alias('Twig_SimpleTest', 'Twig\TwigTest', false);
diff --git a/vendor/twig/twig/lib/Twig/Source.php b/vendor/twig/twig/lib/Twig/Source.php
index bd8d869f..f1596684 100644
--- a/vendor/twig/twig/lib/Twig/Source.php
+++ b/vendor/twig/twig/lib/Twig/Source.php
@@ -1,53 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Source;
 
-/**
- * Holds information about a non-compiled Twig template.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Source
-{
-    private $code;
-    private $name;
-    private $path;
+class_exists('Twig\Source');
 
-    /**
-     * @param string $code The template source code
-     * @param string $name The template logical name
-     * @param string $path The filesystem path of the template if any
-     */
-    public function __construct($code, $name, $path = '')
-    {
-        $this->code = $code;
-        $this->name = $name;
-        $this->path = $path;
-    }
-
-    public function getCode()
-    {
-        return $this->code;
-    }
+@trigger_error(sprintf('Using the "Twig_Source" class is deprecated since Twig version 2.7, use "Twig\Source" instead.'), E_USER_DEPRECATED);
 
-    public function getName()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Source" instead */
+    class Twig_Source extends Source
     {
-        return $this->name;
-    }
-
-    public function getPath()
-    {
-        return $this->path;
     }
 }
-
-class_alias('Twig_Source', 'Twig\Source', false);
diff --git a/vendor/twig/twig/lib/Twig/SourceContextLoaderInterface.php b/vendor/twig/twig/lib/Twig/SourceContextLoaderInterface.php
index a6e8c425..e2667e26 100644
--- a/vendor/twig/twig/lib/Twig/SourceContextLoaderInterface.php
+++ b/vendor/twig/twig/lib/Twig/SourceContextLoaderInterface.php
@@ -1,33 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Loader\SourceContextLoaderInterface;
 
-/**
- * Adds a getSourceContext() method for loaders.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.27 (to be removed in 3.0)
- */
-interface Twig_SourceContextLoaderInterface
-{
-    /**
-     * Returns the source context for a given template logical name.
-     *
-     * @param string $name The template logical name
-     *
-     * @return Twig_Source
-     *
-     * @throws Twig_Error_Loader When $name is not found
-     */
-    public function getSourceContext($name);
-}
+class_exists('Twig\Loader\SourceContextLoaderInterface');
+
+@trigger_error(sprintf('Using the "Twig_SourceContextLoaderInterface" class is deprecated since Twig version 2.7, use "Twig\Loader\SourceContextLoaderInterface" instead.'), E_USER_DEPRECATED);
 
-class_alias('Twig_SourceContextLoaderInterface', 'Twig\Loader\SourceContextLoaderInterface', false);
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Loader\SourceContextLoaderInterface" instead */
+    class Twig_SourceContextLoaderInterface extends SourceContextLoaderInterface
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/Template.php b/vendor/twig/twig/lib/Twig/Template.php
index 64563419..b7365316 100644
--- a/vendor/twig/twig/lib/Twig/Template.php
+++ b/vendor/twig/twig/lib/Twig/Template.php
@@ -1,706 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Template;
 
-/**
- * Default base class for compiled templates.
- *
- * This class is an implementation detail of how template compilation currently
- * works, which might change. It should never be used directly. Use $twig->load()
- * instead, which returns an instance of Twig_TemplateWrapper.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @internal
- */
-abstract class Twig_Template implements Twig_TemplateInterface
-{
-    /**
-     * @internal
-     */
-    protected static $cache = array();
+class_exists('Twig\Template');
 
-    protected $parent;
-    protected $parents = array();
-    protected $env;
-    protected $blocks = array();
-    protected $traits = array();
+@trigger_error(sprintf('Using the "Twig_Template" class is deprecated since Twig version 2.7, use "Twig\Template" instead.'), E_USER_DEPRECATED);
 
-    public function __construct(Twig_Environment $env)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Template" instead */
+    class Twig_Template extends Template
     {
-        $this->env = $env;
-    }
-
-    /**
-     * @internal this method will be removed in 2.0 and is only used internally to provide an upgrade path from 1.x to 2.0
-     */
-    public function __toString()
-    {
-        return $this->getTemplateName();
-    }
-
-    /**
-     * Returns the template name.
-     *
-     * @return string The template name
-     */
-    abstract public function getTemplateName();
-
-    /**
-     * Returns debug information about the template.
-     *
-     * @return array Debug information
-     *
-     * @internal
-     */
-    public function getDebugInfo()
-    {
-        return array();
-    }
-
-    /**
-     * Returns the template source code.
-     *
-     * @return string The template source code
-     *
-     * @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead
-     */
-    public function getSource()
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', E_USER_DEPRECATED);
-
-        return '';
-    }
-
-    /**
-     * Returns information about the original template source code.
-     *
-     * @return Twig_Source
-     */
-    public function getSourceContext()
-    {
-        return new Twig_Source('', $this->getTemplateName());
-    }
-
-    /**
-     * @deprecated since 1.20 (to be removed in 2.0)
-     */
-    public function getEnvironment()
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.20 and will be removed in 2.0.', E_USER_DEPRECATED);
-
-        return $this->env;
-    }
-
-    /**
-     * Returns the parent template.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param array $context
-     *
-     * @return Twig_TemplateInterface|false The parent template or false if there is no parent
-     *
-     * @internal
-     */
-    public function getParent(array $context)
-    {
-        if (null !== $this->parent) {
-            return $this->parent;
-        }
-
-        try {
-            $parent = $this->doGetParent($context);
-
-            if (false === $parent) {
-                return false;
-            }
-
-            if ($parent instanceof self) {
-                return $this->parents[$parent->getTemplateName()] = $parent;
-            }
-
-            if (!isset($this->parents[$parent])) {
-                $this->parents[$parent] = $this->loadTemplate($parent);
-            }
-        } catch (Twig_Error_Loader $e) {
-            $e->setSourceContext(null);
-            $e->guess();
-
-            throw $e;
-        }
-
-        return $this->parents[$parent];
-    }
-
-    protected function doGetParent(array $context)
-    {
-        return false;
-    }
-
-    public function isTraitable()
-    {
-        return true;
-    }
-
-    /**
-     * Displays a parent block.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param string $name    The block name to display from the parent
-     * @param array  $context The context
-     * @param array  $blocks  The current set of blocks
-     *
-     * @internal
-     */
-    public function displayParentBlock($name, array $context, array $blocks = array())
-    {
-        $name = (string) $name;
-
-        if (isset($this->traits[$name])) {
-            $this->traits[$name][0]->displayBlock($name, $context, $blocks, false);
-        } elseif (false !== $parent = $this->getParent($context)) {
-            $parent->displayBlock($name, $context, $blocks, false);
-        } else {
-            throw new Twig_Error_Runtime(sprintf('The template has no parent and no traits defining the "%s" block.', $name), -1, $this->getSourceContext());
-        }
-    }
-
-    /**
-     * Displays a block.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param string $name      The block name to display
-     * @param array  $context   The context
-     * @param array  $blocks    The current set of blocks
-     * @param bool   $useBlocks Whether to use the current set of blocks
-     *
-     * @internal
-     */
-    public function displayBlock($name, array $context, array $blocks = array(), $useBlocks = true)
-    {
-        $name = (string) $name;
-
-        if ($useBlocks && isset($blocks[$name])) {
-            $template = $blocks[$name][0];
-            $block = $blocks[$name][1];
-        } elseif (isset($this->blocks[$name])) {
-            $template = $this->blocks[$name][0];
-            $block = $this->blocks[$name][1];
-        } else {
-            $template = null;
-            $block = null;
-        }
-
-        // avoid RCEs when sandbox is enabled
-        if (null !== $template && !$template instanceof self) {
-            throw new LogicException('A block must be a method on a Twig_Template instance.');
-        }
-
-        if (null !== $template) {
-            try {
-                $template->$block($context, $blocks);
-            } catch (Twig_Error $e) {
-                if (!$e->getSourceContext()) {
-                    $e->setSourceContext($template->getSourceContext());
-                }
-
-                // this is mostly useful for Twig_Error_Loader exceptions
-                // see Twig_Error_Loader
-                if (false === $e->getTemplateLine()) {
-                    $e->setTemplateLine(-1);
-                    $e->guess();
-                }
-
-                throw $e;
-            } catch (Exception $e) {
-                throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getSourceContext(), $e);
-            }
-        } elseif (false !== $parent = $this->getParent($context)) {
-            $parent->displayBlock($name, $context, array_merge($this->blocks, $blocks), false);
-        } else {
-            @trigger_error(sprintf('Silent display of undefined block "%s" in template "%s" is deprecated since version 1.29 and will throw an exception in 2.0. Use the "block(\'%s\') is defined" expression to test for block existence.', $name, $this->getTemplateName(), $name), E_USER_DEPRECATED);
-        }
-    }
-
-    /**
-     * Renders a parent block.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param string $name    The block name to render from the parent
-     * @param array  $context The context
-     * @param array  $blocks  The current set of blocks
-     *
-     * @return string The rendered block
-     *
-     * @internal
-     */
-    public function renderParentBlock($name, array $context, array $blocks = array())
-    {
-        ob_start();
-        $this->displayParentBlock($name, $context, $blocks);
-
-        return ob_get_clean();
-    }
-
-    /**
-     * Renders a block.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @param string $name      The block name to render
-     * @param array  $context   The context
-     * @param array  $blocks    The current set of blocks
-     * @param bool   $useBlocks Whether to use the current set of blocks
-     *
-     * @return string The rendered block
-     *
-     * @internal
-     */
-    public function renderBlock($name, array $context, array $blocks = array(), $useBlocks = true)
-    {
-        ob_start();
-        $this->displayBlock($name, $context, $blocks, $useBlocks);
-
-        return ob_get_clean();
-    }
-
-    /**
-     * Returns whether a block exists or not in the current context of the template.
-     *
-     * This method checks blocks defined in the current template
-     * or defined in "used" traits or defined in parent templates.
-     *
-     * @param string $name    The block name
-     * @param array  $context The context
-     * @param array  $blocks  The current set of blocks
-     *
-     * @return bool true if the block exists, false otherwise
-     *
-     * @internal
-     */
-    public function hasBlock($name, array $context = null, array $blocks = array())
-    {
-        if (null === $context) {
-            @trigger_error('The '.__METHOD__.' method is internal and should never be called; calling it directly is deprecated since version 1.28 and won\'t be possible anymore in 2.0.', E_USER_DEPRECATED);
-
-            return isset($this->blocks[(string) $name]);
-        }
-
-        if (isset($blocks[$name])) {
-            return $blocks[$name][0] instanceof self;
-        }
-
-        if (isset($this->blocks[$name])) {
-            return true;
-        }
-
-        if (false !== $parent = $this->getParent($context)) {
-            return $parent->hasBlock($name, $context);
-        }
-
-        return false;
-    }
-
-    /**
-     * Returns all block names in the current context of the template.
-     *
-     * This method checks blocks defined in the current template
-     * or defined in "used" traits or defined in parent templates.
-     *
-     * @param array $context The context
-     * @param array $blocks  The current set of blocks
-     *
-     * @return array An array of block names
-     *
-     * @internal
-     */
-    public function getBlockNames(array $context = null, array $blocks = array())
-    {
-        if (null === $context) {
-            @trigger_error('The '.__METHOD__.' method is internal and should never be called; calling it directly is deprecated since version 1.28 and won\'t be possible anymore in 2.0.', E_USER_DEPRECATED);
-
-            return array_keys($this->blocks);
-        }
-
-        $names = array_merge(array_keys($blocks), array_keys($this->blocks));
-
-        if (false !== $parent = $this->getParent($context)) {
-            $names = array_merge($names, $parent->getBlockNames($context));
-        }
-
-        return array_unique($names);
-    }
-
-    protected function loadTemplate($template, $templateName = null, $line = null, $index = null)
-    {
-        try {
-            if (is_array($template)) {
-                return $this->env->resolveTemplate($template);
-            }
-
-            if ($template instanceof self) {
-                return $template;
-            }
-
-            if ($template instanceof Twig_TemplateWrapper) {
-                return $template;
-            }
-
-            return $this->env->loadTemplate($template, $index);
-        } catch (Twig_Error $e) {
-            if (!$e->getSourceContext()) {
-                $e->setSourceContext($templateName ? new Twig_Source('', $templateName) : $this->getSourceContext());
-            }
-
-            if ($e->getTemplateLine()) {
-                throw $e;
-            }
-
-            if (!$line) {
-                $e->guess();
-            } else {
-                $e->setTemplateLine($line);
-            }
-
-            throw $e;
-        }
-    }
-
-    /**
-     * Returns all blocks.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * @return array An array of blocks
-     *
-     * @internal
-     */
-    public function getBlocks()
-    {
-        return $this->blocks;
-    }
-
-    public function display(array $context, array $blocks = array())
-    {
-        $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
-    }
-
-    public function render(array $context)
-    {
-        $level = ob_get_level();
-        ob_start();
-        try {
-            $this->display($context);
-        } catch (Exception $e) {
-            while (ob_get_level() > $level) {
-                ob_end_clean();
-            }
-
-            throw $e;
-        } catch (Throwable $e) {
-            while (ob_get_level() > $level) {
-                ob_end_clean();
-            }
-
-            throw $e;
-        }
-
-        return ob_get_clean();
-    }
-
-    protected function displayWithErrorHandling(array $context, array $blocks = array())
-    {
-        try {
-            $this->doDisplay($context, $blocks);
-        } catch (Twig_Error $e) {
-            if (!$e->getSourceContext()) {
-                $e->setSourceContext($this->getSourceContext());
-            }
-
-            // this is mostly useful for Twig_Error_Loader exceptions
-            // see Twig_Error_Loader
-            if (false === $e->getTemplateLine()) {
-                $e->setTemplateLine(-1);
-                $e->guess();
-            }
-
-            throw $e;
-        } catch (Exception $e) {
-            throw new Twig_Error_Runtime(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e);
-        }
-    }
-
-    /**
-     * Auto-generated method to display the template with the given context.
-     *
-     * @param array $context An array of parameters to pass to the template
-     * @param array $blocks  An array of blocks to pass to the template
-     */
-    abstract protected function doDisplay(array $context, array $blocks = array());
-
-    /**
-     * Returns a variable from the context.
-     *
-     * This method is for internal use only and should never be called
-     * directly.
-     *
-     * This method should not be overridden in a sub-class as this is an
-     * implementation detail that has been introduced to optimize variable
-     * access for versions of PHP before 5.4. This is not a way to override
-     * the way to get a variable value.
-     *
-     * @param array  $context           The context
-     * @param string $item              The variable to return from the context
-     * @param bool   $ignoreStrictCheck Whether to ignore the strict variable check or not
-     *
-     * @return mixed The content of the context variable
-     *
-     * @throws Twig_Error_Runtime if the variable does not exist and Twig is running in strict mode
-     *
-     * @internal
-     */
-    final protected function getContext($context, $item, $ignoreStrictCheck = false)
-    {
-        if (!array_key_exists($item, $context)) {
-            if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-                return;
-            }
-
-            throw new Twig_Error_Runtime(sprintf('Variable "%s" does not exist.', $item), -1, $this->getSourceContext());
-        }
-
-        return $context[$item];
-    }
-
-    /**
-     * Returns the attribute value for a given array/object.
-     *
-     * @param mixed  $object            The object or array from where to get the item
-     * @param mixed  $item              The item to get from the array or object
-     * @param array  $arguments         An array of arguments to pass if the item is an object method
-     * @param string $type              The type of attribute (@see Twig_Template constants)
-     * @param bool   $isDefinedTest     Whether this is only a defined check
-     * @param bool   $ignoreStrictCheck Whether to ignore the strict attribute check or not
-     *
-     * @return mixed The attribute value, or a Boolean when $isDefinedTest is true, or null when the attribute is not set and $ignoreStrictCheck is true
-     *
-     * @throws Twig_Error_Runtime if the attribute does not exist and Twig is running in strict mode and $isDefinedTest is false
-     *
-     * @internal
-     */
-    protected function getAttribute($object, $item, array $arguments = array(), $type = self::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false)
-    {
-        // array
-        if (self::METHOD_CALL !== $type) {
-            $arrayItem = is_bool($item) || is_float($item) ? (int) $item : $item;
-
-            if ((is_array($object) && (isset($object[$arrayItem]) || array_key_exists($arrayItem, $object)))
-                || ($object instanceof ArrayAccess && isset($object[$arrayItem]))
-            ) {
-                if ($isDefinedTest) {
-                    return true;
-                }
-
-                return $object[$arrayItem];
-            }
-
-            if (self::ARRAY_CALL === $type || !is_object($object)) {
-                if ($isDefinedTest) {
-                    return false;
-                }
-
-                if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-                    return;
-                }
-
-                if ($object instanceof ArrayAccess) {
-                    $message = sprintf('Key "%s" in object with ArrayAccess of class "%s" does not exist.', $arrayItem, get_class($object));
-                } elseif (is_object($object)) {
-                    $message = sprintf('Impossible to access a key "%s" on an object of class "%s" that does not implement ArrayAccess interface.', $item, get_class($object));
-                } elseif (is_array($object)) {
-                    if (empty($object)) {
-                        $message = sprintf('Key "%s" does not exist as the array is empty.', $arrayItem);
-                    } else {
-                        $message = sprintf('Key "%s" for array with keys "%s" does not exist.', $arrayItem, implode(', ', array_keys($object)));
-                    }
-                } elseif (self::ARRAY_CALL === $type) {
-                    if (null === $object) {
-                        $message = sprintf('Impossible to access a key ("%s") on a null variable.', $item);
-                    } else {
-                        $message = sprintf('Impossible to access a key ("%s") on a %s variable ("%s").', $item, gettype($object), $object);
-                    }
-                } elseif (null === $object) {
-                    $message = sprintf('Impossible to access an attribute ("%s") on a null variable.', $item);
-                } else {
-                    $message = sprintf('Impossible to access an attribute ("%s") on a %s variable ("%s").', $item, gettype($object), $object);
-                }
-
-                throw new Twig_Error_Runtime($message, -1, $this->getSourceContext());
-            }
-        }
-
-        if (!is_object($object)) {
-            if ($isDefinedTest) {
-                return false;
-            }
-
-            if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-                return;
-            }
-
-            if (null === $object) {
-                $message = sprintf('Impossible to invoke a method ("%s") on a null variable.', $item);
-            } else {
-                $message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s").', $item, gettype($object), $object);
-            }
-
-            throw new Twig_Error_Runtime($message, -1, $this->getSourceContext());
-        }
-
-        // object property
-        if (self::METHOD_CALL !== $type && !$object instanceof self) { // Twig_Template does not have public properties, and we don't want to allow access to internal ones
-            if (isset($object->$item) || array_key_exists((string) $item, $object)) {
-                if ($isDefinedTest) {
-                    return true;
-                }
-
-                if ($this->env->hasExtension('Twig_Extension_Sandbox')) {
-                    $this->env->getExtension('Twig_Extension_Sandbox')->checkPropertyAllowed($object, $item);
-                }
-
-                return $object->$item;
-            }
-        }
-
-        $class = get_class($object);
-
-        // object method
-        if (!isset(self::$cache[$class])) {
-            // get_class_methods returns all methods accessible in the scope, but we only want public ones to be accessible in templates
-            if ($object instanceof self) {
-                $ref = new ReflectionClass($class);
-                $methods = array();
-
-                foreach ($ref->getMethods(ReflectionMethod::IS_PUBLIC) as $refMethod) {
-                    // Accessing the environment from templates is forbidden to prevent untrusted changes to the environment
-                    if ('getenvironment' !== strtolower($refMethod->name)) {
-                        $methods[] = $refMethod->name;
-                    }
-                }
-            } else {
-                $methods = get_class_methods($object);
-            }
-            // sort values to have consistent behavior, so that "get" methods win precedence over "is" methods
-            sort($methods);
-
-            $cache = array();
-
-            foreach ($methods as $method) {
-                $cache[$method] = $method;
-                $cache[$lcName = strtolower($method)] = $method;
-
-                if ('g' === $lcName[0] && 0 === strpos($lcName, 'get')) {
-                    $name = substr($method, 3);
-                    $lcName = substr($lcName, 3);
-                } elseif ('i' === $lcName[0] && 0 === strpos($lcName, 'is')) {
-                    $name = substr($method, 2);
-                    $lcName = substr($lcName, 2);
-                } else {
-                    continue;
-                }
-
-                // skip get() and is() methods (in which case, $name is empty)
-                if ($name) {
-                    if (!isset($cache[$name])) {
-                        $cache[$name] = $method;
-                    }
-                    if (!isset($cache[$lcName])) {
-                        $cache[$lcName] = $method;
-                    }
-                }
-            }
-            self::$cache[$class] = $cache;
-        }
-
-        $call = false;
-        if (isset(self::$cache[$class][$item])) {
-            $method = self::$cache[$class][$item];
-        } elseif (isset(self::$cache[$class][$lcItem = strtolower($item)])) {
-            $method = self::$cache[$class][$lcItem];
-        } elseif (isset(self::$cache[$class]['__call'])) {
-            $method = $item;
-            $call = true;
-        } else {
-            if ($isDefinedTest) {
-                return false;
-            }
-
-            if ($ignoreStrictCheck || !$this->env->isStrictVariables()) {
-                return;
-            }
-
-            throw new Twig_Error_Runtime(sprintf('Neither the property "%1$s" nor one of the methods "%1$s()", "get%1$s()"/"is%1$s()" or "__call()" exist and have public access in class "%2$s".', $item, $class), -1, $this->getSourceContext());
-        }
-
-        if ($isDefinedTest) {
-            return true;
-        }
-
-        if ($this->env->hasExtension('Twig_Extension_Sandbox')) {
-            $this->env->getExtension('Twig_Extension_Sandbox')->checkMethodAllowed($object, $method);
-        }
-
-        // Some objects throw exceptions when they have __call, and the method we try
-        // to call is not supported. If ignoreStrictCheck is true, we should return null.
-        try {
-            if (!$arguments) {
-                $ret = $object->$method();
-            } else {
-                $ret = call_user_func_array(array($object, $method), $arguments);
-            }
-        } catch (BadMethodCallException $e) {
-            if ($call && ($ignoreStrictCheck || !$this->env->isStrictVariables())) {
-                return;
-            }
-            throw $e;
-        }
-
-        // @deprecated in 1.28
-        if ($object instanceof Twig_TemplateInterface) {
-            $self = $object->getTemplateName() === $this->getTemplateName();
-            $message = sprintf('Calling "%s" on template "%s" from template "%s" is deprecated since version 1.28 and won\'t be supported anymore in 2.0.', $item, $object->getTemplateName(), $this->getTemplateName());
-            if ('renderBlock' === $method || 'displayBlock' === $method) {
-                $message .= sprintf(' Use block("%s"%s) instead).', $arguments[0], $self ? '' : ', template');
-            } elseif ('hasBlock' === $method) {
-                $message .= sprintf(' Use "block("%s"%s) is defined" instead).', $arguments[0], $self ? '' : ', template');
-            } elseif ('render' === $method || 'display' === $method) {
-                $message .= sprintf(' Use include("%s") instead).', $object->getTemplateName());
-            }
-            @trigger_error($message, E_USER_DEPRECATED);
-
-            return $ret === '' ? '' : new Twig_Markup($ret, $this->env->getCharset());
-        }
-
-        return $ret;
     }
 }
-
-class_alias('Twig_Template', 'Twig\Template', false);
diff --git a/vendor/twig/twig/lib/Twig/TemplateInterface.php b/vendor/twig/twig/lib/Twig/TemplateInterface.php
deleted file mode 100644
index 457ef7d7..00000000
--- a/vendor/twig/twig/lib/Twig/TemplateInterface.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by all compiled templates.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 3.0)
- */
-interface Twig_TemplateInterface
-{
-    const ANY_CALL = 'any';
-    const ARRAY_CALL = 'array';
-    const METHOD_CALL = 'method';
-
-    /**
-     * Renders the template with the given context and returns it as string.
-     *
-     * @param array $context An array of parameters to pass to the template
-     *
-     * @return string The rendered template
-     */
-    public function render(array $context);
-
-    /**
-     * Displays the template with the given context.
-     *
-     * @param array $context An array of parameters to pass to the template
-     * @param array $blocks  An array of blocks to pass to the template
-     */
-    public function display(array $context, array $blocks = array());
-
-    /**
-     * Returns the bound environment for this template.
-     *
-     * @return Twig_Environment
-     */
-    public function getEnvironment();
-}
diff --git a/vendor/twig/twig/lib/Twig/TemplateWrapper.php b/vendor/twig/twig/lib/Twig/TemplateWrapper.php
index 497f6e98..42e30491 100644
--- a/vendor/twig/twig/lib/Twig/TemplateWrapper.php
+++ b/vendor/twig/twig/lib/Twig/TemplateWrapper.php
@@ -1,133 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TemplateWrapper;
 
-/**
- * Exposes a template to userland.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-final class Twig_TemplateWrapper
-{
-    private $env;
-    private $template;
+class_exists('Twig\TemplateWrapper');
 
-    /**
-     * This method is for internal use only and should never be called
-     * directly (use Twig_Environment::load() instead).
-     *
-     * @internal
-     */
-    public function __construct(Twig_Environment $env, Twig_Template $template)
-    {
-        $this->env = $env;
-        $this->template = $template;
-    }
-
-    /**
-     * Renders the template.
-     *
-     * @param array $context An array of parameters to pass to the template
-     *
-     * @return string The rendered template
-     */
-    public function render($context = array())
-    {
-        return $this->template->render($context);
-    }
-
-    /**
-     * Displays the template.
-     *
-     * @param array $context An array of parameters to pass to the template
-     */
-    public function display($context = array())
-    {
-        $this->template->display($context);
-    }
-
-    /**
-     * Checks if a block is defined.
-     *
-     * @param string $name    The block name
-     * @param array  $context An array of parameters to pass to the template
-     *
-     * @return bool
-     */
-    public function hasBlock($name, $context = array())
-    {
-        return $this->template->hasBlock($name, $context);
-    }
-
-    /**
-     * Returns defined block names in the template.
-     *
-     * @param array $context An array of parameters to pass to the template
-     *
-     * @return string[] An array of defined template block names
-     */
-    public function getBlockNames($context = array())
-    {
-        return $this->template->getBlockNames($context);
-    }
-
-    /**
-     * Renders a template block.
-     *
-     * @param string $name    The block name to render
-     * @param array  $context An array of parameters to pass to the template
-     *
-     * @return string The rendered block
-     */
-    public function renderBlock($name, $context = array())
-    {
-        $context = $this->env->mergeGlobals($context);
-        $level = ob_get_level();
-        ob_start();
-        try {
-            $this->template->displayBlock($name, $context);
-        } catch (Exception $e) {
-            while (ob_get_level() > $level) {
-                ob_end_clean();
-            }
-
-            throw $e;
-        } catch (Throwable $e) {
-            while (ob_get_level() > $level) {
-                ob_end_clean();
-            }
-
-            throw $e;
-        }
+@trigger_error(sprintf('Using the "Twig_TemplateWrapper" class is deprecated since Twig version 2.7, use "Twig\TemplateWrapper" instead.'), E_USER_DEPRECATED);
 
-        return ob_get_clean();
-    }
-
-    /**
-     * Displays a template block.
-     *
-     * @param string $name    The block name to render
-     * @param array  $context An array of parameters to pass to the template
-     */
-    public function displayBlock($name, $context = array())
-    {
-        $this->template->displayBlock($name, $this->env->mergeGlobals($context));
-    }
-
-    /**
-     * @return Twig_Source
-     */
-    public function getSourceContext()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TemplateWrapper" instead */
+    class Twig_TemplateWrapper extends TemplateWrapper
     {
-        return $this->template->getSourceContext();
     }
 }
-
-class_alias('Twig_TemplateWrapper', 'Twig\TemplateWrapper', false);
diff --git a/vendor/twig/twig/lib/Twig/Test.php b/vendor/twig/twig/lib/Twig/Test.php
index b450ec62..5926269d 100644
--- a/vendor/twig/twig/lib/Twig/Test.php
+++ b/vendor/twig/twig/lib/Twig/Test.php
@@ -1,37 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TwigTest;
 
-@trigger_error('The Twig_Test class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleTest instead.', E_USER_DEPRECATED);
+class_exists('Twig\TwigTest');
 
-/**
- * Represents a template test.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-abstract class Twig_Test implements Twig_TestInterface, Twig_TestCallableInterface
-{
-    protected $options;
-    protected $arguments = array();
+@trigger_error(sprintf('Using the "Twig_Test" class is deprecated since Twig version 2.7, use "Twig\TwigTest" instead.'), E_USER_DEPRECATED);
 
-    public function __construct(array $options = array())
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TwigTest" instead */
+    class Twig_Test extends TwigTest
     {
-        $this->options = array_merge(array(
-            'callable' => null,
-        ), $options);
-    }
-
-    public function getCallable()
-    {
-        return $this->options['callable'];
     }
 }
diff --git a/vendor/twig/twig/lib/Twig/Test/Function.php b/vendor/twig/twig/lib/Twig/Test/Function.php
deleted file mode 100644
index 9e83c3f8..00000000
--- a/vendor/twig/twig/lib/Twig/Test/Function.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Test_Function class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleTest instead.', E_USER_DEPRECATED);
-
-/**
- * Represents a function template test.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Test_Function extends Twig_Test
-{
-    protected $function;
-
-    public function __construct($function, array $options = array())
-    {
-        $options['callable'] = $function;
-
-        parent::__construct($options);
-
-        $this->function = $function;
-    }
-
-    public function compile()
-    {
-        return $this->function;
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php b/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php
index 016951aa..7338ef4b 100644
--- a/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php
+++ b/vendor/twig/twig/lib/Twig/Test/IntegrationTestCase.php
@@ -1,249 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Test\IntegrationTestCase;
 
-use PHPUnit\Framework\TestCase;
+class_exists('Twig\Test\IntegrationTestCase');
 
-/**
- * Integration test helper.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- * @author Karma Dordrak <drak@xxxxxxxxxx>
- */
-abstract class Twig_Test_IntegrationTestCase extends TestCase
-{
-    /**
-     * @return string
-     */
-    abstract protected function getFixturesDir();
+@trigger_error(sprintf('Using the "Twig_Test_IntegrationTestCase" class is deprecated since Twig version 2.7, use "Twig\Test\IntegrationTestCase" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * @return Twig_RuntimeLoaderInterface[]
-     */
-    protected function getRuntimeLoaders()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Test\IntegrationTestCase" instead */
+    class Twig_Test_IntegrationTestCase extends IntegrationTestCase
     {
-        return array();
-    }
-
-    /**
-     * @return Twig_ExtensionInterface[]
-     */
-    protected function getExtensions()
-    {
-        return array();
-    }
-
-    /**
-     * @return Twig_SimpleFilter[]
-     */
-    protected function getTwigFilters()
-    {
-        return array();
-    }
-
-    /**
-     * @return Twig_SimpleFunction[]
-     */
-    protected function getTwigFunctions()
-    {
-        return array();
-    }
-
-    /**
-     * @return Twig_SimpleTest[]
-     */
-    protected function getTwigTests()
-    {
-        return array();
-    }
-
-    /**
-     * @dataProvider getTests
-     */
-    public function testIntegration($file, $message, $condition, $templates, $exception, $outputs)
-    {
-        $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs);
-    }
-
-    /**
-     * @dataProvider getLegacyTests
-     * @group legacy
-     */
-    public function testLegacyIntegration($file, $message, $condition, $templates, $exception, $outputs)
-    {
-        $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs);
-    }
-
-    public function getTests($name, $legacyTests = false)
-    {
-        $fixturesDir = realpath($this->getFixturesDir());
-        $tests = array();
-
-        foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($fixturesDir), RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
-            if (!preg_match('/\.test$/', $file)) {
-                continue;
-            }
-
-            if ($legacyTests xor false !== strpos($file->getRealpath(), '.legacy.test')) {
-                continue;
-            }
-
-            $test = file_get_contents($file->getRealpath());
-
-            if (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)\s*(?:--DATA--\s*(.*))?\s*--EXCEPTION--\s*(.*)/sx', $test, $match)) {
-                $message = $match[1];
-                $condition = $match[2];
-                $templates = self::parseTemplates($match[3]);
-                $exception = $match[5];
-                $outputs = array(array(null, $match[4], null, ''));
-            } elseif (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)--DATA--.*?--EXPECT--.*/s', $test, $match)) {
-                $message = $match[1];
-                $condition = $match[2];
-                $templates = self::parseTemplates($match[3]);
-                $exception = false;
-                preg_match_all('/--DATA--(.*?)(?:--CONFIG--(.*?))?--EXPECT--(.*?)(?=\-\-DATA\-\-|$)/s', $test, $outputs, PREG_SET_ORDER);
-            } else {
-                throw new InvalidArgumentException(sprintf('Test "%s" is not valid.', str_replace($fixturesDir.'/', '', $file)));
-            }
-
-            $tests[] = array(str_replace($fixturesDir.'/', '', $file), $message, $condition, $templates, $exception, $outputs);
-        }
-
-        if ($legacyTests && empty($tests)) {
-            // add a dummy test to avoid a PHPUnit message
-            return array(array('not', '-', '', array(), '', array()));
-        }
-
-        return $tests;
-    }
-
-    public function getLegacyTests()
-    {
-        return $this->getTests('testLegacyIntegration', true);
-    }
-
-    protected function doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs)
-    {
-        if (!$outputs) {
-            $this->markTestSkipped('no legacy tests to run');
-        }
-
-        if ($condition) {
-            eval('$ret = '.$condition.';');
-            if (!$ret) {
-                $this->markTestSkipped($condition);
-            }
-        }
-
-        $loader = new Twig_Loader_Array($templates);
-
-        foreach ($outputs as $i => $match) {
-            $config = array_merge(array(
-                'cache' => false,
-                'strict_variables' => true,
-            ), $match[2] ? eval($match[2].';') : array());
-            $twig = new Twig_Environment($loader, $config);
-            $twig->addGlobal('global', 'global');
-            foreach ($this->getRuntimeLoaders() as $runtimeLoader) {
-                $twig->addRuntimeLoader($runtimeLoader);
-            }
-
-            foreach ($this->getExtensions() as $extension) {
-                $twig->addExtension($extension);
-            }
-
-            foreach ($this->getTwigFilters() as $filter) {
-                $twig->addFilter($filter);
-            }
-
-            foreach ($this->getTwigTests() as $test) {
-                $twig->addTest($test);
-            }
-
-            foreach ($this->getTwigFunctions() as $function) {
-                $twig->addFunction($function);
-            }
-
-            // avoid using the same PHP class name for different cases
-            // only for PHP 5.2+
-            if (PHP_VERSION_ID >= 50300) {
-                $p = new ReflectionProperty($twig, 'templateClassPrefix');
-                $p->setAccessible(true);
-                $p->setValue($twig, '__TwigTemplate_'.hash('sha256', uniqid(mt_rand(), true), false).'_');
-            }
-
-            try {
-                $template = $twig->loadTemplate('index.twig');
-            } catch (Exception $e) {
-                if (false !== $exception) {
-                    $message = $e->getMessage();
-                    $this->assertSame(trim($exception), trim(sprintf('%s: %s', get_class($e), $message)));
-                    $last = substr($message, strlen($message) - 1);
-                    $this->assertTrue('.' === $last || '?' === $last, $message, 'Exception message must end with a dot or a question mark.');
-
-                    return;
-                }
-
-                throw new Twig_Error(sprintf('%s: %s', get_class($e), $e->getMessage()), -1, $file, $e);
-            }
-
-            try {
-                $output = trim($template->render(eval($match[1].';')), "\n ");
-            } catch (Exception $e) {
-                if (false !== $exception) {
-                    $this->assertSame(trim($exception), trim(sprintf('%s: %s', get_class($e), $e->getMessage())));
-
-                    return;
-                }
-
-                $e = new Twig_Error(sprintf('%s: %s', get_class($e), $e->getMessage()), -1, $file, $e);
-
-                $output = trim(sprintf('%s: %s', get_class($e), $e->getMessage()));
-            }
-
-            if (false !== $exception) {
-                list($class) = explode(':', $exception);
-                $constraintClass = class_exists('PHPUnit\Framework\Constraint\Exception') ? 'PHPUnit\Framework\Constraint\Exception' : 'PHPUnit_Framework_Constraint_Exception';
-                $this->assertThat(null, new $constraintClass($class));
-            }
-
-            $expected = trim($match[3], "\n ");
-
-            if ($expected !== $output) {
-                printf("Compiled templates that failed on case %d:\n", $i + 1);
-
-                foreach (array_keys($templates) as $name) {
-                    echo "Template: $name\n";
-                    $loader = $twig->getLoader();
-                    if (!$loader instanceof Twig_SourceContextLoaderInterface) {
-                        $source = new Twig_Source($loader->getSource($name), $name);
-                    } else {
-                        $source = $loader->getSourceContext($name);
-                    }
-                    echo $twig->compile($twig->parse($twig->tokenize($source)));
-                }
-            }
-            $this->assertEquals($expected, $output, $message.' (in '.$file.')');
-        }
-    }
-
-    protected static function parseTemplates($test)
-    {
-        $templates = array();
-        preg_match_all('/--TEMPLATE(?:\((.*?)\))?--(.*?)(?=\-\-TEMPLATE|$)/s', $test, $matches, PREG_SET_ORDER);
-        foreach ($matches as $match) {
-            $templates[($match[1] ? $match[1] : 'index.twig')] = $match[2];
-        }
-
-        return $templates;
     }
 }
-
-class_alias('Twig_Test_IntegrationTestCase', 'Twig\Test\IntegrationTestCase', false);
diff --git a/vendor/twig/twig/lib/Twig/Test/Method.php b/vendor/twig/twig/lib/Twig/Test/Method.php
deleted file mode 100644
index feccd5db..00000000
--- a/vendor/twig/twig/lib/Twig/Test/Method.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Test_Method class is deprecated since version 1.12 and will be removed in 2.0. Use Twig_SimpleTest instead.', E_USER_DEPRECATED);
-
-/**
- * Represents a method template test.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Test_Method extends Twig_Test
-{
-    protected $extension;
-    protected $method;
-
-    public function __construct(Twig_ExtensionInterface $extension, $method, array $options = array())
-    {
-        $options['callable'] = array($extension, $method);
-
-        parent::__construct($options);
-
-        $this->extension = $extension;
-        $this->method = $method;
-    }
-
-    public function compile()
-    {
-        return sprintf('$this->env->getExtension(\'%s\')->%s', get_class($this->extension), $this->method);
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/Test/Node.php b/vendor/twig/twig/lib/Twig/Test/Node.php
deleted file mode 100644
index 6098a527..00000000
--- a/vendor/twig/twig/lib/Twig/Test/Node.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-@trigger_error('The Twig_Test_Node class is deprecated since version 1.12 and will be removed in 2.0.', E_USER_DEPRECATED);
-
-/**
- * Represents a template test as a Node.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_Test_Node extends Twig_Test
-{
-    protected $class;
-
-    public function __construct($class, array $options = array())
-    {
-        parent::__construct($options);
-
-        $this->class = $class;
-    }
-
-    public function getClass()
-    {
-        return $this->class;
-    }
-
-    public function compile()
-    {
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php b/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php
index 47942675..86a25e9c 100644
--- a/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php
+++ b/vendor/twig/twig/lib/Twig/Test/NodeTestCase.php
@@ -1,75 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Test\NodeTestCase;
 
-use PHPUnit\Framework\TestCase;
+class_exists('Twig\Test\NodeTestCase');
 
-abstract class Twig_Test_NodeTestCase extends TestCase
-{
-    abstract public function getTests();
+@trigger_error(sprintf('Using the "Twig_Test_NodeTestCase" class is deprecated since Twig version 2.7, use "Twig\Test\NodeTestCase" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * @dataProvider getTests
-     */
-    public function testCompile($node, $source, $environment = null, $isPattern = false)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Test\NodeTestCase" instead */
+    class Twig_Test_NodeTestCase extends NodeTestCase
     {
-        $this->assertNodeCompilation($source, $node, $environment, $isPattern);
-    }
-
-    public function assertNodeCompilation($source, Twig_Node $node, Twig_Environment $environment = null, $isPattern = false)
-    {
-        $compiler = $this->getCompiler($environment);
-        $compiler->compile($node);
-
-        if ($isPattern) {
-            $this->assertStringMatchesFormat($source, trim($compiler->getSource()));
-        } else {
-            $this->assertEquals($source, trim($compiler->getSource()));
-        }
-    }
-
-    protected function getCompiler(Twig_Environment $environment = null)
-    {
-        return new Twig_Compiler(null === $environment ? $this->getEnvironment() : $environment);
-    }
-
-    protected function getEnvironment()
-    {
-        return new Twig_Environment(new Twig_Loader_Array(array()));
-    }
-
-    protected function getVariableGetter($name, $line = false)
-    {
-        $line = $line > 0 ? "// line {$line}\n" : '';
-
-        if (PHP_VERSION_ID >= 70000) {
-            return sprintf('%s($context["%s"] ?? null)', $line, $name, $name);
-        }
-
-        if (PHP_VERSION_ID >= 50400) {
-            return sprintf('%s(isset($context["%s"]) ? $context["%s"] : null)', $line, $name, $name);
-        }
-
-        return sprintf('%s$this->getContext($context, "%s")', $line, $name);
-    }
-
-    protected function getAttributeGetter()
-    {
-        if (function_exists('twig_template_get_attributes')) {
-            return 'twig_template_get_attributes($this, ';
-        }
-
-        return '$this->getAttribute(';
     }
 }
-
-class_alias('Twig_Test_NodeTestCase', 'Twig\Test\NodeTestCase', false);
-class_exists('Twig_Environment');
-class_exists('Twig_Node');
diff --git a/vendor/twig/twig/lib/Twig/TestCallableInterface.php b/vendor/twig/twig/lib/Twig/TestCallableInterface.php
deleted file mode 100644
index 51ecb9a2..00000000
--- a/vendor/twig/twig/lib/Twig/TestCallableInterface.php
+++ /dev/null
@@ -1,22 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a callable template test.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_TestCallableInterface
-{
-    public function getCallable();
-}
diff --git a/vendor/twig/twig/lib/Twig/TestInterface.php b/vendor/twig/twig/lib/Twig/TestInterface.php
deleted file mode 100644
index 91664075..00000000
--- a/vendor/twig/twig/lib/Twig/TestInterface.php
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Represents a template test.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_TestInterface
-{
-    /**
-     * Compiles a test.
-     *
-     * @return string The PHP code for the test
-     */
-    public function compile();
-}
diff --git a/vendor/twig/twig/lib/Twig/Token.php b/vendor/twig/twig/lib/Twig/Token.php
index c7850ecc..63fe1101 100644
--- a/vendor/twig/twig/lib/Twig/Token.php
+++ b/vendor/twig/twig/lib/Twig/Token.php
@@ -1,207 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Token;
 
-/**
- * Represents a Token.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @final
- */
-class Twig_Token
-{
-    protected $value;
-    protected $type;
-    protected $lineno;
+class_exists('Twig\Token');
 
-    const EOF_TYPE = -1;
-    const TEXT_TYPE = 0;
-    const BLOCK_START_TYPE = 1;
-    const VAR_START_TYPE = 2;
-    const BLOCK_END_TYPE = 3;
-    const VAR_END_TYPE = 4;
-    const NAME_TYPE = 5;
-    const NUMBER_TYPE = 6;
-    const STRING_TYPE = 7;
-    const OPERATOR_TYPE = 8;
-    const PUNCTUATION_TYPE = 9;
-    const INTERPOLATION_START_TYPE = 10;
-    const INTERPOLATION_END_TYPE = 11;
+@trigger_error(sprintf('Using the "Twig_Token" class is deprecated since Twig version 2.7, use "Twig\Token" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * @param int    $type   The type of the token
-     * @param string $value  The token value
-     * @param int    $lineno The line position in the source
-     */
-    public function __construct($type, $value, $lineno)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Token" instead */
+    class Twig_Token extends Token
     {
-        $this->type = $type;
-        $this->value = $value;
-        $this->lineno = $lineno;
-    }
-
-    public function __toString()
-    {
-        return sprintf('%s(%s)', self::typeToString($this->type, true), $this->value);
-    }
-
-    /**
-     * Tests the current token for a type and/or a value.
-     *
-     * Parameters may be:
-     *  * just type
-     *  * type and value (or array of possible values)
-     *  * just value (or array of possible values) (NAME_TYPE is used as type)
-     *
-     * @param array|int         $type   The type to test
-     * @param array|string|null $values The token value
-     *
-     * @return bool
-     */
-    public function test($type, $values = null)
-    {
-        if (null === $values && !is_int($type)) {
-            $values = $type;
-            $type = self::NAME_TYPE;
-        }
-
-        return ($this->type === $type) && (
-            null === $values ||
-            (is_array($values) && in_array($this->value, $values)) ||
-            $this->value == $values
-        );
-    }
-
-    /**
-     * @return int
-     */
-    public function getLine()
-    {
-        return $this->lineno;
-    }
-
-    /**
-     * @return int
-     */
-    public function getType()
-    {
-        return $this->type;
-    }
-
-    /**
-     * @return string
-     */
-    public function getValue()
-    {
-        return $this->value;
-    }
-
-    /**
-     * Returns the constant representation (internal) of a given type.
-     *
-     * @param int  $type  The type as an integer
-     * @param bool $short Whether to return a short representation or not
-     *
-     * @return string The string representation
-     */
-    public static function typeToString($type, $short = false)
-    {
-        switch ($type) {
-            case self::EOF_TYPE:
-                $name = 'EOF_TYPE';
-                break;
-            case self::TEXT_TYPE:
-                $name = 'TEXT_TYPE';
-                break;
-            case self::BLOCK_START_TYPE:
-                $name = 'BLOCK_START_TYPE';
-                break;
-            case self::VAR_START_TYPE:
-                $name = 'VAR_START_TYPE';
-                break;
-            case self::BLOCK_END_TYPE:
-                $name = 'BLOCK_END_TYPE';
-                break;
-            case self::VAR_END_TYPE:
-                $name = 'VAR_END_TYPE';
-                break;
-            case self::NAME_TYPE:
-                $name = 'NAME_TYPE';
-                break;
-            case self::NUMBER_TYPE:
-                $name = 'NUMBER_TYPE';
-                break;
-            case self::STRING_TYPE:
-                $name = 'STRING_TYPE';
-                break;
-            case self::OPERATOR_TYPE:
-                $name = 'OPERATOR_TYPE';
-                break;
-            case self::PUNCTUATION_TYPE:
-                $name = 'PUNCTUATION_TYPE';
-                break;
-            case self::INTERPOLATION_START_TYPE:
-                $name = 'INTERPOLATION_START_TYPE';
-                break;
-            case self::INTERPOLATION_END_TYPE:
-                $name = 'INTERPOLATION_END_TYPE';
-                break;
-            default:
-                throw new LogicException(sprintf('Token of type "%s" does not exist.', $type));
-        }
-
-        return $short ? $name : 'Twig_Token::'.$name;
-    }
-
-    /**
-     * Returns the English representation of a given type.
-     *
-     * @param int $type The type as an integer
-     *
-     * @return string The string representation
-     */
-    public static function typeToEnglish($type)
-    {
-        switch ($type) {
-            case self::EOF_TYPE:
-                return 'end of template';
-            case self::TEXT_TYPE:
-                return 'text';
-            case self::BLOCK_START_TYPE:
-                return 'begin of statement block';
-            case self::VAR_START_TYPE:
-                return 'begin of print statement';
-            case self::BLOCK_END_TYPE:
-                return 'end of statement block';
-            case self::VAR_END_TYPE:
-                return 'end of print statement';
-            case self::NAME_TYPE:
-                return 'name';
-            case self::NUMBER_TYPE:
-                return 'number';
-            case self::STRING_TYPE:
-                return 'string';
-            case self::OPERATOR_TYPE:
-                return 'operator';
-            case self::PUNCTUATION_TYPE:
-                return 'punctuation';
-            case self::INTERPOLATION_START_TYPE:
-                return 'begin of string interpolation';
-            case self::INTERPOLATION_END_TYPE:
-                return 'end of string interpolation';
-            default:
-                throw new LogicException(sprintf('Token of type "%s" does not exist.', $type));
-        }
     }
 }
-
-class_alias('Twig_Token', 'Twig\Token', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser.php b/vendor/twig/twig/lib/Twig/TokenParser.php
index 1b4de14d..bed9f1ca 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser.php
@@ -1,33 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\AbstractTokenParser;
 
-/**
- * Base class for all token parsers.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-abstract class Twig_TokenParser implements Twig_TokenParserInterface
-{
-    /**
-     * @var Twig_Parser
-     */
-    protected $parser;
+class_exists('Twig\TokenParser\AbstractTokenParser');
 
-    /**
-     * Sets the parser associated with this token parser.
-     */
-    public function setParser(Twig_Parser $parser)
+@trigger_error(sprintf('Using the "Twig_TokenParser" class is deprecated since Twig version 2.7, use "Twig\TokenParser\AbstractTokenParser" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\AbstractTokenParser" instead */
+    class Twig_TokenParser extends AbstractTokenParser
     {
-        $this->parser = $parser;
     }
 }
-
-class_alias('Twig_TokenParser', 'Twig\TokenParser\AbstractTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php b/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php
index a20dedd1..614318e6 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/AutoEscape.php
@@ -1,83 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\AutoEscapeTokenParser;
 
-/**
- * Marks a section of a template to be escaped or not.
- *
- * <pre>
- * {% autoescape true %}
- *   Everything will be automatically escaped in this block
- * {% endautoescape %}
- *
- * {% autoescape false %}
- *   Everything will be outputed as is in this block
- * {% endautoescape %}
- *
- * {% autoescape true js %}
- *   Everything will be automatically escaped in this block
- *   using the js escaping strategy
- * {% endautoescape %}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_AutoEscape extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $stream = $this->parser->getStream();
-
-        if ($stream->test(Twig_Token::BLOCK_END_TYPE)) {
-            $value = 'html';
-        } else {
-            $expr = $this->parser->getExpressionParser()->parseExpression();
-            if (!$expr instanceof Twig_Node_Expression_Constant) {
-                throw new Twig_Error_Syntax('An escaping strategy must be a string or a bool.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
-            }
-            $value = $expr->getAttribute('value');
-
-            $compat = true === $value || false === $value;
-
-            if (true === $value) {
-                $value = 'html';
-            }
-
-            if ($compat && $stream->test(Twig_Token::NAME_TYPE)) {
-                @trigger_error('Using the autoescape tag with "true" or "false" before the strategy name is deprecated since version 1.21.', E_USER_DEPRECATED);
-
-                if (false === $value) {
-                    throw new Twig_Error_Syntax('Unexpected escaping strategy as you set autoescaping to false.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
-                }
-
-                $value = $stream->next()->getValue();
-            }
-        }
+class_exists('Twig\TokenParser\AutoEscapeTokenParser');
 
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
+@trigger_error(sprintf('Using the "Twig_TokenParser_AutoEscape" class is deprecated since Twig version 2.7, use "Twig\TokenParser\AutoEscapeTokenParser" instead.'), E_USER_DEPRECATED);
 
-        return new Twig_Node_AutoEscape($value, $body, $lineno, $this->getTag());
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endautoescape');
-    }
-
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\AutoEscapeTokenParser" instead */
+    class Twig_TokenParser_AutoEscape extends AutoEscapeTokenParser
     {
-        return 'autoescape';
     }
 }
-
-class_alias('Twig_TokenParser_AutoEscape', 'Twig\TokenParser\AutoEscapeTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Block.php b/vendor/twig/twig/lib/Twig/TokenParser/Block.php
index f30f86b5..6ad83678 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Block.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Block.php
@@ -1,73 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\BlockTokenParser;
 
-/**
- * Marks a section of a template as being reusable.
- *
- * <pre>
- *  {% block head %}
- *    <link rel="stylesheet" href="style.css" />
- *    <title>{% block title %}{% endblock %} - My Webpage</title>
- *  {% endblock %}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_Block extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $stream = $this->parser->getStream();
-        $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-        if ($this->parser->hasBlock($name)) {
-            throw new Twig_Error_Syntax(sprintf("The block '%s' has already been defined line %d.", $name, $this->parser->getBlock($name)->getTemplateLine()), $stream->getCurrent()->getLine(), $stream->getSourceContext());
-        }
-        $this->parser->setBlock($name, $block = new Twig_Node_Block($name, new Twig_Node(array()), $lineno));
-        $this->parser->pushLocalScope();
-        $this->parser->pushBlockStack($name);
-
-        if ($stream->nextIf(Twig_Token::BLOCK_END_TYPE)) {
-            $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-            if ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) {
-                $value = $token->getValue();
-
-                if ($value != $name) {
-                    throw new Twig_Error_Syntax(sprintf('Expected endblock for block "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
-                }
-            }
-        } else {
-            $body = new Twig_Node(array(
-                new Twig_Node_Print($this->parser->getExpressionParser()->parseExpression(), $lineno),
-            ));
-        }
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
+class_exists('Twig\TokenParser\BlockTokenParser');
 
-        $block->setNode('body', $body);
-        $this->parser->popBlockStack();
-        $this->parser->popLocalScope();
-
-        return new Twig_Node_BlockReference($name, $lineno, $this->getTag());
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Block" class is deprecated since Twig version 2.7, use "Twig\TokenParser\BlockTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function decideBlockEnd(Twig_Token $token)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\BlockTokenParser" instead */
+    class Twig_TokenParser_Block extends BlockTokenParser
     {
-        return $token->test('endblock');
-    }
-
-    public function getTag()
-    {
-        return 'block';
     }
 }
-
-class_alias('Twig_TokenParser_Block', 'Twig\TokenParser\BlockTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Deprecated.php b/vendor/twig/twig/lib/Twig/TokenParser/Deprecated.php
new file mode 100644
index 00000000..f57dd9c7
--- /dev/null
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Deprecated.php
@@ -0,0 +1,14 @@
+<?php
+
+use Twig\TokenParser\DeprecatedTokenParser;
+
+class_exists('Twig\TokenParser\DeprecatedTokenParser');
+
+@trigger_error(sprintf('Using the "Twig_TokenParser_Deprecated" class is deprecated since Twig version 2.7, use "Twig\TokenParser\DeprecatedTokenParser" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\DeprecatedTokenParser" instead */
+    class Twig_TokenParser_Deprecated extends DeprecatedTokenParser
+    {
+    }
+}
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Do.php b/vendor/twig/twig/lib/Twig/TokenParser/Do.php
index 8ce08808..89579241 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Do.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Do.php
@@ -1,34 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\DoTokenParser;
 
-/**
- * Evaluates an expression, discarding the returned value.
- *
- * @final
- */
-class Twig_TokenParser_Do extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $expr = $this->parser->getExpressionParser()->parseExpression();
-
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+class_exists('Twig\TokenParser\DoTokenParser');
 
-        return new Twig_Node_Do($expr, $token->getLine(), $this->getTag());
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Do" class is deprecated since Twig version 2.7, use "Twig\TokenParser\DoTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\DoTokenParser" instead */
+    class Twig_TokenParser_Do extends DoTokenParser
     {
-        return 'do';
     }
 }
-
-class_alias('Twig_TokenParser_Do', 'Twig\TokenParser\DoTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Embed.php b/vendor/twig/twig/lib/Twig/TokenParser/Embed.php
index 44644cc6..6ff9e619 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Embed.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Embed.php
@@ -1,67 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\EmbedTokenParser;
 
-/**
- * Embeds a template.
- *
- * @final
- */
-class Twig_TokenParser_Embed extends Twig_TokenParser_Include
-{
-    public function parse(Twig_Token $token)
-    {
-        $stream = $this->parser->getStream();
-
-        $parent = $this->parser->getExpressionParser()->parseExpression();
-
-        list($variables, $only, $ignoreMissing) = $this->parseArguments();
-
-        $parentToken = $fakeParentToken = new Twig_Token(Twig_Token::STRING_TYPE, '__parent__', $token->getLine());
-        if ($parent instanceof Twig_Node_Expression_Constant) {
-            $parentToken = new Twig_Token(Twig_Token::STRING_TYPE, $parent->getAttribute('value'), $token->getLine());
-        } elseif ($parent instanceof Twig_Node_Expression_Name) {
-            $parentToken = new Twig_Token(Twig_Token::NAME_TYPE, $parent->getAttribute('name'), $token->getLine());
-        }
-
-        // inject a fake parent to make the parent() function work
-        $stream->injectTokens(array(
-            new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', $token->getLine()),
-            new Twig_Token(Twig_Token::NAME_TYPE, 'extends', $token->getLine()),
-            $parentToken,
-            new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', $token->getLine()),
-        ));
-
-        $module = $this->parser->parse($stream, array($this, 'decideBlockEnd'), true);
-
-        // override the parent with the correct one
-        if ($fakeParentToken === $parentToken) {
-            $module->setNode('parent', $parent);
-        }
+class_exists('Twig\TokenParser\EmbedTokenParser');
 
-        $this->parser->embedTemplate($module);
+@trigger_error(sprintf('Using the "Twig_TokenParser_Embed" class is deprecated since Twig version 2.7, use "Twig\TokenParser\EmbedTokenParser" instead.'), E_USER_DEPRECATED);
 
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_Embed($module->getTemplateName(), $module->getAttribute('index'), $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\EmbedTokenParser" instead */
+    class Twig_TokenParser_Embed extends EmbedTokenParser
     {
-        return $token->test('endembed');
-    }
-
-    public function getTag()
-    {
-        return 'embed';
     }
 }
-
-class_alias('Twig_TokenParser_Embed', 'Twig\TokenParser\EmbedTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Extends.php b/vendor/twig/twig/lib/Twig/TokenParser/Extends.php
index 31168cce..a37d3552 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Extends.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Extends.php
@@ -1,46 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\ExtendsTokenParser;
 
-/**
- * Extends a template by another one.
- *
- * <pre>
- *  {% extends "base.html" %}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_Extends extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $stream = $this->parser->getStream();
-
-        if (!$this->parser->isMainScope()) {
-            throw new Twig_Error_Syntax('Cannot extend from a block.', $token->getLine(), $stream->getSourceContext());
-        }
+class_exists('Twig\TokenParser\ExtendsTokenParser');
 
-        if (null !== $this->parser->getParent()) {
-            throw new Twig_Error_Syntax('Multiple extends tags are forbidden.', $token->getLine(), $stream->getSourceContext());
-        }
-        $this->parser->setParent($this->parser->getExpressionParser()->parseExpression());
+@trigger_error(sprintf('Using the "Twig_TokenParser_Extends" class is deprecated since Twig version 2.7, use "Twig\TokenParser\ExtendsTokenParser" instead.'), E_USER_DEPRECATED);
 
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-    }
-
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\ExtendsTokenParser" instead */
+    class Twig_TokenParser_Extends extends ExtendsTokenParser
     {
-        return 'extends';
     }
 }
-
-class_alias('Twig_TokenParser_Extends', 'Twig\TokenParser\ExtendsTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Filter.php b/vendor/twig/twig/lib/Twig/TokenParser/Filter.php
index 76017829..955170f3 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Filter.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Filter.php
@@ -1,53 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\FilterTokenParser;
 
-/**
- * Filters a section of a template by applying filters.
- *
- * <pre>
- * {% filter upper %}
- *  This text becomes uppercase
- * {% endfilter %}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_Filter extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $name = $this->parser->getVarName();
-        $ref = new Twig_Node_Expression_BlockReference(new Twig_Node_Expression_Constant($name, $token->getLine()), null, $token->getLine(), $this->getTag());
-
-        $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag());
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+class_exists('Twig\TokenParser\FilterTokenParser');
 
-        $block = new Twig_Node_Block($name, $body, $token->getLine());
-        $this->parser->setBlock($name, $block);
-
-        return new Twig_Node_Print($filter, $token->getLine(), $this->getTag());
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Filter" class is deprecated since Twig version 2.7, use "Twig\TokenParser\FilterTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function decideBlockEnd(Twig_Token $token)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\FilterTokenParser" instead */
+    class Twig_TokenParser_Filter extends FilterTokenParser
     {
-        return $token->test('endfilter');
-    }
-
-    public function getTag()
-    {
-        return 'filter';
     }
 }
-
-class_alias('Twig_TokenParser_Filter', 'Twig\TokenParser\FilterTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Flush.php b/vendor/twig/twig/lib/Twig/TokenParser/Flush.php
index 51832c77..e23e769e 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Flush.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Flush.php
@@ -1,34 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\FlushTokenParser;
 
-/**
- * Flushes the output to the client.
- *
- * @see flush()
- *
- * @final
- */
-class Twig_TokenParser_Flush extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+class_exists('Twig\TokenParser\FlushTokenParser');
 
-        return new Twig_Node_Flush($token->getLine(), $this->getTag());
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Flush" class is deprecated since Twig version 2.7, use "Twig\TokenParser\FlushTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\FlushTokenParser" instead */
+    class Twig_TokenParser_Flush extends FlushTokenParser
     {
-        return 'flush';
     }
 }
-
-class_alias('Twig_TokenParser_Flush', 'Twig\TokenParser\FlushTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/For.php b/vendor/twig/twig/lib/Twig/TokenParser/For.php
index 63bf41d6..adbff032 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/For.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/For.php
@@ -1,127 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\ForTokenParser;
 
-/**
- * Loops over each item of a sequence.
- *
- * <pre>
- * <ul>
- *  {% for user in users %}
- *    <li>{{ user.username|e }}</li>
- *  {% endfor %}
- * </ul>
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_For extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $stream = $this->parser->getStream();
-        $targets = $this->parser->getExpressionParser()->parseAssignmentExpression();
-        $stream->expect(Twig_Token::OPERATOR_TYPE, 'in');
-        $seq = $this->parser->getExpressionParser()->parseExpression();
-
-        $ifexpr = null;
-        if ($stream->nextIf(Twig_Token::NAME_TYPE, 'if')) {
-            $ifexpr = $this->parser->getExpressionParser()->parseExpression();
-        }
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideForFork'));
-        if ($stream->next()->getValue() == 'else') {
-            $stream->expect(Twig_Token::BLOCK_END_TYPE);
-            $else = $this->parser->subparse(array($this, 'decideForEnd'), true);
-        } else {
-            $else = null;
-        }
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        if (count($targets) > 1) {
-            $keyTarget = $targets->getNode(0);
-            $keyTarget = new Twig_Node_Expression_AssignName($keyTarget->getAttribute('name'), $keyTarget->getTemplateLine());
-            $valueTarget = $targets->getNode(1);
-            $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
-        } else {
-            $keyTarget = new Twig_Node_Expression_AssignName('_key', $lineno);
-            $valueTarget = $targets->getNode(0);
-            $valueTarget = new Twig_Node_Expression_AssignName($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
-        }
-
-        if ($ifexpr) {
-            $this->checkLoopUsageCondition($stream, $ifexpr);
-            $this->checkLoopUsageBody($stream, $body);
-        }
-
-        return new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, $lineno, $this->getTag());
-    }
-
-    public function decideForFork(Twig_Token $token)
-    {
-        return $token->test(array('else', 'endfor'));
-    }
-
-    public function decideForEnd(Twig_Token $token)
-    {
-        return $token->test('endfor');
-    }
-
-    // the loop variable cannot be used in the condition
-    protected function checkLoopUsageCondition(Twig_TokenStream $stream, Twig_NodeInterface $node)
-    {
-        if ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' == $node->getNode('node')->getAttribute('name')) {
-            throw new Twig_Error_Syntax('The "loop" variable cannot be used in a looping condition.', $node->getTemplateLine(), $stream->getSourceContext());
-        }
-
-        foreach ($node as $n) {
-            if (!$n) {
-                continue;
-            }
-
-            $this->checkLoopUsageCondition($stream, $n);
-        }
-    }
+class_exists('Twig\TokenParser\ForTokenParser');
 
-    // check usage of non-defined loop-items
-    // it does not catch all problems (for instance when a for is included into another or when the variable is used in an include)
-    protected function checkLoopUsageBody(Twig_TokenStream $stream, Twig_NodeInterface $node)
-    {
-        if ($node instanceof Twig_Node_Expression_GetAttr && $node->getNode('node') instanceof Twig_Node_Expression_Name && 'loop' == $node->getNode('node')->getAttribute('name')) {
-            $attribute = $node->getNode('attribute');
-            if ($attribute instanceof Twig_Node_Expression_Constant && in_array($attribute->getAttribute('value'), array('length', 'revindex0', 'revindex', 'last'))) {
-                throw new Twig_Error_Syntax(sprintf('The "loop.%s" variable is not defined when looping with a condition.', $attribute->getAttribute('value')), $node->getTemplateLine(), $stream->getSourceContext());
-            }
-        }
-
-        // should check for parent.loop.XXX usage
-        if ($node instanceof Twig_Node_For) {
-            return;
-        }
-
-        foreach ($node as $n) {
-            if (!$n) {
-                continue;
-            }
+@trigger_error(sprintf('Using the "Twig_TokenParser_For" class is deprecated since Twig version 2.7, use "Twig\TokenParser\ForTokenParser" instead.'), E_USER_DEPRECATED);
 
-            $this->checkLoopUsageBody($stream, $n);
-        }
-    }
-
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\ForTokenParser" instead */
+    class Twig_TokenParser_For extends ForTokenParser
     {
-        return 'for';
     }
 }
-
-class_alias('Twig_TokenParser_For', 'Twig\TokenParser\ForTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/From.php b/vendor/twig/twig/lib/Twig/TokenParser/From.php
index f3053da4..43c96927 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/From.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/From.php
@@ -1,66 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\FromTokenParser;
 
-/**
- * Imports macros.
- *
- * <pre>
- *   {% from 'forms.html' import forms %}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_From extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $macro = $this->parser->getExpressionParser()->parseExpression();
-        $stream = $this->parser->getStream();
-        $stream->expect('import');
-
-        $targets = array();
-        do {
-            $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
-            $alias = $name;
-            if ($stream->nextIf('as')) {
-                $alias = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-            }
-
-            $targets[$name] = $alias;
-
-            if (!$stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) {
-                break;
-            }
-        } while (true);
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
+class_exists('Twig\TokenParser\FromTokenParser');
 
-        $node = new Twig_Node_Import($macro, new Twig_Node_Expression_AssignName($this->parser->getVarName(), $token->getLine()), $token->getLine(), $this->getTag());
+@trigger_error(sprintf('Using the "Twig_TokenParser_From" class is deprecated since Twig version 2.7, use "Twig\TokenParser\FromTokenParser" instead.'), E_USER_DEPRECATED);
 
-        foreach ($targets as $name => $alias) {
-            if ($this->parser->isReservedMacroName($name)) {
-                throw new Twig_Error_Syntax(sprintf('"%s" cannot be an imported macro as it is a reserved keyword.', $name), $token->getLine(), $stream->getSourceContext());
-            }
-
-            $this->parser->addImportedSymbol('function', $alias, 'get'.$name, $node->getNode('var'));
-        }
-
-        return $node;
-    }
-
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\FromTokenParser" instead */
+    class Twig_TokenParser_From extends FromTokenParser
     {
-        return 'from';
     }
 }
-
-class_alias('Twig_TokenParser_From', 'Twig\TokenParser\FromTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/If.php b/vendor/twig/twig/lib/Twig/TokenParser/If.php
index f081df3a..97e1f8bb 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/If.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/If.php
@@ -1,86 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\IfTokenParser;
 
-/**
- * Tests a condition.
- *
- * <pre>
- * {% if users %}
- *  <ul>
- *    {% for user in users %}
- *      <li>{{ user.username|e }}</li>
- *    {% endfor %}
- *  </ul>
- * {% endif %}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_If extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $expr = $this->parser->getExpressionParser()->parseExpression();
-        $stream = $this->parser->getStream();
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideIfFork'));
-        $tests = array($expr, $body);
-        $else = null;
-
-        $end = false;
-        while (!$end) {
-            switch ($stream->next()->getValue()) {
-                case 'else':
-                    $stream->expect(Twig_Token::BLOCK_END_TYPE);
-                    $else = $this->parser->subparse(array($this, 'decideIfEnd'));
-                    break;
-
-                case 'elseif':
-                    $expr = $this->parser->getExpressionParser()->parseExpression();
-                    $stream->expect(Twig_Token::BLOCK_END_TYPE);
-                    $body = $this->parser->subparse(array($this, 'decideIfFork'));
-                    $tests[] = $expr;
-                    $tests[] = $body;
-                    break;
-
-                case 'endif':
-                    $end = true;
-                    break;
-
-                default:
-                    throw new Twig_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d).', $lineno), $stream->getCurrent()->getLine(), $stream->getSourceContext());
-            }
-        }
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return new Twig_Node_If(new Twig_Node($tests), $else, $lineno, $this->getTag());
-    }
+class_exists('Twig\TokenParser\IfTokenParser');
 
-    public function decideIfFork(Twig_Token $token)
-    {
-        return $token->test(array('elseif', 'else', 'endif'));
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_If" class is deprecated since Twig version 2.7, use "Twig\TokenParser\IfTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function decideIfEnd(Twig_Token $token)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\IfTokenParser" instead */
+    class Twig_TokenParser_If extends IfTokenParser
     {
-        return $token->test(array('endif'));
-    }
-
-    public function getTag()
-    {
-        return 'if';
     }
 }
-
-class_alias('Twig_TokenParser_If', 'Twig\TokenParser\IfTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Import.php b/vendor/twig/twig/lib/Twig/TokenParser/Import.php
index 47802f50..24a6e9dc 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Import.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Import.php
@@ -1,41 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\ImportTokenParser;
 
-/**
- * Imports macros.
- *
- * <pre>
- *   {% import 'forms.html' as forms %}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_Import extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $macro = $this->parser->getExpressionParser()->parseExpression();
-        $this->parser->getStream()->expect('as');
-        $var = new Twig_Node_Expression_AssignName($this->parser->getStream()->expect(Twig_Token::NAME_TYPE)->getValue(), $token->getLine());
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $this->parser->addImportedSymbol('template', $var->getAttribute('name'));
+class_exists('Twig\TokenParser\ImportTokenParser');
 
-        return new Twig_Node_Import($macro, $var, $token->getLine(), $this->getTag());
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Import" class is deprecated since Twig version 2.7, use "Twig\TokenParser\ImportTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\ImportTokenParser" instead */
+    class Twig_TokenParser_Import extends ImportTokenParser
     {
-        return 'import';
     }
 }
-
-class_alias('Twig_TokenParser_Import', 'Twig\TokenParser\ImportTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Include.php b/vendor/twig/twig/lib/Twig/TokenParser/Include.php
index 309f11db..8c1adb8f 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Include.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Include.php
@@ -1,65 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\IncludeTokenParser;
 
-/**
- * Includes a template.
- *
- * <pre>
- *   {% include 'header.html' %}
- *     Body
- *   {% include 'footer.html' %}
- * </pre>
- */
-class Twig_TokenParser_Include extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $expr = $this->parser->getExpressionParser()->parseExpression();
-
-        list($variables, $only, $ignoreMissing) = $this->parseArguments();
+class_exists('Twig\TokenParser\IncludeTokenParser');
 
-        return new Twig_Node_Include($expr, $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Include" class is deprecated since Twig version 2.7, use "Twig\TokenParser\IncludeTokenParser" instead.'), E_USER_DEPRECATED);
 
-    protected function parseArguments()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\IncludeTokenParser" instead */
+    class Twig_TokenParser_Include extends IncludeTokenParser
     {
-        $stream = $this->parser->getStream();
-
-        $ignoreMissing = false;
-        if ($stream->nextIf(Twig_Token::NAME_TYPE, 'ignore')) {
-            $stream->expect(Twig_Token::NAME_TYPE, 'missing');
-
-            $ignoreMissing = true;
-        }
-
-        $variables = null;
-        if ($stream->nextIf(Twig_Token::NAME_TYPE, 'with')) {
-            $variables = $this->parser->getExpressionParser()->parseExpression();
-        }
-
-        $only = false;
-        if ($stream->nextIf(Twig_Token::NAME_TYPE, 'only')) {
-            $only = true;
-        }
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        return array($variables, $only, $ignoreMissing);
-    }
-
-    public function getTag()
-    {
-        return 'include';
     }
 }
-
-class_alias('Twig_TokenParser_Include', 'Twig\TokenParser\IncludeTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Macro.php b/vendor/twig/twig/lib/Twig/TokenParser/Macro.php
index 4287934b..381b1dfb 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Macro.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Macro.php
@@ -1,60 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\MacroTokenParser;
 
-/**
- * Defines a macro.
- *
- * <pre>
- * {% macro input(name, value, type, size) %}
- *    <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
- * {% endmacro %}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_Macro extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $stream = $this->parser->getStream();
-        $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
-        $arguments = $this->parser->getExpressionParser()->parseArguments(true, true);
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-        $this->parser->pushLocalScope();
-        $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-        if ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) {
-            $value = $token->getValue();
+class_exists('Twig\TokenParser\MacroTokenParser');
 
-            if ($value != $name) {
-                throw new Twig_Error_Syntax(sprintf('Expected endmacro for macro "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
-            }
-        }
-        $this->parser->popLocalScope();
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $this->parser->setMacro($name, new Twig_Node_Macro($name, new Twig_Node_Body(array($body)), $arguments, $lineno, $this->getTag()));
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Macro" class is deprecated since Twig version 2.7, use "Twig\TokenParser\MacroTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function decideBlockEnd(Twig_Token $token)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\MacroTokenParser" instead */
+    class Twig_TokenParser_Macro extends MacroTokenParser
     {
-        return $token->test('endmacro');
-    }
-
-    public function getTag()
-    {
-        return 'macro';
     }
 }
-
-class_alias('Twig_TokenParser_Macro', 'Twig\TokenParser\MacroTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php b/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php
index b8f581cb..d7d72a7b 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Sandbox.php
@@ -1,61 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\SandboxTokenParser;
 
-/**
- * Marks a section of a template as untrusted code that must be evaluated in the sandbox mode.
- *
- * <pre>
- * {% sandbox %}
- *     {% include 'user.html' %}
- * {% endsandbox %}
- * </pre>
- *
- * @see http://www.twig-project.org/doc/api.html#sandbox-extension for details
- *
- * @final
- */
-class Twig_TokenParser_Sandbox extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $stream = $this->parser->getStream();
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        // in a sandbox tag, only include tags are allowed
-        if (!$body instanceof Twig_Node_Include) {
-            foreach ($body as $node) {
-                if ($node instanceof Twig_Node_Text && ctype_space($node->getAttribute('data'))) {
-                    continue;
-                }
-
-                if (!$node instanceof Twig_Node_Include) {
-                    throw new Twig_Error_Syntax('Only "include" tags are allowed within a "sandbox" section.', $node->getTemplateLine(), $stream->getSourceContext());
-                }
-            }
-        }
-
-        return new Twig_Node_Sandbox($body, $token->getLine(), $this->getTag());
-    }
+class_exists('Twig\TokenParser\SandboxTokenParser');
 
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endsandbox');
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Sandbox" class is deprecated since Twig version 2.7, use "Twig\TokenParser\SandboxTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\SandboxTokenParser" instead */
+    class Twig_TokenParser_Sandbox extends SandboxTokenParser
     {
-        return 'sandbox';
     }
 }
-
-class_alias('Twig_TokenParser_Sandbox', 'Twig\TokenParser\SandboxTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Set.php b/vendor/twig/twig/lib/Twig/TokenParser/Set.php
index 48c6b3ae..c0bf202a 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Set.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Set.php
@@ -1,75 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\SetTokenParser;
 
-/**
- * Defines a variable.
- *
- * <pre>
- *  {% set foo = 'foo' %}
- *
- *  {% set foo = [1, 2] %}
- *
- *  {% set foo = {'foo': 'bar'} %}
- *
- *  {% set foo = 'foo' ~ 'bar' %}
- *
- *  {% set foo, bar = 'foo', 'bar' %}
- *
- *  {% set foo %}Some content{% endset %}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_Set extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-        $stream = $this->parser->getStream();
-        $names = $this->parser->getExpressionParser()->parseAssignmentExpression();
-
-        $capture = false;
-        if ($stream->nextIf(Twig_Token::OPERATOR_TYPE, '=')) {
-            $values = $this->parser->getExpressionParser()->parseMultitargetExpression();
-
-            $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-            if (count($names) !== count($values)) {
-                throw new Twig_Error_Syntax('When using set, you must have the same number of variables and assignments.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
-            }
-        } else {
-            $capture = true;
-
-            if (count($names) > 1) {
-                throw new Twig_Error_Syntax('When using set with a block, you cannot have a multi-target.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
-            }
-
-            $stream->expect(Twig_Token::BLOCK_END_TYPE);
+class_exists('Twig\TokenParser\SetTokenParser');
 
-            $values = $this->parser->subparse(array($this, 'decideBlockEnd'), true);
-            $stream->expect(Twig_Token::BLOCK_END_TYPE);
-        }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Set" class is deprecated since Twig version 2.7, use "Twig\TokenParser\SetTokenParser" instead.'), E_USER_DEPRECATED);
 
-        return new Twig_Node_Set($capture, $names, $values, $lineno, $this->getTag());
-    }
-
-    public function decideBlockEnd(Twig_Token $token)
-    {
-        return $token->test('endset');
-    }
-
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\SetTokenParser" instead */
+    class Twig_TokenParser_Set extends SetTokenParser
     {
-        return 'set';
     }
 }
-
-class_alias('Twig_TokenParser_Set', 'Twig\TokenParser\SetTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php b/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php
index cecf27c6..eef230a1 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Spaceless.php
@@ -1,51 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\SpacelessTokenParser;
 
-/**
- * Remove whitespaces between HTML tags.
- *
- * <pre>
- * {% spaceless %}
- *      <div>
- *          <strong>foo</strong>
- *      </div>
- * {% endspaceless %}
- *
- * {# output will be <div><strong>foo</strong></div> #}
- * </pre>
- *
- * @final
- */
-class Twig_TokenParser_Spaceless extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $lineno = $token->getLine();
-
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
-        $body = $this->parser->subparse(array($this, 'decideSpacelessEnd'), true);
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+class_exists('Twig\TokenParser\SpacelessTokenParser');
 
-        return new Twig_Node_Spaceless($body, $lineno, $this->getTag());
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Spaceless" class is deprecated since Twig version 2.7, use "Twig\TokenParser\SpacelessTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function decideSpacelessEnd(Twig_Token $token)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\SpacelessTokenParser" instead */
+    class Twig_TokenParser_Spaceless extends SpacelessTokenParser
     {
-        return $token->test('endspaceless');
-    }
-
-    public function getTag()
-    {
-        return 'spaceless';
     }
 }
-
-class_alias('Twig_TokenParser_Spaceless', 'Twig\TokenParser\SpacelessTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/Use.php b/vendor/twig/twig/lib/Twig/TokenParser/Use.php
index f15a91ea..cc764ee7 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/Use.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/Use.php
@@ -1,70 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\UseTokenParser;
 
-/**
- * Imports blocks defined in another template into the current template.
- *
- * <pre>
- * {% extends "base.html" %}
- *
- * {% use "blocks.html" %}
- *
- * {% block title %}{% endblock %}
- * {% block content %}{% endblock %}
- * </pre>
- *
- * @see http://www.twig-project.org/doc/templates.html#horizontal-reuse for details.
- *
- * @final
- */
-class Twig_TokenParser_Use extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $template = $this->parser->getExpressionParser()->parseExpression();
-        $stream = $this->parser->getStream();
-
-        if (!$template instanceof Twig_Node_Expression_Constant) {
-            throw new Twig_Error_Syntax('The template references in a "use" statement must be a string.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
-        }
-
-        $targets = array();
-        if ($stream->nextIf('with')) {
-            do {
-                $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-
-                $alias = $name;
-                if ($stream->nextIf('as')) {
-                    $alias = $stream->expect(Twig_Token::NAME_TYPE)->getValue();
-                }
-
-                $targets[$name] = new Twig_Node_Expression_Constant($alias, -1);
+class_exists('Twig\TokenParser\UseTokenParser');
 
-                if (!$stream->nextIf(Twig_Token::PUNCTUATION_TYPE, ',')) {
-                    break;
-                }
-            } while (true);
-        }
+@trigger_error(sprintf('Using the "Twig_TokenParser_Use" class is deprecated since Twig version 2.7, use "Twig\TokenParser\UseTokenParser" instead.'), E_USER_DEPRECATED);
 
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $this->parser->addTrait(new Twig_Node(array('template' => $template, 'targets' => new Twig_Node($targets))));
-
-        return new Twig_Node();
-    }
-
-    public function getTag()
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\UseTokenParser" instead */
+    class Twig_TokenParser_Use extends UseTokenParser
     {
-        return 'use';
     }
 }
-
-class_alias('Twig_TokenParser_Use', 'Twig\TokenParser\UseTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParser/With.php b/vendor/twig/twig/lib/Twig/TokenParser/With.php
index 7a692597..d5973fcd 100644
--- a/vendor/twig/twig/lib/Twig/TokenParser/With.php
+++ b/vendor/twig/twig/lib/Twig/TokenParser/With.php
@@ -1,52 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\WithTokenParser;
 
-/**
- * Creates a nested scope.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @final
- */
-class Twig_TokenParser_With extends Twig_TokenParser
-{
-    public function parse(Twig_Token $token)
-    {
-        $stream = $this->parser->getStream();
-
-        $variables = null;
-        $only = false;
-        if (!$stream->test(Twig_Token::BLOCK_END_TYPE)) {
-            $variables = $this->parser->getExpressionParser()->parseExpression();
-            $only = $stream->nextIf(Twig_Token::NAME_TYPE, 'only');
-        }
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
-
-        $body = $this->parser->subparse(array($this, 'decideWithEnd'), true);
-
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
+class_exists('Twig\TokenParser\WithTokenParser');
 
-        return new Twig_Node_With($body, $variables, $only, $token->getLine(), $this->getTag());
-    }
+@trigger_error(sprintf('Using the "Twig_TokenParser_With" class is deprecated since Twig version 2.7, use "Twig\TokenParser\WithTokenParser" instead.'), E_USER_DEPRECATED);
 
-    public function decideWithEnd(Twig_Token $token)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\WithTokenParser" instead */
+    class Twig_TokenParser_With extends WithTokenParser
     {
-        return $token->test('endwith');
-    }
-
-    public function getTag()
-    {
-        return 'with';
     }
 }
-
-class_alias('Twig_TokenParser_With', 'Twig\TokenParser\WithTokenParser', false);
diff --git a/vendor/twig/twig/lib/Twig/TokenParserBroker.php b/vendor/twig/twig/lib/Twig/TokenParserBroker.php
deleted file mode 100644
index a6401350..00000000
--- a/vendor/twig/twig/lib/Twig/TokenParserBroker.php
+++ /dev/null
@@ -1,120 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Default implementation of a token parser broker.
- *
- * @author Arnaud Le Blanc <arnaud.lb@xxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-class Twig_TokenParserBroker implements Twig_TokenParserBrokerInterface
-{
-    protected $parser;
-    protected $parsers = array();
-    protected $brokers = array();
-
-    /**
-     * @param array|Traversable $parsers                 A Traversable of Twig_TokenParserInterface instances
-     * @param array|Traversable $brokers                 A Traversable of Twig_TokenParserBrokerInterface instances
-     * @param bool              $triggerDeprecationError
-     */
-    public function __construct($parsers = array(), $brokers = array(), $triggerDeprecationError = true)
-    {
-        if ($triggerDeprecationError) {
-            @trigger_error('The '.__CLASS__.' class is deprecated since version 1.12 and will be removed in 2.0.', E_USER_DEPRECATED);
-        }
-
-        foreach ($parsers as $parser) {
-            if (!$parser instanceof Twig_TokenParserInterface) {
-                throw new LogicException('$parsers must a an array of Twig_TokenParserInterface.');
-            }
-            $this->parsers[$parser->getTag()] = $parser;
-        }
-        foreach ($brokers as $broker) {
-            if (!$broker instanceof Twig_TokenParserBrokerInterface) {
-                throw new LogicException('$brokers must a an array of Twig_TokenParserBrokerInterface.');
-            }
-            $this->brokers[] = $broker;
-        }
-    }
-
-    public function addTokenParser(Twig_TokenParserInterface $parser)
-    {
-        $this->parsers[$parser->getTag()] = $parser;
-    }
-
-    public function removeTokenParser(Twig_TokenParserInterface $parser)
-    {
-        $name = $parser->getTag();
-        if (isset($this->parsers[$name]) && $parser === $this->parsers[$name]) {
-            unset($this->parsers[$name]);
-        }
-    }
-
-    public function addTokenParserBroker(Twig_TokenParserBroker $broker)
-    {
-        $this->brokers[] = $broker;
-    }
-
-    public function removeTokenParserBroker(Twig_TokenParserBroker $broker)
-    {
-        if (false !== $pos = array_search($broker, $this->brokers)) {
-            unset($this->brokers[$pos]);
-        }
-    }
-
-    /**
-     * Gets a suitable TokenParser for a tag.
-     *
-     * First looks in parsers, then in brokers.
-     *
-     * @param string $tag A tag name
-     *
-     * @return null|Twig_TokenParserInterface A Twig_TokenParserInterface or null if no suitable TokenParser was found
-     */
-    public function getTokenParser($tag)
-    {
-        if (isset($this->parsers[$tag])) {
-            return $this->parsers[$tag];
-        }
-        $broker = end($this->brokers);
-        while (false !== $broker) {
-            $parser = $broker->getTokenParser($tag);
-            if (null !== $parser) {
-                return $parser;
-            }
-            $broker = prev($this->brokers);
-        }
-    }
-
-    public function getParsers()
-    {
-        return $this->parsers;
-    }
-
-    public function getParser()
-    {
-        return $this->parser;
-    }
-
-    public function setParser(Twig_ParserInterface $parser)
-    {
-        $this->parser = $parser;
-        foreach ($this->parsers as $tokenParser) {
-            $tokenParser->setParser($parser);
-        }
-        foreach ($this->brokers as $broker) {
-            $broker->setParser($parser);
-        }
-    }
-}
diff --git a/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php b/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php
deleted file mode 100644
index 6c93f5ea..00000000
--- a/vendor/twig/twig/lib/Twig/TokenParserBrokerInterface.php
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Arnaud Le Blanc
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-/**
- * Interface implemented by token parser brokers.
- *
- * Token parser brokers allows to implement custom logic in the process of resolving a token parser for a given tag name.
- *
- * @author Arnaud Le Blanc <arnaud.lb@xxxxxxxxx>
- *
- * @deprecated since 1.12 (to be removed in 2.0)
- */
-interface Twig_TokenParserBrokerInterface
-{
-    /**
-     * Gets a TokenParser suitable for a tag.
-     *
-     * @param string $tag A tag name
-     *
-     * @return Twig_TokenParserInterface|null A Twig_TokenParserInterface or null if no suitable TokenParser was found
-     */
-    public function getTokenParser($tag);
-
-    /**
-     * Calls Twig_TokenParserInterface::setParser on all parsers the implementation knows of.
-     */
-    public function setParser(Twig_ParserInterface $parser);
-
-    /**
-     * Gets the Twig_ParserInterface.
-     *
-     * @return null|Twig_ParserInterface A Twig_ParserInterface instance or null
-     */
-    public function getParser();
-}
diff --git a/vendor/twig/twig/lib/Twig/TokenParserInterface.php b/vendor/twig/twig/lib/Twig/TokenParserInterface.php
index 14acc808..1ed1cadf 100644
--- a/vendor/twig/twig/lib/Twig/TokenParserInterface.php
+++ b/vendor/twig/twig/lib/Twig/TokenParserInterface.php
@@ -1,43 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenParser\TokenParserInterface;
 
-/**
- * Interface implemented by token parsers.
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-interface Twig_TokenParserInterface
-{
-    /**
-     * Sets the parser associated with this token parser.
-     */
-    public function setParser(Twig_Parser $parser);
+class_exists('Twig\TokenParser\TokenParserInterface');
 
-    /**
-     * Parses a token and returns a node.
-     *
-     * @return Twig_NodeInterface
-     *
-     * @throws Twig_Error_Syntax
-     */
-    public function parse(Twig_Token $token);
+@trigger_error(sprintf('Using the "Twig_TokenParserInterface" class is deprecated since Twig version 2.7, use "Twig\TokenParser\TokenParserInterface" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * Gets the tag name associated with this token parser.
-     *
-     * @return string The tag name
-     */
-    public function getTag();
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenParser\TokenParserInterface" instead */
+    class Twig_TokenParserInterface extends TokenParserInterface
+    {
+    }
 }
-
-class_alias('Twig_TokenParserInterface', 'Twig\TokenParser\TokenParserInterface', false);
-class_exists('Twig_Parser');
-class_exists('Twig_Token');
diff --git a/vendor/twig/twig/lib/Twig/TokenStream.php b/vendor/twig/twig/lib/Twig/TokenStream.php
index e1bd7ca1..0305fa03 100644
--- a/vendor/twig/twig/lib/Twig/TokenStream.php
+++ b/vendor/twig/twig/lib/Twig/TokenStream.php
@@ -1,196 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- * (c) Armin Ronacher
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\TokenStream;
 
-/**
- * Represents a token stream.
- *
- * @final
- *
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_TokenStream
-{
-    protected $tokens;
-    protected $current = 0;
-    protected $filename;
+class_exists('Twig\TokenStream');
 
-    private $source;
+@trigger_error(sprintf('Using the "Twig_TokenStream" class is deprecated since Twig version 2.7, use "Twig\TokenStream" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * @param array       $tokens An array of tokens
-     * @param string|null $name   The name of the template which tokens are associated with
-     * @param string|null $source The source code associated with the tokens
-     */
-    public function __construct(array $tokens, $name = null, $source = null)
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\TokenStream" instead */
+    class Twig_TokenStream extends TokenStream
     {
-        if (!$name instanceof Twig_Source) {
-            if (null !== $name || null !== $source) {
-                @trigger_error(sprintf('Passing a string as the $name argument of %s() is deprecated since version 1.27. Pass a Twig_Source instance instead.', __METHOD__), E_USER_DEPRECATED);
-            }
-            $this->source = new Twig_Source($source, $name);
-        } else {
-            $this->source = $name;
-        }
-
-        $this->tokens = $tokens;
-
-        // deprecated, not used anymore, to be removed in 2.0
-        $this->filename = $this->source->getName();
-    }
-
-    public function __toString()
-    {
-        return implode("\n", $this->tokens);
-    }
-
-    public function injectTokens(array $tokens)
-    {
-        $this->tokens = array_merge(array_slice($this->tokens, 0, $this->current), $tokens, array_slice($this->tokens, $this->current));
-    }
-
-    /**
-     * Sets the pointer to the next token and returns the old one.
-     *
-     * @return Twig_Token
-     */
-    public function next()
-    {
-        if (!isset($this->tokens[++$this->current])) {
-            throw new Twig_Error_Syntax('Unexpected end of template.', $this->tokens[$this->current - 1]->getLine(), $this->source);
-        }
-
-        return $this->tokens[$this->current - 1];
-    }
-
-    /**
-     * Tests a token, sets the pointer to the next one and returns it or throws a syntax error.
-     *
-     * @return Twig_Token|null The next token if the condition is true, null otherwise
-     */
-    public function nextIf($primary, $secondary = null)
-    {
-        if ($this->tokens[$this->current]->test($primary, $secondary)) {
-            return $this->next();
-        }
-    }
-
-    /**
-     * Tests a token and returns it or throws a syntax error.
-     *
-     * @return Twig_Token
-     */
-    public function expect($type, $value = null, $message = null)
-    {
-        $token = $this->tokens[$this->current];
-        if (!$token->test($type, $value)) {
-            $line = $token->getLine();
-            throw new Twig_Error_Syntax(sprintf('%sUnexpected token "%s" of value "%s" ("%s" expected%s).',
-                $message ? $message.'. ' : '',
-                Twig_Token::typeToEnglish($token->getType()), $token->getValue(),
-                Twig_Token::typeToEnglish($type), $value ? sprintf(' with value "%s"', $value) : ''),
-                $line,
-                $this->source
-            );
-        }
-        $this->next();
-
-        return $token;
-    }
-
-    /**
-     * Looks at the next token.
-     *
-     * @param int $number
-     *
-     * @return Twig_Token
-     */
-    public function look($number = 1)
-    {
-        if (!isset($this->tokens[$this->current + $number])) {
-            throw new Twig_Error_Syntax('Unexpected end of template.', $this->tokens[$this->current + $number - 1]->getLine(), $this->source);
-        }
-
-        return $this->tokens[$this->current + $number];
-    }
-
-    /**
-     * Tests the current token.
-     *
-     * @return bool
-     */
-    public function test($primary, $secondary = null)
-    {
-        return $this->tokens[$this->current]->test($primary, $secondary);
-    }
-
-    /**
-     * Checks if end of stream was reached.
-     *
-     * @return bool
-     */
-    public function isEOF()
-    {
-        return $this->tokens[$this->current]->getType() === Twig_Token::EOF_TYPE;
-    }
-
-    /**
-     * @return Twig_Token
-     */
-    public function getCurrent()
-    {
-        return $this->tokens[$this->current];
-    }
-
-    /**
-     * Gets the name associated with this stream (null if not defined).
-     *
-     * @return string|null
-     *
-     * @deprecated since 1.27 (to be removed in 2.0)
-     */
-    public function getFilename()
-    {
-        @trigger_error(sprintf('The %s() method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
-        return $this->source->getName();
-    }
-
-    /**
-     * Gets the source code associated with this stream.
-     *
-     * @return string
-     *
-     * @internal Don't use this as it might be empty depending on the environment configuration
-     *
-     * @deprecated since 1.27 (to be removed in 2.0)
-     */
-    public function getSource()
-    {
-        @trigger_error(sprintf('The %s() method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', __METHOD__), E_USER_DEPRECATED);
-
-        return $this->source->getCode();
-    }
-
-    /**
-     * Gets the source associated with this stream.
-     *
-     * @return Twig_Source
-     *
-     * @internal
-     */
-    public function getSourceContext()
-    {
-        return $this->source;
     }
 }
-
-class_alias('Twig_TokenStream', 'Twig\TokenStream', false);
diff --git a/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php b/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php
index c7bf53be..5b3f55ed 100644
--- a/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php
+++ b/vendor/twig/twig/lib/Twig/Util/DeprecationCollector.php
@@ -1,86 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Util\DeprecationCollector;
 
-/**
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- *
- * @final
- */
-class Twig_Util_DeprecationCollector
-{
-    private $twig;
-    private $deprecations;
+class_exists('Twig\Util\DeprecationCollector');
 
-    public function __construct(Twig_Environment $twig)
-    {
-        $this->twig = $twig;
-    }
+@trigger_error(sprintf('Using the "Twig_Util_DeprecationCollector" class is deprecated since Twig version 2.7, use "Twig\Util\DeprecationCollector" instead.'), E_USER_DEPRECATED);
 
-    /**
-     * Returns deprecations for templates contained in a directory.
-     *
-     * @param string $dir A directory where templates are stored
-     * @param string $ext Limit the loaded templates by extension
-     *
-     * @return array An array of deprecations
-     */
-    public function collectDir($dir, $ext = '.twig')
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Util\DeprecationCollector" instead */
+    class Twig_Util_DeprecationCollector extends DeprecationCollector
     {
-        $iterator = new RegexIterator(
-            new RecursiveIteratorIterator(
-                new RecursiveDirectoryIterator($dir), RecursiveIteratorIterator::LEAVES_ONLY
-            ), '{'.preg_quote($ext).'$}'
-        );
-
-        return $this->collect(new Twig_Util_TemplateDirIterator($iterator));
-    }
-
-    /**
-     * Returns deprecations for passed templates.
-     *
-     * @param Traversable $iterator An iterator of templates (where keys are template names and values the contents of the template)
-     *
-     * @return array An array of deprecations
-     */
-    public function collect(Traversable $iterator)
-    {
-        $this->deprecations = array();
-
-        set_error_handler(array($this, 'errorHandler'));
-
-        foreach ($iterator as $name => $contents) {
-            try {
-                $this->twig->parse($this->twig->tokenize(new Twig_Source($contents, $name)));
-            } catch (Twig_Error_Syntax $e) {
-                // ignore templates containing syntax errors
-            }
-        }
-
-        restore_error_handler();
-
-        $deprecations = $this->deprecations;
-        $this->deprecations = array();
-
-        return $deprecations;
-    }
-
-    /**
-     * @internal
-     */
-    public function errorHandler($type, $msg)
-    {
-        if (E_USER_DEPRECATED === $type) {
-            $this->deprecations[] = $msg;
-        }
     }
 }
-
-class_alias('Twig_Util_DeprecationCollector', 'Twig\Util\DeprecationCollector', false);
diff --git a/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php b/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php
index c8682335..e84b9d81 100644
--- a/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php
+++ b/vendor/twig/twig/lib/Twig/Util/TemplateDirIterator.php
@@ -1,28 +1,14 @@
 <?php
 
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
+use Twig\Util\TemplateDirIterator;
 
-/**
- * @author Fabien Potencier <fabien@xxxxxxxxxxx>
- */
-class Twig_Util_TemplateDirIterator extends IteratorIterator
-{
-    public function current()
-    {
-        return file_get_contents(parent::current());
-    }
+class_exists('Twig\Util\TemplateDirIterator');
 
-    public function key()
+@trigger_error(sprintf('Using the "Twig_Util_TemplateDirIterator" class is deprecated since Twig version 2.7, use "Twig\Util\TemplateDirIterator" instead.'), E_USER_DEPRECATED);
+
+if (\false) {
+    /** @deprecated since Twig 2.7, use "Twig\Util\TemplateDirIterator" instead */
+    class Twig_Util_TemplateDirIterator extends TemplateDirIterator
     {
-        return (string) parent::key();
     }
 }
-
-class_alias('Twig_Util_TemplateDirIterator', 'Twig\Util\TemplateDirIterator', false);
diff --git a/vendor/twig/twig/phpunit.xml.dist b/vendor/twig/twig/phpunit.xml.dist
index ce773278..c35257f5 100644
--- a/vendor/twig/twig/phpunit.xml.dist
+++ b/vendor/twig/twig/phpunit.xml.dist
@@ -8,7 +8,6 @@
          convertWarningsToExceptions="true"
          processIsolation="false"
          stopOnFailure="false"
-         syntaxCheck="false"
          bootstrap="vendor/autoload.php"
 >
   <testsuites>
@@ -19,6 +18,7 @@
 
   <php>
     <ini name="error_reporting" value="-1" />
+    <ini name="xdebug.overload_var_dump" value="0" />
   </php>
 
   <listeners>
@@ -27,7 +27,7 @@
 
   <filter>
     <whitelist>
-      <directory suffix=".php">./lib/Twig/</directory>
+      <directory suffix=".php">./src/</directory>
     </whitelist>
   </filter>
 </phpunit>
diff --git a/vendor/twig/twig/src/Cache/CacheInterface.php b/vendor/twig/twig/src/Cache/CacheInterface.php
index 2e35e3ba..1c8bb1ec 100644
--- a/vendor/twig/twig/src/Cache/CacheInterface.php
+++ b/vendor/twig/twig/src/Cache/CacheInterface.php
@@ -1,11 +1,60 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Cache;
 
-class_exists('Twig_CacheInterface');
+/**
+ * Interface implemented by cache classes.
+ *
+ * It is highly recommended to always store templates on the filesystem to
+ * benefit from the PHP opcode cache. This interface is mostly useful if you
+ * need to implement a custom strategy for storing templates on the filesystem.
+ *
+ * @author Andrew Tch <andrew@xxxxxxx>
+ */
+interface CacheInterface
+{
+    /**
+     * Generates a cache key for the given template class name.
+     *
+     * @param string $name      The template name
+     * @param string $className The template class name
+     *
+     * @return string
+     */
+    public function generateKey($name, $className);
+
+    /**
+     * Writes the compiled template to cache.
+     *
+     * @param string $key     The cache key
+     * @param string $content The template representation as a PHP class
+     */
+    public function write($key, $content);
 
-if (\false) {
-    interface CacheInterface extends \Twig_CacheInterface
-    {
-    }
+    /**
+     * Loads a template from the cache.
+     *
+     * @param string $key The cache key
+     */
+    public function load($key);
+
+    /**
+     * Returns the modification timestamp of a key.
+     *
+     * @param string $key The cache key
+     *
+     * @return int
+     */
+    public function getTimestamp($key);
 }
+
+class_alias('Twig\Cache\CacheInterface', 'Twig_CacheInterface');
diff --git a/vendor/twig/twig/src/Cache/FilesystemCache.php b/vendor/twig/twig/src/Cache/FilesystemCache.php
index 9882c988..7e228799 100644
--- a/vendor/twig/twig/src/Cache/FilesystemCache.php
+++ b/vendor/twig/twig/src/Cache/FilesystemCache.php
@@ -1,11 +1,93 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Cache;
 
-class_exists('Twig_Cache_Filesystem');
+/**
+ * Implements a cache on the filesystem.
+ *
+ * @author Andrew Tch <andrew@xxxxxxx>
+ */
+class FilesystemCache implements CacheInterface
+{
+    const FORCE_BYTECODE_INVALIDATION = 1;
+
+    private $directory;
+    private $options;
+
+    /**
+     * @param string $directory The root cache directory
+     * @param int    $options   A set of options
+     */
+    public function __construct($directory, $options = 0)
+    {
+        $this->directory = rtrim($directory, '\/').'/';
+        $this->options = $options;
+    }
 
-if (\false) {
-    class FilesystemCache extends \Twig_Cache_Filesystem
+    public function generateKey($name, $className)
     {
+        $hash = hash('sha256', $className);
+
+        return $this->directory.$hash[0].$hash[1].'/'.$hash.'.php';
+    }
+
+    public function load($key)
+    {
+        if (file_exists($key)) {
+            @include_once $key;
+        }
+    }
+
+    public function write($key, $content)
+    {
+        $dir = \dirname($key);
+        if (!is_dir($dir)) {
+            if (false === @mkdir($dir, 0777, true)) {
+                clearstatcache(true, $dir);
+                if (!is_dir($dir)) {
+                    throw new \RuntimeException(sprintf('Unable to create the cache directory (%s).', $dir));
+                }
+            }
+        } elseif (!is_writable($dir)) {
+            throw new \RuntimeException(sprintf('Unable to write in the cache directory (%s).', $dir));
+        }
+
+        $tmpFile = tempnam($dir, basename($key));
+        if (false !== @file_put_contents($tmpFile, $content) && @rename($tmpFile, $key)) {
+            @chmod($key, 0666 & ~umask());
+
+            if (self::FORCE_BYTECODE_INVALIDATION == ($this->options & self::FORCE_BYTECODE_INVALIDATION)) {
+                // Compile cached file into bytecode cache
+                if (\function_exists('opcache_invalidate')) {
+                    opcache_invalidate($key, true);
+                } elseif (\function_exists('apc_compile_file')) {
+                    apc_compile_file($key);
+                }
+            }
+
+            return;
+        }
+
+        throw new \RuntimeException(sprintf('Failed to write cache file "%s".', $key));
+    }
+
+    public function getTimestamp($key)
+    {
+        if (!file_exists($key)) {
+            return 0;
+        }
+
+        return (int) @filemtime($key);
     }
 }
+
+class_alias('Twig\Cache\FilesystemCache', 'Twig_Cache_Filesystem');
diff --git a/vendor/twig/twig/src/Cache/NullCache.php b/vendor/twig/twig/src/Cache/NullCache.php
index c3d40555..02c868cd 100644
--- a/vendor/twig/twig/src/Cache/NullCache.php
+++ b/vendor/twig/twig/src/Cache/NullCache.php
@@ -1,11 +1,40 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Cache;
 
-class_exists('Twig_Cache_Null');
+/**
+ * Implements a no-cache strategy.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class NullCache implements CacheInterface
+{
+    public function generateKey($name, $className)
+    {
+        return '';
+    }
+
+    public function write($key, $content)
+    {
+    }
+
+    public function load($key)
+    {
+    }
 
-if (\false) {
-    class NullCache extends \Twig_Cache_Null
+    public function getTimestamp($key)
     {
+        return 0;
     }
 }
+
+class_alias('Twig\Cache\NullCache', 'Twig_Cache_Null');
diff --git a/vendor/twig/twig/src/Compiler.php b/vendor/twig/twig/src/Compiler.php
index 6025c4df..56933e20 100644
--- a/vendor/twig/twig/src/Compiler.php
+++ b/vendor/twig/twig/src/Compiler.php
@@ -1,11 +1,245 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_Compiler');
+use Twig\Node\Node;
+
+/**
+ * Compiles a node to PHP code.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class Compiler
+{
+    private $lastLine;
+    private $source;
+    private $indentation;
+    private $env;
+    private $debugInfo = [];
+    private $sourceOffset;
+    private $sourceLine;
+    private $varNameSalt = 0;
+
+    public function __construct(Environment $env)
+    {
+        $this->env = $env;
+    }
+
+    /**
+     * Returns the environment instance related to this compiler.
+     *
+     * @return Environment
+     */
+    public function getEnvironment()
+    {
+        return $this->env;
+    }
+
+    /**
+     * Gets the current PHP code after compilation.
+     *
+     * @return string The PHP code
+     */
+    public function getSource()
+    {
+        return $this->source;
+    }
+
+    /**
+     * Compiles a node.
+     *
+     * @param int $indentation The current indentation
+     *
+     * @return $this
+     */
+    public function compile(Node $node, $indentation = 0)
+    {
+        $this->lastLine = null;
+        $this->source = '';
+        $this->debugInfo = [];
+        $this->sourceOffset = 0;
+        // source code starts at 1 (as we then increment it when we encounter new lines)
+        $this->sourceLine = 1;
+        $this->indentation = $indentation;
+        $this->varNameSalt = 0;
+
+        $node->compile($this);
+
+        return $this;
+    }
+
+    public function subcompile(Node $node, $raw = true)
+    {
+        if (false === $raw) {
+            $this->source .= str_repeat(' ', $this->indentation * 4);
+        }
+
+        $node->compile($this);
 
-if (\false) {
-    class Compiler extends \Twig_Compiler
+        return $this;
+    }
+
+    /**
+     * Adds a raw string to the compiled code.
+     *
+     * @param string $string The string
+     *
+     * @return $this
+     */
+    public function raw($string)
     {
+        $this->source .= $string;
+
+        return $this;
+    }
+
+    /**
+     * Writes a string to the compiled code by adding indentation.
+     *
+     * @return $this
+     */
+    public function write(...$strings)
+    {
+        foreach ($strings as $string) {
+            $this->source .= str_repeat(' ', $this->indentation * 4).$string;
+        }
+
+        return $this;
+    }
+
+    /**
+     * Adds a quoted string to the compiled code.
+     *
+     * @param string $value The string
+     *
+     * @return $this
+     */
+    public function string($value)
+    {
+        $this->source .= sprintf('"%s"', addcslashes($value, "\0\t\"\$\\"));
+
+        return $this;
+    }
+
+    /**
+     * Returns a PHP representation of a given value.
+     *
+     * @param mixed $value The value to convert
+     *
+     * @return $this
+     */
+    public function repr($value)
+    {
+        if (\is_int($value) || \is_float($value)) {
+            if (false !== $locale = setlocale(LC_NUMERIC, '0')) {
+                setlocale(LC_NUMERIC, 'C');
+            }
+
+            $this->raw(var_export($value, true));
+
+            if (false !== $locale) {
+                setlocale(LC_NUMERIC, $locale);
+            }
+        } elseif (null === $value) {
+            $this->raw('null');
+        } elseif (\is_bool($value)) {
+            $this->raw($value ? 'true' : 'false');
+        } elseif (\is_array($value)) {
+            $this->raw('array(');
+            $first = true;
+            foreach ($value as $key => $v) {
+                if (!$first) {
+                    $this->raw(', ');
+                }
+                $first = false;
+                $this->repr($key);
+                $this->raw(' => ');
+                $this->repr($v);
+            }
+            $this->raw(')');
+        } else {
+            $this->string($value);
+        }
+
+        return $this;
+    }
+
+    /**
+     * Adds debugging information.
+     *
+     * @return $this
+     */
+    public function addDebugInfo(Node $node)
+    {
+        if ($node->getTemplateLine() != $this->lastLine) {
+            $this->write(sprintf("// line %d\n", $node->getTemplateLine()));
+
+            $this->sourceLine += substr_count($this->source, "\n", $this->sourceOffset);
+            $this->sourceOffset = \strlen($this->source);
+            $this->debugInfo[$this->sourceLine] = $node->getTemplateLine();
+
+            $this->lastLine = $node->getTemplateLine();
+        }
+
+        return $this;
+    }
+
+    public function getDebugInfo()
+    {
+        ksort($this->debugInfo);
+
+        return $this->debugInfo;
+    }
+
+    /**
+     * Indents the generated code.
+     *
+     * @param int $step The number of indentation to add
+     *
+     * @return $this
+     */
+    public function indent($step = 1)
+    {
+        $this->indentation += $step;
+
+        return $this;
+    }
+
+    /**
+     * Outdents the generated code.
+     *
+     * @param int $step The number of indentation to remove
+     *
+     * @return $this
+     *
+     * @throws \LogicException When trying to outdent too much so the indentation would become negative
+     */
+    public function outdent($step = 1)
+    {
+        // can't outdent by more steps than the current indentation level
+        if ($this->indentation < $step) {
+            throw new \LogicException('Unable to call outdent() as the indentation would become negative.');
+        }
+
+        $this->indentation -= $step;
+
+        return $this;
+    }
+
+    public function getVarName()
+    {
+        return sprintf('__internal_%s', hash('sha256', __METHOD__.$this->varNameSalt++));
     }
 }
+
+class_alias('Twig\Compiler', 'Twig_Compiler');
diff --git a/vendor/twig/twig/src/Environment.php b/vendor/twig/twig/src/Environment.php
index e0f9edcd..d0061d1b 100644
--- a/vendor/twig/twig/src/Environment.php
+++ b/vendor/twig/twig/src/Environment.php
@@ -1,11 +1,995 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_Environment');
+use Twig\Cache\CacheInterface;
+use Twig\Cache\FilesystemCache;
+use Twig\Cache\NullCache;
+use Twig\Error\Error;
+use Twig\Error\LoaderError;
+use Twig\Error\RuntimeError;
+use Twig\Error\SyntaxError;
+use Twig\Extension\CoreExtension;
+use Twig\Extension\EscaperExtension;
+use Twig\Extension\ExtensionInterface;
+use Twig\Extension\OptimizerExtension;
+use Twig\Loader\ArrayLoader;
+use Twig\Loader\ChainLoader;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\ModuleNode;
+use Twig\Node\Node;
+use Twig\NodeVisitor\NodeVisitorInterface;
+use Twig\RuntimeLoader\RuntimeLoaderInterface;
+use Twig\TokenParser\TokenParserInterface;
+
+/**
+ * Stores the Twig configuration.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class Environment
+{
+    const VERSION = '2.11.3';
+    const VERSION_ID = 21103;
+    const MAJOR_VERSION = 2;
+    const MINOR_VERSION = 11;
+    const RELEASE_VERSION = 3;
+    const EXTRA_VERSION = '';
+
+    private $charset;
+    private $loader;
+    private $debug;
+    private $autoReload;
+    private $cache;
+    private $lexer;
+    private $parser;
+    private $compiler;
+    private $baseTemplateClass;
+    private $globals = [];
+    private $resolvedGlobals;
+    private $loadedTemplates;
+    private $strictVariables;
+    private $templateClassPrefix = '__TwigTemplate_';
+    private $originalCache;
+    private $extensionSet;
+    private $runtimeLoaders = [];
+    private $runtimes = [];
+    private $optionsHash;
+
+    /**
+     * Constructor.
+     *
+     * Available options:
+     *
+     *  * debug: When set to true, it automatically set "auto_reload" to true as
+     *           well (default to false).
+     *
+     *  * charset: The charset used by the templates (default to UTF-8).
+     *
+     *  * base_template_class: The base template class to use for generated
+     *                         templates (default to \Twig\Template).
+     *
+     *  * cache: An absolute path where to store the compiled templates,
+     *           a \Twig\Cache\CacheInterface implementation,
+     *           or false to disable compilation cache (default).
+     *
+     *  * auto_reload: Whether to reload the template if the original source changed.
+     *                 If you don't provide the auto_reload option, it will be
+     *                 determined automatically based on the debug value.
+     *
+     *  * strict_variables: Whether to ignore invalid variables in templates
+     *                      (default to false).
+     *
+     *  * autoescape: Whether to enable auto-escaping (default to html):
+     *                  * false: disable auto-escaping
+     *                  * html, js: set the autoescaping to one of the supported strategies
+     *                  * name: set the autoescaping strategy based on the template name extension
+     *                  * PHP callback: a PHP callback that returns an escaping strategy based on the template "name"
+     *
+     *  * optimizations: A flag that indicates which optimizations to apply
+     *                   (default to -1 which means that all optimizations are enabled;
+     *                   set it to 0 to disable).
+     */
+    public function __construct(LoaderInterface $loader, $options = [])
+    {
+        $this->setLoader($loader);
+
+        $options = array_merge([
+            'debug' => false,
+            'charset' => 'UTF-8',
+            'base_template_class' => Template::class,
+            'strict_variables' => false,
+            'autoescape' => 'html',
+            'cache' => false,
+            'auto_reload' => null,
+            'optimizations' => -1,
+        ], $options);
+
+        $this->debug = (bool) $options['debug'];
+        $this->setCharset($options['charset']);
+        $this->baseTemplateClass = '\\'.ltrim($options['base_template_class'], '\\');
+        if ('\\'.Template::class !== $this->baseTemplateClass && '\Twig_Template' !== $this->baseTemplateClass) {
+            @trigger_error('The "base_template_class" option on '.__CLASS__.' is deprecated since Twig 2.7.0.', E_USER_DEPRECATED);
+        }
+        $this->autoReload = null === $options['auto_reload'] ? $this->debug : (bool) $options['auto_reload'];
+        $this->strictVariables = (bool) $options['strict_variables'];
+        $this->setCache($options['cache']);
+        $this->extensionSet = new ExtensionSet();
+
+        $this->addExtension(new CoreExtension());
+        $this->addExtension(new EscaperExtension($options['autoescape']));
+        $this->addExtension(new OptimizerExtension($options['optimizations']));
+    }
+
+    /**
+     * Gets the base template class for compiled templates.
+     *
+     * @return string The base template class name
+     */
+    public function getBaseTemplateClass()
+    {
+        if (1 > \func_num_args() || \func_get_arg(0)) {
+            @trigger_error('The '.__METHOD__.' is deprecated since Twig 2.7.0.', E_USER_DEPRECATED);
+        }
+
+        return $this->baseTemplateClass;
+    }
+
+    /**
+     * Sets the base template class for compiled templates.
+     *
+     * @param string $class The base template class name
+     */
+    public function setBaseTemplateClass($class)
+    {
+        @trigger_error('The '.__METHOD__.' is deprecated since Twig 2.7.0.', E_USER_DEPRECATED);
+
+        $this->baseTemplateClass = $class;
+        $this->updateOptionsHash();
+    }
+
+    /**
+     * Enables debugging mode.
+     */
+    public function enableDebug()
+    {
+        $this->debug = true;
+        $this->updateOptionsHash();
+    }
+
+    /**
+     * Disables debugging mode.
+     */
+    public function disableDebug()
+    {
+        $this->debug = false;
+        $this->updateOptionsHash();
+    }
+
+    /**
+     * Checks if debug mode is enabled.
+     *
+     * @return bool true if debug mode is enabled, false otherwise
+     */
+    public function isDebug()
+    {
+        return $this->debug;
+    }
+
+    /**
+     * Enables the auto_reload option.
+     */
+    public function enableAutoReload()
+    {
+        $this->autoReload = true;
+    }
+
+    /**
+     * Disables the auto_reload option.
+     */
+    public function disableAutoReload()
+    {
+        $this->autoReload = false;
+    }
+
+    /**
+     * Checks if the auto_reload option is enabled.
+     *
+     * @return bool true if auto_reload is enabled, false otherwise
+     */
+    public function isAutoReload()
+    {
+        return $this->autoReload;
+    }
+
+    /**
+     * Enables the strict_variables option.
+     */
+    public function enableStrictVariables()
+    {
+        $this->strictVariables = true;
+        $this->updateOptionsHash();
+    }
+
+    /**
+     * Disables the strict_variables option.
+     */
+    public function disableStrictVariables()
+    {
+        $this->strictVariables = false;
+        $this->updateOptionsHash();
+    }
+
+    /**
+     * Checks if the strict_variables option is enabled.
+     *
+     * @return bool true if strict_variables is enabled, false otherwise
+     */
+    public function isStrictVariables()
+    {
+        return $this->strictVariables;
+    }
+
+    /**
+     * Gets the current cache implementation.
+     *
+     * @param bool $original Whether to return the original cache option or the real cache instance
+     *
+     * @return CacheInterface|string|false A Twig\Cache\CacheInterface implementation,
+     *                                     an absolute path to the compiled templates,
+     *                                     or false to disable cache
+     */
+    public function getCache($original = true)
+    {
+        return $original ? $this->originalCache : $this->cache;
+    }
+
+    /**
+     * Sets the current cache implementation.
+     *
+     * @param CacheInterface|string|false $cache A Twig\Cache\CacheInterface implementation,
+     *                                           an absolute path to the compiled templates,
+     *                                           or false to disable cache
+     */
+    public function setCache($cache)
+    {
+        if (\is_string($cache)) {
+            $this->originalCache = $cache;
+            $this->cache = new FilesystemCache($cache);
+        } elseif (false === $cache) {
+            $this->originalCache = $cache;
+            $this->cache = new NullCache();
+        } elseif ($cache instanceof CacheInterface) {
+            $this->originalCache = $this->cache = $cache;
+        } else {
+            throw new \LogicException(sprintf('Cache can only be a string, false, or a \Twig\Cache\CacheInterface implementation.'));
+        }
+    }
+
+    /**
+     * Gets the template class associated with the given string.
+     *
+     * The generated template class is based on the following parameters:
+     *
+     *  * The cache key for the given template;
+     *  * The currently enabled extensions;
+     *  * Whether the Twig C extension is available or not;
+     *  * PHP version;
+     *  * Twig version;
+     *  * Options with what environment was created.
+     *
+     * @param string   $name  The name for which to calculate the template class name
+     * @param int|null $index The index if it is an embedded template
+     *
+     * @return string The template class name
+     *
+     * @internal
+     */
+    public function getTemplateClass($name, $index = null)
+    {
+        $key = $this->getLoader()->getCacheKey($name).$this->optionsHash;
+
+        return $this->templateClassPrefix.hash('sha256', $key).(null === $index ? '' : '___'.$index);
+    }
+
+    /**
+     * Renders a template.
+     *
+     * @param string|TemplateWrapper $name    The template name
+     * @param array                  $context An array of parameters to pass to the template
+     *
+     * @return string The rendered template
+     *
+     * @throws LoaderError  When the template cannot be found
+     * @throws SyntaxError  When an error occurred during compilation
+     * @throws RuntimeError When an error occurred during rendering
+     */
+    public function render($name, array $context = [])
+    {
+        return $this->load($name)->render($context);
+    }
+
+    /**
+     * Displays a template.
+     *
+     * @param string|TemplateWrapper $name    The template name
+     * @param array                  $context An array of parameters to pass to the template
+     *
+     * @throws LoaderError  When the template cannot be found
+     * @throws SyntaxError  When an error occurred during compilation
+     * @throws RuntimeError When an error occurred during rendering
+     */
+    public function display($name, array $context = [])
+    {
+        $this->load($name)->display($context);
+    }
+
+    /**
+     * Loads a template.
+     *
+     * @param string|TemplateWrapper $name The template name
+     *
+     * @throws LoaderError  When the template cannot be found
+     * @throws RuntimeError When a previously generated cache is corrupted
+     * @throws SyntaxError  When an error occurred during compilation
+     *
+     * @return TemplateWrapper
+     */
+    public function load($name)
+    {
+        if ($name instanceof TemplateWrapper) {
+            return $name;
+        }
+
+        if ($name instanceof Template) {
+            @trigger_error('Passing a \Twig\Template instance to '.__METHOD__.' is deprecated since Twig 2.7.0, use \Twig\TemplateWrapper instead.', E_USER_DEPRECATED);
+
+            return new TemplateWrapper($this, $name);
+        }
+
+        return new TemplateWrapper($this, $this->loadTemplate($name));
+    }
+
+    /**
+     * Loads a template internal representation.
+     *
+     * This method is for internal use only and should never be called
+     * directly.
+     *
+     * @param string $name  The template name
+     * @param int    $index The index if it is an embedded template
+     *
+     * @return Template A template instance representing the given template name
+     *
+     * @throws LoaderError  When the template cannot be found
+     * @throws RuntimeError When a previously generated cache is corrupted
+     * @throws SyntaxError  When an error occurred during compilation
+     *
+     * @internal
+     */
+    public function loadTemplate($name, $index = null)
+    {
+        return $this->loadClass($this->getTemplateClass($name), $name, $index);
+    }
+
+    /**
+     * @internal
+     */
+    public function loadClass($cls, $name, $index = null)
+    {
+        $mainCls = $cls;
+        if (null !== $index) {
+            $cls .= '___'.$index;
+        }
+
+        if (isset($this->loadedTemplates[$cls])) {
+            return $this->loadedTemplates[$cls];
+        }
+
+        if (!class_exists($cls, false)) {
+            $key = $this->cache->generateKey($name, $mainCls);
+
+            if (!$this->isAutoReload() || $this->isTemplateFresh($name, $this->cache->getTimestamp($key))) {
+                $this->cache->load($key);
+            }
+
+            $source = null;
+            if (!class_exists($cls, false)) {
+                $source = $this->getLoader()->getSourceContext($name);
+                $content = $this->compileSource($source);
+                $this->cache->write($key, $content);
+                $this->cache->load($key);
+
+                if (!class_exists($mainCls, false)) {
+                    /* Last line of defense if either $this->bcWriteCacheFile was used,
+                     * $this->cache is implemented as a no-op or we have a race condition
+                     * where the cache was cleared between the above calls to write to and load from
+                     * the cache.
+                     */
+                    eval('?>'.$content);
+                }
+
+                if (!class_exists($cls, false)) {
+                    throw new RuntimeError(sprintf('Failed to load Twig template "%s", index "%s": cache might be corrupted.', $name, $index), -1, $source);
+                }
+            }
+        }
+
+        // to be removed in 3.0
+        $this->extensionSet->initRuntime($this);
+
+        return $this->loadedTemplates[$cls] = new $cls($this);
+    }
+
+    /**
+     * Creates a template from source.
+     *
+     * This method should not be used as a generic way to load templates.
+     *
+     * @param string $template The template name
+     * @param string $name     An optional name of the template to be used in error messages
+     *
+     * @return TemplateWrapper A template instance representing the given template name
+     *
+     * @throws LoaderError When the template cannot be found
+     * @throws SyntaxError When an error occurred during compilation
+     */
+    public function createTemplate($template, string $name = null)
+    {
+        $hash = hash('sha256', $template, false);
+        if (null !== $name) {
+            $name = sprintf('%s (string template %s)', $name, $hash);
+        } else {
+            $name = sprintf('__string_template__%s', $hash);
+        }
+
+        $loader = new ChainLoader([
+            new ArrayLoader([$name => $template]),
+            $current = $this->getLoader(),
+        ]);
+
+        $this->setLoader($loader);
+        try {
+            return new TemplateWrapper($this, $this->loadTemplate($name));
+        } finally {
+            $this->setLoader($current);
+        }
+    }
+
+    /**
+     * Returns true if the template is still fresh.
+     *
+     * Besides checking the loader for freshness information,
+     * this method also checks if the enabled extensions have
+     * not changed.
+     *
+     * @param string $name The template name
+     * @param int    $time The last modification time of the cached template
+     *
+     * @return bool true if the template is fresh, false otherwise
+     */
+    public function isTemplateFresh($name, $time)
+    {
+        return $this->extensionSet->getLastModified() <= $time && $this->getLoader()->isFresh($name, $time);
+    }
+
+    /**
+     * Tries to load a template consecutively from an array.
+     *
+     * Similar to load() but it also accepts instances of \Twig\Template and
+     * \Twig\TemplateWrapper, and an array of templates where each is tried to be loaded.
+     *
+     * @param string|TemplateWrapper|array $names A template or an array of templates to try consecutively
+     *
+     * @return TemplateWrapper|Template
+     *
+     * @throws LoaderError When none of the templates can be found
+     * @throws SyntaxError When an error occurred during compilation
+     */
+    public function resolveTemplate($names)
+    {
+        if (!\is_array($names)) {
+            $names = [$names];
+        }
+
+        foreach ($names as $name) {
+            if ($name instanceof Template) {
+                return $name;
+            }
+            if ($name instanceof TemplateWrapper) {
+                return $name;
+            }
+
+            try {
+                return $this->loadTemplate($name);
+            } catch (LoaderError $e) {
+                if (1 === \count($names)) {
+                    throw $e;
+                }
+            }
+        }
+
+        throw new LoaderError(sprintf('Unable to find one of the following templates: "%s".', implode('", "', $names)));
+    }
+
+    public function setLexer(Lexer $lexer)
+    {
+        $this->lexer = $lexer;
+    }
+
+    /**
+     * Tokenizes a source code.
+     *
+     * @return TokenStream
+     *
+     * @throws SyntaxError When the code is syntactically wrong
+     */
+    public function tokenize(Source $source)
+    {
+        if (null === $this->lexer) {
+            $this->lexer = new Lexer($this);
+        }
+
+        return $this->lexer->tokenize($source);
+    }
+
+    public function setParser(Parser $parser)
+    {
+        $this->parser = $parser;
+    }
+
+    /**
+     * Converts a token stream to a node tree.
+     *
+     * @return ModuleNode
+     *
+     * @throws SyntaxError When the token stream is syntactically or semantically wrong
+     */
+    public function parse(TokenStream $stream)
+    {
+        if (null === $this->parser) {
+            $this->parser = new Parser($this);
+        }
+
+        return $this->parser->parse($stream);
+    }
 
-if (\false) {
-    class Environment extends \Twig_Environment
+    public function setCompiler(Compiler $compiler)
     {
+        $this->compiler = $compiler;
+    }
+
+    /**
+     * Compiles a node and returns the PHP code.
+     *
+     * @return string The compiled PHP source code
+     */
+    public function compile(Node $node)
+    {
+        if (null === $this->compiler) {
+            $this->compiler = new Compiler($this);
+        }
+
+        return $this->compiler->compile($node)->getSource();
+    }
+
+    /**
+     * Compiles a template source code.
+     *
+     * @return string The compiled PHP source code
+     *
+     * @throws SyntaxError When there was an error during tokenizing, parsing or compiling
+     */
+    public function compileSource(Source $source)
+    {
+        try {
+            return $this->compile($this->parse($this->tokenize($source)));
+        } catch (Error $e) {
+            $e->setSourceContext($source);
+            throw $e;
+        } catch (\Exception $e) {
+            throw new SyntaxError(sprintf('An exception has been thrown during the compilation of a template ("%s").', $e->getMessage()), -1, $source, $e);
+        }
+    }
+
+    public function setLoader(LoaderInterface $loader)
+    {
+        $this->loader = $loader;
+    }
+
+    /**
+     * Gets the Loader instance.
+     *
+     * @return LoaderInterface
+     */
+    public function getLoader()
+    {
+        return $this->loader;
+    }
+
+    /**
+     * Sets the default template charset.
+     *
+     * @param string $charset The default charset
+     */
+    public function setCharset($charset)
+    {
+        if ('UTF8' === $charset = strtoupper($charset)) {
+            // iconv on Windows requires "UTF-8" instead of "UTF8"
+            $charset = 'UTF-8';
+        }
+
+        $this->charset = $charset;
+    }
+
+    /**
+     * Gets the default template charset.
+     *
+     * @return string The default charset
+     */
+    public function getCharset()
+    {
+        return $this->charset;
+    }
+
+    /**
+     * Returns true if the given extension is registered.
+     *
+     * @param string $class The extension class name
+     *
+     * @return bool Whether the extension is registered or not
+     */
+    public function hasExtension($class)
+    {
+        return $this->extensionSet->hasExtension($class);
+    }
+
+    /**
+     * Adds a runtime loader.
+     */
+    public function addRuntimeLoader(RuntimeLoaderInterface $loader)
+    {
+        $this->runtimeLoaders[] = $loader;
+    }
+
+    /**
+     * Gets an extension by class name.
+     *
+     * @param string $class The extension class name
+     *
+     * @return ExtensionInterface
+     */
+    public function getExtension($class)
+    {
+        return $this->extensionSet->getExtension($class);
+    }
+
+    /**
+     * Returns the runtime implementation of a Twig element (filter/function/test).
+     *
+     * @param string $class A runtime class name
+     *
+     * @return object The runtime implementation
+     *
+     * @throws RuntimeError When the template cannot be found
+     */
+    public function getRuntime($class)
+    {
+        if (isset($this->runtimes[$class])) {
+            return $this->runtimes[$class];
+        }
+
+        foreach ($this->runtimeLoaders as $loader) {
+            if (null !== $runtime = $loader->load($class)) {
+                return $this->runtimes[$class] = $runtime;
+            }
+        }
+
+        throw new RuntimeError(sprintf('Unable to load the "%s" runtime.', $class));
+    }
+
+    public function addExtension(ExtensionInterface $extension)
+    {
+        $this->extensionSet->addExtension($extension);
+        $this->updateOptionsHash();
+    }
+
+    /**
+     * Registers an array of extensions.
+     *
+     * @param array $extensions An array of extensions
+     */
+    public function setExtensions(array $extensions)
+    {
+        $this->extensionSet->setExtensions($extensions);
+        $this->updateOptionsHash();
+    }
+
+    /**
+     * Returns all registered extensions.
+     *
+     * @return ExtensionInterface[] An array of extensions (keys are for internal usage only and should not be relied on)
+     */
+    public function getExtensions()
+    {
+        return $this->extensionSet->getExtensions();
+    }
+
+    public function addTokenParser(TokenParserInterface $parser)
+    {
+        $this->extensionSet->addTokenParser($parser);
+    }
+
+    /**
+     * Gets the registered Token Parsers.
+     *
+     * @return TokenParserInterface[]
+     *
+     * @internal
+     */
+    public function getTokenParsers()
+    {
+        return $this->extensionSet->getTokenParsers();
+    }
+
+    /**
+     * Gets registered tags.
+     *
+     * @return TokenParserInterface[]
+     *
+     * @internal
+     */
+    public function getTags()
+    {
+        $tags = [];
+        foreach ($this->getTokenParsers() as $parser) {
+            $tags[$parser->getTag()] = $parser;
+        }
+
+        return $tags;
+    }
+
+    public function addNodeVisitor(NodeVisitorInterface $visitor)
+    {
+        $this->extensionSet->addNodeVisitor($visitor);
+    }
+
+    /**
+     * Gets the registered Node Visitors.
+     *
+     * @return NodeVisitorInterface[]
+     *
+     * @internal
+     */
+    public function getNodeVisitors()
+    {
+        return $this->extensionSet->getNodeVisitors();
+    }
+
+    public function addFilter(TwigFilter $filter)
+    {
+        $this->extensionSet->addFilter($filter);
+    }
+
+    /**
+     * Get a filter by name.
+     *
+     * Subclasses may override this method and load filters differently;
+     * so no list of filters is available.
+     *
+     * @param string $name The filter name
+     *
+     * @return TwigFilter|false
+     *
+     * @internal
+     */
+    public function getFilter($name)
+    {
+        return $this->extensionSet->getFilter($name);
+    }
+
+    public function registerUndefinedFilterCallback(callable $callable)
+    {
+        $this->extensionSet->registerUndefinedFilterCallback($callable);
+    }
+
+    /**
+     * Gets the registered Filters.
+     *
+     * Be warned that this method cannot return filters defined with registerUndefinedFilterCallback.
+     *
+     * @return TwigFilter[]
+     *
+     * @see registerUndefinedFilterCallback
+     *
+     * @internal
+     */
+    public function getFilters()
+    {
+        return $this->extensionSet->getFilters();
+    }
+
+    public function addTest(TwigTest $test)
+    {
+        $this->extensionSet->addTest($test);
+    }
+
+    /**
+     * Gets the registered Tests.
+     *
+     * @return TwigTest[]
+     *
+     * @internal
+     */
+    public function getTests()
+    {
+        return $this->extensionSet->getTests();
+    }
+
+    /**
+     * Gets a test by name.
+     *
+     * @param string $name The test name
+     *
+     * @return TwigTest|false
+     *
+     * @internal
+     */
+    public function getTest($name)
+    {
+        return $this->extensionSet->getTest($name);
+    }
+
+    public function addFunction(TwigFunction $function)
+    {
+        $this->extensionSet->addFunction($function);
+    }
+
+    /**
+     * Get a function by name.
+     *
+     * Subclasses may override this method and load functions differently;
+     * so no list of functions is available.
+     *
+     * @param string $name function name
+     *
+     * @return TwigFunction|false
+     *
+     * @internal
+     */
+    public function getFunction($name)
+    {
+        return $this->extensionSet->getFunction($name);
+    }
+
+    public function registerUndefinedFunctionCallback(callable $callable)
+    {
+        $this->extensionSet->registerUndefinedFunctionCallback($callable);
+    }
+
+    /**
+     * Gets registered functions.
+     *
+     * Be warned that this method cannot return functions defined with registerUndefinedFunctionCallback.
+     *
+     * @return TwigFunction[]
+     *
+     * @see registerUndefinedFunctionCallback
+     *
+     * @internal
+     */
+    public function getFunctions()
+    {
+        return $this->extensionSet->getFunctions();
+    }
+
+    /**
+     * Registers a Global.
+     *
+     * New globals can be added before compiling or rendering a template;
+     * but after, you can only update existing globals.
+     *
+     * @param string $name  The global name
+     * @param mixed  $value The global value
+     */
+    public function addGlobal($name, $value)
+    {
+        if ($this->extensionSet->isInitialized() && !\array_key_exists($name, $this->getGlobals())) {
+            throw new \LogicException(sprintf('Unable to add global "%s" as the runtime or the extensions have already been initialized.', $name));
+        }
+
+        if (null !== $this->resolvedGlobals) {
+            $this->resolvedGlobals[$name] = $value;
+        } else {
+            $this->globals[$name] = $value;
+        }
+    }
+
+    /**
+     * Gets the registered Globals.
+     *
+     * @return array An array of globals
+     *
+     * @internal
+     */
+    public function getGlobals()
+    {
+        if ($this->extensionSet->isInitialized()) {
+            if (null === $this->resolvedGlobals) {
+                $this->resolvedGlobals = array_merge($this->extensionSet->getGlobals(), $this->globals);
+            }
+
+            return $this->resolvedGlobals;
+        }
+
+        return array_merge($this->extensionSet->getGlobals(), $this->globals);
+    }
+
+    /**
+     * Merges a context with the defined globals.
+     *
+     * @param array $context An array representing the context
+     *
+     * @return array The context merged with the globals
+     */
+    public function mergeGlobals(array $context)
+    {
+        // we don't use array_merge as the context being generally
+        // bigger than globals, this code is faster.
+        foreach ($this->getGlobals() as $key => $value) {
+            if (!\array_key_exists($key, $context)) {
+                $context[$key] = $value;
+            }
+        }
+
+        return $context;
+    }
+
+    /**
+     * Gets the registered unary Operators.
+     *
+     * @return array An array of unary operators
+     *
+     * @internal
+     */
+    public function getUnaryOperators()
+    {
+        return $this->extensionSet->getUnaryOperators();
+    }
+
+    /**
+     * Gets the registered binary Operators.
+     *
+     * @return array An array of binary operators
+     *
+     * @internal
+     */
+    public function getBinaryOperators()
+    {
+        return $this->extensionSet->getBinaryOperators();
+    }
+
+    private function updateOptionsHash()
+    {
+        $this->optionsHash = implode(':', [
+            $this->extensionSet->getSignature(),
+            PHP_MAJOR_VERSION,
+            PHP_MINOR_VERSION,
+            self::VERSION,
+            (int) $this->debug,
+            $this->baseTemplateClass,
+            (int) $this->strictVariables,
+        ]);
     }
 }
+
+class_alias('Twig\Environment', 'Twig_Environment');
diff --git a/vendor/twig/twig/src/Error/Error.php b/vendor/twig/twig/src/Error/Error.php
index 52224d8a..a64cbcbc 100644
--- a/vendor/twig/twig/src/Error/Error.php
+++ b/vendor/twig/twig/src/Error/Error.php
@@ -1,11 +1,257 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Error;
 
-class_exists('Twig_Error');
+use Twig\Source;
+use Twig\Template;
+
+/**
+ * Twig base exception.
+ *
+ * This exception class and its children must only be used when
+ * an error occurs during the loading of a template, when a syntax error
+ * is detected in a template, or when rendering a template. Other
+ * errors must use regular PHP exception classes (like when the template
+ * cache directory is not writable for instance).
+ *
+ * To help debugging template issues, this class tracks the original template
+ * name and line where the error occurred.
+ *
+ * Whenever possible, you must set these information (original template name
+ * and line number) yourself by passing them to the constructor. If some or all
+ * these information are not available from where you throw the exception, then
+ * this class will guess them automatically (when the line number is set to -1
+ * and/or the name is set to null). As this is a costly operation, this
+ * can be disabled by passing false for both the name and the line number
+ * when creating a new instance of this class.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class Error extends \Exception
+{
+    private $lineno;
+    private $name;
+    private $rawMessage;
+    private $sourcePath;
+    private $sourceCode;
+
+    /**
+     * Constructor.
+     *
+     * Set the line number to -1 to enable its automatic guessing.
+     * Set the name to null to enable its automatic guessing.
+     *
+     * @param string             $message  The error message
+     * @param int                $lineno   The template line where the error occurred
+     * @param Source|string|null $source   The source context where the error occurred
+     * @param \Exception         $previous The previous exception
+     */
+    public function __construct(string $message, int $lineno = -1, $source = null, \Exception $previous = null)
+    {
+        parent::__construct('', 0, $previous);
+
+        if (null === $source) {
+            $name = null;
+        } elseif (!$source instanceof Source && !$source instanceof \Twig_Source) {
+            @trigger_error(sprintf('Passing a string as a source to %s is deprecated since Twig 2.6.1; pass a Twig\Source instance instead.', __CLASS__), E_USER_DEPRECATED);
+            $name = $source;
+        } else {
+            $name = $source->getName();
+            $this->sourceCode = $source->getCode();
+            $this->sourcePath = $source->getPath();
+        }
+
+        $this->lineno = $lineno;
+        $this->name = $name;
+        $this->rawMessage = $message;
+        $this->updateRepr();
+    }
+
+    /**
+     * Gets the raw message.
+     *
+     * @return string The raw message
+     */
+    public function getRawMessage()
+    {
+        return $this->rawMessage;
+    }
+
+    /**
+     * Gets the template line where the error occurred.
+     *
+     * @return int The template line
+     */
+    public function getTemplateLine()
+    {
+        return $this->lineno;
+    }
+
+    /**
+     * Sets the template line where the error occurred.
+     *
+     * @param int $lineno The template line
+     */
+    public function setTemplateLine($lineno)
+    {
+        $this->lineno = $lineno;
+
+        $this->updateRepr();
+    }
+
+    /**
+     * Gets the source context of the Twig template where the error occurred.
+     *
+     * @return Source|null
+     */
+    public function getSourceContext()
+    {
+        return $this->name ? new Source($this->sourceCode, $this->name, $this->sourcePath) : null;
+    }
+
+    /**
+     * Sets the source context of the Twig template where the error occurred.
+     */
+    public function setSourceContext(Source $source = null)
+    {
+        if (null === $source) {
+            $this->sourceCode = $this->name = $this->sourcePath = null;
+        } else {
+            $this->sourceCode = $source->getCode();
+            $this->name = $source->getName();
+            $this->sourcePath = $source->getPath();
+        }
+
+        $this->updateRepr();
+    }
+
+    public function guess()
+    {
+        $this->guessTemplateInfo();
+        $this->updateRepr();
+    }
+
+    public function appendMessage($rawMessage)
+    {
+        $this->rawMessage .= $rawMessage;
+        $this->updateRepr();
+    }
+
+    private function updateRepr()
+    {
+        $this->message = $this->rawMessage;
+
+        if ($this->sourcePath && $this->lineno > 0) {
+            $this->file = $this->sourcePath;
+            $this->line = $this->lineno;
+
+            return;
+        }
+
+        $dot = false;
+        if ('.' === substr($this->message, -1)) {
+            $this->message = substr($this->message, 0, -1);
+            $dot = true;
+        }
+
+        $questionMark = false;
+        if ('?' === substr($this->message, -1)) {
+            $this->message = substr($this->message, 0, -1);
+            $questionMark = true;
+        }
+
+        if ($this->name) {
+            if (\is_string($this->name) || (\is_object($this->name) && method_exists($this->name, '__toString'))) {
+                $name = sprintf('"%s"', $this->name);
+            } else {
+                $name = json_encode($this->name);
+            }
+            $this->message .= sprintf(' in %s', $name);
+        }
+
+        if ($this->lineno && $this->lineno >= 0) {
+            $this->message .= sprintf(' at line %d', $this->lineno);
+        }
+
+        if ($dot) {
+            $this->message .= '.';
+        }
 
-if (\false) {
-    class Error extends \Twig_Error
+        if ($questionMark) {
+            $this->message .= '?';
+        }
+    }
+
+    private function guessTemplateInfo()
     {
+        $template = null;
+        $templateClass = null;
+
+        $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS | DEBUG_BACKTRACE_PROVIDE_OBJECT);
+        foreach ($backtrace as $trace) {
+            if (isset($trace['object']) && $trace['object'] instanceof Template && 'Twig_Template' !== \get_class($trace['object'])) {
+                $currentClass = \get_class($trace['object']);
+                $isEmbedContainer = 0 === strpos($templateClass, $currentClass);
+                if (null === $this->name || ($this->name == $trace['object']->getTemplateName() && !$isEmbedContainer)) {
+                    $template = $trace['object'];
+                    $templateClass = \get_class($trace['object']);
+                }
+            }
+        }
+
+        // update template name
+        if (null !== $template && null === $this->name) {
+            $this->name = $template->getTemplateName();
+        }
+
+        // update template path if any
+        if (null !== $template && null === $this->sourcePath) {
+            $src = $template->getSourceContext();
+            $this->sourceCode = $src->getCode();
+            $this->sourcePath = $src->getPath();
+        }
+
+        if (null === $template || $this->lineno > -1) {
+            return;
+        }
+
+        $r = new \ReflectionObject($template);
+        $file = $r->getFileName();
+
+        $exceptions = [$e = $this];
+        while ($e = $e->getPrevious()) {
+            $exceptions[] = $e;
+        }
+
+        while ($e = array_pop($exceptions)) {
+            $traces = $e->getTrace();
+            array_unshift($traces, ['file' => $e->getFile(), 'line' => $e->getLine()]);
+
+            while ($trace = array_shift($traces)) {
+                if (!isset($trace['file']) || !isset($trace['line']) || $file != $trace['file']) {
+                    continue;
+                }
+
+                foreach ($template->getDebugInfo() as $codeLine => $templateLine) {
+                    if ($codeLine <= $trace['line']) {
+                        // update template line
+                        $this->lineno = $templateLine;
+
+                        return;
+                    }
+                }
+            }
+        }
     }
 }
+
+class_alias('Twig\Error\Error', 'Twig_Error');
diff --git a/vendor/twig/twig/src/Error/LoaderError.php b/vendor/twig/twig/src/Error/LoaderError.php
index df731b15..dc5a9f1a 100644
--- a/vendor/twig/twig/src/Error/LoaderError.php
+++ b/vendor/twig/twig/src/Error/LoaderError.php
@@ -1,11 +1,23 @@
 <?php
 
-namespace Twig\Error;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_Error_Loader');
+namespace Twig\Error;
 
-if (\false) {
-    class LoaderError extends \Twig_Error_Loader
-    {
-    }
+/**
+ * Exception thrown when an error occurs during template loading.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class LoaderError extends Error
+{
 }
+
+class_alias('Twig\Error\LoaderError', 'Twig_Error_Loader');
diff --git a/vendor/twig/twig/src/Error/RuntimeError.php b/vendor/twig/twig/src/Error/RuntimeError.php
index b29ec536..9b3f36e0 100644
--- a/vendor/twig/twig/src/Error/RuntimeError.php
+++ b/vendor/twig/twig/src/Error/RuntimeError.php
@@ -1,11 +1,24 @@
 <?php
 
-namespace Twig\Error;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_Error_Runtime');
+namespace Twig\Error;
 
-if (\false) {
-    class RuntimeError extends \Twig_Error_Runtime
-    {
-    }
+/**
+ * Exception thrown when an error occurs at runtime.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class RuntimeError extends Error
+{
 }
+
+class_alias('Twig\Error\RuntimeError', 'Twig_Error_Runtime');
diff --git a/vendor/twig/twig/src/Error/SyntaxError.php b/vendor/twig/twig/src/Error/SyntaxError.php
index 1b31520e..efece925 100644
--- a/vendor/twig/twig/src/Error/SyntaxError.php
+++ b/vendor/twig/twig/src/Error/SyntaxError.php
@@ -1,11 +1,48 @@
 <?php
 
-namespace Twig\Error;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_Error_Syntax');
+namespace Twig\Error;
 
-if (\false) {
-    class SyntaxError extends \Twig_Error_Syntax
+/**
+ * \Exception thrown when a syntax error occurs during lexing or parsing of a template.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class SyntaxError extends Error
+{
+    /**
+     * Tweaks the error message to include suggestions.
+     *
+     * @param string $name  The original name of the item that does not exist
+     * @param array  $items An array of possible items
+     */
+    public function addSuggestions($name, array $items)
     {
+        $alternatives = [];
+        foreach ($items as $item) {
+            $lev = levenshtein($name, $item);
+            if ($lev <= \strlen($name) / 3 || false !== strpos($item, $name)) {
+                $alternatives[$item] = $lev;
+            }
+        }
+
+        if (!$alternatives) {
+            return;
+        }
+
+        asort($alternatives);
+
+        $this->appendMessage(sprintf(' Did you mean "%s"?', implode('", "', array_keys($alternatives))));
     }
 }
+
+class_alias('Twig\Error\SyntaxError', 'Twig_Error_Syntax');
diff --git a/vendor/twig/twig/src/ExpressionParser.php b/vendor/twig/twig/src/ExpressionParser.php
index 0cbbdbc2..2c5df63f 100644
--- a/vendor/twig/twig/src/ExpressionParser.php
+++ b/vendor/twig/twig/src/ExpressionParser.php
@@ -1,11 +1,814 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_ExpressionParser');
+use Twig\Error\SyntaxError;
+use Twig\Node\Expression\AbstractExpression;
+use Twig\Node\Expression\ArrayExpression;
+use Twig\Node\Expression\ArrowFunctionExpression;
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Node\Expression\Binary\ConcatBinary;
+use Twig\Node\Expression\BlockReferenceExpression;
+use Twig\Node\Expression\ConditionalExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\GetAttrExpression;
+use Twig\Node\Expression\MethodCallExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\Expression\ParentExpression;
+use Twig\Node\Expression\TestExpression;
+use Twig\Node\Expression\Unary\NegUnary;
+use Twig\Node\Expression\Unary\NotUnary;
+use Twig\Node\Expression\Unary\PosUnary;
+use Twig\Node\Node;
+
+/**
+ * Parses expressions.
+ *
+ * This parser implements a "Precedence climbing" algorithm.
+ *
+ * @see https://www.engr.mun.ca/~theo/Misc/exp_parsing.htm
+ * @see https://en.wikipedia.org/wiki/Operator-precedence_parser
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @internal
+ */
+class ExpressionParser
+{
+    const OPERATOR_LEFT = 1;
+    const OPERATOR_RIGHT = 2;
+
+    private $parser;
+    private $env;
+    private $unaryOperators;
+    private $binaryOperators;
+
+    public function __construct(Parser $parser, Environment $env)
+    {
+        $this->parser = $parser;
+        $this->env = $env;
+        $this->unaryOperators = $env->getUnaryOperators();
+        $this->binaryOperators = $env->getBinaryOperators();
+    }
+
+    public function parseExpression($precedence = 0, $allowArrow = false)
+    {
+        if ($allowArrow && $arrow = $this->parseArrow()) {
+            return $arrow;
+        }
+
+        $expr = $this->getPrimary();
+        $token = $this->parser->getCurrentToken();
+        while ($this->isBinary($token) && $this->binaryOperators[$token->getValue()]['precedence'] >= $precedence) {
+            $op = $this->binaryOperators[$token->getValue()];
+            $this->parser->getStream()->next();
+
+            if ('is not' === $token->getValue()) {
+                $expr = $this->parseNotTestExpression($expr);
+            } elseif ('is' === $token->getValue()) {
+                $expr = $this->parseTestExpression($expr);
+            } elseif (isset($op['callable'])) {
+                $expr = $op['callable']($this->parser, $expr);
+            } else {
+                $expr1 = $this->parseExpression(self::OPERATOR_LEFT === $op['associativity'] ? $op['precedence'] + 1 : $op['precedence']);
+                $class = $op['class'];
+                $expr = new $class($expr, $expr1, $token->getLine());
+            }
+
+            $token = $this->parser->getCurrentToken();
+        }
+
+        if (0 === $precedence) {
+            return $this->parseConditionalExpression($expr);
+        }
+
+        return $expr;
+    }
+
+    /**
+     * @return ArrowFunctionExpression|null
+     */
+    private function parseArrow()
+    {
+        $stream = $this->parser->getStream();
+
+        // short array syntax (one argument, no parentheses)?
+        if ($stream->look(1)->test(/* Token::ARROW_TYPE */ 12)) {
+            $line = $stream->getCurrent()->getLine();
+            $token = $stream->expect(/* Token::NAME_TYPE */ 5);
+            $names = [new AssignNameExpression($token->getValue(), $token->getLine())];
+            $stream->expect(/* Token::ARROW_TYPE */ 12);
+
+            return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line);
+        }
+
+        // first, determine if we are parsing an arrow function by finding => (long form)
+        $i = 0;
+        if (!$stream->look($i)->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
+            return null;
+        }
+        ++$i;
+        while (true) {
+            // variable name
+            ++$i;
+            if (!$stream->look($i)->test(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
+                break;
+            }
+            ++$i;
+        }
+        if (!$stream->look($i)->test(/* Token::PUNCTUATION_TYPE */ 9, ')')) {
+            return null;
+        }
+        ++$i;
+        if (!$stream->look($i)->test(/* Token::ARROW_TYPE */ 12)) {
+            return null;
+        }
+
+        // yes, let's parse it properly
+        $token = $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '(');
+        $line = $token->getLine();
+
+        $names = [];
+        while (true) {
+            $token = $stream->expect(/* Token::NAME_TYPE */ 5);
+            $names[] = new AssignNameExpression($token->getValue(), $token->getLine());
+
+            if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
+                break;
+            }
+        }
+        $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ')');
+        $stream->expect(/* Token::ARROW_TYPE */ 12);
+
+        return new ArrowFunctionExpression($this->parseExpression(0), new Node($names), $line);
+    }
+
+    private function getPrimary(): AbstractExpression
+    {
+        $token = $this->parser->getCurrentToken();
+
+        if ($this->isUnary($token)) {
+            $operator = $this->unaryOperators[$token->getValue()];
+            $this->parser->getStream()->next();
+            $expr = $this->parseExpression($operator['precedence']);
+            $class = $operator['class'];
+
+            return $this->parsePostfixExpression(new $class($expr, $token->getLine()));
+        } elseif ($token->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
+            $this->parser->getStream()->next();
+            $expr = $this->parseExpression();
+            $this->parser->getStream()->expect(/* Token::PUNCTUATION_TYPE */ 9, ')', 'An opened parenthesis is not properly closed');
+
+            return $this->parsePostfixExpression($expr);
+        }
+
+        return $this->parsePrimaryExpression();
+    }
+
+    private function parseConditionalExpression($expr): AbstractExpression
+    {
+        while ($this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, '?')) {
+            if (!$this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ':')) {
+                $expr2 = $this->parseExpression();
+                if ($this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ':')) {
+                    $expr3 = $this->parseExpression();
+                } else {
+                    $expr3 = new ConstantExpression('', $this->parser->getCurrentToken()->getLine());
+                }
+            } else {
+                $expr2 = $expr;
+                $expr3 = $this->parseExpression();
+            }
+
+            $expr = new ConditionalExpression($expr, $expr2, $expr3, $this->parser->getCurrentToken()->getLine());
+        }
+
+        return $expr;
+    }
+
+    private function isUnary(Token $token): bool
+    {
+        return $token->test(/* Token::OPERATOR_TYPE */ 8) && isset($this->unaryOperators[$token->getValue()]);
+    }
+
+    private function isBinary(Token $token): bool
+    {
+        return $token->test(/* Token::OPERATOR_TYPE */ 8) && isset($this->binaryOperators[$token->getValue()]);
+    }
+
+    public function parsePrimaryExpression()
+    {
+        $token = $this->parser->getCurrentToken();
+        switch ($token->getType()) {
+            case /* Token::NAME_TYPE */ 5:
+                $this->parser->getStream()->next();
+                switch ($token->getValue()) {
+                    case 'true':
+                    case 'TRUE':
+                        $node = new ConstantExpression(true, $token->getLine());
+                        break;
+
+                    case 'false':
+                    case 'FALSE':
+                        $node = new ConstantExpression(false, $token->getLine());
+                        break;
+
+                    case 'none':
+                    case 'NONE':
+                    case 'null':
+                    case 'NULL':
+                        $node = new ConstantExpression(null, $token->getLine());
+                        break;
 
-if (\false) {
-    class ExpressionParser extends \Twig_ExpressionParser
+                    default:
+                        if ('(' === $this->parser->getCurrentToken()->getValue()) {
+                            $node = $this->getFunctionNode($token->getValue(), $token->getLine());
+                        } else {
+                            $node = new NameExpression($token->getValue(), $token->getLine());
+                        }
+                }
+                break;
+
+            case /* Token::NUMBER_TYPE */ 6:
+                $this->parser->getStream()->next();
+                $node = new ConstantExpression($token->getValue(), $token->getLine());
+                break;
+
+            case /* Token::STRING_TYPE */ 7:
+            case /* Token::INTERPOLATION_START_TYPE */ 10:
+                $node = $this->parseStringExpression();
+                break;
+
+            case /* Token::OPERATOR_TYPE */ 8:
+                if (preg_match(Lexer::REGEX_NAME, $token->getValue(), $matches) && $matches[0] == $token->getValue()) {
+                    // in this context, string operators are variable names
+                    $this->parser->getStream()->next();
+                    $node = new NameExpression($token->getValue(), $token->getLine());
+                    break;
+                } elseif (isset($this->unaryOperators[$token->getValue()])) {
+                    $class = $this->unaryOperators[$token->getValue()]['class'];
+
+                    $ref = new \ReflectionClass($class);
+                    if (!(\in_array($ref->getName(), [NegUnary::class, PosUnary::class, 'Twig_Node_Expression_Unary_Neg', 'Twig_Node_Expression_Unary_Pos'])
+                        || $ref->isSubclassOf(NegUnary::class) || $ref->isSubclassOf(PosUnary::class)
+                        || $ref->isSubclassOf('Twig_Node_Expression_Unary_Neg') || $ref->isSubclassOf('Twig_Node_Expression_Unary_Pos'))
+                    ) {
+                        throw new SyntaxError(sprintf('Unexpected unary operator "%s".', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
+                    }
+
+                    $this->parser->getStream()->next();
+                    $expr = $this->parsePrimaryExpression();
+
+                    $node = new $class($expr, $token->getLine());
+                    break;
+                }
+
+                // no break
+            default:
+                if ($token->test(/* Token::PUNCTUATION_TYPE */ 9, '[')) {
+                    $node = $this->parseArrayExpression();
+                } elseif ($token->test(/* Token::PUNCTUATION_TYPE */ 9, '{')) {
+                    $node = $this->parseHashExpression();
+                } elseif ($token->test(/* Token::OPERATOR_TYPE */ 8, '=') && ('==' === $this->parser->getStream()->look(-1)->getValue() || '!=' === $this->parser->getStream()->look(-1)->getValue())) {
+                    throw new SyntaxError(sprintf('Unexpected operator of value "%s". Did you try to use "===" or "!==" for strict comparison? Use "is same as(value)" instead.', $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
+                } else {
+                    throw new SyntaxError(sprintf('Unexpected token "%s" of value "%s".', Token::typeToEnglish($token->getType()), $token->getValue()), $token->getLine(), $this->parser->getStream()->getSourceContext());
+                }
+        }
+
+        return $this->parsePostfixExpression($node);
+    }
+
+    public function parseStringExpression()
+    {
+        $stream = $this->parser->getStream();
+
+        $nodes = [];
+        // a string cannot be followed by another string in a single expression
+        $nextCanBeString = true;
+        while (true) {
+            if ($nextCanBeString && $token = $stream->nextIf(/* Token::STRING_TYPE */ 7)) {
+                $nodes[] = new ConstantExpression($token->getValue(), $token->getLine());
+                $nextCanBeString = false;
+            } elseif ($stream->nextIf(/* Token::INTERPOLATION_START_TYPE */ 10)) {
+                $nodes[] = $this->parseExpression();
+                $stream->expect(/* Token::INTERPOLATION_END_TYPE */ 11);
+                $nextCanBeString = true;
+            } else {
+                break;
+            }
+        }
+
+        $expr = array_shift($nodes);
+        foreach ($nodes as $node) {
+            $expr = new ConcatBinary($expr, $node, $node->getTemplateLine());
+        }
+
+        return $expr;
+    }
+
+    public function parseArrayExpression()
+    {
+        $stream = $this->parser->getStream();
+        $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '[', 'An array element was expected');
+
+        $node = new ArrayExpression([], $stream->getCurrent()->getLine());
+        $first = true;
+        while (!$stream->test(/* Token::PUNCTUATION_TYPE */ 9, ']')) {
+            if (!$first) {
+                $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ',', 'An array element must be followed by a comma');
+
+                // trailing ,?
+                if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ']')) {
+                    break;
+                }
+            }
+            $first = false;
+
+            $node->addElement($this->parseExpression());
+        }
+        $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ']', 'An opened array is not properly closed');
+
+        return $node;
+    }
+
+    public function parseHashExpression()
     {
+        $stream = $this->parser->getStream();
+        $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '{', 'A hash element was expected');
+
+        $node = new ArrayExpression([], $stream->getCurrent()->getLine());
+        $first = true;
+        while (!$stream->test(/* Token::PUNCTUATION_TYPE */ 9, '}')) {
+            if (!$first) {
+                $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ',', 'A hash value must be followed by a comma');
+
+                // trailing ,?
+                if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '}')) {
+                    break;
+                }
+            }
+            $first = false;
+
+            // a hash key can be:
+            //
+            //  * a number -- 12
+            //  * a string -- 'a'
+            //  * a name, which is equivalent to a string -- a
+            //  * an expression, which must be enclosed in parentheses -- (1 + 2)
+            if (($token = $stream->nextIf(/* Token::STRING_TYPE */ 7)) || ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) || $token = $stream->nextIf(/* Token::NUMBER_TYPE */ 6)) {
+                $key = new ConstantExpression($token->getValue(), $token->getLine());
+            } elseif ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
+                $key = $this->parseExpression();
+            } else {
+                $current = $stream->getCurrent();
+
+                throw new SyntaxError(sprintf('A hash key must be a quoted string, a number, a name, or an expression enclosed in parentheses (unexpected token "%s" of value "%s".', Token::typeToEnglish($current->getType()), $current->getValue()), $current->getLine(), $stream->getSourceContext());
+            }
+
+            $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ':', 'A hash key must be followed by a colon (:)');
+            $value = $this->parseExpression();
+
+            $node->addElement($value, $key);
+        }
+        $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '}', 'An opened hash is not properly closed');
+
+        return $node;
+    }
+
+    public function parsePostfixExpression($node)
+    {
+        while (true) {
+            $token = $this->parser->getCurrentToken();
+            if (/* Token::PUNCTUATION_TYPE */ 9 == $token->getType()) {
+                if ('.' == $token->getValue() || '[' == $token->getValue()) {
+                    $node = $this->parseSubscriptExpression($node);
+                } elseif ('|' == $token->getValue()) {
+                    $node = $this->parseFilterExpression($node);
+                } else {
+                    break;
+                }
+            } else {
+                break;
+            }
+        }
+
+        return $node;
+    }
+
+    public function getFunctionNode($name, $line)
+    {
+        switch ($name) {
+            case 'parent':
+                $this->parseArguments();
+                if (!\count($this->parser->getBlockStack())) {
+                    throw new SyntaxError('Calling "parent" outside a block is forbidden.', $line, $this->parser->getStream()->getSourceContext());
+                }
+
+                if (!$this->parser->getParent() && !$this->parser->hasTraits()) {
+                    throw new SyntaxError('Calling "parent" on a template that does not extend nor "use" another template is forbidden.', $line, $this->parser->getStream()->getSourceContext());
+                }
+
+                return new ParentExpression($this->parser->peekBlockStack(), $line);
+            case 'block':
+                $args = $this->parseArguments();
+                if (\count($args) < 1) {
+                    throw new SyntaxError('The "block" function takes one argument (the block name).', $line, $this->parser->getStream()->getSourceContext());
+                }
+
+                return new BlockReferenceExpression($args->getNode(0), \count($args) > 1 ? $args->getNode(1) : null, $line);
+            case 'attribute':
+                $args = $this->parseArguments();
+                if (\count($args) < 2) {
+                    throw new SyntaxError('The "attribute" function takes at least two arguments (the variable and the attributes).', $line, $this->parser->getStream()->getSourceContext());
+                }
+
+                return new GetAttrExpression($args->getNode(0), $args->getNode(1), \count($args) > 2 ? $args->getNode(2) : null, Template::ANY_CALL, $line);
+            default:
+                if (null !== $alias = $this->parser->getImportedSymbol('function', $name)) {
+                    $arguments = new ArrayExpression([], $line);
+                    foreach ($this->parseArguments() as $n) {
+                        $arguments->addElement($n);
+                    }
+
+                    $node = new MethodCallExpression($alias['node'], $alias['name'], $arguments, $line);
+                    $node->setAttribute('safe', true);
+
+                    return $node;
+                }
+
+                $args = $this->parseArguments(true);
+                $class = $this->getFunctionNodeClass($name, $line);
+
+                return new $class($name, $args, $line);
+        }
+    }
+
+    public function parseSubscriptExpression($node)
+    {
+        $stream = $this->parser->getStream();
+        $token = $stream->next();
+        $lineno = $token->getLine();
+        $arguments = new ArrayExpression([], $lineno);
+        $type = Template::ANY_CALL;
+        if ('.' == $token->getValue()) {
+            $token = $stream->next();
+            if (
+                /* Token::NAME_TYPE */ 5 == $token->getType()
+                ||
+                /* Token::NUMBER_TYPE */ 6 == $token->getType()
+                ||
+                (/* Token::OPERATOR_TYPE */ 8 == $token->getType() && preg_match(Lexer::REGEX_NAME, $token->getValue()))
+            ) {
+                $arg = new ConstantExpression($token->getValue(), $lineno);
+
+                if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
+                    $type = Template::METHOD_CALL;
+                    foreach ($this->parseArguments() as $n) {
+                        $arguments->addElement($n);
+                    }
+                }
+            } else {
+                throw new SyntaxError('Expected name or number.', $lineno, $stream->getSourceContext());
+            }
+
+            if ($node instanceof NameExpression && null !== $this->parser->getImportedSymbol('template', $node->getAttribute('name'))) {
+                if (!$arg instanceof ConstantExpression) {
+                    throw new SyntaxError(sprintf('Dynamic macro names are not supported (called on "%s").', $node->getAttribute('name')), $token->getLine(), $stream->getSourceContext());
+                }
+
+                $name = $arg->getAttribute('value');
+
+                $node = new MethodCallExpression($node, 'macro_'.$name, $arguments, $lineno);
+                $node->setAttribute('safe', true);
+
+                return $node;
+            }
+        } else {
+            $type = Template::ARRAY_CALL;
+
+            // slice?
+            $slice = false;
+            if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ':')) {
+                $slice = true;
+                $arg = new ConstantExpression(0, $token->getLine());
+            } else {
+                $arg = $this->parseExpression();
+            }
+
+            if ($stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ':')) {
+                $slice = true;
+            }
+
+            if ($slice) {
+                if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, ']')) {
+                    $length = new ConstantExpression(null, $token->getLine());
+                } else {
+                    $length = $this->parseExpression();
+                }
+
+                $class = $this->getFilterNodeClass('slice', $token->getLine());
+                $arguments = new Node([$arg, $length]);
+                $filter = new $class($node, new ConstantExpression('slice', $token->getLine()), $arguments, $token->getLine());
+
+                $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ']');
+
+                return $filter;
+            }
+
+            $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ']');
+        }
+
+        return new GetAttrExpression($node, $arg, $arguments, $type, $lineno);
+    }
+
+    public function parseFilterExpression($node)
+    {
+        $this->parser->getStream()->next();
+
+        return $this->parseFilterExpressionRaw($node);
+    }
+
+    public function parseFilterExpressionRaw($node, $tag = null)
+    {
+        while (true) {
+            $token = $this->parser->getStream()->expect(/* Token::NAME_TYPE */ 5);
+
+            $name = new ConstantExpression($token->getValue(), $token->getLine());
+            if (!$this->parser->getStream()->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
+                $arguments = new Node();
+            } else {
+                $arguments = $this->parseArguments(true, false, true);
+            }
+
+            $class = $this->getFilterNodeClass($name->getAttribute('value'), $token->getLine());
+
+            $node = new $class($node, $name, $arguments, $token->getLine(), $tag);
+
+            if (!$this->parser->getStream()->test(/* Token::PUNCTUATION_TYPE */ 9, '|')) {
+                break;
+            }
+
+            $this->parser->getStream()->next();
+        }
+
+        return $node;
+    }
+
+    /**
+     * Parses arguments.
+     *
+     * @param bool $namedArguments Whether to allow named arguments or not
+     * @param bool $definition     Whether we are parsing arguments for a function definition
+     *
+     * @return Node
+     *
+     * @throws SyntaxError
+     */
+    public function parseArguments($namedArguments = false, $definition = false, $allowArrow = false)
+    {
+        $args = [];
+        $stream = $this->parser->getStream();
+
+        $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, '(', 'A list of arguments must begin with an opening parenthesis');
+        while (!$stream->test(/* Token::PUNCTUATION_TYPE */ 9, ')')) {
+            if (!empty($args)) {
+                $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ',', 'Arguments must be separated by a comma');
+            }
+
+            if ($definition) {
+                $token = $stream->expect(/* Token::NAME_TYPE */ 5, null, 'An argument must be a name');
+                $value = new NameExpression($token->getValue(), $this->parser->getCurrentToken()->getLine());
+            } else {
+                $value = $this->parseExpression(0, $allowArrow);
+            }
+
+            $name = null;
+            if ($namedArguments && $token = $stream->nextIf(/* Token::OPERATOR_TYPE */ 8, '=')) {
+                if (!$value instanceof NameExpression) {
+                    throw new SyntaxError(sprintf('A parameter name must be a string, "%s" given.', \get_class($value)), $token->getLine(), $stream->getSourceContext());
+                }
+                $name = $value->getAttribute('name');
+
+                if ($definition) {
+                    $value = $this->parsePrimaryExpression();
+
+                    if (!$this->checkConstantExpression($value)) {
+                        throw new SyntaxError(sprintf('A default value for an argument must be a constant (a boolean, a string, a number, or an array).'), $token->getLine(), $stream->getSourceContext());
+                    }
+                } else {
+                    $value = $this->parseExpression(0, $allowArrow);
+                }
+            }
+
+            if ($definition) {
+                if (null === $name) {
+                    $name = $value->getAttribute('name');
+                    $value = new ConstantExpression(null, $this->parser->getCurrentToken()->getLine());
+                }
+                $args[$name] = $value;
+            } else {
+                if (null === $name) {
+                    $args[] = $value;
+                } else {
+                    $args[$name] = $value;
+                }
+            }
+        }
+        $stream->expect(/* Token::PUNCTUATION_TYPE */ 9, ')', 'A list of arguments must be closed by a parenthesis');
+
+        return new Node($args);
+    }
+
+    public function parseAssignmentExpression()
+    {
+        $stream = $this->parser->getStream();
+        $targets = [];
+        while (true) {
+            $token = $this->parser->getCurrentToken();
+            if ($stream->test(/* Token::OPERATOR_TYPE */ 8) && preg_match(Lexer::REGEX_NAME, $token->getValue())) {
+                // in this context, string operators are variable names
+                $this->parser->getStream()->next();
+            } else {
+                $stream->expect(/* Token::NAME_TYPE */ 5, null, 'Only variables can be assigned to');
+            }
+            $value = $token->getValue();
+            if (\in_array(strtolower($value), ['true', 'false', 'none', 'null'])) {
+                throw new SyntaxError(sprintf('You cannot assign a value to "%s".', $value), $token->getLine(), $stream->getSourceContext());
+            }
+            $targets[] = new AssignNameExpression($value, $token->getLine());
+
+            if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
+                break;
+            }
+        }
+
+        return new Node($targets);
+    }
+
+    public function parseMultitargetExpression()
+    {
+        $targets = [];
+        while (true) {
+            $targets[] = $this->parseExpression();
+            if (!$this->parser->getStream()->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
+                break;
+            }
+        }
+
+        return new Node($targets);
+    }
+
+    private function parseNotTestExpression(Node $node): NotUnary
+    {
+        return new NotUnary($this->parseTestExpression($node), $this->parser->getCurrentToken()->getLine());
+    }
+
+    private function parseTestExpression(Node $node): TestExpression
+    {
+        $stream = $this->parser->getStream();
+        list($name, $test) = $this->getTest($node->getTemplateLine());
+
+        $class = $this->getTestNodeClass($test);
+        $arguments = null;
+        if ($stream->test(/* Token::PUNCTUATION_TYPE */ 9, '(')) {
+            $arguments = $this->parseArguments(true);
+        }
+
+        if ('defined' === $name && $node instanceof NameExpression && null !== $alias = $this->parser->getImportedSymbol('function', $node->getAttribute('name'))) {
+            $node = new MethodCallExpression($alias['node'], $alias['name'], new ArrayExpression([], $node->getTemplateLine()), $node->getTemplateLine());
+            $node->setAttribute('safe', true);
+        }
+
+        return new $class($node, $name, $arguments, $this->parser->getCurrentToken()->getLine());
+    }
+
+    private function getTest(int $line): array
+    {
+        $stream = $this->parser->getStream();
+        $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
+
+        if ($test = $this->env->getTest($name)) {
+            return [$name, $test];
+        }
+
+        if ($stream->test(/* Token::NAME_TYPE */ 5)) {
+            // try 2-words tests
+            $name = $name.' '.$this->parser->getCurrentToken()->getValue();
+
+            if ($test = $this->env->getTest($name)) {
+                $stream->next();
+
+                return [$name, $test];
+            }
+        }
+
+        $e = new SyntaxError(sprintf('Unknown "%s" test.', $name), $line, $stream->getSourceContext());
+        $e->addSuggestions($name, array_keys($this->env->getTests()));
+
+        throw $e;
+    }
+
+    private function getTestNodeClass(TwigTest $test): string
+    {
+        if ($test->isDeprecated()) {
+            $stream = $this->parser->getStream();
+            $message = sprintf('Twig Test "%s" is deprecated', $test->getName());
+
+            if (!\is_bool($test->getDeprecatedVersion())) {
+                $message .= sprintf(' since version %s', $test->getDeprecatedVersion());
+            }
+            if ($test->getAlternative()) {
+                $message .= sprintf('. Use "%s" instead', $test->getAlternative());
+            }
+            $src = $stream->getSourceContext();
+            $message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $stream->getCurrent()->getLine());
+
+            @trigger_error($message, E_USER_DEPRECATED);
+        }
+
+        return $test->getNodeClass();
+    }
+
+    private function getFunctionNodeClass(string $name, int $line): string
+    {
+        if (false === $function = $this->env->getFunction($name)) {
+            $e = new SyntaxError(sprintf('Unknown "%s" function.', $name), $line, $this->parser->getStream()->getSourceContext());
+            $e->addSuggestions($name, array_keys($this->env->getFunctions()));
+
+            throw $e;
+        }
+
+        if ($function->isDeprecated()) {
+            $message = sprintf('Twig Function "%s" is deprecated', $function->getName());
+            if (!\is_bool($function->getDeprecatedVersion())) {
+                $message .= sprintf(' since version %s', $function->getDeprecatedVersion());
+            }
+            if ($function->getAlternative()) {
+                $message .= sprintf('. Use "%s" instead', $function->getAlternative());
+            }
+            $src = $this->parser->getStream()->getSourceContext();
+            $message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $line);
+
+            @trigger_error($message, E_USER_DEPRECATED);
+        }
+
+        return $function->getNodeClass();
+    }
+
+    private function getFilterNodeClass(string $name, int $line): string
+    {
+        if (false === $filter = $this->env->getFilter($name)) {
+            $e = new SyntaxError(sprintf('Unknown "%s" filter.', $name), $line, $this->parser->getStream()->getSourceContext());
+            $e->addSuggestions($name, array_keys($this->env->getFilters()));
+
+            throw $e;
+        }
+
+        if ($filter->isDeprecated()) {
+            $message = sprintf('Twig Filter "%s" is deprecated', $filter->getName());
+            if (!\is_bool($filter->getDeprecatedVersion())) {
+                $message .= sprintf(' since version %s', $filter->getDeprecatedVersion());
+            }
+            if ($filter->getAlternative()) {
+                $message .= sprintf('. Use "%s" instead', $filter->getAlternative());
+            }
+            $src = $this->parser->getStream()->getSourceContext();
+            $message .= sprintf(' in %s at line %d.', $src->getPath() ?: $src->getName(), $line);
+
+            @trigger_error($message, E_USER_DEPRECATED);
+        }
+
+        return $filter->getNodeClass();
+    }
+
+    // checks that the node only contains "constant" elements
+    private function checkConstantExpression(Node $node): bool
+    {
+        if (!($node instanceof ConstantExpression || $node instanceof ArrayExpression
+            || $node instanceof NegUnary || $node instanceof PosUnary
+        )) {
+            return false;
+        }
+
+        foreach ($node as $n) {
+            if (!$this->checkConstantExpression($n)) {
+                return false;
+            }
+        }
+
+        return true;
     }
 }
+
+class_alias('Twig\ExpressionParser', 'Twig_ExpressionParser');
diff --git a/vendor/twig/twig/src/Extension/AbstractExtension.php b/vendor/twig/twig/src/Extension/AbstractExtension.php
index 8fc965c4..0c012b3e 100644
--- a/vendor/twig/twig/src/Extension/AbstractExtension.php
+++ b/vendor/twig/twig/src/Extension/AbstractExtension.php
@@ -1,11 +1,47 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Extension;
 
-class_exists('Twig_Extension');
+abstract class AbstractExtension implements ExtensionInterface
+{
+    public function getTokenParsers()
+    {
+        return [];
+    }
+
+    public function getNodeVisitors()
+    {
+        return [];
+    }
+
+    public function getFilters()
+    {
+        return [];
+    }
+
+    public function getTests()
+    {
+        return [];
+    }
+
+    public function getFunctions()
+    {
+        return [];
+    }
 
-if (\false) {
-    class AbstractExtension extends \Twig_Extension
+    public function getOperators()
     {
+        return [];
     }
 }
+
+class_alias('Twig\Extension\AbstractExtension', 'Twig_Extension');
diff --git a/vendor/twig/twig/src/Extension/CoreExtension.php b/vendor/twig/twig/src/Extension/CoreExtension.php
index 6f66a44d..07360c0a 100644
--- a/vendor/twig/twig/src/Extension/CoreExtension.php
+++ b/vendor/twig/twig/src/Extension/CoreExtension.php
@@ -1,11 +1,1551 @@
 <?php
 
-namespace Twig\Extension;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_Extension_Core');
+namespace Twig\Extension {
+use Twig\ExpressionParser;
+use Twig\Node\Expression\Binary\AddBinary;
+use Twig\Node\Expression\Binary\AndBinary;
+use Twig\Node\Expression\Binary\BitwiseAndBinary;
+use Twig\Node\Expression\Binary\BitwiseOrBinary;
+use Twig\Node\Expression\Binary\BitwiseXorBinary;
+use Twig\Node\Expression\Binary\ConcatBinary;
+use Twig\Node\Expression\Binary\DivBinary;
+use Twig\Node\Expression\Binary\EndsWithBinary;
+use Twig\Node\Expression\Binary\EqualBinary;
+use Twig\Node\Expression\Binary\FloorDivBinary;
+use Twig\Node\Expression\Binary\GreaterBinary;
+use Twig\Node\Expression\Binary\GreaterEqualBinary;
+use Twig\Node\Expression\Binary\InBinary;
+use Twig\Node\Expression\Binary\LessBinary;
+use Twig\Node\Expression\Binary\LessEqualBinary;
+use Twig\Node\Expression\Binary\MatchesBinary;
+use Twig\Node\Expression\Binary\ModBinary;
+use Twig\Node\Expression\Binary\MulBinary;
+use Twig\Node\Expression\Binary\NotEqualBinary;
+use Twig\Node\Expression\Binary\NotInBinary;
+use Twig\Node\Expression\Binary\OrBinary;
+use Twig\Node\Expression\Binary\PowerBinary;
+use Twig\Node\Expression\Binary\RangeBinary;
+use Twig\Node\Expression\Binary\StartsWithBinary;
+use Twig\Node\Expression\Binary\SubBinary;
+use Twig\Node\Expression\Filter\DefaultFilter;
+use Twig\Node\Expression\NullCoalesceExpression;
+use Twig\Node\Expression\Test\ConstantTest;
+use Twig\Node\Expression\Test\DefinedTest;
+use Twig\Node\Expression\Test\DivisiblebyTest;
+use Twig\Node\Expression\Test\EvenTest;
+use Twig\Node\Expression\Test\NullTest;
+use Twig\Node\Expression\Test\OddTest;
+use Twig\Node\Expression\Test\SameasTest;
+use Twig\Node\Expression\Unary\NegUnary;
+use Twig\Node\Expression\Unary\NotUnary;
+use Twig\Node\Expression\Unary\PosUnary;
+use Twig\NodeVisitor\MacroAutoImportNodeVisitor;
+use Twig\TokenParser\ApplyTokenParser;
+use Twig\TokenParser\BlockTokenParser;
+use Twig\TokenParser\DeprecatedTokenParser;
+use Twig\TokenParser\DoTokenParser;
+use Twig\TokenParser\EmbedTokenParser;
+use Twig\TokenParser\ExtendsTokenParser;
+use Twig\TokenParser\FilterTokenParser;
+use Twig\TokenParser\FlushTokenParser;
+use Twig\TokenParser\ForTokenParser;
+use Twig\TokenParser\FromTokenParser;
+use Twig\TokenParser\IfTokenParser;
+use Twig\TokenParser\ImportTokenParser;
+use Twig\TokenParser\IncludeTokenParser;
+use Twig\TokenParser\MacroTokenParser;
+use Twig\TokenParser\SetTokenParser;
+use Twig\TokenParser\SpacelessTokenParser;
+use Twig\TokenParser\UseTokenParser;
+use Twig\TokenParser\WithTokenParser;
+use Twig\TwigFilter;
+use Twig\TwigFunction;
+use Twig\TwigTest;
 
-if (\false) {
-    class CoreExtension extends \Twig_Extension_Core
+final class CoreExtension extends AbstractExtension
+{
+    private $dateFormats = ['F j, Y H:i', '%d days'];
+    private $numberFormat = [0, '.', ','];
+    private $timezone = null;
+    private $escapers = [];
+
+    /**
+     * Defines a new escaper to be used via the escape filter.
+     *
+     * @param string   $strategy The strategy name that should be used as a strategy in the escape call
+     * @param callable $callable A valid PHP callable
+     *
+     * @deprecated since Twig 2.11, to be removed in 3.0; use the same method on EscaperExtension instead
+     */
+    public function setEscaper($strategy, callable $callable)
+    {
+        @trigger_error(sprintf('The "%s" method is deprecated since Twig 2.11; use "%s::setEscaper" instead.', __METHOD__, EscaperExtension::class), E_USER_DEPRECATED);
+
+        $this->escapers[$strategy] = $callable;
+    }
+
+    /**
+     * Gets all defined escapers.
+     *
+     * @return callable[] An array of escapers
+     *
+     * @deprecated since Twig 2.11, to be removed in 3.0; use the same method on EscaperExtension instead
+     */
+    public function getEscapers(/* $triggerDeprecation = true */)
+    {
+        if (0 === \func_num_args() || func_get_arg(0)) {
+            @trigger_error(sprintf('The "%s" method is deprecated since Twig 2.11; use "%s::getEscapers" instead.', __METHOD__, EscaperExtension::class), E_USER_DEPRECATED);
+        }
+
+        return $this->escapers;
+    }
+
+    /**
+     * Sets the default format to be used by the date filter.
+     *
+     * @param string $format             The default date format string
+     * @param string $dateIntervalFormat The default date interval format string
+     */
+    public function setDateFormat($format = null, $dateIntervalFormat = null)
+    {
+        if (null !== $format) {
+            $this->dateFormats[0] = $format;
+        }
+
+        if (null !== $dateIntervalFormat) {
+            $this->dateFormats[1] = $dateIntervalFormat;
+        }
+    }
+
+    /**
+     * Gets the default format to be used by the date filter.
+     *
+     * @return array The default date format string and the default date interval format string
+     */
+    public function getDateFormat()
+    {
+        return $this->dateFormats;
+    }
+
+    /**
+     * Sets the default timezone to be used by the date filter.
+     *
+     * @param \DateTimeZone|string $timezone The default timezone string or a \DateTimeZone object
+     */
+    public function setTimezone($timezone)
+    {
+        $this->timezone = $timezone instanceof \DateTimeZone ? $timezone : new \DateTimeZone($timezone);
+    }
+
+    /**
+     * Gets the default timezone to be used by the date filter.
+     *
+     * @return \DateTimeZone The default timezone currently in use
+     */
+    public function getTimezone()
+    {
+        if (null === $this->timezone) {
+            $this->timezone = new \DateTimeZone(date_default_timezone_get());
+        }
+
+        return $this->timezone;
+    }
+
+    /**
+     * Sets the default format to be used by the number_format filter.
+     *
+     * @param int    $decimal      the number of decimal places to use
+     * @param string $decimalPoint the character(s) to use for the decimal point
+     * @param string $thousandSep  the character(s) to use for the thousands separator
+     */
+    public function setNumberFormat($decimal, $decimalPoint, $thousandSep)
+    {
+        $this->numberFormat = [$decimal, $decimalPoint, $thousandSep];
+    }
+
+    /**
+     * Get the default format used by the number_format filter.
+     *
+     * @return array The arguments for number_format()
+     */
+    public function getNumberFormat()
+    {
+        return $this->numberFormat;
+    }
+
+    public function getTokenParsers()
+    {
+        return [
+            new ApplyTokenParser(),
+            new ForTokenParser(),
+            new IfTokenParser(),
+            new ExtendsTokenParser(),
+            new IncludeTokenParser(),
+            new BlockTokenParser(),
+            new UseTokenParser(),
+            new FilterTokenParser(),
+            new MacroTokenParser(),
+            new ImportTokenParser(),
+            new FromTokenParser(),
+            new SetTokenParser(),
+            new SpacelessTokenParser(),
+            new FlushTokenParser(),
+            new DoTokenParser(),
+            new EmbedTokenParser(),
+            new WithTokenParser(),
+            new DeprecatedTokenParser(),
+        ];
+    }
+
+    public function getFilters()
+    {
+        return [
+            // formatting filters
+            new TwigFilter('date', 'twig_date_format_filter', ['needs_environment' => true]),
+            new TwigFilter('date_modify', 'twig_date_modify_filter', ['needs_environment' => true]),
+            new TwigFilter('format', 'sprintf'),
+            new TwigFilter('replace', 'twig_replace_filter'),
+            new TwigFilter('number_format', 'twig_number_format_filter', ['needs_environment' => true]),
+            new TwigFilter('abs', 'abs'),
+            new TwigFilter('round', 'twig_round'),
+
+            // encoding
+            new TwigFilter('url_encode', 'twig_urlencode_filter'),
+            new TwigFilter('json_encode', 'json_encode'),
+            new TwigFilter('convert_encoding', 'twig_convert_encoding'),
+
+            // string filters
+            new TwigFilter('title', 'twig_title_string_filter', ['needs_environment' => true]),
+            new TwigFilter('capitalize', 'twig_capitalize_string_filter', ['needs_environment' => true]),
+            new TwigFilter('upper', 'twig_upper_filter', ['needs_environment' => true]),
+            new TwigFilter('lower', 'twig_lower_filter', ['needs_environment' => true]),
+            new TwigFilter('striptags', 'strip_tags'),
+            new TwigFilter('trim', 'twig_trim_filter'),
+            new TwigFilter('nl2br', 'nl2br', ['pre_escape' => 'html', 'is_safe' => ['html']]),
+            new TwigFilter('spaceless', 'twig_spaceless', ['is_safe' => ['html']]),
+
+            // array helpers
+            new TwigFilter('join', 'twig_join_filter'),
+            new TwigFilter('split', 'twig_split_filter', ['needs_environment' => true]),
+            new TwigFilter('sort', 'twig_sort_filter'),
+            new TwigFilter('merge', 'twig_array_merge'),
+            new TwigFilter('batch', 'twig_array_batch'),
+            new TwigFilter('column', 'twig_array_column'),
+            new TwigFilter('filter', 'twig_array_filter'),
+            new TwigFilter('map', 'twig_array_map'),
+            new TwigFilter('reduce', 'twig_array_reduce'),
+
+            // string/array filters
+            new TwigFilter('reverse', 'twig_reverse_filter', ['needs_environment' => true]),
+            new TwigFilter('length', 'twig_length_filter', ['needs_environment' => true]),
+            new TwigFilter('slice', 'twig_slice', ['needs_environment' => true]),
+            new TwigFilter('first', 'twig_first', ['needs_environment' => true]),
+            new TwigFilter('last', 'twig_last', ['needs_environment' => true]),
+
+            // iteration and runtime
+            new TwigFilter('default', '_twig_default_filter', ['node_class' => DefaultFilter::class]),
+            new TwigFilter('keys', 'twig_get_array_keys_filter'),
+        ];
+    }
+
+    public function getFunctions()
+    {
+        return [
+            new TwigFunction('max', 'max'),
+            new TwigFunction('min', 'min'),
+            new TwigFunction('range', 'range'),
+            new TwigFunction('constant', 'twig_constant'),
+            new TwigFunction('cycle', 'twig_cycle'),
+            new TwigFunction('random', 'twig_random', ['needs_environment' => true]),
+            new TwigFunction('date', 'twig_date_converter', ['needs_environment' => true]),
+            new TwigFunction('include', 'twig_include', ['needs_environment' => true, 'needs_context' => true, 'is_safe' => ['all']]),
+            new TwigFunction('source', 'twig_source', ['needs_environment' => true, 'is_safe' => ['all']]),
+        ];
+    }
+
+    public function getTests()
     {
+        return [
+            new TwigTest('even', null, ['node_class' => EvenTest::class]),
+            new TwigTest('odd', null, ['node_class' => OddTest::class]),
+            new TwigTest('defined', null, ['node_class' => DefinedTest::class]),
+            new TwigTest('same as', null, ['node_class' => SameasTest::class]),
+            new TwigTest('none', null, ['node_class' => NullTest::class]),
+            new TwigTest('null', null, ['node_class' => NullTest::class]),
+            new TwigTest('divisible by', null, ['node_class' => DivisiblebyTest::class]),
+            new TwigTest('constant', null, ['node_class' => ConstantTest::class]),
+            new TwigTest('empty', 'twig_test_empty'),
+            new TwigTest('iterable', 'twig_test_iterable'),
+        ];
+    }
+
+    public function getNodeVisitors()
+    {
+        return [new MacroAutoImportNodeVisitor()];
+    }
+
+    public function getOperators()
+    {
+        return [
+            [
+                'not' => ['precedence' => 50, 'class' => NotUnary::class],
+                '-' => ['precedence' => 500, 'class' => NegUnary::class],
+                '+' => ['precedence' => 500, 'class' => PosUnary::class],
+            ],
+            [
+                'or' => ['precedence' => 10, 'class' => OrBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'and' => ['precedence' => 15, 'class' => AndBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'b-or' => ['precedence' => 16, 'class' => BitwiseOrBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'b-xor' => ['precedence' => 17, 'class' => BitwiseXorBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'b-and' => ['precedence' => 18, 'class' => BitwiseAndBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '==' => ['precedence' => 20, 'class' => EqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '!=' => ['precedence' => 20, 'class' => NotEqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '<' => ['precedence' => 20, 'class' => LessBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '>' => ['precedence' => 20, 'class' => GreaterBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '>=' => ['precedence' => 20, 'class' => GreaterEqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '<=' => ['precedence' => 20, 'class' => LessEqualBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'not in' => ['precedence' => 20, 'class' => NotInBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'in' => ['precedence' => 20, 'class' => InBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'matches' => ['precedence' => 20, 'class' => MatchesBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'starts with' => ['precedence' => 20, 'class' => StartsWithBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'ends with' => ['precedence' => 20, 'class' => EndsWithBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '..' => ['precedence' => 25, 'class' => RangeBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '+' => ['precedence' => 30, 'class' => AddBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '-' => ['precedence' => 30, 'class' => SubBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '~' => ['precedence' => 40, 'class' => ConcatBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '*' => ['precedence' => 60, 'class' => MulBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '/' => ['precedence' => 60, 'class' => DivBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '//' => ['precedence' => 60, 'class' => FloorDivBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '%' => ['precedence' => 60, 'class' => ModBinary::class, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'is' => ['precedence' => 100, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                'is not' => ['precedence' => 100, 'associativity' => ExpressionParser::OPERATOR_LEFT],
+                '**' => ['precedence' => 200, 'class' => PowerBinary::class, 'associativity' => ExpressionParser::OPERATOR_RIGHT],
+                '??' => ['precedence' => 300, 'class' => NullCoalesceExpression::class, 'associativity' => ExpressionParser::OPERATOR_RIGHT],
+            ],
+        ];
+    }
+}
+
+class_alias('Twig\Extension\CoreExtension', 'Twig_Extension_Core');
+}
+
+namespace {
+    use Twig\Environment;
+    use Twig\Error\LoaderError;
+    use Twig\Error\RuntimeError;
+    use Twig\Extension\CoreExtension;
+    use Twig\Extension\SandboxExtension;
+    use Twig\Markup;
+    use Twig\Source;
+    use Twig\Template;
+
+    /**
+ * Cycles over a value.
+ *
+ * @param \ArrayAccess|array $values
+ * @param int                $position The cycle position
+ *
+ * @return string The next value in the cycle
+ */
+function twig_cycle($values, $position)
+{
+    if (!\is_array($values) && !$values instanceof \ArrayAccess) {
+        return $values;
+    }
+
+    return $values[$position % \count($values)];
+}
+
+/**
+ * Returns a random value depending on the supplied parameter type:
+ * - a random item from a \Traversable or array
+ * - a random character from a string
+ * - a random integer between 0 and the integer parameter.
+ *
+ * @param \Traversable|array|int|float|string $values The values to pick a random item from
+ * @param int|null                            $max    Maximum value used when $values is an int
+ *
+ * @throws RuntimeError when $values is an empty array (does not apply to an empty string which is returned as is)
+ *
+ * @return mixed A random value from the given sequence
+ */
+function twig_random(Environment $env, $values = null, $max = null)
+{
+    if (null === $values) {
+        return null === $max ? mt_rand() : mt_rand(0, $max);
+    }
+
+    if (\is_int($values) || \is_float($values)) {
+        if (null === $max) {
+            if ($values < 0) {
+                $max = 0;
+                $min = $values;
+            } else {
+                $max = $values;
+                $min = 0;
+            }
+        } else {
+            $min = $values;
+            $max = $max;
+        }
+
+        return mt_rand($min, $max);
+    }
+
+    if (\is_string($values)) {
+        if ('' === $values) {
+            return '';
+        }
+
+        $charset = $env->getCharset();
+
+        if ('UTF-8' !== $charset) {
+            $values = iconv($charset, 'UTF-8', $values);
+        }
+
+        // unicode version of str_split()
+        // split at all positions, but not after the start and not before the end
+        $values = preg_split('/(?<!^)(?!$)/u', $values);
+
+        if ('UTF-8' !== $charset) {
+            foreach ($values as $i => $value) {
+                $values[$i] = iconv('UTF-8', $charset, $value);
+            }
+        }
+    }
+
+    if (!twig_test_iterable($values)) {
+        return $values;
+    }
+
+    $values = twig_to_array($values);
+
+    if (0 === \count($values)) {
+        throw new RuntimeError('The random function cannot pick from an empty array.');
+    }
+
+    return $values[array_rand($values, 1)];
+}
+
+/**
+ * Converts a date to the given format.
+ *
+ *   {{ post.published_at|date("m/d/Y") }}
+ *
+ * @param \DateTimeInterface|\DateInterval|string $date     A date
+ * @param string|null                             $format   The target format, null to use the default
+ * @param \DateTimeZone|string|false|null         $timezone The target timezone, null to use the default, false to leave unchanged
+ *
+ * @return string The formatted date
+ */
+function twig_date_format_filter(Environment $env, $date, $format = null, $timezone = null)
+{
+    if (null === $format) {
+        $formats = $env->getExtension(CoreExtension::class)->getDateFormat();
+        $format = $date instanceof \DateInterval ? $formats[1] : $formats[0];
+    }
+
+    if ($date instanceof \DateInterval) {
+        return $date->format($format);
+    }
+
+    return twig_date_converter($env, $date, $timezone)->format($format);
+}
+
+/**
+ * Returns a new date object modified.
+ *
+ *   {{ post.published_at|date_modify("-1day")|date("m/d/Y") }}
+ *
+ * @param \DateTimeInterface|string $date     A date
+ * @param string                    $modifier A modifier string
+ *
+ * @return \DateTimeInterface
+ */
+function twig_date_modify_filter(Environment $env, $date, $modifier)
+{
+    $date = twig_date_converter($env, $date, false);
+
+    return $date->modify($modifier);
+}
+
+/**
+ * Converts an input to a \DateTime instance.
+ *
+ *    {% if date(user.created_at) < date('+2days') %}
+ *      {# do something #}
+ *    {% endif %}
+ *
+ * @param \DateTimeInterface|string|null  $date     A date or null to use the current time
+ * @param \DateTimeZone|string|false|null $timezone The target timezone, null to use the default, false to leave unchanged
+ *
+ * @return \DateTime
+ */
+function twig_date_converter(Environment $env, $date = null, $timezone = null)
+{
+    // determine the timezone
+    if (false !== $timezone) {
+        if (null === $timezone) {
+            $timezone = $env->getExtension(CoreExtension::class)->getTimezone();
+        } elseif (!$timezone instanceof \DateTimeZone) {
+            $timezone = new \DateTimeZone($timezone);
+        }
+    }
+
+    // immutable dates
+    if ($date instanceof \DateTimeImmutable) {
+        return false !== $timezone ? $date->setTimezone($timezone) : $date;
+    }
+
+    if ($date instanceof \DateTimeInterface) {
+        $date = clone $date;
+        if (false !== $timezone) {
+            $date->setTimezone($timezone);
+        }
+
+        return $date;
+    }
+
+    if (null === $date || 'now' === $date) {
+        return new \DateTime($date, false !== $timezone ? $timezone : $env->getExtension(CoreExtension::class)->getTimezone());
+    }
+
+    $asString = (string) $date;
+    if (ctype_digit($asString) || (!empty($asString) && '-' === $asString[0] && ctype_digit(substr($asString, 1)))) {
+        $date = new \DateTime('@'.$date);
+    } else {
+        $date = new \DateTime($date, $env->getExtension(CoreExtension::class)->getTimezone());
+    }
+
+    if (false !== $timezone) {
+        $date->setTimezone($timezone);
+    }
+
+    return $date;
+}
+
+/**
+ * Replaces strings within a string.
+ *
+ * @param string             $str  String to replace in
+ * @param array|\Traversable $from Replace values
+ *
+ * @return string
+ */
+function twig_replace_filter($str, $from)
+{
+    if (!twig_test_iterable($from)) {
+        throw new RuntimeError(sprintf('The "replace" filter expects an array or "Traversable" as replace values, got "%s".', \is_object($from) ? \get_class($from) : \gettype($from)));
+    }
+
+    return strtr($str, twig_to_array($from));
+}
+
+/**
+ * Rounds a number.
+ *
+ * @param int|float $value     The value to round
+ * @param int|float $precision The rounding precision
+ * @param string    $method    The method to use for rounding
+ *
+ * @return int|float The rounded number
+ */
+function twig_round($value, $precision = 0, $method = 'common')
+{
+    if ('common' == $method) {
+        return round($value, $precision);
+    }
+
+    if ('ceil' != $method && 'floor' != $method) {
+        throw new RuntimeError('The round filter only supports the "common", "ceil", and "floor" methods.');
+    }
+
+    return $method($value * pow(10, $precision)) / pow(10, $precision);
+}
+
+/**
+ * Number format filter.
+ *
+ * All of the formatting options can be left null, in that case the defaults will
+ * be used.  Supplying any of the parameters will override the defaults set in the
+ * environment object.
+ *
+ * @param mixed  $number       A float/int/string of the number to format
+ * @param int    $decimal      the number of decimal points to display
+ * @param string $decimalPoint the character(s) to use for the decimal point
+ * @param string $thousandSep  the character(s) to use for the thousands separator
+ *
+ * @return string The formatted number
+ */
+function twig_number_format_filter(Environment $env, $number, $decimal = null, $decimalPoint = null, $thousandSep = null)
+{
+    $defaults = $env->getExtension(CoreExtension::class)->getNumberFormat();
+    if (null === $decimal) {
+        $decimal = $defaults[0];
+    }
+
+    if (null === $decimalPoint) {
+        $decimalPoint = $defaults[1];
+    }
+
+    if (null === $thousandSep) {
+        $thousandSep = $defaults[2];
+    }
+
+    return number_format((float) $number, $decimal, $decimalPoint, $thousandSep);
+}
+
+/**
+ * URL encodes (RFC 3986) a string as a path segment or an array as a query string.
+ *
+ * @param string|array $url A URL or an array of query parameters
+ *
+ * @return string The URL encoded value
+ */
+function twig_urlencode_filter($url)
+{
+    if (\is_array($url)) {
+        return http_build_query($url, '', '&', PHP_QUERY_RFC3986);
+    }
+
+    return rawurlencode($url);
+}
+
+/**
+ * Merges an array with another one.
+ *
+ *  {% set items = { 'apple': 'fruit', 'orange': 'fruit' } %}
+ *
+ *  {% set items = items|merge({ 'peugeot': 'car' }) %}
+ *
+ *  {# items now contains { 'apple': 'fruit', 'orange': 'fruit', 'peugeot': 'car' } #}
+ *
+ * @param array|\Traversable $arr1 An array
+ * @param array|\Traversable $arr2 An array
+ *
+ * @return array The merged array
+ */
+function twig_array_merge($arr1, $arr2)
+{
+    if (!twig_test_iterable($arr1)) {
+        throw new RuntimeError(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as first argument.', \gettype($arr1)));
+    }
+
+    if (!twig_test_iterable($arr2)) {
+        throw new RuntimeError(sprintf('The merge filter only works with arrays or "Traversable", got "%s" as second argument.', \gettype($arr2)));
+    }
+
+    return array_merge(twig_to_array($arr1), twig_to_array($arr2));
+}
+
+/**
+ * Slices a variable.
+ *
+ * @param mixed $item         A variable
+ * @param int   $start        Start of the slice
+ * @param int   $length       Size of the slice
+ * @param bool  $preserveKeys Whether to preserve key or not (when the input is an array)
+ *
+ * @return mixed The sliced variable
+ */
+function twig_slice(Environment $env, $item, $start, $length = null, $preserveKeys = false)
+{
+    if ($item instanceof \Traversable) {
+        while ($item instanceof \IteratorAggregate) {
+            $item = $item->getIterator();
+        }
+
+        if ($start >= 0 && $length >= 0 && $item instanceof \Iterator) {
+            try {
+                return iterator_to_array(new \LimitIterator($item, $start, null === $length ? -1 : $length), $preserveKeys);
+            } catch (\OutOfBoundsException $e) {
+                return [];
+            }
+        }
+
+        $item = iterator_to_array($item, $preserveKeys);
+    }
+
+    if (\is_array($item)) {
+        return \array_slice($item, $start, $length, $preserveKeys);
+    }
+
+    $item = (string) $item;
+
+    return (string) mb_substr($item, $start, $length, $env->getCharset());
+}
+
+/**
+ * Returns the first element of the item.
+ *
+ * @param mixed $item A variable
+ *
+ * @return mixed The first element of the item
+ */
+function twig_first(Environment $env, $item)
+{
+    $elements = twig_slice($env, $item, 0, 1, false);
+
+    return \is_string($elements) ? $elements : current($elements);
+}
+
+/**
+ * Returns the last element of the item.
+ *
+ * @param mixed $item A variable
+ *
+ * @return mixed The last element of the item
+ */
+function twig_last(Environment $env, $item)
+{
+    $elements = twig_slice($env, $item, -1, 1, false);
+
+    return \is_string($elements) ? $elements : current($elements);
+}
+
+/**
+ * Joins the values to a string.
+ *
+ * The separators between elements are empty strings per default, you can define them with the optional parameters.
+ *
+ *  {{ [1, 2, 3]|join(', ', ' and ') }}
+ *  {# returns 1, 2 and 3 #}
+ *
+ *  {{ [1, 2, 3]|join('|') }}
+ *  {# returns 1|2|3 #}
+ *
+ *  {{ [1, 2, 3]|join }}
+ *  {# returns 123 #}
+ *
+ * @param array       $value An array
+ * @param string      $glue  The separator
+ * @param string|null $and   The separator for the last pair
+ *
+ * @return string The concatenated string
+ */
+function twig_join_filter($value, $glue = '', $and = null)
+{
+    if (!twig_test_iterable($value)) {
+        $value = (array) $value;
+    }
+
+    $value = twig_to_array($value, false);
+
+    if (0 === \count($value)) {
+        return '';
+    }
+
+    if (null === $and || $and === $glue) {
+        return implode($glue, $value);
+    }
+
+    if (1 === \count($value)) {
+        return $value[0];
+    }
+
+    return implode($glue, \array_slice($value, 0, -1)).$and.$value[\count($value) - 1];
+}
+
+/**
+ * Splits the string into an array.
+ *
+ *  {{ "one,two,three"|split(',') }}
+ *  {# returns [one, two, three] #}
+ *
+ *  {{ "one,two,three,four,five"|split(',', 3) }}
+ *  {# returns [one, two, "three,four,five"] #}
+ *
+ *  {{ "123"|split('') }}
+ *  {# returns [1, 2, 3] #}
+ *
+ *  {{ "aabbcc"|split('', 2) }}
+ *  {# returns [aa, bb, cc] #}
+ *
+ * @param string $value     A string
+ * @param string $delimiter The delimiter
+ * @param int    $limit     The limit
+ *
+ * @return array The split string as an array
+ */
+function twig_split_filter(Environment $env, $value, $delimiter, $limit = null)
+{
+    if (!empty($delimiter)) {
+        return null === $limit ? explode($delimiter, $value) : explode($delimiter, $value, $limit);
+    }
+
+    if ($limit <= 1) {
+        return preg_split('/(?<!^)(?!$)/u', $value);
+    }
+
+    $length = mb_strlen($value, $env->getCharset());
+    if ($length < $limit) {
+        return [$value];
+    }
+
+    $r = [];
+    for ($i = 0; $i < $length; $i += $limit) {
+        $r[] = mb_substr($value, $i, $limit, $env->getCharset());
+    }
+
+    return $r;
+}
+
+// The '_default' filter is used internally to avoid using the ternary operator
+// which costs a lot for big contexts (before PHP 5.4). So, on average,
+// a function call is cheaper.
+/**
+ * @internal
+ */
+function _twig_default_filter($value, $default = '')
+{
+    if (twig_test_empty($value)) {
+        return $default;
+    }
+
+    return $value;
+}
+
+/**
+ * Returns the keys for the given array.
+ *
+ * It is useful when you want to iterate over the keys of an array:
+ *
+ *  {% for key in array|keys %}
+ *      {# ... #}
+ *  {% endfor %}
+ *
+ * @param array $array An array
+ *
+ * @return array The keys
+ */
+function twig_get_array_keys_filter($array)
+{
+    if ($array instanceof \Traversable) {
+        while ($array instanceof \IteratorAggregate) {
+            $array = $array->getIterator();
+        }
+
+        if ($array instanceof \Iterator) {
+            $keys = [];
+            $array->rewind();
+            while ($array->valid()) {
+                $keys[] = $array->key();
+                $array->next();
+            }
+
+            return $keys;
+        }
+
+        $keys = [];
+        foreach ($array as $key => $item) {
+            $keys[] = $key;
+        }
+
+        return $keys;
+    }
+
+    if (!\is_array($array)) {
+        return [];
+    }
+
+    return array_keys($array);
+}
+
+/**
+ * Reverses a variable.
+ *
+ * @param array|\Traversable|string $item         An array, a \Traversable instance, or a string
+ * @param bool                      $preserveKeys Whether to preserve key or not
+ *
+ * @return mixed The reversed input
+ */
+function twig_reverse_filter(Environment $env, $item, $preserveKeys = false)
+{
+    if ($item instanceof \Traversable) {
+        return array_reverse(iterator_to_array($item), $preserveKeys);
+    }
+
+    if (\is_array($item)) {
+        return array_reverse($item, $preserveKeys);
+    }
+
+    $string = (string) $item;
+
+    $charset = $env->getCharset();
+
+    if ('UTF-8' !== $charset) {
+        $item = iconv($charset, 'UTF-8', $string);
+    }
+
+    preg_match_all('/./us', $item, $matches);
+
+    $string = implode('', array_reverse($matches[0]));
+
+    if ('UTF-8' !== $charset) {
+        $string = iconv('UTF-8', $charset, $string);
+    }
+
+    return $string;
+}
+
+/**
+ * Sorts an array.
+ *
+ * @param array|\Traversable $array
+ *
+ * @return array
+ */
+function twig_sort_filter($array)
+{
+    if ($array instanceof \Traversable) {
+        $array = iterator_to_array($array);
+    } elseif (!\is_array($array)) {
+        throw new RuntimeError(sprintf('The sort filter only works with arrays or "Traversable", got "%s".', \gettype($array)));
+    }
+
+    asort($array);
+
+    return $array;
+}
+
+/**
+ * @internal
+ */
+function twig_in_filter($value, $compare)
+{
+    if ($value instanceof Markup) {
+        $value = (string) $value;
+    }
+    if ($compare instanceof Markup) {
+        $compare = (string) $compare;
+    }
+
+    if (\is_array($compare)) {
+        return \in_array($value, $compare, \is_object($value) || \is_resource($value));
+    } elseif (\is_string($compare) && (\is_string($value) || \is_int($value) || \is_float($value))) {
+        return '' === $value || false !== strpos($compare, (string) $value);
+    } elseif ($compare instanceof \Traversable) {
+        if (\is_object($value) || \is_resource($value)) {
+            foreach ($compare as $item) {
+                if ($item === $value) {
+                    return true;
+                }
+            }
+        } else {
+            foreach ($compare as $item) {
+                if ($item == $value) {
+                    return true;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    return false;
+}
+
+/**
+ * Returns a trimmed string.
+ *
+ * @return string
+ *
+ * @throws RuntimeError When an invalid trimming side is used (not a string or not 'left', 'right', or 'both')
+ */
+function twig_trim_filter($string, $characterMask = null, $side = 'both')
+{
+    if (null === $characterMask) {
+        $characterMask = " \t\n\r\0\x0B";
+    }
+
+    switch ($side) {
+        case 'both':
+            return trim($string, $characterMask);
+        case 'left':
+            return ltrim($string, $characterMask);
+        case 'right':
+            return rtrim($string, $characterMask);
+        default:
+            throw new RuntimeError('Trimming side must be "left", "right" or "both".');
+    }
+}
+
+/**
+ * Removes whitespaces between HTML tags.
+ *
+ * @return string
+ */
+function twig_spaceless($content)
+{
+    return trim(preg_replace('/>\s+</', '><', $content));
+}
+
+function twig_convert_encoding($string, $to, $from)
+{
+    return iconv($from, $to, $string);
+}
+
+/**
+ * Returns the length of a variable.
+ *
+ * @param mixed $thing A variable
+ *
+ * @return int The length of the value
+ */
+function twig_length_filter(Environment $env, $thing)
+{
+    if (null === $thing) {
+        return 0;
+    }
+
+    if (is_scalar($thing)) {
+        return mb_strlen($thing, $env->getCharset());
+    }
+
+    if ($thing instanceof \Countable || \is_array($thing) || $thing instanceof \SimpleXMLElement) {
+        return \count($thing);
+    }
+
+    if ($thing instanceof \Traversable) {
+        return iterator_count($thing);
+    }
+
+    if (method_exists($thing, '__toString') && !$thing instanceof \Countable) {
+        return mb_strlen((string) $thing, $env->getCharset());
+    }
+
+    return 1;
+}
+
+/**
+ * Converts a string to uppercase.
+ *
+ * @param string $string A string
+ *
+ * @return string The uppercased string
+ */
+function twig_upper_filter(Environment $env, $string)
+{
+    return mb_strtoupper($string, $env->getCharset());
+}
+
+/**
+ * Converts a string to lowercase.
+ *
+ * @param string $string A string
+ *
+ * @return string The lowercased string
+ */
+function twig_lower_filter(Environment $env, $string)
+{
+    return mb_strtolower($string, $env->getCharset());
+}
+
+/**
+ * Returns a titlecased string.
+ *
+ * @param string $string A string
+ *
+ * @return string The titlecased string
+ */
+function twig_title_string_filter(Environment $env, $string)
+{
+    if (null !== $charset = $env->getCharset()) {
+        return mb_convert_case($string, MB_CASE_TITLE, $charset);
+    }
+
+    return ucwords(strtolower($string));
+}
+
+/**
+ * Returns a capitalized string.
+ *
+ * @param string $string A string
+ *
+ * @return string The capitalized string
+ */
+function twig_capitalize_string_filter(Environment $env, $string)
+{
+    $charset = $env->getCharset();
+
+    return mb_strtoupper(mb_substr($string, 0, 1, $charset), $charset).mb_strtolower(mb_substr($string, 1, null, $charset), $charset);
+}
+
+/**
+ * @internal
+ */
+function twig_call_macro(Template $template, string $method, array $args, int $lineno, array $context, Source $source)
+{
+    if (!method_exists($template, $method)) {
+        $parent = $template;
+        while ($parent = $parent->getParent($context)) {
+            if (method_exists($parent, $method)) {
+                return $parent->$method(...$args);
+            }
+        }
+
+        throw new RuntimeError(sprintf('Macro "%s" is not defined in template "%s".', substr($method, \strlen('macro_')), $template->getTemplateName()), $lineno, $source);
+    }
+
+    return $template->$method(...$args);
+}
+
+/**
+ * @internal
+ */
+function twig_ensure_traversable($seq)
+{
+    if ($seq instanceof \Traversable || \is_array($seq)) {
+        return $seq;
+    }
+
+    return [];
+}
+
+/**
+ * @internal
+ */
+function twig_to_array($seq, $preserveKeys = true)
+{
+    if ($seq instanceof \Traversable) {
+        return iterator_to_array($seq, $preserveKeys);
+    }
+
+    if (!\is_array($seq)) {
+        return $seq;
+    }
+
+    return $preserveKeys ? $seq : array_values($seq);
+}
+
+/**
+ * Checks if a variable is empty.
+ *
+ *    {# evaluates to true if the foo variable is null, false, or the empty string #}
+ *    {% if foo is empty %}
+ *        {# ... #}
+ *    {% endif %}
+ *
+ * @param mixed $value A variable
+ *
+ * @return bool true if the value is empty, false otherwise
+ */
+function twig_test_empty($value)
+{
+    if ($value instanceof \Countable) {
+        return 0 == \count($value);
+    }
+
+    if (\is_object($value) && method_exists($value, '__toString')) {
+        return '' === (string) $value;
     }
+
+    return '' === $value || false === $value || null === $value || [] === $value;
+}
+
+/**
+ * Checks if a variable is traversable.
+ *
+ *    {# evaluates to true if the foo variable is an array or a traversable object #}
+ *    {% if foo is iterable %}
+ *        {# ... #}
+ *    {% endif %}
+ *
+ * @param mixed $value A variable
+ *
+ * @return bool true if the value is traversable
+ */
+function twig_test_iterable($value)
+{
+    return $value instanceof \Traversable || \is_array($value);
+}
+
+/**
+ * Renders a template.
+ *
+ * @param array        $context
+ * @param string|array $template      The template to render or an array of templates to try consecutively
+ * @param array        $variables     The variables to pass to the template
+ * @param bool         $withContext
+ * @param bool         $ignoreMissing Whether to ignore missing templates or not
+ * @param bool         $sandboxed     Whether to sandbox the template or not
+ *
+ * @return string The rendered template
+ */
+function twig_include(Environment $env, $context, $template, $variables = [], $withContext = true, $ignoreMissing = false, $sandboxed = false)
+{
+    $alreadySandboxed = false;
+    $sandbox = null;
+    if ($withContext) {
+        $variables = array_merge($context, $variables);
+    }
+
+    if ($isSandboxed = $sandboxed && $env->hasExtension(SandboxExtension::class)) {
+        $sandbox = $env->getExtension(SandboxExtension::class);
+        if (!$alreadySandboxed = $sandbox->isSandboxed()) {
+            $sandbox->enableSandbox();
+        }
+    }
+
+    try {
+        $loaded = null;
+        try {
+            $loaded = $env->resolveTemplate($template);
+        } catch (LoaderError $e) {
+            if (!$ignoreMissing) {
+                throw $e;
+            }
+        }
+
+        return $loaded ? $loaded->render($variables) : '';
+    } finally {
+        if ($isSandboxed && !$alreadySandboxed) {
+            $sandbox->disableSandbox();
+        }
+    }
+}
+
+/**
+ * Returns a template content without rendering it.
+ *
+ * @param string $name          The template name
+ * @param bool   $ignoreMissing Whether to ignore missing templates or not
+ *
+ * @return string The template source
+ */
+function twig_source(Environment $env, $name, $ignoreMissing = false)
+{
+    $loader = $env->getLoader();
+    try {
+        return $loader->getSourceContext($name)->getCode();
+    } catch (LoaderError $e) {
+        if (!$ignoreMissing) {
+            throw $e;
+        }
+    }
+}
+
+/**
+ * Provides the ability to get constants from instances as well as class/global constants.
+ *
+ * @param string      $constant The name of the constant
+ * @param object|null $object   The object to get the constant from
+ *
+ * @return string
+ */
+function twig_constant($constant, $object = null)
+{
+    if (null !== $object) {
+        $constant = \get_class($object).'::'.$constant;
+    }
+
+    return \constant($constant);
+}
+
+/**
+ * Checks if a constant exists.
+ *
+ * @param string      $constant The name of the constant
+ * @param object|null $object   The object to get the constant from
+ *
+ * @return bool
+ */
+function twig_constant_is_defined($constant, $object = null)
+{
+    if (null !== $object) {
+        $constant = \get_class($object).'::'.$constant;
+    }
+
+    return \defined($constant);
+}
+
+/**
+ * Batches item.
+ *
+ * @param array $items An array of items
+ * @param int   $size  The size of the batch
+ * @param mixed $fill  A value used to fill missing items
+ *
+ * @return array
+ */
+function twig_array_batch($items, $size, $fill = null, $preserveKeys = true)
+{
+    if (!twig_test_iterable($items)) {
+        throw new RuntimeError(sprintf('The "batch" filter expects an array or "Traversable", got "%s".', \is_object($items) ? \get_class($items) : \gettype($items)));
+    }
+
+    $size = ceil($size);
+
+    $result = array_chunk(twig_to_array($items, $preserveKeys), $size, $preserveKeys);
+
+    if (null !== $fill && $result) {
+        $last = \count($result) - 1;
+        if ($fillCount = $size - \count($result[$last])) {
+            for ($i = 0; $i < $fillCount; ++$i) {
+                $result[$last][] = $fill;
+            }
+        }
+    }
+
+    return $result;
+}
+
+/**
+ * Returns the attribute value for a given array/object.
+ *
+ * @param mixed  $object            The object or array from where to get the item
+ * @param mixed  $item              The item to get from the array or object
+ * @param array  $arguments         An array of arguments to pass if the item is an object method
+ * @param string $type              The type of attribute (@see \Twig\Template constants)
+ * @param bool   $isDefinedTest     Whether this is only a defined check
+ * @param bool   $ignoreStrictCheck Whether to ignore the strict attribute check or not
+ * @param int    $lineno            The template line where the attribute was called
+ *
+ * @return mixed The attribute value, or a Boolean when $isDefinedTest is true, or null when the attribute is not set and $ignoreStrictCheck is true
+ *
+ * @throws RuntimeError if the attribute does not exist and Twig is running in strict mode and $isDefinedTest is false
+ *
+ * @internal
+ */
+function twig_get_attribute(Environment $env, Source $source, $object, $item, array $arguments = [], $type = /* Template::ANY_CALL */ 'any', $isDefinedTest = false, $ignoreStrictCheck = false, $sandboxed = false, int $lineno = -1)
+{
+    // array
+    if (/* Template::METHOD_CALL */ 'method' !== $type) {
+        $arrayItem = \is_bool($item) || \is_float($item) ? (int) $item : $item;
+
+        if (((\is_array($object) || $object instanceof \ArrayObject) && (isset($object[$arrayItem]) || \array_key_exists($arrayItem, $object)))
+            || ($object instanceof ArrayAccess && isset($object[$arrayItem]))
+        ) {
+            if ($isDefinedTest) {
+                return true;
+            }
+
+            return $object[$arrayItem];
+        }
+
+        if (/* Template::ARRAY_CALL */ 'array' === $type || !\is_object($object)) {
+            if ($isDefinedTest) {
+                return false;
+            }
+
+            if ($ignoreStrictCheck || !$env->isStrictVariables()) {
+                return;
+            }
+
+            if ($object instanceof ArrayAccess) {
+                $message = sprintf('Key "%s" in object with ArrayAccess of class "%s" does not exist.', $arrayItem, \get_class($object));
+            } elseif (\is_object($object)) {
+                $message = sprintf('Impossible to access a key "%s" on an object of class "%s" that does not implement ArrayAccess interface.', $item, \get_class($object));
+            } elseif (\is_array($object)) {
+                if (empty($object)) {
+                    $message = sprintf('Key "%s" does not exist as the array is empty.', $arrayItem);
+                } else {
+                    $message = sprintf('Key "%s" for array with keys "%s" does not exist.', $arrayItem, implode(', ', array_keys($object)));
+                }
+            } elseif (/* Template::ARRAY_CALL */ 'array' === $type) {
+                if (null === $object) {
+                    $message = sprintf('Impossible to access a key ("%s") on a null variable.', $item);
+                } else {
+                    $message = sprintf('Impossible to access a key ("%s") on a %s variable ("%s").', $item, \gettype($object), $object);
+                }
+            } elseif (null === $object) {
+                $message = sprintf('Impossible to access an attribute ("%s") on a null variable.', $item);
+            } else {
+                $message = sprintf('Impossible to access an attribute ("%s") on a %s variable ("%s").', $item, \gettype($object), $object);
+            }
+
+            throw new RuntimeError($message, $lineno, $source);
+        }
+    }
+
+    if (!\is_object($object)) {
+        if ($isDefinedTest) {
+            return false;
+        }
+
+        if ($ignoreStrictCheck || !$env->isStrictVariables()) {
+            return;
+        }
+
+        if (null === $object) {
+            $message = sprintf('Impossible to invoke a method ("%s") on a null variable.', $item);
+        } elseif (\is_array($object)) {
+            $message = sprintf('Impossible to invoke a method ("%s") on an array.', $item);
+        } else {
+            $message = sprintf('Impossible to invoke a method ("%s") on a %s variable ("%s").', $item, \gettype($object), $object);
+        }
+
+        throw new RuntimeError($message, $lineno, $source);
+    }
+
+    if ($object instanceof Template) {
+        throw new RuntimeError('Accessing \Twig\Template attributes is forbidden.', $lineno, $source);
+    }
+
+    // object property
+    if (/* Template::METHOD_CALL */ 'method' !== $type) {
+        if (isset($object->$item) || \array_key_exists((string) $item, $object)) {
+            if ($isDefinedTest) {
+                return true;
+            }
+
+            if ($sandboxed) {
+                $env->getExtension(SandboxExtension::class)->checkPropertyAllowed($object, $item, $lineno, $source);
+            }
+
+            return $object->$item;
+        }
+    }
+
+    static $cache = [];
+
+    $class = \get_class($object);
+
+    // object method
+    // precedence: getXxx() > isXxx() > hasXxx()
+    if (!isset($cache[$class])) {
+        $methods = get_class_methods($object);
+        sort($methods);
+        $lcMethods = array_map('strtolower', $methods);
+        $classCache = [];
+        foreach ($methods as $i => $method) {
+            $classCache[$method] = $method;
+            $classCache[$lcName = $lcMethods[$i]] = $method;
+
+            if ('g' === $lcName[0] && 0 === strpos($lcName, 'get')) {
+                $name = substr($method, 3);
+                $lcName = substr($lcName, 3);
+            } elseif ('i' === $lcName[0] && 0 === strpos($lcName, 'is')) {
+                $name = substr($method, 2);
+                $lcName = substr($lcName, 2);
+            } elseif ('h' === $lcName[0] && 0 === strpos($lcName, 'has')) {
+                $name = substr($method, 3);
+                $lcName = substr($lcName, 3);
+                if (\in_array('is'.$lcName, $lcMethods)) {
+                    continue;
+                }
+            } else {
+                continue;
+            }
+
+            // skip get() and is() methods (in which case, $name is empty)
+            if ($name) {
+                if (!isset($classCache[$name])) {
+                    $classCache[$name] = $method;
+                }
+
+                if (!isset($classCache[$lcName])) {
+                    $classCache[$lcName] = $method;
+                }
+            }
+        }
+        $cache[$class] = $classCache;
+    }
+
+    $call = false;
+    if (isset($cache[$class][$item])) {
+        $method = $cache[$class][$item];
+    } elseif (isset($cache[$class][$lcItem = strtolower($item)])) {
+        $method = $cache[$class][$lcItem];
+    } elseif (isset($cache[$class]['__call'])) {
+        $method = $item;
+        $call = true;
+    } else {
+        if ($isDefinedTest) {
+            return false;
+        }
+
+        if ($ignoreStrictCheck || !$env->isStrictVariables()) {
+            return;
+        }
+
+        throw new RuntimeError(sprintf('Neither the property "%1$s" nor one of the methods "%1$s()", "get%1$s()"/"is%1$s()"/"has%1$s()" or "__call()" exist and have public access in class "%2$s".', $item, $class), $lineno, $source);
+    }
+
+    if ($isDefinedTest) {
+        return true;
+    }
+
+    if ($sandboxed) {
+        $env->getExtension(SandboxExtension::class)->checkMethodAllowed($object, $method, $lineno, $source);
+    }
+
+    // Some objects throw exceptions when they have __call, and the method we try
+    // to call is not supported. If ignoreStrictCheck is true, we should return null.
+    try {
+        $ret = $object->$method(...$arguments);
+    } catch (\BadMethodCallException $e) {
+        if ($call && ($ignoreStrictCheck || !$env->isStrictVariables())) {
+            return;
+        }
+        throw $e;
+    }
+
+    return $ret;
+}
+
+/**
+ * Returns the values from a single column in the input array.
+ *
+ * <pre>
+ *  {% set items = [{ 'fruit' : 'apple'}, {'fruit' : 'orange' }] %}
+ *
+ *  {% set fruits = items|column('fruit') %}
+ *
+ *  {# fruits now contains ['apple', 'orange'] #}
+ * </pre>
+ *
+ * @param array|Traversable $array An array
+ * @param mixed             $name  The column name
+ *
+ * @return array The array of values
+ */
+function twig_array_column($array, $name): array
+{
+    if ($array instanceof Traversable) {
+        $array = iterator_to_array($array);
+    } elseif (!\is_array($array)) {
+        throw new RuntimeError(sprintf('The column filter only works with arrays or "Traversable", got "%s" as first argument.', \gettype($array)));
+    }
+
+    return array_column($array, $name);
+}
+
+function twig_array_filter($array, $arrow)
+{
+    if (\is_array($array)) {
+        return array_filter($array, $arrow, \ARRAY_FILTER_USE_BOTH);
+    }
+
+    // the IteratorIterator wrapping is needed as some internal PHP classes are \Traversable but do not implement \Iterator
+    return new \CallbackFilterIterator(new \IteratorIterator($array), $arrow);
+}
+
+function twig_array_map($array, $arrow)
+{
+    $r = [];
+    foreach ($array as $k => $v) {
+        $r[$k] = $arrow($v, $k);
+    }
+
+    return $r;
+}
+
+function twig_array_reduce($array, $arrow, $initial = null)
+{
+    if (!\is_array($array)) {
+        $array = iterator_to_array($array);
+    }
+
+    return array_reduce($array, $arrow, $initial);
+}
 }
diff --git a/vendor/twig/twig/src/Extension/DebugExtension.php b/vendor/twig/twig/src/Extension/DebugExtension.php
index d196850c..2e8510df 100644
--- a/vendor/twig/twig/src/Extension/DebugExtension.php
+++ b/vendor/twig/twig/src/Extension/DebugExtension.php
@@ -1,11 +1,66 @@
 <?php
 
-namespace Twig\Extension;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_Extension_Debug');
+namespace Twig\Extension {
+use Twig\TwigFunction;
 
-if (\false) {
-    class DebugExtension extends \Twig_Extension_Debug
+final class DebugExtension extends AbstractExtension
+{
+    public function getFunctions()
     {
+        // dump is safe if var_dump is overridden by xdebug
+        $isDumpOutputHtmlSafe = \extension_loaded('xdebug')
+            // false means that it was not set (and the default is on) or it explicitly enabled
+            && (false === ini_get('xdebug.overload_var_dump') || ini_get('xdebug.overload_var_dump'))
+            // false means that it was not set (and the default is on) or it explicitly enabled
+            // xdebug.overload_var_dump produces HTML only when html_errors is also enabled
+            && (false === ini_get('html_errors') || ini_get('html_errors'))
+            || 'cli' === \PHP_SAPI
+        ;
+
+        return [
+            new TwigFunction('dump', 'twig_var_dump', ['is_safe' => $isDumpOutputHtmlSafe ? ['html'] : [], 'needs_context' => true, 'needs_environment' => true, 'is_variadic' => true]),
+        ];
+    }
+}
+
+class_alias('Twig\Extension\DebugExtension', 'Twig_Extension_Debug');
+}
+
+namespace {
+use Twig\Environment;
+use Twig\Template;
+use Twig\TemplateWrapper;
+
+function twig_var_dump(Environment $env, $context, ...$vars)
+{
+    if (!$env->isDebug()) {
+        return;
     }
+
+    ob_start();
+
+    if (!$vars) {
+        $vars = [];
+        foreach ($context as $key => $value) {
+            if (!$value instanceof Template && !$value instanceof TemplateWrapper) {
+                $vars[$key] = $value;
+            }
+        }
+
+        var_dump($vars);
+    } else {
+        var_dump(...$vars);
+    }
+
+    return ob_get_clean();
+}
 }
diff --git a/vendor/twig/twig/src/Extension/EscaperExtension.php b/vendor/twig/twig/src/Extension/EscaperExtension.php
index c6d60b5e..b8dabccf 100644
--- a/vendor/twig/twig/src/Extension/EscaperExtension.php
+++ b/vendor/twig/twig/src/Extension/EscaperExtension.php
@@ -1,11 +1,427 @@
 <?php
 
-namespace Twig\Extension;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_Extension_Escaper');
+namespace Twig\Extension {
+use Twig\FileExtensionEscapingStrategy;
+use Twig\NodeVisitor\EscaperNodeVisitor;
+use Twig\TokenParser\AutoEscapeTokenParser;
+use Twig\TwigFilter;
 
-if (\false) {
-    class EscaperExtension extends \Twig_Extension_Escaper
+final class EscaperExtension extends AbstractExtension
+{
+    private $defaultStrategy;
+    private $escapers = [];
+
+    /** @internal */
+    public $safeClasses = [];
+
+    /** @internal */
+    public $safeLookup = [];
+
+    /**
+     * @param string|false|callable $defaultStrategy An escaping strategy
+     *
+     * @see setDefaultStrategy()
+     */
+    public function __construct($defaultStrategy = 'html')
+    {
+        $this->setDefaultStrategy($defaultStrategy);
+    }
+
+    public function getTokenParsers()
+    {
+        return [new AutoEscapeTokenParser()];
+    }
+
+    public function getNodeVisitors()
+    {
+        return [new EscaperNodeVisitor()];
+    }
+
+    public function getFilters()
     {
+        return [
+            new TwigFilter('escape', 'twig_escape_filter', ['needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe']),
+            new TwigFilter('e', 'twig_escape_filter', ['needs_environment' => true, 'is_safe_callback' => 'twig_escape_filter_is_safe']),
+            new TwigFilter('raw', 'twig_raw_filter', ['is_safe' => ['all']]),
+        ];
+    }
+
+    /**
+     * Sets the default strategy to use when not defined by the user.
+     *
+     * The strategy can be a valid PHP callback that takes the template
+     * name as an argument and returns the strategy to use.
+     *
+     * @param string|false|callable $defaultStrategy An escaping strategy
+     */
+    public function setDefaultStrategy($defaultStrategy)
+    {
+        if ('name' === $defaultStrategy) {
+            $defaultStrategy = [FileExtensionEscapingStrategy::class, 'guess'];
+        }
+
+        $this->defaultStrategy = $defaultStrategy;
+    }
+
+    /**
+     * Gets the default strategy to use when not defined by the user.
+     *
+     * @param string $name The template name
+     *
+     * @return string|false The default strategy to use for the template
+     */
+    public function getDefaultStrategy($name)
+    {
+        // disable string callables to avoid calling a function named html or js,
+        // or any other upcoming escaping strategy
+        if (!\is_string($this->defaultStrategy) && false !== $this->defaultStrategy) {
+            return \call_user_func($this->defaultStrategy, $name);
+        }
+
+        return $this->defaultStrategy;
+    }
+
+    /**
+     * Defines a new escaper to be used via the escape filter.
+     *
+     * @param string   $strategy The strategy name that should be used as a strategy in the escape call
+     * @param callable $callable A valid PHP callable
+     */
+    public function setEscaper($strategy, callable $callable)
+    {
+        $this->escapers[$strategy] = $callable;
+    }
+
+    /**
+     * Gets all defined escapers.
+     *
+     * @return callable[] An array of escapers
+     */
+    public function getEscapers()
+    {
+        return $this->escapers;
+    }
+
+    public function setSafeClasses(array $safeClasses = [])
+    {
+        $this->safeClasses = [];
+        $this->safeLookup = [];
+        foreach ($safeClasses as $class => $strategies) {
+            $this->addSafeClass($class, $strategies);
+        }
+    }
+
+    public function addSafeClass(string $class, array $strategies)
+    {
+        $class = ltrim($class, '\\');
+        if (!isset($this->safeClasses[$class])) {
+            $this->safeClasses[$class] = [];
+        }
+        $this->safeClasses[$class] = array_merge($this->safeClasses[$class], $strategies);
+
+        foreach ($strategies as $strategy) {
+            $this->safeLookup[$strategy][$class] = true;
+        }
+    }
+}
+
+class_alias('Twig\Extension\EscaperExtension', 'Twig_Extension_Escaper');
+}
+
+namespace {
+use Twig\Environment;
+use Twig\Error\RuntimeError;
+use Twig\Extension\CoreExtension;
+use Twig\Extension\EscaperExtension;
+use Twig\Markup;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Node;
+
+/**
+ * Marks a variable as being safe.
+ *
+ * @param string $string A PHP variable
+ *
+ * @return string
+ */
+function twig_raw_filter($string)
+{
+    return $string;
+}
+
+/**
+ * Escapes a string.
+ *
+ * @param mixed  $string     The value to be escaped
+ * @param string $strategy   The escaping strategy
+ * @param string $charset    The charset
+ * @param bool   $autoescape Whether the function is called by the auto-escaping feature (true) or by the developer (false)
+ *
+ * @return string
+ */
+function twig_escape_filter(Environment $env, $string, $strategy = 'html', $charset = null, $autoescape = false)
+{
+    if ($autoescape && $string instanceof Markup) {
+        return $string;
+    }
+
+    if (!\is_string($string)) {
+        if (\is_object($string) && method_exists($string, '__toString')) {
+            if ($autoescape) {
+                $c = \get_class($string);
+                $ext = $env->getExtension(EscaperExtension::class);
+                if (!isset($ext->safeClasses[$c])) {
+                    $ext->safeClasses[$c] = [];
+                    foreach (class_parents($string) + class_implements($string) as $class) {
+                        if (isset($ext->safeClasses[$class])) {
+                            $ext->safeClasses[$c] = array_unique(array_merge($ext->safeClasses[$c], $ext->safeClasses[$class]));
+                            foreach ($ext->safeClasses[$class] as $s) {
+                                $ext->safeLookup[$s][$c] = true;
+                            }
+                        }
+                    }
+                }
+                if (isset($ext->safeLookup[$strategy][$c]) || isset($ext->safeLookup['all'][$c])) {
+                    return (string) $string;
+                }
+            }
+
+            $string = (string) $string;
+        } elseif (\in_array($strategy, ['html', 'js', 'css', 'html_attr', 'url'])) {
+            return $string;
+        }
+    }
+
+    if ('' === $string) {
+        return '';
+    }
+
+    if (null === $charset) {
+        $charset = $env->getCharset();
     }
+
+    switch ($strategy) {
+        case 'html':
+            // see https://secure.php.net/htmlspecialchars
+
+            // Using a static variable to avoid initializing the array
+            // each time the function is called. Moving the declaration on the
+            // top of the function slow downs other escaping strategies.
+            static $htmlspecialcharsCharsets = [
+                'ISO-8859-1' => true, 'ISO8859-1' => true,
+                'ISO-8859-15' => true, 'ISO8859-15' => true,
+                'utf-8' => true, 'UTF-8' => true,
+                'CP866' => true, 'IBM866' => true, '866' => true,
+                'CP1251' => true, 'WINDOWS-1251' => true, 'WIN-1251' => true,
+                '1251' => true,
+                'CP1252' => true, 'WINDOWS-1252' => true, '1252' => true,
+                'KOI8-R' => true, 'KOI8-RU' => true, 'KOI8R' => true,
+                'BIG5' => true, '950' => true,
+                'GB2312' => true, '936' => true,
+                'BIG5-HKSCS' => true,
+                'SHIFT_JIS' => true, 'SJIS' => true, '932' => true,
+                'EUC-JP' => true, 'EUCJP' => true,
+                'ISO8859-5' => true, 'ISO-8859-5' => true, 'MACROMAN' => true,
+            ];
+
+            if (isset($htmlspecialcharsCharsets[$charset])) {
+                return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
+            }
+
+            if (isset($htmlspecialcharsCharsets[strtoupper($charset)])) {
+                // cache the lowercase variant for future iterations
+                $htmlspecialcharsCharsets[$charset] = true;
+
+                return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, $charset);
+            }
+
+            $string = iconv($charset, 'UTF-8', $string);
+            $string = htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
+
+            return iconv('UTF-8', $charset, $string);
+
+        case 'js':
+            // escape all non-alphanumeric characters
+            // into their \x or \uHHHH representations
+            if ('UTF-8' !== $charset) {
+                $string = iconv($charset, 'UTF-8', $string);
+            }
+
+            if (!preg_match('//u', $string)) {
+                throw new RuntimeError('The string to escape is not a valid UTF-8 string.');
+            }
+
+            $string = preg_replace_callback('#[^a-zA-Z0-9,\._]#Su', function ($matches) {
+                $char = $matches[0];
+
+                /*
+                 * A few characters have short escape sequences in JSON and JavaScript.
+                 * Escape sequences supported only by JavaScript, not JSON, are ommitted.
+                 * \" is also supported but omitted, because the resulting string is not HTML safe.
+                 */
+                static $shortMap = [
+                    '\\' => '\\\\',
+                    '/' => '\\/',
+                    "\x08" => '\b',
+                    "\x0C" => '\f',
+                    "\x0A" => '\n',
+                    "\x0D" => '\r',
+                    "\x09" => '\t',
+                ];
+
+                if (isset($shortMap[$char])) {
+                    return $shortMap[$char];
+                }
+
+                // \uHHHH
+                $char = twig_convert_encoding($char, 'UTF-16BE', 'UTF-8');
+                $char = strtoupper(bin2hex($char));
+
+                if (4 >= \strlen($char)) {
+                    return sprintf('\u%04s', $char);
+                }
+
+                return sprintf('\u%04s\u%04s', substr($char, 0, -4), substr($char, -4));
+            }, $string);
+
+            if ('UTF-8' !== $charset) {
+                $string = iconv('UTF-8', $charset, $string);
+            }
+
+            return $string;
+
+        case 'css':
+            if ('UTF-8' !== $charset) {
+                $string = iconv($charset, 'UTF-8', $string);
+            }
+
+            if (!preg_match('//u', $string)) {
+                throw new RuntimeError('The string to escape is not a valid UTF-8 string.');
+            }
+
+            $string = preg_replace_callback('#[^a-zA-Z0-9]#Su', function ($matches) {
+                $char = $matches[0];
+
+                return sprintf('\\%X ', 1 === \strlen($char) ? \ord($char) : mb_ord($char, 'UTF-8'));
+            }, $string);
+
+            if ('UTF-8' !== $charset) {
+                $string = iconv('UTF-8', $charset, $string);
+            }
+
+            return $string;
+
+        case 'html_attr':
+            if ('UTF-8' !== $charset) {
+                $string = iconv($charset, 'UTF-8', $string);
+            }
+
+            if (!preg_match('//u', $string)) {
+                throw new RuntimeError('The string to escape is not a valid UTF-8 string.');
+            }
+
+            $string = preg_replace_callback('#[^a-zA-Z0-9,\.\-_]#Su', function ($matches) {
+                /**
+                 * This function is adapted from code coming from Zend Framework.
+                 *
+                 * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (https://www.zend.com)
+                 * @license   https://framework.zend.com/license/new-bsd New BSD License
+                 */
+                $chr = $matches[0];
+                $ord = \ord($chr);
+
+                /*
+                 * The following replaces characters undefined in HTML with the
+                 * hex entity for the Unicode replacement character.
+                 */
+                if (($ord <= 0x1f && "\t" != $chr && "\n" != $chr && "\r" != $chr) || ($ord >= 0x7f && $ord <= 0x9f)) {
+                    return '&#xFFFD;';
+                }
+
+                /*
+                 * Check if the current character to escape has a name entity we should
+                 * replace it with while grabbing the hex value of the character.
+                 */
+                if (1 === \strlen($chr)) {
+                    /*
+                     * While HTML supports far more named entities, the lowest common denominator
+                     * has become HTML5's XML Serialisation which is restricted to the those named
+                     * entities that XML supports. Using HTML entities would result in this error:
+                     *     XML Parsing Error: undefined entity
+                     */
+                    static $entityMap = [
+                        34 => '&quot;', /* quotation mark */
+                        38 => '&amp;',  /* ampersand */
+                        60 => '&lt;',   /* less-than sign */
+                        62 => '&gt;',   /* greater-than sign */
+                    ];
+
+                    if (isset($entityMap[$ord])) {
+                        return $entityMap[$ord];
+                    }
+
+                    return sprintf('&#x%02X;', $ord);
+                }
+
+                /*
+                 * Per OWASP recommendations, we'll use hex entities for any other
+                 * characters where a named entity does not exist.
+                 */
+                return sprintf('&#x%04X;', mb_ord($chr, 'UTF-8'));
+            }, $string);
+
+            if ('UTF-8' !== $charset) {
+                $string = iconv('UTF-8', $charset, $string);
+            }
+
+            return $string;
+
+        case 'url':
+            return rawurlencode($string);
+
+        default:
+            static $escapers;
+
+            if (null === $escapers) {
+                // merge the ones set on CoreExtension for BC (to be removed in 3.0)
+                $escapers = array_merge(
+                    $env->getExtension(CoreExtension::class)->getEscapers(false),
+                    $env->getExtension(EscaperExtension::class)->getEscapers()
+                );
+            }
+
+            if (isset($escapers[$strategy])) {
+                return $escapers[$strategy]($env, $string, $charset);
+            }
+
+            $validStrategies = implode(', ', array_merge(['html', 'js', 'url', 'css', 'html_attr'], array_keys($escapers)));
+
+            throw new RuntimeError(sprintf('Invalid escaping strategy "%s" (valid ones: %s).', $strategy, $validStrategies));
+    }
+}
+
+/**
+ * @internal
+ */
+function twig_escape_filter_is_safe(Node $filterArgs)
+{
+    foreach ($filterArgs as $arg) {
+        if ($arg instanceof ConstantExpression) {
+            return [$arg->getAttribute('value')];
+        }
+
+        return [];
+    }
+
+    return ['html'];
+}
 }
diff --git a/vendor/twig/twig/src/Extension/ExtensionInterface.php b/vendor/twig/twig/src/Extension/ExtensionInterface.php
index 0a1d502e..a0832112 100644
--- a/vendor/twig/twig/src/Extension/ExtensionInterface.php
+++ b/vendor/twig/twig/src/Extension/ExtensionInterface.php
@@ -1,11 +1,73 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Extension;
 
-class_exists('Twig_ExtensionInterface');
+use Twig\NodeVisitor\NodeVisitorInterface;
+use Twig\TokenParser\TokenParserInterface;
+use Twig\TwigFilter;
+use Twig\TwigFunction;
+use Twig\TwigTest;
+
+/**
+ * Interface implemented by extension classes.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+interface ExtensionInterface
+{
+    /**
+     * Returns the token parser instances to add to the existing list.
+     *
+     * @return TokenParserInterface[]
+     */
+    public function getTokenParsers();
+
+    /**
+     * Returns the node visitor instances to add to the existing list.
+     *
+     * @return NodeVisitorInterface[]
+     */
+    public function getNodeVisitors();
+
+    /**
+     * Returns a list of filters to add to the existing list.
+     *
+     * @return TwigFilter[]
+     */
+    public function getFilters();
 
-if (\false) {
-    interface ExtensionInterface extends \Twig_ExtensionInterface
-    {
-    }
+    /**
+     * Returns a list of tests to add to the existing list.
+     *
+     * @return TwigTest[]
+     */
+    public function getTests();
+
+    /**
+     * Returns a list of functions to add to the existing list.
+     *
+     * @return TwigFunction[]
+     */
+    public function getFunctions();
+
+    /**
+     * Returns a list of operators to add to the existing list.
+     *
+     * @return array<array> First array of unary operators, second array of binary operators
+     */
+    public function getOperators();
 }
+
+class_alias('Twig\Extension\ExtensionInterface', 'Twig_ExtensionInterface');
+
+// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name.
+class_exists('Twig\Environment');
diff --git a/vendor/twig/twig/src/Extension/GlobalsInterface.php b/vendor/twig/twig/src/Extension/GlobalsInterface.php
index 024f314d..4421271b 100644
--- a/vendor/twig/twig/src/Extension/GlobalsInterface.php
+++ b/vendor/twig/twig/src/Extension/GlobalsInterface.php
@@ -1,11 +1,32 @@
 <?php
 
-namespace Twig\Extension;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_Extension_GlobalsInterface');
+namespace Twig\Extension;
 
-if (\false) {
-    interface GlobalsInterface extends \Twig_Extension_ExtensionInterface
-    {
-    }
+/**
+ * Enables usage of the deprecated Twig\Extension\AbstractExtension::getGlobals() method.
+ *
+ * Explicitly implement this interface if you really need to implement the
+ * deprecated getGlobals() method in your extensions.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+interface GlobalsInterface
+{
+    /**
+     * Returns a list of global variables to add to the existing list.
+     *
+     * @return array An array of global variables
+     */
+    public function getGlobals();
 }
+
+class_alias('Twig\Extension\GlobalsInterface', 'Twig_Extension_GlobalsInterface');
diff --git a/vendor/twig/twig/src/Extension/InitRuntimeInterface.php b/vendor/twig/twig/src/Extension/InitRuntimeInterface.php
index b7a2e300..d64d3cd1 100644
--- a/vendor/twig/twig/src/Extension/InitRuntimeInterface.php
+++ b/vendor/twig/twig/src/Extension/InitRuntimeInterface.php
@@ -1,11 +1,36 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Extension;
 
-class_exists('Twig_Extension_InitRuntimeInterface');
+use Twig\Environment;
 
-if (\false) {
-    interface InitRuntimeInterface extends \Twig_Extension_InitRuntimeInterface
-    {
-    }
+/**
+ * Enables usage of the deprecated Twig\Extension\AbstractExtension::initRuntime() method.
+ *
+ * Explicitly implement this interface if you really need to implement the
+ * deprecated initRuntime() method in your extensions.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @deprecated since Twig 2.7, to be removed in 3.0
+ */
+interface InitRuntimeInterface
+{
+    /**
+     * Initializes the runtime environment.
+     *
+     * This is where you can load some file that contains filter functions for instance.
+     */
+    public function initRuntime(Environment $environment);
 }
+
+class_alias('Twig\Extension\InitRuntimeInterface', 'Twig_Extension_InitRuntimeInterface');
diff --git a/vendor/twig/twig/src/Extension/OptimizerExtension.php b/vendor/twig/twig/src/Extension/OptimizerExtension.php
index 5aa6ea34..9552b358 100644
--- a/vendor/twig/twig/src/Extension/OptimizerExtension.php
+++ b/vendor/twig/twig/src/Extension/OptimizerExtension.php
@@ -1,11 +1,31 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Extension;
 
-class_exists('Twig_Extension_Optimizer');
+use Twig\NodeVisitor\OptimizerNodeVisitor;
+
+final class OptimizerExtension extends AbstractExtension
+{
+    private $optimizers;
+
+    public function __construct($optimizers = -1)
+    {
+        $this->optimizers = $optimizers;
+    }
 
-if (\false) {
-    class OptimizerExtension extends \Twig_Extension_Optimizer
+    public function getNodeVisitors()
     {
+        return [new OptimizerNodeVisitor($this->optimizers)];
     }
 }
+
+class_alias('Twig\Extension\OptimizerExtension', 'Twig_Extension_Optimizer');
diff --git a/vendor/twig/twig/src/Extension/ProfilerExtension.php b/vendor/twig/twig/src/Extension/ProfilerExtension.php
index 58fb5bc8..ca5367c4 100644
--- a/vendor/twig/twig/src/Extension/ProfilerExtension.php
+++ b/vendor/twig/twig/src/Extension/ProfilerExtension.php
@@ -1,11 +1,48 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Extension;
 
-class_exists('Twig_Extension_Profiler');
+use Twig\Profiler\NodeVisitor\ProfilerNodeVisitor;
+use Twig\Profiler\Profile;
+
+class ProfilerExtension extends AbstractExtension
+{
+    private $actives = [];
 
-if (\false) {
-    class ProfilerExtension extends \Twig_Extension_Profiler
+    public function __construct(Profile $profile)
     {
+        $this->actives[] = $profile;
+    }
+
+    public function enter(Profile $profile)
+    {
+        $this->actives[0]->addProfile($profile);
+        array_unshift($this->actives, $profile);
+    }
+
+    public function leave(Profile $profile)
+    {
+        $profile->leave();
+        array_shift($this->actives);
+
+        if (1 === \count($this->actives)) {
+            $this->actives[0]->leave();
+        }
+    }
+
+    public function getNodeVisitors()
+    {
+        return [new ProfilerNodeVisitor(\get_class($this))];
     }
 }
+
+class_alias('Twig\Extension\ProfilerExtension', 'Twig_Extension_Profiler');
diff --git a/vendor/twig/twig/src/Extension/SandboxExtension.php b/vendor/twig/twig/src/Extension/SandboxExtension.php
index 0c244ffc..d16e4edd 100644
--- a/vendor/twig/twig/src/Extension/SandboxExtension.php
+++ b/vendor/twig/twig/src/Extension/SandboxExtension.php
@@ -1,11 +1,125 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Extension;
 
-class_exists('Twig_Extension_Sandbox');
+use Twig\NodeVisitor\SandboxNodeVisitor;
+use Twig\Sandbox\SecurityNotAllowedMethodError;
+use Twig\Sandbox\SecurityNotAllowedPropertyError;
+use Twig\Sandbox\SecurityPolicyInterface;
+use Twig\Source;
+use Twig\TokenParser\SandboxTokenParser;
+
+final class SandboxExtension extends AbstractExtension
+{
+    private $sandboxedGlobally;
+    private $sandboxed;
+    private $policy;
+
+    public function __construct(SecurityPolicyInterface $policy, $sandboxed = false)
+    {
+        $this->policy = $policy;
+        $this->sandboxedGlobally = $sandboxed;
+    }
+
+    public function getTokenParsers()
+    {
+        return [new SandboxTokenParser()];
+    }
+
+    public function getNodeVisitors()
+    {
+        return [new SandboxNodeVisitor()];
+    }
+
+    public function enableSandbox()
+    {
+        $this->sandboxed = true;
+    }
+
+    public function disableSandbox()
+    {
+        $this->sandboxed = false;
+    }
 
-if (\false) {
-    class SandboxExtension extends \Twig_Extension_Sandbox
+    public function isSandboxed()
     {
+        return $this->sandboxedGlobally || $this->sandboxed;
+    }
+
+    public function isSandboxedGlobally()
+    {
+        return $this->sandboxedGlobally;
+    }
+
+    public function setSecurityPolicy(SecurityPolicyInterface $policy)
+    {
+        $this->policy = $policy;
+    }
+
+    public function getSecurityPolicy()
+    {
+        return $this->policy;
+    }
+
+    public function checkSecurity($tags, $filters, $functions)
+    {
+        if ($this->isSandboxed()) {
+            $this->policy->checkSecurity($tags, $filters, $functions);
+        }
+    }
+
+    public function checkMethodAllowed($obj, $method, int $lineno = -1, Source $source = null)
+    {
+        if ($this->isSandboxed()) {
+            try {
+                $this->policy->checkMethodAllowed($obj, $method);
+            } catch (SecurityNotAllowedMethodError $e) {
+                $e->setSourceContext($source);
+                $e->setTemplateLine($lineno);
+
+                throw $e;
+            }
+        }
+    }
+
+    public function checkPropertyAllowed($obj, $method, int $lineno = -1, Source $source = null)
+    {
+        if ($this->isSandboxed()) {
+            try {
+                $this->policy->checkPropertyAllowed($obj, $method);
+            } catch (SecurityNotAllowedPropertyError $e) {
+                $e->setSourceContext($source);
+                $e->setTemplateLine($lineno);
+
+                throw $e;
+            }
+        }
+    }
+
+    public function ensureToStringAllowed($obj, int $lineno = -1, Source $source = null)
+    {
+        if ($this->isSandboxed() && \is_object($obj) && method_exists($obj, '__toString')) {
+            try {
+                $this->policy->checkMethodAllowed($obj, '__toString');
+            } catch (SecurityNotAllowedMethodError $e) {
+                $e->setSourceContext($source);
+                $e->setTemplateLine($lineno);
+
+                throw $e;
+            }
+        }
+
+        return $obj;
     }
 }
+
+class_alias('Twig\Extension\SandboxExtension', 'Twig_Extension_Sandbox');
diff --git a/vendor/twig/twig/src/Extension/StagingExtension.php b/vendor/twig/twig/src/Extension/StagingExtension.php
index 62016fae..7c0c26c8 100644
--- a/vendor/twig/twig/src/Extension/StagingExtension.php
+++ b/vendor/twig/twig/src/Extension/StagingExtension.php
@@ -1,11 +1,102 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Extension;
 
-class_exists('Twig_Extension_Staging');
+use Twig\NodeVisitor\NodeVisitorInterface;
+use Twig\TokenParser\TokenParserInterface;
+use Twig\TwigFilter;
+use Twig\TwigFunction;
+use Twig\TwigTest;
+
+/**
+ * Used by \Twig\Environment as a staging area.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @internal
+ */
+final class StagingExtension extends AbstractExtension
+{
+    private $functions = [];
+    private $filters = [];
+    private $visitors = [];
+    private $tokenParsers = [];
+    private $tests = [];
+
+    public function addFunction(TwigFunction $function)
+    {
+        if (isset($this->functions[$function->getName()])) {
+            throw new \LogicException(sprintf('Function "%s" is already registered.', $function->getName()));
+        }
+
+        $this->functions[$function->getName()] = $function;
+    }
+
+    public function getFunctions()
+    {
+        return $this->functions;
+    }
+
+    public function addFilter(TwigFilter $filter)
+    {
+        if (isset($this->filters[$filter->getName()])) {
+            throw new \LogicException(sprintf('Filter "%s" is already registered.', $filter->getName()));
+        }
+
+        $this->filters[$filter->getName()] = $filter;
+    }
+
+    public function getFilters()
+    {
+        return $this->filters;
+    }
+
+    public function addNodeVisitor(NodeVisitorInterface $visitor)
+    {
+        $this->visitors[] = $visitor;
+    }
+
+    public function getNodeVisitors()
+    {
+        return $this->visitors;
+    }
+
+    public function addTokenParser(TokenParserInterface $parser)
+    {
+        if (isset($this->tokenParsers[$parser->getTag()])) {
+            throw new \LogicException(sprintf('Tag "%s" is already registered.', $parser->getTag()));
+        }
+
+        $this->tokenParsers[$parser->getTag()] = $parser;
+    }
 
-if (\false) {
-    class StagingExtension extends \Twig_Extension_Staging
+    public function getTokenParsers()
     {
+        return $this->tokenParsers;
+    }
+
+    public function addTest(TwigTest $test)
+    {
+        if (isset($this->tests[$test->getName()])) {
+            throw new \LogicException(sprintf('Test "%s" is already registered.', $test->getName()));
+        }
+
+        $this->tests[$test->getName()] = $test;
+    }
+
+    public function getTests()
+    {
+        return $this->tests;
     }
 }
+
+class_alias('Twig\Extension\StagingExtension', 'Twig_Extension_Staging');
diff --git a/vendor/twig/twig/src/Extension/StringLoaderExtension.php b/vendor/twig/twig/src/Extension/StringLoaderExtension.php
index 0474432d..d6718620 100644
--- a/vendor/twig/twig/src/Extension/StringLoaderExtension.php
+++ b/vendor/twig/twig/src/Extension/StringLoaderExtension.php
@@ -1,11 +1,46 @@
 <?php
 
-namespace Twig\Extension;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_Extension_StringLoader');
+namespace Twig\Extension {
+use Twig\TwigFunction;
 
-if (\false) {
-    class StringLoaderExtension extends \Twig_Extension_StringLoader
+final class StringLoaderExtension extends AbstractExtension
+{
+    public function getFunctions()
     {
+        return [
+            new TwigFunction('template_from_string', 'twig_template_from_string', ['needs_environment' => true]),
+        ];
     }
 }
+
+class_alias('Twig\Extension\StringLoaderExtension', 'Twig_Extension_StringLoader');
+}
+
+namespace {
+use Twig\Environment;
+use Twig\TemplateWrapper;
+
+/**
+ * Loads a template from a string.
+ *
+ *     {{ include(template_from_string("Hello {{ name }}")) }}
+ *
+ * @param string $template A template as a string or object implementing __toString()
+ * @param string $name     An optional name of the template to be used in error messages
+ *
+ * @return TemplateWrapper
+ */
+function twig_template_from_string(Environment $env, $template, string $name = null)
+{
+    return $env->createTemplate((string) $template, $name);
+}
+}
diff --git a/vendor/twig/twig/src/ExtensionSet.php b/vendor/twig/twig/src/ExtensionSet.php
new file mode 100644
index 00000000..dc25b133
--- /dev/null
+++ b/vendor/twig/twig/src/ExtensionSet.php
@@ -0,0 +1,477 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Twig;
+
+use Twig\Error\RuntimeError;
+use Twig\Extension\ExtensionInterface;
+use Twig\Extension\GlobalsInterface;
+use Twig\Extension\InitRuntimeInterface;
+use Twig\Extension\StagingExtension;
+use Twig\NodeVisitor\NodeVisitorInterface;
+use Twig\TokenParser\TokenParserInterface;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @internal
+ */
+final class ExtensionSet
+{
+    private $extensions;
+    private $initialized = false;
+    private $runtimeInitialized = false;
+    private $staging;
+    private $parsers;
+    private $visitors;
+    private $filters;
+    private $tests;
+    private $functions;
+    private $unaryOperators;
+    private $binaryOperators;
+    private $globals;
+    private $functionCallbacks = [];
+    private $filterCallbacks = [];
+    private $lastModified = 0;
+
+    public function __construct()
+    {
+        $this->staging = new StagingExtension();
+    }
+
+    /**
+     * Initializes the runtime environment.
+     *
+     * @deprecated since Twig 2.7
+     */
+    public function initRuntime(Environment $env)
+    {
+        if ($this->runtimeInitialized) {
+            return;
+        }
+
+        $this->runtimeInitialized = true;
+
+        foreach ($this->extensions as $extension) {
+            if ($extension instanceof InitRuntimeInterface) {
+                $extension->initRuntime($env);
+            }
+        }
+    }
+
+    public function hasExtension(string $class): bool
+    {
+        $class = ltrim($class, '\\');
+        if (!isset($this->extensions[$class]) && class_exists($class, false)) {
+            // For BC/FC with namespaced aliases
+            $class = (new \ReflectionClass($class))->name;
+        }
+
+        return isset($this->extensions[$class]);
+    }
+
+    public function getExtension(string $class): ExtensionInterface
+    {
+        $class = ltrim($class, '\\');
+        if (!isset($this->extensions[$class]) && class_exists($class, false)) {
+            // For BC/FC with namespaced aliases
+            $class = (new \ReflectionClass($class))->name;
+        }
+
+        if (!isset($this->extensions[$class])) {
+            throw new RuntimeError(sprintf('The "%s" extension is not enabled.', $class));
+        }
+
+        return $this->extensions[$class];
+    }
+
+    /**
+     * @param ExtensionInterface[] $extensions
+     */
+    public function setExtensions(array $extensions)
+    {
+        foreach ($extensions as $extension) {
+            $this->addExtension($extension);
+        }
+    }
+
+    /**
+     * @return ExtensionInterface[]
+     */
+    public function getExtensions(): array
+    {
+        return $this->extensions;
+    }
+
+    public function getSignature(): string
+    {
+        return json_encode(array_keys($this->extensions));
+    }
+
+    public function isInitialized(): bool
+    {
+        return $this->initialized || $this->runtimeInitialized;
+    }
+
+    public function getLastModified(): int
+    {
+        if (0 !== $this->lastModified) {
+            return $this->lastModified;
+        }
+
+        foreach ($this->extensions as $extension) {
+            $r = new \ReflectionObject($extension);
+            if (file_exists($r->getFileName()) && ($extensionTime = filemtime($r->getFileName())) > $this->lastModified) {
+                $this->lastModified = $extensionTime;
+            }
+        }
+
+        return $this->lastModified;
+    }
+
+    public function addExtension(ExtensionInterface $extension)
+    {
+        $class = \get_class($extension);
+
+        if ($this->initialized) {
+            throw new \LogicException(sprintf('Unable to register extension "%s" as extensions have already been initialized.', $class));
+        }
+
+        if (isset($this->extensions[$class])) {
+            throw new \LogicException(sprintf('Unable to register extension "%s" as it is already registered.', $class));
+        }
+
+        // For BC/FC with namespaced aliases
+        $class = (new \ReflectionClass($class))->name;
+        $this->extensions[$class] = $extension;
+    }
+
+    public function addFunction(TwigFunction $function)
+    {
+        if ($this->initialized) {
+            throw new \LogicException(sprintf('Unable to add function "%s" as extensions have already been initialized.', $function->getName()));
+        }
+
+        $this->staging->addFunction($function);
+    }
+
+    /**
+     * @return TwigFunction[]
+     */
+    public function getFunctions(): array
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        return $this->functions;
+    }
+
+    /**
+     * @return TwigFunction|false
+     */
+    public function getFunction(string $name)
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        if (isset($this->functions[$name])) {
+            return $this->functions[$name];
+        }
+
+        foreach ($this->functions as $pattern => $function) {
+            $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
+
+            if ($count && preg_match('#^'.$pattern.'$#', $name, $matches)) {
+                array_shift($matches);
+                $function->setArguments($matches);
+
+                return $function;
+            }
+        }
+
+        foreach ($this->functionCallbacks as $callback) {
+            if (false !== $function = $callback($name)) {
+                return $function;
+            }
+        }
+
+        return false;
+    }
+
+    public function registerUndefinedFunctionCallback(callable $callable)
+    {
+        $this->functionCallbacks[] = $callable;
+    }
+
+    public function addFilter(TwigFilter $filter)
+    {
+        if ($this->initialized) {
+            throw new \LogicException(sprintf('Unable to add filter "%s" as extensions have already been initialized.', $filter->getName()));
+        }
+
+        $this->staging->addFilter($filter);
+    }
+
+    /**
+     * @return TwigFilter[]
+     */
+    public function getFilters(): array
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        return $this->filters;
+    }
+
+    /**
+     * @return TwigFilter|false
+     */
+    public function getFilter(string $name)
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        if (isset($this->filters[$name])) {
+            return $this->filters[$name];
+        }
+
+        foreach ($this->filters as $pattern => $filter) {
+            $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
+
+            if ($count && preg_match('#^'.$pattern.'$#', $name, $matches)) {
+                array_shift($matches);
+                $filter->setArguments($matches);
+
+                return $filter;
+            }
+        }
+
+        foreach ($this->filterCallbacks as $callback) {
+            if (false !== $filter = $callback($name)) {
+                return $filter;
+            }
+        }
+
+        return false;
+    }
+
+    public function registerUndefinedFilterCallback(callable $callable)
+    {
+        $this->filterCallbacks[] = $callable;
+    }
+
+    public function addNodeVisitor(NodeVisitorInterface $visitor)
+    {
+        if ($this->initialized) {
+            throw new \LogicException('Unable to add a node visitor as extensions have already been initialized.');
+        }
+
+        $this->staging->addNodeVisitor($visitor);
+    }
+
+    /**
+     * @return NodeVisitorInterface[]
+     */
+    public function getNodeVisitors(): array
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        return $this->visitors;
+    }
+
+    public function addTokenParser(TokenParserInterface $parser)
+    {
+        if ($this->initialized) {
+            throw new \LogicException('Unable to add a token parser as extensions have already been initialized.');
+        }
+
+        $this->staging->addTokenParser($parser);
+    }
+
+    /**
+     * @return TokenParserInterface[]
+     */
+    public function getTokenParsers(): array
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        return $this->parsers;
+    }
+
+    public function getGlobals(): array
+    {
+        if (null !== $this->globals) {
+            return $this->globals;
+        }
+
+        $globals = [];
+        foreach ($this->extensions as $extension) {
+            if (!$extension instanceof GlobalsInterface) {
+                continue;
+            }
+
+            $extGlobals = $extension->getGlobals();
+            if (!\is_array($extGlobals)) {
+                throw new \UnexpectedValueException(sprintf('"%s::getGlobals()" must return an array of globals.', \get_class($extension)));
+            }
+
+            $globals = array_merge($globals, $extGlobals);
+        }
+
+        if ($this->initialized) {
+            $this->globals = $globals;
+        }
+
+        return $globals;
+    }
+
+    public function addTest(TwigTest $test)
+    {
+        if ($this->initialized) {
+            throw new \LogicException(sprintf('Unable to add test "%s" as extensions have already been initialized.', $test->getName()));
+        }
+
+        $this->staging->addTest($test);
+    }
+
+    /**
+     * @return TwigTest[]
+     */
+    public function getTests(): array
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        return $this->tests;
+    }
+
+    /**
+     * @return TwigTest|false
+     */
+    public function getTest(string $name)
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        if (isset($this->tests[$name])) {
+            return $this->tests[$name];
+        }
+
+        foreach ($this->tests as $pattern => $test) {
+            $pattern = str_replace('\\*', '(.*?)', preg_quote($pattern, '#'), $count);
+
+            if ($count) {
+                if (preg_match('#^'.$pattern.'$#', $name, $matches)) {
+                    array_shift($matches);
+                    $test->setArguments($matches);
+
+                    return $test;
+                }
+            }
+        }
+
+        return false;
+    }
+
+    public function getUnaryOperators(): array
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        return $this->unaryOperators;
+    }
+
+    public function getBinaryOperators(): array
+    {
+        if (!$this->initialized) {
+            $this->initExtensions();
+        }
+
+        return $this->binaryOperators;
+    }
+
+    private function initExtensions()
+    {
+        $this->parsers = [];
+        $this->filters = [];
+        $this->functions = [];
+        $this->tests = [];
+        $this->visitors = [];
+        $this->unaryOperators = [];
+        $this->binaryOperators = [];
+
+        foreach ($this->extensions as $extension) {
+            $this->initExtension($extension);
+        }
+        $this->initExtension($this->staging);
+        // Done at the end only, so that an exception during initialization does not mark the environment as initialized when catching the exception
+        $this->initialized = true;
+    }
+
+    private function initExtension(ExtensionInterface $extension)
+    {
+        // filters
+        foreach ($extension->getFilters() as $filter) {
+            $this->filters[$filter->getName()] = $filter;
+        }
+
+        // functions
+        foreach ($extension->getFunctions() as $function) {
+            $this->functions[$function->getName()] = $function;
+        }
+
+        // tests
+        foreach ($extension->getTests() as $test) {
+            $this->tests[$test->getName()] = $test;
+        }
+
+        // token parsers
+        foreach ($extension->getTokenParsers() as $parser) {
+            if (!$parser instanceof TokenParserInterface) {
+                throw new \LogicException('getTokenParsers() must return an array of \Twig\TokenParser\TokenParserInterface.');
+            }
+
+            $this->parsers[] = $parser;
+        }
+
+        // node visitors
+        foreach ($extension->getNodeVisitors() as $visitor) {
+            $this->visitors[] = $visitor;
+        }
+
+        // operators
+        if ($operators = $extension->getOperators()) {
+            if (!\is_array($operators)) {
+                throw new \InvalidArgumentException(sprintf('"%s::getOperators()" must return an array with operators, got "%s".', \get_class($extension), \is_object($operators) ? \get_class($operators) : \gettype($operators).(\is_resource($operators) ? '' : '#'.$operators)));
+            }
+
+            if (2 !== \count($operators)) {
+                throw new \InvalidArgumentException(sprintf('"%s::getOperators()" must return an array of 2 elements, got %d.', \get_class($extension), \count($operators)));
+            }
+
+            $this->unaryOperators = array_merge($this->unaryOperators, $operators[0]);
+            $this->binaryOperators = array_merge($this->binaryOperators, $operators[1]);
+        }
+    }
+}
+
+class_alias('Twig\ExtensionSet', 'Twig_ExtensionSet');
diff --git a/vendor/twig/twig/src/FileExtensionEscapingStrategy.php b/vendor/twig/twig/src/FileExtensionEscapingStrategy.php
index 189f8132..bc95f334 100644
--- a/vendor/twig/twig/src/FileExtensionEscapingStrategy.php
+++ b/vendor/twig/twig/src/FileExtensionEscapingStrategy.php
@@ -1,11 +1,62 @@
 <?php
 
-namespace Twig;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_FileExtensionEscapingStrategy');
+namespace Twig;
 
-if (\false) {
-    class FileExtensionEscapingStrategy extends \Twig_FileExtensionEscapingStrategy
+/**
+ * Default autoescaping strategy based on file names.
+ *
+ * This strategy sets the HTML as the default autoescaping strategy,
+ * but changes it based on the template name.
+ *
+ * Note that there is no runtime performance impact as the
+ * default autoescaping strategy is set at compilation time.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class FileExtensionEscapingStrategy
+{
+    /**
+     * Guesses the best autoescaping strategy based on the file name.
+     *
+     * @param string $name The template name
+     *
+     * @return string|false The escaping strategy name to use or false to disable
+     */
+    public static function guess($name)
     {
+        if (\in_array(substr($name, -1), ['/', '\\'])) {
+            return 'html'; // return html for directories
+        }
+
+        if ('.twig' === substr($name, -5)) {
+            $name = substr($name, 0, -5);
+        }
+
+        $extension = pathinfo($name, PATHINFO_EXTENSION);
+
+        switch ($extension) {
+            case 'js':
+                return 'js';
+
+            case 'css':
+                return 'css';
+
+            case 'txt':
+                return false;
+
+            default:
+                return 'html';
+        }
     }
 }
+
+class_alias('Twig\FileExtensionEscapingStrategy', 'Twig_FileExtensionEscapingStrategy');
diff --git a/vendor/twig/twig/src/Lexer.php b/vendor/twig/twig/src/Lexer.php
index f141afe6..8bcd0f87 100644
--- a/vendor/twig/twig/src/Lexer.php
+++ b/vendor/twig/twig/src/Lexer.php
@@ -1,11 +1,501 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_Lexer');
+use Twig\Error\SyntaxError;
+
+/**
+ * Lexes a template string.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class Lexer
+{
+    private $tokens;
+    private $code;
+    private $cursor;
+    private $lineno;
+    private $end;
+    private $state;
+    private $states;
+    private $brackets;
+    private $env;
+    private $source;
+    private $options;
+    private $regexes;
+    private $position;
+    private $positions;
+    private $currentVarBlockLine;
+
+    const STATE_DATA = 0;
+    const STATE_BLOCK = 1;
+    const STATE_VAR = 2;
+    const STATE_STRING = 3;
+    const STATE_INTERPOLATION = 4;
+
+    const REGEX_NAME = '/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/A';
+    const REGEX_NUMBER = '/[0-9]+(?:\.[0-9]+)?/A';
+    const REGEX_STRING = '/"([^#"\\\\]*(?:\\\\.[^#"\\\\]*)*)"|\'([^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'/As';
+    const REGEX_DQ_STRING_DELIM = '/"/A';
+    const REGEX_DQ_STRING_PART = '/[^#"\\\\]*(?:(?:\\\\.|#(?!\{))[^#"\\\\]*)*/As';
+    const PUNCTUATION = '()[]{}?:.,|';
+
+    public function __construct(Environment $env, array $options = [])
+    {
+        $this->env = $env;
+
+        $this->options = array_merge([
+            'tag_comment' => ['{#', '#}'],
+            'tag_block' => ['{%', '%}'],
+            'tag_variable' => ['{{', '}}'],
+            'whitespace_trim' => '-',
+            'whitespace_line_trim' => '~',
+            'whitespace_line_chars' => ' \t\0\x0B',
+            'interpolation' => ['#{', '}'],
+        ], $options);
+
+        // when PHP 7.3 is the min version, we will be able to remove the '#' part in preg_quote as it's part of the default
+        $this->regexes = [
+            // }}
+            'lex_var' => '{
+                \s*
+                (?:'.
+                    preg_quote($this->options['whitespace_trim'].$this->options['tag_variable'][1], '#').'\s*'. // -}}\s*
+                    '|'.
+                    preg_quote($this->options['whitespace_line_trim'].$this->options['tag_variable'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~}}[ \t\0\x0B]*
+                    '|'.
+                    preg_quote($this->options['tag_variable'][1], '#'). // }}
+                ')
+            }Ax',
+
+            // %}
+            'lex_block' => '{
+                \s*
+                (?:'.
+                    preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*\n?'. // -%}\s*\n?
+                    '|'.
+                    preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
+                    '|'.
+                    preg_quote($this->options['tag_block'][1], '#').'\n?'. // %}\n?
+                ')
+            }Ax',
+
+            // {% endverbatim %}
+            'lex_raw_data' => '{'.
+                preg_quote($this->options['tag_block'][0], '#'). // {%
+                '('.
+                    $this->options['whitespace_trim']. // -
+                    '|'.
+                    $this->options['whitespace_line_trim']. // ~
+                ')?\s*endverbatim\s*'.
+                '(?:'.
+                    preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*'. // -%}
+                    '|'.
+                    preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
+                    '|'.
+                    preg_quote($this->options['tag_block'][1], '#'). // %}
+                ')
+            }sx',
+
+            'operator' => $this->getOperatorRegex(),
+
+            // #}
+            'lex_comment' => '{
+                (?:'.
+                    preg_quote($this->options['whitespace_trim']).preg_quote($this->options['tag_comment'][1], '#').'\s*\n?'. // -#}\s*\n?
+                    '|'.
+                    preg_quote($this->options['whitespace_line_trim'].$this->options['tag_comment'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~#}[ \t\0\x0B]*
+                    '|'.
+                    preg_quote($this->options['tag_comment'][1], '#').'\n?'. // #}\n?
+                ')
+            }sx',
+
+            // verbatim %}
+            'lex_block_raw' => '{
+                \s*verbatim\s*
+                (?:'.
+                    preg_quote($this->options['whitespace_trim'].$this->options['tag_block'][1], '#').'\s*'. // -%}\s*
+                    '|'.
+                    preg_quote($this->options['whitespace_line_trim'].$this->options['tag_block'][1], '#').'['.$this->options['whitespace_line_chars'].']*'. // ~%}[ \t\0\x0B]*
+                    '|'.
+                    preg_quote($this->options['tag_block'][1], '#'). // %}
+                ')
+            }Asx',
+
+            'lex_block_line' => '{\s*line\s+(\d+)\s*'.preg_quote($this->options['tag_block'][1], '#').'}As',
+
+            // {{ or {% or {#
+            'lex_tokens_start' => '{
+                ('.
+                    preg_quote($this->options['tag_variable'][0], '#'). // {{
+                    '|'.
+                    preg_quote($this->options['tag_block'][0], '#'). // {%
+                    '|'.
+                    preg_quote($this->options['tag_comment'][0], '#'). // {#
+                ')('.
+                    preg_quote($this->options['whitespace_trim'], '#'). // -
+                    '|'.
+                    preg_quote($this->options['whitespace_line_trim'], '#'). // ~
+                ')?
+            }sx',
+            'interpolation_start' => '{'.preg_quote($this->options['interpolation'][0], '#').'\s*}A',
+            'interpolation_end' => '{\s*'.preg_quote($this->options['interpolation'][1], '#').'}A',
+        ];
+    }
+
+    public function tokenize(Source $source)
+    {
+        $this->source = $source;
+        $this->code = str_replace(["\r\n", "\r"], "\n", $source->getCode());
+        $this->cursor = 0;
+        $this->lineno = 1;
+        $this->end = \strlen($this->code);
+        $this->tokens = [];
+        $this->state = self::STATE_DATA;
+        $this->states = [];
+        $this->brackets = [];
+        $this->position = -1;
+
+        // find all token starts in one go
+        preg_match_all($this->regexes['lex_tokens_start'], $this->code, $matches, PREG_OFFSET_CAPTURE);
+        $this->positions = $matches;
+
+        while ($this->cursor < $this->end) {
+            // dispatch to the lexing functions depending
+            // on the current state
+            switch ($this->state) {
+                case self::STATE_DATA:
+                    $this->lexData();
+                    break;
+
+                case self::STATE_BLOCK:
+                    $this->lexBlock();
+                    break;
+
+                case self::STATE_VAR:
+                    $this->lexVar();
+                    break;
+
+                case self::STATE_STRING:
+                    $this->lexString();
+                    break;
+
+                case self::STATE_INTERPOLATION:
+                    $this->lexInterpolation();
+                    break;
+            }
+        }
+
+        $this->pushToken(/* Token::EOF_TYPE */ -1);
+
+        if (!empty($this->brackets)) {
+            list($expect, $lineno) = array_pop($this->brackets);
+            throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
+        }
+
+        return new TokenStream($this->tokens, $this->source);
+    }
+
+    private function lexData()
+    {
+        // if no matches are left we return the rest of the template as simple text token
+        if ($this->position == \count($this->positions[0]) - 1) {
+            $this->pushToken(/* Token::TEXT_TYPE */ 0, substr($this->code, $this->cursor));
+            $this->cursor = $this->end;
+
+            return;
+        }
+
+        // Find the first token after the current cursor
+        $position = $this->positions[0][++$this->position];
+        while ($position[1] < $this->cursor) {
+            if ($this->position == \count($this->positions[0]) - 1) {
+                return;
+            }
+            $position = $this->positions[0][++$this->position];
+        }
+
+        // push the template text first
+        $text = $textContent = substr($this->code, $this->cursor, $position[1] - $this->cursor);
+
+        // trim?
+        if (isset($this->positions[2][$this->position][0])) {
+            if ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0]) {
+                // whitespace_trim detected ({%-, {{- or {#-)
+                $text = rtrim($text);
+            } elseif ($this->options['whitespace_line_trim'] === $this->positions[2][$this->position][0]) {
+                // whitespace_line_trim detected ({%~, {{~ or {#~)
+                // don't trim \r and \n
+                $text = rtrim($text, " \t\0\x0B");
+            }
+        }
+        $this->pushToken(/* Token::TEXT_TYPE */ 0, $text);
+        $this->moveCursor($textContent.$position[0]);
+
+        switch ($this->positions[1][$this->position][0]) {
+            case $this->options['tag_comment'][0]:
+                $this->lexComment();
+                break;
+
+            case $this->options['tag_block'][0]:
+                // raw data?
+                if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, 0, $this->cursor)) {
+                    $this->moveCursor($match[0]);
+                    $this->lexRawData();
+                // {% line \d+ %}
+                } elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, 0, $this->cursor)) {
+                    $this->moveCursor($match[0]);
+                    $this->lineno = (int) $match[1];
+                } else {
+                    $this->pushToken(/* Token::BLOCK_START_TYPE */ 1);
+                    $this->pushState(self::STATE_BLOCK);
+                    $this->currentVarBlockLine = $this->lineno;
+                }
+                break;
+
+            case $this->options['tag_variable'][0]:
+                $this->pushToken(/* Token::VAR_START_TYPE */ 2);
+                $this->pushState(self::STATE_VAR);
+                $this->currentVarBlockLine = $this->lineno;
+                break;
+        }
+    }
+
+    private function lexBlock()
+    {
+        if (empty($this->brackets) && preg_match($this->regexes['lex_block'], $this->code, $match, 0, $this->cursor)) {
+            $this->pushToken(/* Token::BLOCK_END_TYPE */ 3);
+            $this->moveCursor($match[0]);
+            $this->popState();
+        } else {
+            $this->lexExpression();
+        }
+    }
+
+    private function lexVar()
+    {
+        if (empty($this->brackets) && preg_match($this->regexes['lex_var'], $this->code, $match, 0, $this->cursor)) {
+            $this->pushToken(/* Token::VAR_END_TYPE */ 4);
+            $this->moveCursor($match[0]);
+            $this->popState();
+        } else {
+            $this->lexExpression();
+        }
+    }
+
+    private function lexExpression()
+    {
+        // whitespace
+        if (preg_match('/\s+/A', $this->code, $match, 0, $this->cursor)) {
+            $this->moveCursor($match[0]);
+
+            if ($this->cursor >= $this->end) {
+                throw new SyntaxError(sprintf('Unclosed "%s".', self::STATE_BLOCK === $this->state ? 'block' : 'variable'), $this->currentVarBlockLine, $this->source);
+            }
+        }
+
+        // arrow function
+        if ('=' === $this->code[$this->cursor] && '>' === $this->code[$this->cursor + 1]) {
+            $this->pushToken(Token::ARROW_TYPE, '=>');
+            $this->moveCursor('=>');
+        }
+        // operators
+        elseif (preg_match($this->regexes['operator'], $this->code, $match, 0, $this->cursor)) {
+            $this->pushToken(/* Token::OPERATOR_TYPE */ 8, preg_replace('/\s+/', ' ', $match[0]));
+            $this->moveCursor($match[0]);
+        }
+        // names
+        elseif (preg_match(self::REGEX_NAME, $this->code, $match, 0, $this->cursor)) {
+            $this->pushToken(/* Token::NAME_TYPE */ 5, $match[0]);
+            $this->moveCursor($match[0]);
+        }
+        // numbers
+        elseif (preg_match(self::REGEX_NUMBER, $this->code, $match, 0, $this->cursor)) {
+            $number = (float) $match[0];  // floats
+            if (ctype_digit($match[0]) && $number <= PHP_INT_MAX) {
+                $number = (int) $match[0]; // integers lower than the maximum
+            }
+            $this->pushToken(/* Token::NUMBER_TYPE */ 6, $number);
+            $this->moveCursor($match[0]);
+        }
+        // punctuation
+        elseif (false !== strpos(self::PUNCTUATION, $this->code[$this->cursor])) {
+            // opening bracket
+            if (false !== strpos('([{', $this->code[$this->cursor])) {
+                $this->brackets[] = [$this->code[$this->cursor], $this->lineno];
+            }
+            // closing bracket
+            elseif (false !== strpos(')]}', $this->code[$this->cursor])) {
+                if (empty($this->brackets)) {
+                    throw new SyntaxError(sprintf('Unexpected "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
+                }
+
+                list($expect, $lineno) = array_pop($this->brackets);
+                if ($this->code[$this->cursor] != strtr($expect, '([{', ')]}')) {
+                    throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
+                }
+            }
+
+            $this->pushToken(/* Token::PUNCTUATION_TYPE */ 9, $this->code[$this->cursor]);
+            ++$this->cursor;
+        }
+        // strings
+        elseif (preg_match(self::REGEX_STRING, $this->code, $match, 0, $this->cursor)) {
+            $this->pushToken(/* Token::STRING_TYPE */ 7, stripcslashes(substr($match[0], 1, -1)));
+            $this->moveCursor($match[0]);
+        }
+        // opening double quoted string
+        elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, 0, $this->cursor)) {
+            $this->brackets[] = ['"', $this->lineno];
+            $this->pushState(self::STATE_STRING);
+            $this->moveCursor($match[0]);
+        }
+        // unlexable
+        else {
+            throw new SyntaxError(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
+        }
+    }
+
+    private function lexRawData()
+    {
+        if (!preg_match($this->regexes['lex_raw_data'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
+            throw new SyntaxError('Unexpected end of file: Unclosed "verbatim" block.', $this->lineno, $this->source);
+        }
+
+        $text = substr($this->code, $this->cursor, $match[0][1] - $this->cursor);
+        $this->moveCursor($text.$match[0][0]);
+
+        // trim?
+        if (isset($match[1][0])) {
+            if ($this->options['whitespace_trim'] === $match[1][0]) {
+                // whitespace_trim detected ({%-, {{- or {#-)
+                $text = rtrim($text);
+            } else {
+                // whitespace_line_trim detected ({%~, {{~ or {#~)
+                // don't trim \r and \n
+                $text = rtrim($text, " \t\0\x0B");
+            }
+        }
+
+        $this->pushToken(/* Token::TEXT_TYPE */ 0, $text);
+    }
+
+    private function lexComment()
+    {
+        if (!preg_match($this->regexes['lex_comment'], $this->code, $match, PREG_OFFSET_CAPTURE, $this->cursor)) {
+            throw new SyntaxError('Unclosed comment.', $this->lineno, $this->source);
+        }
+
+        $this->moveCursor(substr($this->code, $this->cursor, $match[0][1] - $this->cursor).$match[0][0]);
+    }
+
+    private function lexString()
+    {
+        if (preg_match($this->regexes['interpolation_start'], $this->code, $match, 0, $this->cursor)) {
+            $this->brackets[] = [$this->options['interpolation'][0], $this->lineno];
+            $this->pushToken(/* Token::INTERPOLATION_START_TYPE */ 10);
+            $this->moveCursor($match[0]);
+            $this->pushState(self::STATE_INTERPOLATION);
+        } elseif (preg_match(self::REGEX_DQ_STRING_PART, $this->code, $match, 0, $this->cursor) && \strlen($match[0]) > 0) {
+            $this->pushToken(/* Token::STRING_TYPE */ 7, stripcslashes($match[0]));
+            $this->moveCursor($match[0]);
+        } elseif (preg_match(self::REGEX_DQ_STRING_DELIM, $this->code, $match, 0, $this->cursor)) {
+            list($expect, $lineno) = array_pop($this->brackets);
+            if ('"' != $this->code[$this->cursor]) {
+                throw new SyntaxError(sprintf('Unclosed "%s".', $expect), $lineno, $this->source);
+            }
+
+            $this->popState();
+            ++$this->cursor;
+        } else {
+            // unlexable
+            throw new SyntaxError(sprintf('Unexpected character "%s".', $this->code[$this->cursor]), $this->lineno, $this->source);
+        }
+    }
+
+    private function lexInterpolation()
+    {
+        $bracket = end($this->brackets);
+        if ($this->options['interpolation'][0] === $bracket[0] && preg_match($this->regexes['interpolation_end'], $this->code, $match, 0, $this->cursor)) {
+            array_pop($this->brackets);
+            $this->pushToken(/* Token::INTERPOLATION_END_TYPE */ 11);
+            $this->moveCursor($match[0]);
+            $this->popState();
+        } else {
+            $this->lexExpression();
+        }
+    }
+
+    private function pushToken($type, $value = '')
+    {
+        // do not push empty text tokens
+        if (/* Token::TEXT_TYPE */ 0 === $type && '' === $value) {
+            return;
+        }
+
+        $this->tokens[] = new Token($type, $value, $this->lineno);
+    }
+
+    private function moveCursor($text)
+    {
+        $this->cursor += \strlen($text);
+        $this->lineno += substr_count($text, "\n");
+    }
+
+    private function getOperatorRegex()
+    {
+        $operators = array_merge(
+            ['='],
+            array_keys($this->env->getUnaryOperators()),
+            array_keys($this->env->getBinaryOperators())
+        );
 
-if (\false) {
-    class Lexer extends \Twig_Lexer
+        $operators = array_combine($operators, array_map('strlen', $operators));
+        arsort($operators);
+
+        $regex = [];
+        foreach ($operators as $operator => $length) {
+            // an operator that ends with a character must be followed by
+            // a whitespace or a parenthesis
+            if (ctype_alpha($operator[$length - 1])) {
+                $r = preg_quote($operator, '/').'(?=[\s()])';
+            } else {
+                $r = preg_quote($operator, '/');
+            }
+
+            // an operator with a space can be any amount of whitespaces
+            $r = preg_replace('/\s+/', '\s+', $r);
+
+            $regex[] = $r;
+        }
+
+        return '/'.implode('|', $regex).'/A';
+    }
+
+    private function pushState($state)
     {
+        $this->states[] = $this->state;
+        $this->state = $state;
+    }
+
+    private function popState()
+    {
+        if (0 === \count($this->states)) {
+            throw new \LogicException('Cannot pop state without a previous state.');
+        }
+
+        $this->state = array_pop($this->states);
     }
 }
+
+class_alias('Twig\Lexer', 'Twig_Lexer');
diff --git a/vendor/twig/twig/src/Loader/ArrayLoader.php b/vendor/twig/twig/src/Loader/ArrayLoader.php
index 9f5de3c7..b03170b2 100644
--- a/vendor/twig/twig/src/Loader/ArrayLoader.php
+++ b/vendor/twig/twig/src/Loader/ArrayLoader.php
@@ -1,11 +1,86 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Loader;
 
-class_exists('Twig_Loader_Array');
+use Twig\Error\LoaderError;
+use Twig\Source;
+
+/**
+ * Loads a template from an array.
+ *
+ * When using this loader with a cache mechanism, you should know that a new cache
+ * key is generated each time a template content "changes" (the cache key being the
+ * source code of the template). If you don't want to see your cache grows out of
+ * control, you need to take care of clearing the old cache file by yourself.
+ *
+ * This loader should only be used for unit testing.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class ArrayLoader implements LoaderInterface, ExistsLoaderInterface, SourceContextLoaderInterface
+{
+    private $templates = [];
+
+    /**
+     * @param array $templates An array of templates (keys are the names, and values are the source code)
+     */
+    public function __construct(array $templates = [])
+    {
+        $this->templates = $templates;
+    }
 
-if (\false) {
-    class ArrayLoader extends \Twig_Loader_Array
+    /**
+     * Adds or overrides a template.
+     *
+     * @param string $name     The template name
+     * @param string $template The template source
+     */
+    public function setTemplate($name, $template)
     {
+        $this->templates[$name] = $template;
+    }
+
+    public function getSourceContext($name)
+    {
+        $name = (string) $name;
+        if (!isset($this->templates[$name])) {
+            throw new LoaderError(sprintf('Template "%s" is not defined.', $name));
+        }
+
+        return new Source($this->templates[$name], $name);
+    }
+
+    public function exists($name)
+    {
+        return isset($this->templates[$name]);
+    }
+
+    public function getCacheKey($name)
+    {
+        if (!isset($this->templates[$name])) {
+            throw new LoaderError(sprintf('Template "%s" is not defined.', $name));
+        }
+
+        return $name.':'.$this->templates[$name];
+    }
+
+    public function isFresh($name, $time)
+    {
+        if (!isset($this->templates[$name])) {
+            throw new LoaderError(sprintf('Template "%s" is not defined.', $name));
+        }
+
+        return true;
     }
 }
+
+class_alias('Twig\Loader\ArrayLoader', 'Twig_Loader_Array');
diff --git a/vendor/twig/twig/src/Loader/ChainLoader.php b/vendor/twig/twig/src/Loader/ChainLoader.php
index 396eca52..edb9df8c 100644
--- a/vendor/twig/twig/src/Loader/ChainLoader.php
+++ b/vendor/twig/twig/src/Loader/ChainLoader.php
@@ -1,11 +1,120 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Loader;
 
-class_exists('Twig_Loader_Chain');
+use Twig\Error\LoaderError;
+
+/**
+ * Loads templates from other loaders.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class ChainLoader implements LoaderInterface, ExistsLoaderInterface, SourceContextLoaderInterface
+{
+    private $hasSourceCache = [];
+    private $loaders = [];
+
+    /**
+     * @param LoaderInterface[] $loaders
+     */
+    public function __construct(array $loaders = [])
+    {
+        foreach ($loaders as $loader) {
+            $this->addLoader($loader);
+        }
+    }
+
+    public function addLoader(LoaderInterface $loader)
+    {
+        $this->loaders[] = $loader;
+        $this->hasSourceCache = [];
+    }
 
-if (\false) {
-    class ChainLoader extends \Twig_Loader_Chain
+    /**
+     * @return LoaderInterface[]
+     */
+    public function getLoaders()
     {
+        return $this->loaders;
+    }
+
+    public function getSourceContext($name)
+    {
+        $exceptions = [];
+        foreach ($this->loaders as $loader) {
+            if (!$loader->exists($name)) {
+                continue;
+            }
+
+            try {
+                return $loader->getSourceContext($name);
+            } catch (LoaderError $e) {
+                $exceptions[] = $e->getMessage();
+            }
+        }
+
+        throw new LoaderError(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
+    }
+
+    public function exists($name)
+    {
+        if (isset($this->hasSourceCache[$name])) {
+            return $this->hasSourceCache[$name];
+        }
+
+        foreach ($this->loaders as $loader) {
+            if ($loader->exists($name)) {
+                return $this->hasSourceCache[$name] = true;
+            }
+        }
+
+        return $this->hasSourceCache[$name] = false;
+    }
+
+    public function getCacheKey($name)
+    {
+        $exceptions = [];
+        foreach ($this->loaders as $loader) {
+            if (!$loader->exists($name)) {
+                continue;
+            }
+
+            try {
+                return $loader->getCacheKey($name);
+            } catch (LoaderError $e) {
+                $exceptions[] = \get_class($loader).': '.$e->getMessage();
+            }
+        }
+
+        throw new LoaderError(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
+    }
+
+    public function isFresh($name, $time)
+    {
+        $exceptions = [];
+        foreach ($this->loaders as $loader) {
+            if (!$loader->exists($name)) {
+                continue;
+            }
+
+            try {
+                return $loader->isFresh($name, $time);
+            } catch (LoaderError $e) {
+                $exceptions[] = \get_class($loader).': '.$e->getMessage();
+            }
+        }
+
+        throw new LoaderError(sprintf('Template "%s" is not defined%s.', $name, $exceptions ? ' ('.implode(', ', $exceptions).')' : ''));
     }
 }
+
+class_alias('Twig\Loader\ChainLoader', 'Twig_Loader_Chain');
diff --git a/vendor/twig/twig/src/Loader/ExistsLoaderInterface.php b/vendor/twig/twig/src/Loader/ExistsLoaderInterface.php
index e533d4b2..aab8bd86 100644
--- a/vendor/twig/twig/src/Loader/ExistsLoaderInterface.php
+++ b/vendor/twig/twig/src/Loader/ExistsLoaderInterface.php
@@ -1,11 +1,23 @@
 <?php
 
-namespace Twig\Loader;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_ExistsLoaderInterface');
+namespace Twig\Loader;
 
-if (\false) {
-    interface ExistsLoaderInterface extends \Twig_ExistsLoaderInterface
-    {
-    }
+/**
+ * Empty interface for Twig 1.x compatibility.
+ *
+ * @deprecated since Twig 2.7, to be removed in 3.0
+ */
+interface ExistsLoaderInterface extends LoaderInterface
+{
 }
+
+class_alias('Twig\Loader\ExistsLoaderInterface', 'Twig_ExistsLoaderInterface');
diff --git a/vendor/twig/twig/src/Loader/FilesystemLoader.php b/vendor/twig/twig/src/Loader/FilesystemLoader.php
index 83e8833f..0971e09b 100644
--- a/vendor/twig/twig/src/Loader/FilesystemLoader.php
+++ b/vendor/twig/twig/src/Loader/FilesystemLoader.php
@@ -1,11 +1,308 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Loader;
 
-class_exists('Twig_Loader_Filesystem');
+use Twig\Error\LoaderError;
+use Twig\Source;
+
+/**
+ * Loads template from the filesystem.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class FilesystemLoader implements LoaderInterface, ExistsLoaderInterface, SourceContextLoaderInterface
+{
+    /** Identifier of the main namespace. */
+    const MAIN_NAMESPACE = '__main__';
+
+    protected $paths = [];
+    protected $cache = [];
+    protected $errorCache = [];
+
+    private $rootPath;
+
+    /**
+     * @param string|array $paths    A path or an array of paths where to look for templates
+     * @param string|null  $rootPath The root path common to all relative paths (null for getcwd())
+     */
+    public function __construct($paths = [], string $rootPath = null)
+    {
+        $this->rootPath = (null === $rootPath ? getcwd() : $rootPath).\DIRECTORY_SEPARATOR;
+        if (false !== $realPath = realpath($rootPath)) {
+            $this->rootPath = $realPath.\DIRECTORY_SEPARATOR;
+        }
+
+        if ($paths) {
+            $this->setPaths($paths);
+        }
+    }
+
+    /**
+     * Returns the paths to the templates.
+     *
+     * @param string $namespace A path namespace
+     *
+     * @return array The array of paths where to look for templates
+     */
+    public function getPaths($namespace = self::MAIN_NAMESPACE)
+    {
+        return isset($this->paths[$namespace]) ? $this->paths[$namespace] : [];
+    }
+
+    /**
+     * Returns the path namespaces.
+     *
+     * The main namespace is always defined.
+     *
+     * @return array The array of defined namespaces
+     */
+    public function getNamespaces()
+    {
+        return array_keys($this->paths);
+    }
+
+    /**
+     * Sets the paths where templates are stored.
+     *
+     * @param string|array $paths     A path or an array of paths where to look for templates
+     * @param string       $namespace A path namespace
+     */
+    public function setPaths($paths, $namespace = self::MAIN_NAMESPACE)
+    {
+        if (!\is_array($paths)) {
+            $paths = [$paths];
+        }
+
+        $this->paths[$namespace] = [];
+        foreach ($paths as $path) {
+            $this->addPath($path, $namespace);
+        }
+    }
+
+    /**
+     * Adds a path where templates are stored.
+     *
+     * @param string $path      A path where to look for templates
+     * @param string $namespace A path namespace
+     *
+     * @throws LoaderError
+     */
+    public function addPath($path, $namespace = self::MAIN_NAMESPACE)
+    {
+        // invalidate the cache
+        $this->cache = $this->errorCache = [];
+
+        $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path;
+        if (!is_dir($checkPath)) {
+            throw new LoaderError(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath));
+        }
+
+        $this->paths[$namespace][] = rtrim($path, '/\\');
+    }
+
+    /**
+     * Prepends a path where templates are stored.
+     *
+     * @param string $path      A path where to look for templates
+     * @param string $namespace A path namespace
+     *
+     * @throws LoaderError
+     */
+    public function prependPath($path, $namespace = self::MAIN_NAMESPACE)
+    {
+        // invalidate the cache
+        $this->cache = $this->errorCache = [];
+
+        $checkPath = $this->isAbsolutePath($path) ? $path : $this->rootPath.$path;
+        if (!is_dir($checkPath)) {
+            throw new LoaderError(sprintf('The "%s" directory does not exist ("%s").', $path, $checkPath));
+        }
+
+        $path = rtrim($path, '/\\');
+
+        if (!isset($this->paths[$namespace])) {
+            $this->paths[$namespace][] = $path;
+        } else {
+            array_unshift($this->paths[$namespace], $path);
+        }
+    }
+
+    public function getSourceContext($name)
+    {
+        if (null === ($path = $this->findTemplate($name)) || false === $path) {
+            return new Source('', $name, '');
+        }
+
+        return new Source(file_get_contents($path), $name, $path);
+    }
+
+    public function getCacheKey($name)
+    {
+        if (null === ($path = $this->findTemplate($name)) || false === $path) {
+            return '';
+        }
+        $len = \strlen($this->rootPath);
+        if (0 === strncmp($this->rootPath, $path, $len)) {
+            return substr($path, $len);
+        }
 
-if (\false) {
-    class FilesystemLoader extends \Twig_Loader_Filesystem
+        return $path;
+    }
+
+    public function exists($name)
     {
+        $name = $this->normalizeName($name);
+
+        if (isset($this->cache[$name])) {
+            return true;
+        }
+
+        return null !== ($path = $this->findTemplate($name, false)) && false !== $path;
+    }
+
+    public function isFresh($name, $time)
+    {
+        // false support to be removed in 3.0
+        if (null === ($path = $this->findTemplate($name)) || false === $path) {
+            return false;
+        }
+
+        return filemtime($path) < $time;
+    }
+
+    /**
+     * Checks if the template can be found.
+     *
+     * In Twig 3.0, findTemplate must return a string or null (returning false won't work anymore).
+     *
+     * @param string $name  The template name
+     * @param bool   $throw Whether to throw an exception when an error occurs
+     *
+     * @return string|false|null The template name or false/null
+     */
+    protected function findTemplate($name, $throw = true)
+    {
+        $name = $this->normalizeName($name);
+
+        if (isset($this->cache[$name])) {
+            return $this->cache[$name];
+        }
+
+        if (isset($this->errorCache[$name])) {
+            if (!$throw) {
+                return false;
+            }
+
+            throw new LoaderError($this->errorCache[$name]);
+        }
+
+        try {
+            $this->validateName($name);
+
+            list($namespace, $shortname) = $this->parseName($name);
+        } catch (LoaderError $e) {
+            if (!$throw) {
+                return false;
+            }
+
+            throw $e;
+        }
+
+        if (!isset($this->paths[$namespace])) {
+            $this->errorCache[$name] = sprintf('There are no registered paths for namespace "%s".', $namespace);
+
+            if (!$throw) {
+                return false;
+            }
+
+            throw new LoaderError($this->errorCache[$name]);
+        }
+
+        foreach ($this->paths[$namespace] as $path) {
+            if (!$this->isAbsolutePath($path)) {
+                $path = $this->rootPath.$path;
+            }
+
+            if (is_file($path.'/'.$shortname)) {
+                if (false !== $realpath = realpath($path.'/'.$shortname)) {
+                    return $this->cache[$name] = $realpath;
+                }
+
+                return $this->cache[$name] = $path.'/'.$shortname;
+            }
+        }
+
+        $this->errorCache[$name] = sprintf('Unable to find template "%s" (looked into: %s).', $name, implode(', ', $this->paths[$namespace]));
+
+        if (!$throw) {
+            return false;
+        }
+
+        throw new LoaderError($this->errorCache[$name]);
+    }
+
+    private function normalizeName($name)
+    {
+        return preg_replace('#/{2,}#', '/', str_replace('\\', '/', $name));
+    }
+
+    private function parseName($name, $default = self::MAIN_NAMESPACE)
+    {
+        if (isset($name[0]) && '@' == $name[0]) {
+            if (false === $pos = strpos($name, '/')) {
+                throw new LoaderError(sprintf('Malformed namespaced template name "%s" (expecting "@namespace/template_name").', $name));
+            }
+
+            $namespace = substr($name, 1, $pos - 1);
+            $shortname = substr($name, $pos + 1);
+
+            return [$namespace, $shortname];
+        }
+
+        return [$default, $name];
+    }
+
+    private function validateName($name)
+    {
+        if (false !== strpos($name, "\0")) {
+            throw new LoaderError('A template name cannot contain NUL bytes.');
+        }
+
+        $name = ltrim($name, '/');
+        $parts = explode('/', $name);
+        $level = 0;
+        foreach ($parts as $part) {
+            if ('..' === $part) {
+                --$level;
+            } elseif ('.' !== $part) {
+                ++$level;
+            }
+
+            if ($level < 0) {
+                throw new LoaderError(sprintf('Looks like you try to load a template outside configured directories (%s).', $name));
+            }
+        }
+    }
+
+    private function isAbsolutePath($file)
+    {
+        return strspn($file, '/\\', 0, 1)
+            || (\strlen($file) > 3 && ctype_alpha($file[0])
+                && ':' === $file[1]
+                && strspn($file, '/\\', 2, 1)
+            )
+            || null !== parse_url($file, PHP_URL_SCHEME)
+        ;
     }
 }
+
+class_alias('Twig\Loader\FilesystemLoader', 'Twig_Loader_Filesystem');
diff --git a/vendor/twig/twig/src/Loader/LoaderInterface.php b/vendor/twig/twig/src/Loader/LoaderInterface.php
index 67c331e6..5ccd2c78 100644
--- a/vendor/twig/twig/src/Loader/LoaderInterface.php
+++ b/vendor/twig/twig/src/Loader/LoaderInterface.php
@@ -1,11 +1,69 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Loader;
 
-class_exists('Twig_LoaderInterface');
+use Twig\Error\LoaderError;
+use Twig\Source;
+
+/**
+ * Interface all loaders must implement.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+interface LoaderInterface
+{
+    /**
+     * Returns the source context for a given template logical name.
+     *
+     * @param string $name The template logical name
+     *
+     * @return Source
+     *
+     * @throws LoaderError When $name is not found
+     */
+    public function getSourceContext($name);
+
+    /**
+     * Gets the cache key to use for the cache for a given template name.
+     *
+     * @param string $name The name of the template to load
+     *
+     * @return string The cache key
+     *
+     * @throws LoaderError When $name is not found
+     */
+    public function getCacheKey($name);
 
-if (\false) {
-    interface LoaderInterface extends \Twig_LoaderInterface
-    {
-    }
+    /**
+     * Returns true if the template is still fresh.
+     *
+     * @param string $name The template name
+     * @param int    $time Timestamp of the last modification time of the
+     *                     cached template
+     *
+     * @return bool true if the template is fresh, false otherwise
+     *
+     * @throws LoaderError When $name is not found
+     */
+    public function isFresh($name, $time);
+
+    /**
+     * Check if we have the source code of a template, given its name.
+     *
+     * @param string $name The name of the template to check if we can load
+     *
+     * @return bool If the template source code is handled by this loader or not
+     */
+    public function exists($name);
 }
+
+class_alias('Twig\Loader\LoaderInterface', 'Twig_LoaderInterface');
diff --git a/vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php b/vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php
index 4444f808..4fdb17ea 100644
--- a/vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php
+++ b/vendor/twig/twig/src/Loader/SourceContextLoaderInterface.php
@@ -1,11 +1,21 @@
 <?php
 
-namespace Twig\Loader;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_SourceContextLoaderInterface');
+namespace Twig\Loader;
 
-if (\false) {
-    interface SourceContextLoaderInterface extends \Twig_SourceContextLoaderInterface
-    {
-    }
+/**
+ * Empty interface for Twig 1.x compatibility.
+ */
+interface SourceContextLoaderInterface extends LoaderInterface
+{
 }
+
+class_alias('Twig\Loader\SourceContextLoaderInterface', 'Twig_SourceContextLoaderInterface');
diff --git a/vendor/twig/twig/src/Markup.php b/vendor/twig/twig/src/Markup.php
index 8dad0822..43c890b4 100644
--- a/vendor/twig/twig/src/Markup.php
+++ b/vendor/twig/twig/src/Markup.php
@@ -1,11 +1,46 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_Markup');
+/**
+ * Marks a content as safe.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class Markup implements \Countable, \JsonSerializable
+{
+    private $content;
+    private $charset;
+
+    public function __construct($content, $charset)
+    {
+        $this->content = (string) $content;
+        $this->charset = $charset;
+    }
 
-if (\false) {
-    class Markup extends \Twig_Markup
+    public function __toString()
     {
+        return $this->content;
+    }
+
+    public function count()
+    {
+        return mb_strlen($this->content, $this->charset);
+    }
+
+    public function jsonSerialize()
+    {
+        return $this->content;
     }
 }
+
+class_alias('Twig\Markup', 'Twig_Markup');
diff --git a/vendor/twig/twig/src/Node/AutoEscapeNode.php b/vendor/twig/twig/src/Node/AutoEscapeNode.php
index 9edb8e3d..0bd5ae1f 100644
--- a/vendor/twig/twig/src/Node/AutoEscapeNode.php
+++ b/vendor/twig/twig/src/Node/AutoEscapeNode.php
@@ -1,11 +1,40 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_AutoEscape');
+use Twig\Compiler;
 
-if (\false) {
-    class AutoEscapeNode extends \Twig_Node_AutoEscape
+/**
+ * Represents an autoescape node.
+ *
+ * The value is the escaping strategy (can be html, js, ...)
+ *
+ * The true value is equivalent to html.
+ *
+ * If autoescaping is disabled, then the value is false.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class AutoEscapeNode extends Node
+{
+    public function __construct($value, Node $body, int $lineno, string $tag = 'autoescape')
     {
+        parent::__construct(['body' => $body], ['value' => $value], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler->subcompile($this->getNode('body'));
     }
 }
+
+class_alias('Twig\Node\AutoEscapeNode', 'Twig_Node_AutoEscape');
diff --git a/vendor/twig/twig/src/Node/BlockNode.php b/vendor/twig/twig/src/Node/BlockNode.php
index 27e30f98..4da6e6ff 100644
--- a/vendor/twig/twig/src/Node/BlockNode.php
+++ b/vendor/twig/twig/src/Node/BlockNode.php
@@ -1,11 +1,46 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Block');
+use Twig\Compiler;
+
+/**
+ * Represents a block node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class BlockNode extends Node
+{
+    public function __construct(string $name, Node $body, int $lineno, string $tag = null)
+    {
+        parent::__construct(['body' => $body], ['name' => $name], $lineno, $tag);
+    }
 
-if (\false) {
-    class BlockNode extends \Twig_Node_Block
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->addDebugInfo($this)
+            ->write(sprintf("public function block_%s(\$context, array \$blocks = [])\n", $this->getAttribute('name')), "{\n")
+            ->indent()
+            ->write("\$macros = \$this->macros;\n")
+        ;
+
+        $compiler
+            ->subcompile($this->getNode('body'))
+            ->outdent()
+            ->write("}\n\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\BlockNode', 'Twig_Node_Block');
diff --git a/vendor/twig/twig/src/Node/BlockReferenceNode.php b/vendor/twig/twig/src/Node/BlockReferenceNode.php
index 87bdd1f9..c46d8b3e 100644
--- a/vendor/twig/twig/src/Node/BlockReferenceNode.php
+++ b/vendor/twig/twig/src/Node/BlockReferenceNode.php
@@ -1,11 +1,38 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_BlockReference');
+use Twig\Compiler;
 
-if (\false) {
-    class BlockReferenceNode extends \Twig_Node_BlockReference
+/**
+ * Represents a block call node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class BlockReferenceNode extends Node implements NodeOutputInterface
+{
+    public function __construct(string $name, int $lineno, string $tag = null)
     {
+        parent::__construct([], ['name' => $name], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write(sprintf("\$this->displayBlock('%s', \$context, \$blocks);\n", $this->getAttribute('name')))
+        ;
     }
 }
+
+class_alias('Twig\Node\BlockReferenceNode', 'Twig_Node_BlockReference');
diff --git a/vendor/twig/twig/src/Node/BodyNode.php b/vendor/twig/twig/src/Node/BodyNode.php
index 013bda3b..5290be56 100644
--- a/vendor/twig/twig/src/Node/BodyNode.php
+++ b/vendor/twig/twig/src/Node/BodyNode.php
@@ -1,11 +1,23 @@
 <?php
 
-namespace Twig\Node;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_Node_Body');
+namespace Twig\Node;
 
-if (\false) {
-    class BodyNode extends \Twig_Node_Body
-    {
-    }
+/**
+ * Represents a body node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class BodyNode extends Node
+{
 }
+
+class_alias('Twig\Node\BodyNode', 'Twig_Node_Body');
diff --git a/vendor/twig/twig/src/Node/CheckSecurityNode.php b/vendor/twig/twig/src/Node/CheckSecurityNode.php
index 6510086b..59857ca5 100644
--- a/vendor/twig/twig/src/Node/CheckSecurityNode.php
+++ b/vendor/twig/twig/src/Node/CheckSecurityNode.php
@@ -1,11 +1,85 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_CheckSecurity');
+use Twig\Compiler;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class CheckSecurityNode extends Node
+{
+    private $usedFilters;
+    private $usedTags;
+    private $usedFunctions;
+
+    public function __construct(array $usedFilters, array $usedTags, array $usedFunctions)
+    {
+        $this->usedFilters = $usedFilters;
+        $this->usedTags = $usedTags;
+        $this->usedFunctions = $usedFunctions;
+
+        parent::__construct();
+    }
 
-if (\false) {
-    class CheckSecurityNode extends \Twig_Node_CheckSecurity
+    public function compile(Compiler $compiler)
     {
+        $tags = $filters = $functions = [];
+        foreach (['tags', 'filters', 'functions'] as $type) {
+            foreach ($this->{'used'.ucfirst($type)} as $name => $node) {
+                if ($node instanceof Node) {
+                    ${$type}[$name] = $node->getTemplateLine();
+                } else {
+                    ${$type}[$node] = null;
+                }
+            }
+        }
+
+        $compiler
+            ->write("\$this->sandbox = \$this->env->getExtension('\Twig\Extension\SandboxExtension');\n")
+            ->write('$tags = ')->repr(array_filter($tags))->raw(";\n")
+            ->write('$filters = ')->repr(array_filter($filters))->raw(";\n")
+            ->write('$functions = ')->repr(array_filter($functions))->raw(";\n\n")
+            ->write("try {\n")
+            ->indent()
+            ->write("\$this->sandbox->checkSecurity(\n")
+            ->indent()
+            ->write(!$tags ? "[],\n" : "['".implode("', '", array_keys($tags))."'],\n")
+            ->write(!$filters ? "[],\n" : "['".implode("', '", array_keys($filters))."'],\n")
+            ->write(!$functions ? "[]\n" : "['".implode("', '", array_keys($functions))."']\n")
+            ->outdent()
+            ->write(");\n")
+            ->outdent()
+            ->write("} catch (SecurityError \$e) {\n")
+            ->indent()
+            ->write("\$e->setSourceContext(\$this->source);\n\n")
+            ->write("if (\$e instanceof SecurityNotAllowedTagError && isset(\$tags[\$e->getTagName()])) {\n")
+            ->indent()
+            ->write("\$e->setTemplateLine(\$tags[\$e->getTagName()]);\n")
+            ->outdent()
+            ->write("} elseif (\$e instanceof SecurityNotAllowedFilterError && isset(\$filters[\$e->getFilterName()])) {\n")
+            ->indent()
+            ->write("\$e->setTemplateLine(\$filters[\$e->getFilterName()]);\n")
+            ->outdent()
+            ->write("} elseif (\$e instanceof SecurityNotAllowedFunctionError && isset(\$functions[\$e->getFunctionName()])) {\n")
+            ->indent()
+            ->write("\$e->setTemplateLine(\$functions[\$e->getFunctionName()]);\n")
+            ->outdent()
+            ->write("}\n\n")
+            ->write("throw \$e;\n")
+            ->outdent()
+            ->write("}\n\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\CheckSecurityNode', 'Twig_Node_CheckSecurity');
diff --git a/vendor/twig/twig/src/Node/CheckToStringNode.php b/vendor/twig/twig/src/Node/CheckToStringNode.php
new file mode 100644
index 00000000..02b42fcd
--- /dev/null
+++ b/vendor/twig/twig/src/Node/CheckToStringNode.php
@@ -0,0 +1,45 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Twig\Node;
+
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
+
+/**
+ * Checks if casting an expression to __toString() is allowed by the sandbox.
+ *
+ * For instance, when there is a simple Print statement, like {{ article }},
+ * and if the sandbox is enabled, we need to check that the __toString()
+ * method is allowed if 'article' is an object. The same goes for {{ article|upper }}
+ * or {{ random(article) }}
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class CheckToStringNode extends AbstractExpression
+{
+    public function __construct(AbstractExpression $expr)
+    {
+        parent::__construct(['expr' => $expr], [], $expr->getTemplateLine(), $expr->getNodeTag());
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $expr = $this->getNode('expr');
+        $compiler
+            ->raw('$this->sandbox->ensureToStringAllowed(')
+            ->subcompile($expr)
+            ->raw(', ')
+            ->repr($expr->getTemplateLine())
+            ->raw(', $this->source)')
+        ;
+    }
+}
diff --git a/vendor/twig/twig/src/Node/DeprecatedNode.php b/vendor/twig/twig/src/Node/DeprecatedNode.php
new file mode 100644
index 00000000..accd7680
--- /dev/null
+++ b/vendor/twig/twig/src/Node/DeprecatedNode.php
@@ -0,0 +1,55 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Twig\Node;
+
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
+use Twig\Node\Expression\ConstantExpression;
+
+/**
+ * Represents a deprecated node.
+ *
+ * @author Yonel Ceruto <yonelceruto@xxxxxxxxx>
+ */
+class DeprecatedNode extends Node
+{
+    public function __construct(AbstractExpression $expr, int $lineno, string $tag = null)
+    {
+        parent::__construct(['expr' => $expr], [], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler->addDebugInfo($this);
+
+        $expr = $this->getNode('expr');
+
+        if ($expr instanceof ConstantExpression) {
+            $compiler->write('@trigger_error(')
+                ->subcompile($expr);
+        } else {
+            $varName = $compiler->getVarName();
+            $compiler->write(sprintf('$%s = ', $varName))
+                ->subcompile($expr)
+                ->raw(";\n")
+                ->write(sprintf('@trigger_error($%s', $varName));
+        }
+
+        $compiler
+            ->raw('.')
+            ->string(sprintf(' ("%s" at line %d).', $this->getTemplateName(), $this->getTemplateLine()))
+            ->raw(", E_USER_DEPRECATED);\n")
+        ;
+    }
+}
+
+class_alias('Twig\Node\DeprecatedNode', 'Twig_Node_Deprecated');
diff --git a/vendor/twig/twig/src/Node/DoNode.php b/vendor/twig/twig/src/Node/DoNode.php
index 1a972ff3..d74804c5 100644
--- a/vendor/twig/twig/src/Node/DoNode.php
+++ b/vendor/twig/twig/src/Node/DoNode.php
@@ -1,11 +1,40 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Do');
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
 
-if (\false) {
-    class DoNode extends \Twig_Node_Do
+/**
+ * Represents a do node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class DoNode extends Node
+{
+    public function __construct(AbstractExpression $expr, int $lineno, string $tag = null)
     {
+        parent::__construct(['expr' => $expr], [], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write('')
+            ->subcompile($this->getNode('expr'))
+            ->raw(";\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\DoNode', 'Twig_Node_Do');
diff --git a/vendor/twig/twig/src/Node/EmbedNode.php b/vendor/twig/twig/src/Node/EmbedNode.php
index 96094239..4a1ef6fc 100644
--- a/vendor/twig/twig/src/Node/EmbedNode.php
+++ b/vendor/twig/twig/src/Node/EmbedNode.php
@@ -1,11 +1,50 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Embed');
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
+use Twig\Node\Expression\ConstantExpression;
+
+/**
+ * Represents an embed node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class EmbedNode extends IncludeNode
+{
+    // we don't inject the module to avoid node visitors to traverse it twice (as it will be already visited in the main module)
+    public function __construct(string $name, int $index, AbstractExpression $variables = null, bool $only = false, bool $ignoreMissing = false, int $lineno, string $tag = null)
+    {
+        parent::__construct(new ConstantExpression('not_used', $lineno), $variables, $only, $ignoreMissing, $lineno, $tag);
+
+        $this->setAttribute('name', $name);
+        $this->setAttribute('index', $index);
+    }
 
-if (\false) {
-    class EmbedNode extends \Twig_Node_Embed
+    protected function addGetTemplate(Compiler $compiler)
     {
+        $compiler
+            ->write('$this->loadTemplate(')
+            ->string($this->getAttribute('name'))
+            ->raw(', ')
+            ->repr($this->getTemplateName())
+            ->raw(', ')
+            ->repr($this->getTemplateLine())
+            ->raw(', ')
+            ->string($this->getAttribute('index'))
+            ->raw(')')
+        ;
     }
 }
+
+class_alias('Twig\Node\EmbedNode', 'Twig_Node_Embed');
diff --git a/vendor/twig/twig/src/Node/Expression/AbstractExpression.php b/vendor/twig/twig/src/Node/Expression/AbstractExpression.php
index 1fdbea85..a3528924 100644
--- a/vendor/twig/twig/src/Node/Expression/AbstractExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/AbstractExpression.php
@@ -1,11 +1,26 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression');
+use Twig\Node\Node;
 
-if (\false) {
-    class AbstractExpression extends \Twig_Node_Expression
-    {
-    }
+/**
+ * Abstract class for all nodes that represents an expression.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+abstract class AbstractExpression extends Node
+{
 }
+
+class_alias('Twig\Node\Expression\AbstractExpression', 'Twig_Node_Expression');
diff --git a/vendor/twig/twig/src/Node/Expression/ArrayExpression.php b/vendor/twig/twig/src/Node/Expression/ArrayExpression.php
index c4086579..917675d9 100644
--- a/vendor/twig/twig/src/Node/Expression/ArrayExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/ArrayExpression.php
@@ -1,11 +1,88 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_Array');
+use Twig\Compiler;
+
+class ArrayExpression extends AbstractExpression
+{
+    private $index;
 
-if (\false) {
-    class ArrayExpression extends \Twig_Node_Expression_Array
+    public function __construct(array $elements, int $lineno)
     {
+        parent::__construct($elements, [], $lineno);
+
+        $this->index = -1;
+        foreach ($this->getKeyValuePairs() as $pair) {
+            if ($pair['key'] instanceof ConstantExpression && ctype_digit((string) $pair['key']->getAttribute('value')) && $pair['key']->getAttribute('value') > $this->index) {
+                $this->index = $pair['key']->getAttribute('value');
+            }
+        }
+    }
+
+    public function getKeyValuePairs()
+    {
+        $pairs = [];
+
+        foreach (array_chunk($this->nodes, 2) as $pair) {
+            $pairs[] = [
+                'key' => $pair[0],
+                'value' => $pair[1],
+            ];
+        }
+
+        return $pairs;
+    }
+
+    public function hasElement(AbstractExpression $key)
+    {
+        foreach ($this->getKeyValuePairs() as $pair) {
+            // we compare the string representation of the keys
+            // to avoid comparing the line numbers which are not relevant here.
+            if ((string) $key === (string) $pair['key']) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    public function addElement(AbstractExpression $value, AbstractExpression $key = null)
+    {
+        if (null === $key) {
+            $key = new ConstantExpression(++$this->index, $value->getTemplateLine());
+        }
+
+        array_push($this->nodes, $key, $value);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler->raw('[');
+        $first = true;
+        foreach ($this->getKeyValuePairs() as $pair) {
+            if (!$first) {
+                $compiler->raw(', ');
+            }
+            $first = false;
+
+            $compiler
+                ->subcompile($pair['key'])
+                ->raw(' => ')
+                ->subcompile($pair['value'])
+            ;
+        }
+        $compiler->raw(']');
     }
 }
+
+class_alias('Twig\Node\Expression\ArrayExpression', 'Twig_Node_Expression_Array');
diff --git a/vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php b/vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php
new file mode 100644
index 00000000..36b77da8
--- /dev/null
+++ b/vendor/twig/twig/src/Node/Expression/ArrowFunctionExpression.php
@@ -0,0 +1,64 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Twig\Node\Expression;
+
+use Twig\Compiler;
+use Twig\Node\Node;
+
+/**
+ * Represents an arrow function.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class ArrowFunctionExpression extends AbstractExpression
+{
+    public function __construct(AbstractExpression $expr, Node $names, $lineno, $tag = null)
+    {
+        parent::__construct(['expr' => $expr, 'names' => $names], [], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->raw('function (')
+        ;
+        foreach ($this->getNode('names') as $i => $name) {
+            if ($i) {
+                $compiler->raw(', ');
+            }
+
+            $compiler
+                ->raw('$__')
+                ->raw($name->getAttribute('name'))
+                ->raw('__')
+            ;
+        }
+        $compiler
+            ->raw(') use ($context) { ')
+        ;
+        foreach ($this->getNode('names') as $name) {
+            $compiler
+                ->raw('$context["')
+                ->raw($name->getAttribute('name'))
+                ->raw('"] = $__')
+                ->raw($name->getAttribute('name'))
+                ->raw('__; ')
+            ;
+        }
+        $compiler
+            ->raw('return ')
+            ->subcompile($this->getNode('expr'))
+            ->raw('; }')
+        ;
+    }
+}
diff --git a/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php b/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php
index f1cd3a1a..62c4ac0b 100644
--- a/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/AssignNameExpression.php
@@ -1,11 +1,29 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_AssignName');
+use Twig\Compiler;
 
-if (\false) {
-    class AssignNameExpression extends \Twig_Node_Expression_AssignName
+class AssignNameExpression extends NameExpression
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('$context[')
+            ->string($this->getAttribute('name'))
+            ->raw(']')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\AssignNameExpression', 'Twig_Node_Expression_AssignName');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php
index 7462a8cf..67c388ae 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/AbstractBinary.php
@@ -1,11 +1,44 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary');
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
+use Twig\Node\Node;
+
+abstract class AbstractBinary extends AbstractExpression
+{
+    public function __construct(Node $left, Node $right, int $lineno)
+    {
+        parent::__construct(['left' => $left, 'right' => $right], [], $lineno);
+    }
 
-if (\false) {
-    class AbstractBinary extends \Twig_Node_Expression_Binary
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('(')
+            ->subcompile($this->getNode('left'))
+            ->raw(' ')
+        ;
+        $this->operator($compiler);
+        $compiler
+            ->raw(' ')
+            ->subcompile($this->getNode('right'))
+            ->raw(')')
+        ;
     }
+
+    abstract public function operator(Compiler $compiler);
 }
+
+class_alias('Twig\Node\Expression\Binary\AbstractBinary', 'Twig_Node_Expression_Binary');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php
index 9bb84168..f7719a19 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/AddBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Add');
+use Twig\Compiler;
 
-if (\false) {
-    class AddBinary extends \Twig_Node_Expression_Binary_Add
+class AddBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('+');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\AddBinary', 'Twig_Node_Expression_Binary_Add');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php
index 06034a60..484597da 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/AndBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_And');
+use Twig\Compiler;
 
-if (\false) {
-    class AndBinary extends \Twig_Node_Expression_Binary_And
+class AndBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('&&');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\AndBinary', 'Twig_Node_Expression_Binary_And');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php
index da98ce06..cf286912 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_BitwiseAnd');
+use Twig\Compiler;
 
-if (\false) {
-    class BitwiseAndBinary extends \Twig_Node_Expression_Binary_BitwiseAnd
+class BitwiseAndBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('&');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\BitwiseAndBinary', 'Twig_Node_Expression_Binary_BitwiseAnd');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php
index 16b434c4..7d5d2600 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_BitwiseOr');
+use Twig\Compiler;
 
-if (\false) {
-    class BitwiseOrBinary extends \Twig_Node_Expression_Binary_BitwiseOr
+class BitwiseOrBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('|');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\BitwiseOrBinary', 'Twig_Node_Expression_Binary_BitwiseOr');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php
index ee6a6880..72919871 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_BitwiseXor');
+use Twig\Compiler;
 
-if (\false) {
-    class BitwiseXorBinary extends \Twig_Node_Expression_Binary_BitwiseXor
+class BitwiseXorBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('^');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\BitwiseXorBinary', 'Twig_Node_Expression_Binary_BitwiseXor');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php
index 29dfda34..f6e5938f 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/ConcatBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Concat');
+use Twig\Compiler;
 
-if (\false) {
-    class ConcatBinary extends \Twig_Node_Expression_Binary_Concat
+class ConcatBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('.');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\ConcatBinary', 'Twig_Node_Expression_Binary_Concat');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php
index 7326bde6..ebfcc758 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/DivBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Div');
+use Twig\Compiler;
 
-if (\false) {
-    class DivBinary extends \Twig_Node_Expression_Binary_Div
+class DivBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('/');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\DivBinary', 'Twig_Node_Expression_Binary_Div');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php
index 9845ad16..41a0065b 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php
@@ -1,11 +1,37 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_EndsWith');
+use Twig\Compiler;
 
-if (\false) {
-    class EndsWithBinary extends \Twig_Node_Expression_Binary_EndsWith
+class EndsWithBinary extends AbstractBinary
+{
+    public function compile(Compiler $compiler)
     {
+        $left = $compiler->getVarName();
+        $right = $compiler->getVarName();
+        $compiler
+            ->raw(sprintf('(is_string($%s = ', $left))
+            ->subcompile($this->getNode('left'))
+            ->raw(sprintf(') && is_string($%s = ', $right))
+            ->subcompile($this->getNode('right'))
+            ->raw(sprintf(') && (\'\' === $%2$s || $%2$s === substr($%1$s, -strlen($%2$s))))', $left, $right))
+        ;
+    }
+
+    public function operator(Compiler $compiler)
+    {
+        return $compiler->raw('');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\EndsWithBinary', 'Twig_Node_Expression_Binary_EndsWith');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php
index 97e4889a..84904c36 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/EqualBinary.php
@@ -1,11 +1,24 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Equal');
+use Twig\Compiler;
 
-if (\false) {
-    class EqualBinary extends \Twig_Node_Expression_Binary_Equal
+class EqualBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('==');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\EqualBinary', 'Twig_Node_Expression_Binary_Equal');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php
index 9e8676f4..4dd5e3d3 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php
@@ -1,11 +1,31 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_FloorDiv');
+use Twig\Compiler;
 
-if (\false) {
-    class FloorDivBinary extends \Twig_Node_Expression_Binary_FloorDiv
+class FloorDivBinary extends AbstractBinary
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler->raw('(int) floor(');
+        parent::compile($compiler);
+        $compiler->raw(')');
+    }
+
+    public function operator(Compiler $compiler)
+    {
+        return $compiler->raw('/');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\FloorDivBinary', 'Twig_Node_Expression_Binary_FloorDiv');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php
index 8dde9d2a..be73001e 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/GreaterBinary.php
@@ -1,11 +1,24 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Greater');
+use Twig\Compiler;
 
-if (\false) {
-    class GreaterBinary extends \Twig_Node_Expression_Binary_Greater
+class GreaterBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('>');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\GreaterBinary', 'Twig_Node_Expression_Binary_Greater');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php
index 455f6d84..5c2ae72e 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php
@@ -1,11 +1,24 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_GreaterEqual');
+use Twig\Compiler;
 
-if (\false) {
-    class GreaterEqualBinary extends \Twig_Node_Expression_Binary_GreaterEqual
+class GreaterEqualBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('>=');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\GreaterEqualBinary', 'Twig_Node_Expression_Binary_GreaterEqual');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php
index 3e3cf2fe..f00b2306 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/InBinary.php
@@ -1,11 +1,35 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_In');
+use Twig\Compiler;
 
-if (\false) {
-    class InBinary extends \Twig_Node_Expression_Binary_In
+class InBinary extends AbstractBinary
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('twig_in_filter(')
+            ->subcompile($this->getNode('left'))
+            ->raw(', ')
+            ->subcompile($this->getNode('right'))
+            ->raw(')')
+        ;
+    }
+
+    public function operator(Compiler $compiler)
+    {
+        return $compiler->raw('in');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\InBinary', 'Twig_Node_Expression_Binary_In');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php
index 84bcfe6b..2b202daa 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/LessBinary.php
@@ -1,11 +1,24 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Less');
+use Twig\Compiler;
 
-if (\false) {
-    class LessBinary extends \Twig_Node_Expression_Binary_Less
+class LessBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('<');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\LessBinary', 'Twig_Node_Expression_Binary_Less');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php
index 0f3018a4..4fffafea 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php
@@ -1,11 +1,24 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_LessEqual');
+use Twig\Compiler;
 
-if (\false) {
-    class LessEqualBinary extends \Twig_Node_Expression_Binary_LessEqual
+class LessEqualBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('<=');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\LessEqualBinary', 'Twig_Node_Expression_Binary_LessEqual');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php
index d8b039a7..ae810b26 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/MatchesBinary.php
@@ -1,11 +1,35 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Matches');
+use Twig\Compiler;
 
-if (\false) {
-    class MatchesBinary extends \Twig_Node_Expression_Binary_Matches
+class MatchesBinary extends AbstractBinary
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('preg_match(')
+            ->subcompile($this->getNode('right'))
+            ->raw(', ')
+            ->subcompile($this->getNode('left'))
+            ->raw(')')
+        ;
+    }
+
+    public function operator(Compiler $compiler)
+    {
+        return $compiler->raw('');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\MatchesBinary', 'Twig_Node_Expression_Binary_Matches');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php
index d39d5a46..e6a2b360 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/ModBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Mod');
+use Twig\Compiler;
 
-if (\false) {
-    class ModBinary extends \Twig_Node_Expression_Binary_Mod
+class ModBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('%');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\ModBinary', 'Twig_Node_Expression_Binary_Mod');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php
index 46d6d3f6..cd65f5df 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/MulBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Mul');
+use Twig\Compiler;
 
-if (\false) {
-    class MulBinary extends \Twig_Node_Expression_Binary_Mul
+class MulBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('*');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\MulBinary', 'Twig_Node_Expression_Binary_Mul');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php
index 09a546fd..df5c6a23 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php
@@ -1,11 +1,24 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_NotEqual');
+use Twig\Compiler;
 
-if (\false) {
-    class NotEqualBinary extends \Twig_Node_Expression_Binary_NotEqual
+class NotEqualBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('!=');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\NotEqualBinary', 'Twig_Node_Expression_Binary_NotEqual');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php
index 3ef89954..ed2034e3 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/NotInBinary.php
@@ -1,11 +1,35 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_NotIn');
+use Twig\Compiler;
 
-if (\false) {
-    class NotInBinary extends \Twig_Node_Expression_Binary_NotIn
+class NotInBinary extends AbstractBinary
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('!twig_in_filter(')
+            ->subcompile($this->getNode('left'))
+            ->raw(', ')
+            ->subcompile($this->getNode('right'))
+            ->raw(')')
+        ;
+    }
+
+    public function operator(Compiler $compiler)
+    {
+        return $compiler->raw('not in');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\NotInBinary', 'Twig_Node_Expression_Binary_NotIn');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php
index f0311fd2..8f9da431 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/OrBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Or');
+use Twig\Compiler;
 
-if (\false) {
-    class OrBinary extends \Twig_Node_Expression_Binary_Or
+class OrBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('||');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\OrBinary', 'Twig_Node_Expression_Binary_Or');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php
index f4033cb1..32d0214f 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/PowerBinary.php
@@ -1,11 +1,24 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Power');
+use Twig\Compiler;
 
-if (\false) {
-    class PowerBinary extends \Twig_Node_Expression_Binary_Power
+class PowerBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('**');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\PowerBinary', 'Twig_Node_Expression_Binary_Power');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php
index 7ffe00a0..e9c0cdf5 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/RangeBinary.php
@@ -1,11 +1,35 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Range');
+use Twig\Compiler;
 
-if (\false) {
-    class RangeBinary extends \Twig_Node_Expression_Binary_Range
+class RangeBinary extends AbstractBinary
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('range(')
+            ->subcompile($this->getNode('left'))
+            ->raw(', ')
+            ->subcompile($this->getNode('right'))
+            ->raw(')')
+        ;
+    }
+
+    public function operator(Compiler $compiler)
+    {
+        return $compiler->raw('..');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\RangeBinary', 'Twig_Node_Expression_Binary_Range');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php
index 3548ce47..1fe59fb4 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php
@@ -1,11 +1,37 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_StartsWith');
+use Twig\Compiler;
 
-if (\false) {
-    class StartsWithBinary extends \Twig_Node_Expression_Binary_StartsWith
+class StartsWithBinary extends AbstractBinary
+{
+    public function compile(Compiler $compiler)
     {
+        $left = $compiler->getVarName();
+        $right = $compiler->getVarName();
+        $compiler
+            ->raw(sprintf('(is_string($%s = ', $left))
+            ->subcompile($this->getNode('left'))
+            ->raw(sprintf(') && is_string($%s = ', $right))
+            ->subcompile($this->getNode('right'))
+            ->raw(sprintf(') && (\'\' === $%2$s || 0 === strpos($%1$s, $%2$s)))', $left, $right))
+        ;
+    }
+
+    public function operator(Compiler $compiler)
+    {
+        return $compiler->raw('');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\StartsWithBinary', 'Twig_Node_Expression_Binary_StartsWith');
diff --git a/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php b/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php
index 1bd35cc3..25469750 100644
--- a/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php
+++ b/vendor/twig/twig/src/Node/Expression/Binary/SubBinary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Binary;
 
-class_exists('Twig_Node_Expression_Binary_Sub');
+use Twig\Compiler;
 
-if (\false) {
-    class SubBinary extends \Twig_Node_Expression_Binary_Sub
+class SubBinary extends AbstractBinary
+{
+    public function operator(Compiler $compiler)
     {
+        return $compiler->raw('-');
     }
 }
+
+class_alias('Twig\Node\Expression\Binary\SubBinary', 'Twig_Node_Expression_Binary_Sub');
diff --git a/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php b/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php
index 4d4439e3..c68989ae 100644
--- a/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/BlockReferenceExpression.php
@@ -1,11 +1,88 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_BlockReference');
+use Twig\Compiler;
+use Twig\Node\Node;
 
-if (\false) {
-    class BlockReferenceExpression extends \Twig_Node_Expression_BlockReference
+/**
+ * Represents a block call node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class BlockReferenceExpression extends AbstractExpression
+{
+    public function __construct(Node $name, Node $template = null, int $lineno, string $tag = null)
     {
+        $nodes = ['name' => $name];
+        if (null !== $template) {
+            $nodes['template'] = $template;
+        }
+
+        parent::__construct($nodes, ['is_defined_test' => false, 'output' => false], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        if ($this->getAttribute('is_defined_test')) {
+            $this->compileTemplateCall($compiler, 'hasBlock');
+        } else {
+            if ($this->getAttribute('output')) {
+                $compiler->addDebugInfo($this);
+
+                $this
+                    ->compileTemplateCall($compiler, 'displayBlock')
+                    ->raw(";\n");
+            } else {
+                $this->compileTemplateCall($compiler, 'renderBlock');
+            }
+        }
+    }
+
+    private function compileTemplateCall(Compiler $compiler, string $method): Compiler
+    {
+        if (!$this->hasNode('template')) {
+            $compiler->write('$this');
+        } else {
+            $compiler
+                ->write('$this->loadTemplate(')
+                ->subcompile($this->getNode('template'))
+                ->raw(', ')
+                ->repr($this->getTemplateName())
+                ->raw(', ')
+                ->repr($this->getTemplateLine())
+                ->raw(')')
+            ;
+        }
+
+        $compiler->raw(sprintf('->%s', $method));
+
+        return $this->compileBlockArguments($compiler);
+    }
+
+    private function compileBlockArguments(Compiler $compiler): Compiler
+    {
+        $compiler
+            ->raw('(')
+            ->subcompile($this->getNode('name'))
+            ->raw(', $context');
+
+        if (!$this->hasNode('template')) {
+            $compiler->raw(', $blocks');
+        }
+
+        return $compiler->raw(')');
     }
 }
+
+class_alias('Twig\Node\Expression\BlockReferenceExpression', 'Twig_Node_Expression_BlockReference');
diff --git a/vendor/twig/twig/src/Node/Expression/CallExpression.php b/vendor/twig/twig/src/Node/Expression/CallExpression.php
index f9af30b2..4ecd2c11 100644
--- a/vendor/twig/twig/src/Node/Expression/CallExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/CallExpression.php
@@ -1,11 +1,313 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_Call');
+use Twig\Compiler;
+use Twig\Error\SyntaxError;
+use Twig\Extension\ExtensionInterface;
+use Twig\Node\Node;
+
+abstract class CallExpression extends AbstractExpression
+{
+    private $reflector;
+
+    protected function compileCallable(Compiler $compiler)
+    {
+        $callable = $this->getAttribute('callable');
+
+        $closingParenthesis = false;
+        $isArray = false;
+        if (\is_string($callable) && false === strpos($callable, '::')) {
+            $compiler->raw($callable);
+        } else {
+            list($r, $callable) = $this->reflectCallable($callable);
+            if ($r instanceof \ReflectionMethod && \is_string($callable[0])) {
+                if ($r->isStatic()) {
+                    $compiler->raw(sprintf('%s::%s', $callable[0], $callable[1]));
+                } else {
+                    $compiler->raw(sprintf('$this->env->getRuntime(\'%s\')->%s', $callable[0], $callable[1]));
+                }
+            } elseif ($r instanceof \ReflectionMethod && $callable[0] instanceof ExtensionInterface) {
+                // For BC/FC with namespaced aliases
+                $class = (new \ReflectionClass(\get_class($callable[0])))->name;
+                if (!$compiler->getEnvironment()->hasExtension($class)) {
+                    // Compile a non-optimized call to trigger a \Twig\Error\RuntimeError, which cannot be a compile-time error
+                    $compiler->raw(sprintf('$this->env->getExtension(\'%s\')', $class));
+                } else {
+                    $compiler->raw(sprintf('$this->extensions[\'%s\']', ltrim($class, '\\')));
+                }
+
+                $compiler->raw(sprintf('->%s', $callable[1]));
+            } else {
+                $closingParenthesis = true;
+                $isArray = true;
+                $compiler->raw(sprintf('call_user_func_array($this->env->get%s(\'%s\')->getCallable(), ', ucfirst($this->getAttribute('type')), $this->getAttribute('name')));
+            }
+        }
+
+        $this->compileArguments($compiler, $isArray);
+
+        if ($closingParenthesis) {
+            $compiler->raw(')');
+        }
+    }
+
+    protected function compileArguments(Compiler $compiler, $isArray = false)
+    {
+        $compiler->raw($isArray ? '[' : '(');
+
+        $first = true;
+
+        if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
+            $compiler->raw('$this->env');
+            $first = false;
+        }
+
+        if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
+            if (!$first) {
+                $compiler->raw(', ');
+            }
+            $compiler->raw('$context');
+            $first = false;
+        }
+
+        if ($this->hasAttribute('arguments')) {
+            foreach ($this->getAttribute('arguments') as $argument) {
+                if (!$first) {
+                    $compiler->raw(', ');
+                }
+                $compiler->string($argument);
+                $first = false;
+            }
+        }
+
+        if ($this->hasNode('node')) {
+            if (!$first) {
+                $compiler->raw(', ');
+            }
+            $compiler->subcompile($this->getNode('node'));
+            $first = false;
+        }
+
+        if ($this->hasNode('arguments')) {
+            $callable = $this->getAttribute('callable');
+            $arguments = $this->getArguments($callable, $this->getNode('arguments'));
+            foreach ($arguments as $node) {
+                if (!$first) {
+                    $compiler->raw(', ');
+                }
+                $compiler->subcompile($node);
+                $first = false;
+            }
+        }
+
+        $compiler->raw($isArray ? ']' : ')');
+    }
+
+    protected function getArguments($callable = null, $arguments)
+    {
+        $callType = $this->getAttribute('type');
+        $callName = $this->getAttribute('name');
+
+        $parameters = [];
+        $named = false;
+        foreach ($arguments as $name => $node) {
+            if (!\is_int($name)) {
+                $named = true;
+                $name = $this->normalizeName($name);
+            } elseif ($named) {
+                throw new SyntaxError(sprintf('Positional arguments cannot be used after named arguments for %s "%s".', $callType, $callName), $this->getTemplateLine(), $this->getSourceContext());
+            }
+
+            $parameters[$name] = $node;
+        }
+
+        $isVariadic = $this->hasAttribute('is_variadic') && $this->getAttribute('is_variadic');
+        if (!$named && !$isVariadic) {
+            return $parameters;
+        }
 
-if (\false) {
-    class CallExpression extends \Twig_Node_Expression_Call
+        if (!$callable) {
+            if ($named) {
+                $message = sprintf('Named arguments are not supported for %s "%s".', $callType, $callName);
+            } else {
+                $message = sprintf('Arbitrary positional arguments are not supported for %s "%s".', $callType, $callName);
+            }
+
+            throw new \LogicException($message);
+        }
+
+        list($callableParameters, $isPhpVariadic) = $this->getCallableParameters($callable, $isVariadic);
+        $arguments = [];
+        $names = [];
+        $missingArguments = [];
+        $optionalArguments = [];
+        $pos = 0;
+        foreach ($callableParameters as $callableParameter) {
+            $names[] = $name = $this->normalizeName($callableParameter->name);
+
+            if (\array_key_exists($name, $parameters)) {
+                if (\array_key_exists($pos, $parameters)) {
+                    throw new SyntaxError(sprintf('Argument "%s" is defined twice for %s "%s".', $name, $callType, $callName), $this->getTemplateLine(), $this->getSourceContext());
+                }
+
+                if (\count($missingArguments)) {
+                    throw new SyntaxError(sprintf(
+                        'Argument "%s" could not be assigned for %s "%s(%s)" because it is mapped to an internal PHP function which cannot determine default value for optional argument%s "%s".',
+                        $name, $callType, $callName, implode(', ', $names), \count($missingArguments) > 1 ? 's' : '', implode('", "', $missingArguments)
+                    ), $this->getTemplateLine(), $this->getSourceContext());
+                }
+
+                $arguments = array_merge($arguments, $optionalArguments);
+                $arguments[] = $parameters[$name];
+                unset($parameters[$name]);
+                $optionalArguments = [];
+            } elseif (\array_key_exists($pos, $parameters)) {
+                $arguments = array_merge($arguments, $optionalArguments);
+                $arguments[] = $parameters[$pos];
+                unset($parameters[$pos]);
+                $optionalArguments = [];
+                ++$pos;
+            } elseif ($callableParameter->isDefaultValueAvailable()) {
+                $optionalArguments[] = new ConstantExpression($callableParameter->getDefaultValue(), -1);
+            } elseif ($callableParameter->isOptional()) {
+                if (empty($parameters)) {
+                    break;
+                } else {
+                    $missingArguments[] = $name;
+                }
+            } else {
+                throw new SyntaxError(sprintf('Value for argument "%s" is required for %s "%s".', $name, $callType, $callName), $this->getTemplateLine(), $this->getSourceContext());
+            }
+        }
+
+        if ($isVariadic) {
+            $arbitraryArguments = $isPhpVariadic ? new VariadicExpression([], -1) : new ArrayExpression([], -1);
+            foreach ($parameters as $key => $value) {
+                if (\is_int($key)) {
+                    $arbitraryArguments->addElement($value);
+                } else {
+                    $arbitraryArguments->addElement($value, new ConstantExpression($key, -1));
+                }
+                unset($parameters[$key]);
+            }
+
+            if ($arbitraryArguments->count()) {
+                $arguments = array_merge($arguments, $optionalArguments);
+                $arguments[] = $arbitraryArguments;
+            }
+        }
+
+        if (!empty($parameters)) {
+            $unknownParameter = null;
+            foreach ($parameters as $parameter) {
+                if ($parameter instanceof Node) {
+                    $unknownParameter = $parameter;
+                    break;
+                }
+            }
+
+            throw new SyntaxError(
+                sprintf(
+                    'Unknown argument%s "%s" for %s "%s(%s)".',
+                    \count($parameters) > 1 ? 's' : '', implode('", "', array_keys($parameters)), $callType, $callName, implode(', ', $names)
+                ),
+                $unknownParameter ? $unknownParameter->getTemplateLine() : $this->getTemplateLine(),
+                $unknownParameter ? $unknownParameter->getSourceContext() : $this->getSourceContext()
+            );
+        }
+
+        return $arguments;
+    }
+
+    protected function normalizeName($name)
     {
+        return strtolower(preg_replace(['/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'], ['\\1_\\2', '\\1_\\2'], $name));
+    }
+
+    private function getCallableParameters($callable, bool $isVariadic): array
+    {
+        list($r) = $this->reflectCallable($callable);
+        if (null === $r) {
+            return [[], false];
+        }
+
+        $parameters = $r->getParameters();
+        if ($this->hasNode('node')) {
+            array_shift($parameters);
+        }
+        if ($this->hasAttribute('needs_environment') && $this->getAttribute('needs_environment')) {
+            array_shift($parameters);
+        }
+        if ($this->hasAttribute('needs_context') && $this->getAttribute('needs_context')) {
+            array_shift($parameters);
+        }
+        if ($this->hasAttribute('arguments') && null !== $this->getAttribute('arguments')) {
+            foreach ($this->getAttribute('arguments') as $argument) {
+                array_shift($parameters);
+            }
+        }
+        $isPhpVariadic = false;
+        if ($isVariadic) {
+            $argument = end($parameters);
+            if ($argument && $argument->isArray() && $argument->isDefaultValueAvailable() && [] === $argument->getDefaultValue()) {
+                array_pop($parameters);
+            } elseif ($argument && $argument->isVariadic()) {
+                array_pop($parameters);
+                $isPhpVariadic = true;
+            } else {
+                $callableName = $r->name;
+                if ($r instanceof \ReflectionMethod) {
+                    $callableName = $r->getDeclaringClass()->name.'::'.$callableName;
+                }
+
+                throw new \LogicException(sprintf('The last parameter of "%s" for %s "%s" must be an array with default value, eg. "array $arg = []".', $callableName, $this->getAttribute('type'), $this->getAttribute('name')));
+            }
+        }
+
+        return [$parameters, $isPhpVariadic];
+    }
+
+    private function reflectCallable($callable)
+    {
+        if (null !== $this->reflector) {
+            return $this->reflector;
+        }
+
+        if (\is_array($callable)) {
+            if (!method_exists($callable[0], $callable[1])) {
+                // __call()
+                return [null, []];
+            }
+            $r = new \ReflectionMethod($callable[0], $callable[1]);
+        } elseif (\is_object($callable) && !$callable instanceof \Closure) {
+            $r = new \ReflectionObject($callable);
+            $r = $r->getMethod('__invoke');
+            $callable = [$callable, '__invoke'];
+        } elseif (\is_string($callable) && false !== $pos = strpos($callable, '::')) {
+            $class = substr($callable, 0, $pos);
+            $method = substr($callable, $pos + 2);
+            if (!method_exists($class, $method)) {
+                // __staticCall()
+                return [null, []];
+            }
+            $r = new \ReflectionMethod($callable);
+            $callable = [$class, $method];
+        } else {
+            $r = new \ReflectionFunction($callable);
+        }
+
+        return $this->reflector = [$r, $callable];
     }
 }
+
+class_alias('Twig\Node\Expression\CallExpression', 'Twig_Node_Expression_Call');
diff --git a/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php b/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php
index 507d085e..8c367d35 100644
--- a/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/ConditionalExpression.php
@@ -1,11 +1,38 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_Conditional');
+use Twig\Compiler;
 
-if (\false) {
-    class ConditionalExpression extends \Twig_Node_Expression_Conditional
+class ConditionalExpression extends AbstractExpression
+{
+    public function __construct(AbstractExpression $expr1, AbstractExpression $expr2, AbstractExpression $expr3, int $lineno)
     {
+        parent::__construct(['expr1' => $expr1, 'expr2' => $expr2, 'expr3' => $expr3], [], $lineno);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->raw('((')
+            ->subcompile($this->getNode('expr1'))
+            ->raw(') ? (')
+            ->subcompile($this->getNode('expr2'))
+            ->raw(') : (')
+            ->subcompile($this->getNode('expr3'))
+            ->raw('))')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\ConditionalExpression', 'Twig_Node_Expression_Conditional');
diff --git a/vendor/twig/twig/src/Node/Expression/ConstantExpression.php b/vendor/twig/twig/src/Node/Expression/ConstantExpression.php
index ef197ba0..46e0ac39 100644
--- a/vendor/twig/twig/src/Node/Expression/ConstantExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/ConstantExpression.php
@@ -1,11 +1,30 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_Constant');
+use Twig\Compiler;
 
-if (\false) {
-    class ConstantExpression extends \Twig_Node_Expression_Constant
+class ConstantExpression extends AbstractExpression
+{
+    public function __construct($value, int $lineno)
     {
+        parent::__construct([], ['value' => $value], $lineno);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler->repr($this->getAttribute('value'));
     }
 }
+
+class_alias('Twig\Node\Expression\ConstantExpression', 'Twig_Node_Expression_Constant');
diff --git a/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php b/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php
index 2eb573c2..0dacae83 100644
--- a/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php
+++ b/vendor/twig/twig/src/Node/Expression/Filter/DefaultFilter.php
@@ -1,11 +1,54 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Filter;
 
-class_exists('Twig_Node_Expression_Filter_Default');
+use Twig\Compiler;
+use Twig\Node\Expression\ConditionalExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\FilterExpression;
+use Twig\Node\Expression\GetAttrExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\Expression\Test\DefinedTest;
+use Twig\Node\Node;
+
+/**
+ * Returns the value or the default value when it is undefined or empty.
+ *
+ *  {{ var.foo|default('foo item on var is not defined') }}
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class DefaultFilter extends FilterExpression
+{
+    public function __construct(Node $node, ConstantExpression $filterName, Node $arguments, int $lineno, string $tag = null)
+    {
+        $default = new FilterExpression($node, new ConstantExpression('default', $node->getTemplateLine()), $arguments, $node->getTemplateLine());
+
+        if ('default' === $filterName->getAttribute('value') && ($node instanceof NameExpression || $node instanceof GetAttrExpression)) {
+            $test = new DefinedTest(clone $node, 'defined', new Node(), $node->getTemplateLine());
+            $false = \count($arguments) ? $arguments->getNode(0) : new ConstantExpression('', $node->getTemplateLine());
 
-if (\false) {
-    class DefaultFilter extends \Twig_Node_Expression_Filter_Default
+            $node = new ConditionalExpression($test, $default, $false, $node->getTemplateLine());
+        } else {
+            $node = $default;
+        }
+
+        parent::__construct($node, $filterName, $arguments, $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
     {
+        $compiler->subcompile($this->getNode('node'));
     }
 }
+
+class_alias('Twig\Node\Expression\Filter\DefaultFilter', 'Twig_Node_Expression_Filter_Default');
diff --git a/vendor/twig/twig/src/Node/Expression/FilterExpression.php b/vendor/twig/twig/src/Node/Expression/FilterExpression.php
index 47b3b41e..41b07341 100644
--- a/vendor/twig/twig/src/Node/Expression/FilterExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/FilterExpression.php
@@ -1,11 +1,42 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_Filter');
+use Twig\Compiler;
+use Twig\Node\Node;
 
-if (\false) {
-    class FilterExpression extends \Twig_Node_Expression_Filter
+class FilterExpression extends CallExpression
+{
+    public function __construct(Node $node, ConstantExpression $filterName, Node $arguments, int $lineno, string $tag = null)
     {
+        parent::__construct(['node' => $node, 'filter' => $filterName, 'arguments' => $arguments], [], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $name = $this->getNode('filter')->getAttribute('value');
+        $filter = $compiler->getEnvironment()->getFilter($name);
+
+        $this->setAttribute('name', $name);
+        $this->setAttribute('type', 'filter');
+        $this->setAttribute('needs_environment', $filter->needsEnvironment());
+        $this->setAttribute('needs_context', $filter->needsContext());
+        $this->setAttribute('arguments', $filter->getArguments());
+        $this->setAttribute('callable', $filter->getCallable());
+        $this->setAttribute('is_variadic', $filter->isVariadic());
+
+        $this->compileCallable($compiler);
     }
 }
+
+class_alias('Twig\Node\Expression\FilterExpression', 'Twig_Node_Expression_Filter');
diff --git a/vendor/twig/twig/src/Node/Expression/FunctionExpression.php b/vendor/twig/twig/src/Node/Expression/FunctionExpression.php
index 9ab002fb..429dbb92 100644
--- a/vendor/twig/twig/src/Node/Expression/FunctionExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/FunctionExpression.php
@@ -1,11 +1,45 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_Function');
+use Twig\Compiler;
+use Twig\Node\Node;
 
-if (\false) {
-    class FunctionExpression extends \Twig_Node_Expression_Function
+class FunctionExpression extends CallExpression
+{
+    public function __construct(string $name, Node $arguments, int $lineno)
     {
+        parent::__construct(['arguments' => $arguments], ['name' => $name, 'is_defined_test' => false], $lineno);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $name = $this->getAttribute('name');
+        $function = $compiler->getEnvironment()->getFunction($name);
+
+        $this->setAttribute('name', $name);
+        $this->setAttribute('type', 'function');
+        $this->setAttribute('needs_environment', $function->needsEnvironment());
+        $this->setAttribute('needs_context', $function->needsContext());
+        $this->setAttribute('arguments', $function->getArguments());
+        $callable = $function->getCallable();
+        if ('constant' === $name && $this->getAttribute('is_defined_test')) {
+            $callable = 'twig_constant_is_defined';
+        }
+        $this->setAttribute('callable', $callable);
+        $this->setAttribute('is_variadic', $function->isVariadic());
+
+        $this->compileCallable($compiler);
     }
 }
+
+class_alias('Twig\Node\Expression\FunctionExpression', 'Twig_Node_Expression_Function');
diff --git a/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php b/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php
index 6e810c7f..7b066170 100644
--- a/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/GetAttrExpression.php
@@ -1,11 +1,89 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_GetAttr');
+use Twig\Compiler;
+use Twig\Extension\SandboxExtension;
+use Twig\Template;
 
-if (\false) {
-    class GetAttrExpression extends \Twig_Node_Expression_GetAttr
+class GetAttrExpression extends AbstractExpression
+{
+    public function __construct(AbstractExpression $node, AbstractExpression $attribute, AbstractExpression $arguments = null, string $type, int $lineno)
     {
+        $nodes = ['node' => $node, 'attribute' => $attribute];
+        if (null !== $arguments) {
+            $nodes['arguments'] = $arguments;
+        }
+
+        parent::__construct($nodes, ['type' => $type, 'is_defined_test' => false, 'ignore_strict_check' => false, 'optimizable' => true], $lineno);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $env = $compiler->getEnvironment();
+
+        // optimize array calls
+        if (
+            $this->getAttribute('optimizable')
+            && (!$env->isStrictVariables() || $this->getAttribute('ignore_strict_check'))
+            && !$this->getAttribute('is_defined_test')
+            && Template::ARRAY_CALL === $this->getAttribute('type')
+        ) {
+            $var = '$'.$compiler->getVarName();
+            $compiler
+                ->raw('(('.$var.' = ')
+                ->subcompile($this->getNode('node'))
+                ->raw(') && is_array(')
+                ->raw($var)
+                ->raw(') || ')
+                ->raw($var)
+                ->raw(' instanceof ArrayAccess ? (')
+                ->raw($var)
+                ->raw('[')
+                ->subcompile($this->getNode('attribute'))
+                ->raw('] ?? null) : null)')
+            ;
+
+            return;
+        }
+
+        $compiler->raw('twig_get_attribute($this->env, $this->source, ');
+
+        if ($this->getAttribute('ignore_strict_check')) {
+            $this->getNode('node')->setAttribute('ignore_strict_check', true);
+        }
+
+        $compiler
+            ->subcompile($this->getNode('node'))
+            ->raw(', ')
+            ->subcompile($this->getNode('attribute'))
+        ;
+
+        if ($this->hasNode('arguments')) {
+            $compiler->raw(', ')->subcompile($this->getNode('arguments'));
+        } else {
+            $compiler->raw(', []');
+        }
+
+        $compiler->raw(', ')
+            ->repr($this->getAttribute('type'))
+            ->raw(', ')->repr($this->getAttribute('is_defined_test'))
+            ->raw(', ')->repr($this->getAttribute('ignore_strict_check'))
+            ->raw(', ')->repr($env->hasExtension(SandboxExtension::class))
+            ->raw(', ')->repr($this->getNode('node')->getTemplateLine())
+            ->raw(')')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\GetAttrExpression', 'Twig_Node_Expression_GetAttr');
diff --git a/vendor/twig/twig/src/Node/Expression/InlinePrint.php b/vendor/twig/twig/src/Node/Expression/InlinePrint.php
new file mode 100644
index 00000000..469e7367
--- /dev/null
+++ b/vendor/twig/twig/src/Node/Expression/InlinePrint.php
@@ -0,0 +1,35 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Twig\Node\Expression;
+
+use Twig\Compiler;
+use Twig\Node\Node;
+
+/**
+ * @internal
+ */
+final class InlinePrint extends AbstractExpression
+{
+    public function __construct(Node $node, $lineno)
+    {
+        parent::__construct(['node' => $node], [], $lineno);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->raw('print (')
+            ->subcompile($this->getNode('node'))
+            ->raw(')')
+        ;
+    }
+}
diff --git a/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php b/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php
index e751c31b..d5287f85 100644
--- a/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/MethodCallExpression.php
@@ -1,11 +1,64 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_MethodCall');
+use Twig\Compiler;
 
-if (\false) {
-    class MethodCallExpression extends \Twig_Node_Expression_MethodCall
+class MethodCallExpression extends AbstractExpression
+{
+    public function __construct(AbstractExpression $node, string $method, ArrayExpression $arguments, int $lineno)
     {
+        parent::__construct(['node' => $node, 'arguments' => $arguments], ['method' => $method, 'safe' => false, 'is_defined_test' => false], $lineno);
+
+        if ($node instanceof NameExpression) {
+            $node->setAttribute('always_defined', true);
+        }
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        if ($this->getAttribute('is_defined_test')) {
+            $compiler
+                ->raw('method_exists($macros[')
+                ->repr($this->getNode('node')->getAttribute('name'))
+                ->raw('], ')
+                ->repr($this->getAttribute('method'))
+                ->raw(')')
+            ;
+
+            return;
+        }
+
+        $compiler
+            ->raw('twig_call_macro($macros[')
+            ->repr($this->getNode('node')->getAttribute('name'))
+            ->raw('], ')
+            ->repr($this->getAttribute('method'))
+            ->raw(', [')
+        ;
+        $first = true;
+        foreach ($this->getNode('arguments')->getKeyValuePairs() as $pair) {
+            if (!$first) {
+                $compiler->raw(', ');
+            }
+            $first = false;
+
+            $compiler->subcompile($pair['value']);
+        }
+        $compiler
+            ->raw('], ')
+            ->repr($this->getTemplateLine())
+            ->raw(', $context, $this->getSourceContext())');
     }
 }
+
+class_alias('Twig\Node\Expression\MethodCallExpression', 'Twig_Node_Expression_MethodCall');
diff --git a/vendor/twig/twig/src/Node/Expression/NameExpression.php b/vendor/twig/twig/src/Node/Expression/NameExpression.php
index c32981af..ff7a046a 100644
--- a/vendor/twig/twig/src/Node/Expression/NameExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/NameExpression.php
@@ -1,11 +1,99 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_Name');
+use Twig\Compiler;
+
+class NameExpression extends AbstractExpression
+{
+    private $specialVars = [
+        '_self' => '$this->getTemplateName()',
+        '_context' => '$context',
+        '_charset' => '$this->env->getCharset()',
+    ];
+
+    public function __construct(string $name, int $lineno)
+    {
+        parent::__construct([], ['name' => $name, 'is_defined_test' => false, 'ignore_strict_check' => false, 'always_defined' => false], $lineno);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $name = $this->getAttribute('name');
+
+        $compiler->addDebugInfo($this);
+
+        if ($this->getAttribute('is_defined_test')) {
+            if ($this->isSpecial()) {
+                $compiler->repr(true);
+            } elseif (\PHP_VERSION_ID >= 700400) {
+                $compiler
+                    ->raw('array_key_exists(')
+                    ->string($name)
+                    ->raw(', $context)')
+                ;
+            } else {
+                $compiler
+                    ->raw('(isset($context[')
+                    ->string($name)
+                    ->raw(']) || array_key_exists(')
+                    ->string($name)
+                    ->raw(', $context))')
+                ;
+            }
+        } elseif ($this->isSpecial()) {
+            $compiler->raw($this->specialVars[$name]);
+        } elseif ($this->getAttribute('always_defined')) {
+            $compiler
+                ->raw('$context[')
+                ->string($name)
+                ->raw(']')
+            ;
+        } else {
+            if ($this->getAttribute('ignore_strict_check') || !$compiler->getEnvironment()->isStrictVariables()) {
+                $compiler
+                    ->raw('($context[')
+                    ->string($name)
+                    ->raw('] ?? null)')
+                ;
+            } else {
+                $compiler
+                    ->raw('(isset($context[')
+                    ->string($name)
+                    ->raw(']) || array_key_exists(')
+                    ->string($name)
+                    ->raw(', $context) ? $context[')
+                    ->string($name)
+                    ->raw('] : (function () { throw new RuntimeError(\'Variable ')
+                    ->string($name)
+                    ->raw(' does not exist.\', ')
+                    ->repr($this->lineno)
+                    ->raw(', $this->source); })()')
+                    ->raw(')')
+                ;
+            }
+        }
+    }
 
-if (\false) {
-    class NameExpression extends \Twig_Node_Expression_Name
+    public function isSpecial()
     {
+        return isset($this->specialVars[$this->getAttribute('name')]);
+    }
+
+    public function isSimple()
+    {
+        return !$this->isSpecial() && !$this->getAttribute('is_defined_test');
     }
 }
+
+class_alias('Twig\Node\Expression\NameExpression', 'Twig_Node_Expression_Name');
diff --git a/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php b/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php
index a1d3590a..c551f2f6 100644
--- a/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/NullCoalesceExpression.php
@@ -1,11 +1,58 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_NullCoalesce');
+use Twig\Compiler;
+use Twig\Node\Expression\Binary\AndBinary;
+use Twig\Node\Expression\Test\DefinedTest;
+use Twig\Node\Expression\Test\NullTest;
+use Twig\Node\Expression\Unary\NotUnary;
+use Twig\Node\Node;
+
+class NullCoalesceExpression extends ConditionalExpression
+{
+    public function __construct(Node $left, Node $right, int $lineno)
+    {
+        $test = new AndBinary(
+            new DefinedTest(clone $left, 'defined', new Node(), $left->getTemplateLine()),
+            new NotUnary(new NullTest($left, 'null', new Node(), $left->getTemplateLine()), $left->getTemplateLine()),
+            $left->getTemplateLine()
+        );
+
+        parent::__construct($test, $left, $right, $lineno);
+    }
 
-if (\false) {
-    class NullCoalesceExpression extends \Twig_Node_Expression_NullCoalesce
+    public function compile(Compiler $compiler)
     {
+        /*
+         * This optimizes only one case. PHP 7 also supports more complex expressions
+         * that can return null. So, for instance, if log is defined, log("foo") ?? "..." works,
+         * but log($a["foo"]) ?? "..." does not if $a["foo"] is not defined. More advanced
+         * cases might be implemented as an optimizer node visitor, but has not been done
+         * as benefits are probably not worth the added complexity.
+         */
+        if ($this->getNode('expr2') instanceof NameExpression) {
+            $this->getNode('expr2')->setAttribute('always_defined', true);
+            $compiler
+                ->raw('((')
+                ->subcompile($this->getNode('expr2'))
+                ->raw(') ?? (')
+                ->subcompile($this->getNode('expr3'))
+                ->raw('))')
+            ;
+        } else {
+            parent::compile($compiler);
+        }
     }
 }
+
+class_alias('Twig\Node\Expression\NullCoalesceExpression', 'Twig_Node_Expression_NullCoalesce');
diff --git a/vendor/twig/twig/src/Node/Expression/ParentExpression.php b/vendor/twig/twig/src/Node/Expression/ParentExpression.php
index 70b0e360..294ab398 100644
--- a/vendor/twig/twig/src/Node/Expression/ParentExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/ParentExpression.php
@@ -1,11 +1,48 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_Parent');
+use Twig\Compiler;
 
-if (\false) {
-    class ParentExpression extends \Twig_Node_Expression_Parent
+/**
+ * Represents a parent node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class ParentExpression extends AbstractExpression
+{
+    public function __construct(string $name, int $lineno, string $tag = null)
     {
+        parent::__construct([], ['output' => false, 'name' => $name], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        if ($this->getAttribute('output')) {
+            $compiler
+                ->addDebugInfo($this)
+                ->write('$this->displayParentBlock(')
+                ->string($this->getAttribute('name'))
+                ->raw(", \$context, \$blocks);\n")
+            ;
+        } else {
+            $compiler
+                ->raw('$this->renderParentBlock(')
+                ->string($this->getAttribute('name'))
+                ->raw(', $context, $blocks)')
+            ;
+        }
     }
 }
+
+class_alias('Twig\Node\Expression\ParentExpression', 'Twig_Node_Expression_Parent');
diff --git a/vendor/twig/twig/src/Node/Expression/TempNameExpression.php b/vendor/twig/twig/src/Node/Expression/TempNameExpression.php
index 178b6dec..e7a1a890 100644
--- a/vendor/twig/twig/src/Node/Expression/TempNameExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/TempNameExpression.php
@@ -1,11 +1,33 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_TempName');
+use Twig\Compiler;
 
-if (\false) {
-    class TempNameExpression extends \Twig_Node_Expression_TempName
+class TempNameExpression extends AbstractExpression
+{
+    public function __construct(string $name, int $lineno)
     {
+        parent::__construct([], ['name' => $name], $lineno);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->raw('$_')
+            ->raw($this->getAttribute('name'))
+            ->raw('_')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\TempNameExpression', 'Twig_Node_Expression_TempName');
diff --git a/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php b/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php
index b54b2801..78353a8b 100644
--- a/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php
+++ b/vendor/twig/twig/src/Node/Expression/Test/ConstantTest.php
@@ -1,11 +1,51 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Test;
 
-class_exists('Twig_Node_Expression_Test_Constant');
+use Twig\Compiler;
+use Twig\Node\Expression\TestExpression;
 
-if (\false) {
-    class ConstantTest extends \Twig_Node_Expression_Test_Constant
+/**
+ * Checks if a variable is the exact same value as a constant.
+ *
+ *    {% if post.status is constant('Post::PUBLISHED') %}
+ *      the status attribute is exactly the same as Post::PUBLISHED
+ *    {% endif %}
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class ConstantTest extends TestExpression
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('(')
+            ->subcompile($this->getNode('node'))
+            ->raw(' === constant(')
+        ;
+
+        if ($this->getNode('arguments')->hasNode(1)) {
+            $compiler
+                ->raw('get_class(')
+                ->subcompile($this->getNode('arguments')->getNode(1))
+                ->raw(')."::".')
+            ;
+        }
+
+        $compiler
+            ->subcompile($this->getNode('arguments')->getNode(0))
+            ->raw('))')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\Test\ConstantTest', 'Twig_Node_Expression_Test_Constant');
diff --git a/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php b/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php
index 69c36a0b..7a898406 100644
--- a/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php
+++ b/vendor/twig/twig/src/Node/Expression/Test/DefinedTest.php
@@ -1,11 +1,76 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Test;
 
-class_exists('Twig_Node_Expression_Test_Defined');
+use Twig\Compiler;
+use Twig\Error\SyntaxError;
+use Twig\Node\Expression\ArrayExpression;
+use Twig\Node\Expression\BlockReferenceExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\FunctionExpression;
+use Twig\Node\Expression\GetAttrExpression;
+use Twig\Node\Expression\MethodCallExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\Expression\TestExpression;
+use Twig\Node\Node;
+
+/**
+ * Checks if a variable is defined in the current context.
+ *
+ *    {# defined works with variable names and variable attributes #}
+ *    {% if foo is defined %}
+ *        {# ... #}
+ *    {% endif %}
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class DefinedTest extends TestExpression
+{
+    public function __construct(Node $node, string $name, Node $arguments = null, int $lineno)
+    {
+        if ($node instanceof NameExpression) {
+            $node->setAttribute('is_defined_test', true);
+        } elseif ($node instanceof GetAttrExpression) {
+            $node->setAttribute('is_defined_test', true);
+            $this->changeIgnoreStrictCheck($node);
+        } elseif ($node instanceof BlockReferenceExpression) {
+            $node->setAttribute('is_defined_test', true);
+        } elseif ($node instanceof FunctionExpression && 'constant' === $node->getAttribute('name')) {
+            $node->setAttribute('is_defined_test', true);
+        } elseif ($node instanceof ConstantExpression || $node instanceof ArrayExpression) {
+            $node = new ConstantExpression(true, $node->getTemplateLine());
+        } elseif ($node instanceof MethodCallExpression) {
+            $node->setAttribute('is_defined_test', true);
+        } else {
+            throw new SyntaxError('The "defined" test only works with simple variables.', $lineno);
+        }
+
+        parent::__construct($node, $name, $arguments, $lineno);
+    }
+
+    private function changeIgnoreStrictCheck(GetAttrExpression $node)
+    {
+        $node->setAttribute('optimizable', false);
+        $node->setAttribute('ignore_strict_check', true);
 
-if (\false) {
-    class DefinedTest extends \Twig_Node_Expression_Test_Defined
+        if ($node->getNode('node') instanceof GetAttrExpression) {
+            $this->changeIgnoreStrictCheck($node->getNode('node'));
+        }
+    }
+
+    public function compile(Compiler $compiler)
     {
+        $compiler->subcompile($this->getNode('node'));
     }
 }
+
+class_alias('Twig\Node\Expression\Test\DefinedTest', 'Twig_Node_Expression_Test_Defined');
diff --git a/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php b/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php
index e9d91004..05c8ad8f 100644
--- a/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php
+++ b/vendor/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php
@@ -1,11 +1,38 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Test;
 
-class_exists('Twig_Node_Expression_Test_Divisibleby');
+use Twig\Compiler;
+use Twig\Node\Expression\TestExpression;
 
-if (\false) {
-    class DivisiblebyTest extends \Twig_Node_Expression_Test_Divisibleby
+/**
+ * Checks if a variable is divisible by a number.
+ *
+ *  {% if loop.index is divisible by(3) %}
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class DivisiblebyTest extends TestExpression
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('(0 == ')
+            ->subcompile($this->getNode('node'))
+            ->raw(' % ')
+            ->subcompile($this->getNode('arguments')->getNode(0))
+            ->raw(')')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\Test\DivisiblebyTest', 'Twig_Node_Expression_Test_Divisibleby');
diff --git a/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php b/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php
index feb3a89c..3b955d26 100644
--- a/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php
+++ b/vendor/twig/twig/src/Node/Expression/Test/EvenTest.php
@@ -1,11 +1,37 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Test;
 
-class_exists('Twig_Node_Expression_Test_Even');
+use Twig\Compiler;
+use Twig\Node\Expression\TestExpression;
 
-if (\false) {
-    class EvenTest extends \Twig_Node_Expression_Test_Even
+/**
+ * Checks if a number is even.
+ *
+ *  {{ var is even }}
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class EvenTest extends TestExpression
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('(')
+            ->subcompile($this->getNode('node'))
+            ->raw(' % 2 == 0')
+            ->raw(')')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\Test\EvenTest', 'Twig_Node_Expression_Test_Even');
diff --git a/vendor/twig/twig/src/Node/Expression/Test/NullTest.php b/vendor/twig/twig/src/Node/Expression/Test/NullTest.php
index 2263b1b2..24d39978 100644
--- a/vendor/twig/twig/src/Node/Expression/Test/NullTest.php
+++ b/vendor/twig/twig/src/Node/Expression/Test/NullTest.php
@@ -1,11 +1,36 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Test;
 
-class_exists('Twig_Node_Expression_Test_Null');
+use Twig\Compiler;
+use Twig\Node\Expression\TestExpression;
 
-if (\false) {
-    class NullTest extends \Twig_Node_Expression_Test_Null
+/**
+ * Checks that a variable is null.
+ *
+ *  {{ var is none }}
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class NullTest extends TestExpression
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('(null === ')
+            ->subcompile($this->getNode('node'))
+            ->raw(')')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\Test\NullTest', 'Twig_Node_Expression_Test_Null');
diff --git a/vendor/twig/twig/src/Node/Expression/Test/OddTest.php b/vendor/twig/twig/src/Node/Expression/Test/OddTest.php
index 86ddb224..2dc693a9 100644
--- a/vendor/twig/twig/src/Node/Expression/Test/OddTest.php
+++ b/vendor/twig/twig/src/Node/Expression/Test/OddTest.php
@@ -1,11 +1,37 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Test;
 
-class_exists('Twig_Node_Expression_Test_Odd');
+use Twig\Compiler;
+use Twig\Node\Expression\TestExpression;
 
-if (\false) {
-    class OddTest extends \Twig_Node_Expression_Test_Odd
+/**
+ * Checks if a number is odd.
+ *
+ *  {{ var is odd }}
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class OddTest extends TestExpression
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('(')
+            ->subcompile($this->getNode('node'))
+            ->raw(' % 2 == 1')
+            ->raw(')')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\Test\OddTest', 'Twig_Node_Expression_Test_Odd');
diff --git a/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php b/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php
index 26a8f0ea..75f2b82a 100644
--- a/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php
+++ b/vendor/twig/twig/src/Node/Expression/Test/SameasTest.php
@@ -1,11 +1,36 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Test;
 
-class_exists('Twig_Node_Expression_Test_Sameas');
+use Twig\Compiler;
+use Twig\Node\Expression\TestExpression;
 
-if (\false) {
-    class SameasTest extends \Twig_Node_Expression_Test_Sameas
+/**
+ * Checks if a variable is the same as another one (=== in PHP).
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class SameasTest extends TestExpression
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->raw('(')
+            ->subcompile($this->getNode('node'))
+            ->raw(' === ')
+            ->subcompile($this->getNode('arguments')->getNode(0))
+            ->raw(')')
+        ;
     }
 }
+
+class_alias('Twig\Node\Expression\Test\SameasTest', 'Twig_Node_Expression_Test_Sameas');
diff --git a/vendor/twig/twig/src/Node/Expression/TestExpression.php b/vendor/twig/twig/src/Node/Expression/TestExpression.php
index f3d4f903..50aab052 100644
--- a/vendor/twig/twig/src/Node/Expression/TestExpression.php
+++ b/vendor/twig/twig/src/Node/Expression/TestExpression.php
@@ -1,11 +1,44 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression;
 
-class_exists('Twig_Node_Expression_Test');
+use Twig\Compiler;
+use Twig\Node\Node;
+
+class TestExpression extends CallExpression
+{
+    public function __construct(Node $node, string $name, Node $arguments = null, int $lineno)
+    {
+        $nodes = ['node' => $node];
+        if (null !== $arguments) {
+            $nodes['arguments'] = $arguments;
+        }
+
+        parent::__construct($nodes, ['name' => $name], $lineno);
+    }
 
-if (\false) {
-    class TestExpression extends \Twig_Node_Expression_Test
+    public function compile(Compiler $compiler)
     {
+        $name = $this->getAttribute('name');
+        $test = $compiler->getEnvironment()->getTest($name);
+
+        $this->setAttribute('name', $name);
+        $this->setAttribute('type', 'test');
+        $this->setAttribute('arguments', $test->getArguments());
+        $this->setAttribute('callable', $test->getCallable());
+        $this->setAttribute('is_variadic', $test->isVariadic());
+
+        $this->compileCallable($compiler);
     }
 }
+
+class_alias('Twig\Node\Expression\TestExpression', 'Twig_Node_Expression_Test');
diff --git a/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php b/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php
index 7d998559..4896280f 100644
--- a/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php
+++ b/vendor/twig/twig/src/Node/Expression/Unary/AbstractUnary.php
@@ -1,11 +1,36 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Unary;
 
-class_exists('Twig_Node_Expression_Unary');
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
+use Twig\Node\Node;
+
+abstract class AbstractUnary extends AbstractExpression
+{
+    public function __construct(Node $node, int $lineno)
+    {
+        parent::__construct(['node' => $node], [], $lineno);
+    }
 
-if (\false) {
-    class AbstractUnary extends \Twig_Node_Expression_Unary
+    public function compile(Compiler $compiler)
     {
+        $compiler->raw(' ');
+        $this->operator($compiler);
+        $compiler->subcompile($this->getNode('node'));
     }
+
+    abstract public function operator(Compiler $compiler);
 }
+
+class_alias('Twig\Node\Expression\Unary\AbstractUnary', 'Twig_Node_Expression_Unary');
diff --git a/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php b/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php
index 344b1216..dfb6f542 100644
--- a/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php
+++ b/vendor/twig/twig/src/Node/Expression/Unary/NegUnary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Unary;
 
-class_exists('Twig_Node_Expression_Unary_Neg');
+use Twig\Compiler;
 
-if (\false) {
-    class NegUnary extends \Twig_Node_Expression_Unary_Neg
+class NegUnary extends AbstractUnary
+{
+    public function operator(Compiler $compiler)
     {
+        $compiler->raw('-');
     }
 }
+
+class_alias('Twig\Node\Expression\Unary\NegUnary', 'Twig_Node_Expression_Unary_Neg');
diff --git a/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php b/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php
index 79c24628..7bdde96f 100644
--- a/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php
+++ b/vendor/twig/twig/src/Node/Expression/Unary/NotUnary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Unary;
 
-class_exists('Twig_Node_Expression_Unary_Not');
+use Twig\Compiler;
 
-if (\false) {
-    class NotUnary extends \Twig_Node_Expression_Unary_Not
+class NotUnary extends AbstractUnary
+{
+    public function operator(Compiler $compiler)
     {
+        $compiler->raw('!');
     }
 }
+
+class_alias('Twig\Node\Expression\Unary\NotUnary', 'Twig_Node_Expression_Unary_Not');
diff --git a/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php b/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php
index 24d88ccb..52d5d0c8 100644
--- a/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php
+++ b/vendor/twig/twig/src/Node/Expression/Unary/PosUnary.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node\Expression\Unary;
 
-class_exists('Twig_Node_Expression_Unary_Pos');
+use Twig\Compiler;
 
-if (\false) {
-    class PosUnary extends \Twig_Node_Expression_Unary_Pos
+class PosUnary extends AbstractUnary
+{
+    public function operator(Compiler $compiler)
     {
+        $compiler->raw('+');
     }
 }
+
+class_alias('Twig\Node\Expression\Unary\PosUnary', 'Twig_Node_Expression_Unary_Pos');
diff --git a/vendor/twig/twig/src/Node/Expression/VariadicExpression.php b/vendor/twig/twig/src/Node/Expression/VariadicExpression.php
new file mode 100644
index 00000000..3351e1a6
--- /dev/null
+++ b/vendor/twig/twig/src/Node/Expression/VariadicExpression.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Twig\Node\Expression;
+
+use Twig\Compiler;
+
+class VariadicExpression extends ArrayExpression
+{
+    public function compile(Compiler $compiler)
+    {
+        $compiler->raw('...');
+
+        parent::compile($compiler);
+    }
+}
diff --git a/vendor/twig/twig/src/Node/FlushNode.php b/vendor/twig/twig/src/Node/FlushNode.php
index c06306e1..b88f3409 100644
--- a/vendor/twig/twig/src/Node/FlushNode.php
+++ b/vendor/twig/twig/src/Node/FlushNode.php
@@ -1,11 +1,37 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Flush');
+use Twig\Compiler;
 
-if (\false) {
-    class FlushNode extends \Twig_Node_Flush
+/**
+ * Represents a flush node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class FlushNode extends Node
+{
+    public function __construct(int $lineno, string $tag)
     {
+        parent::__construct([], [], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write("flush();\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\FlushNode', 'Twig_Node_Flush');
diff --git a/vendor/twig/twig/src/Node/ForLoopNode.php b/vendor/twig/twig/src/Node/ForLoopNode.php
index e8e3936c..42aedd7b 100644
--- a/vendor/twig/twig/src/Node/ForLoopNode.php
+++ b/vendor/twig/twig/src/Node/ForLoopNode.php
@@ -1,11 +1,56 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_ForLoop');
+use Twig\Compiler;
 
-if (\false) {
-    class ForLoopNode extends \Twig_Node_ForLoop
+/**
+ * Internal node used by the for node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class ForLoopNode extends Node
+{
+    public function __construct(int $lineno, string $tag = null)
     {
+        parent::__construct([], ['with_loop' => false, 'ifexpr' => false, 'else' => false], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        if ($this->getAttribute('else')) {
+            $compiler->write("\$context['_iterated'] = true;\n");
+        }
+
+        if ($this->getAttribute('with_loop')) {
+            $compiler
+                ->write("++\$context['loop']['index0'];\n")
+                ->write("++\$context['loop']['index'];\n")
+                ->write("\$context['loop']['first'] = false;\n")
+            ;
+
+            if (!$this->getAttribute('ifexpr')) {
+                $compiler
+                    ->write("if (isset(\$context['loop']['length'])) {\n")
+                    ->indent()
+                    ->write("--\$context['loop']['revindex0'];\n")
+                    ->write("--\$context['loop']['revindex'];\n")
+                    ->write("\$context['loop']['last'] = 0 === \$context['loop']['revindex0'];\n")
+                    ->outdent()
+                    ->write("}\n")
+                ;
+            }
+        }
     }
 }
+
+class_alias('Twig\Node\ForLoopNode', 'Twig_Node_ForLoop');
diff --git a/vendor/twig/twig/src/Node/ForNode.php b/vendor/twig/twig/src/Node/ForNode.php
index 86521f4e..54afe938 100644
--- a/vendor/twig/twig/src/Node/ForNode.php
+++ b/vendor/twig/twig/src/Node/ForNode.php
@@ -1,11 +1,119 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_For');
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
+use Twig\Node\Expression\AssignNameExpression;
+
+/**
+ * Represents a for node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class ForNode extends Node
+{
+    private $loop;
 
-if (\false) {
-    class ForNode extends \Twig_Node_For
+    public function __construct(AssignNameExpression $keyTarget, AssignNameExpression $valueTarget, AbstractExpression $seq, AbstractExpression $ifexpr = null, Node $body, Node $else = null, int $lineno, string $tag = null)
     {
+        $body = new Node([$body, $this->loop = new ForLoopNode($lineno, $tag)]);
+
+        if (null !== $ifexpr) {
+            $body = new IfNode(new Node([$ifexpr, $body]), null, $lineno, $tag);
+        }
+
+        $nodes = ['key_target' => $keyTarget, 'value_target' => $valueTarget, 'seq' => $seq, 'body' => $body];
+        if (null !== $else) {
+            $nodes['else'] = $else;
+        }
+
+        parent::__construct($nodes, ['with_loop' => true, 'ifexpr' => null !== $ifexpr], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write("\$context['_parent'] = \$context;\n")
+            ->write("\$context['_seq'] = twig_ensure_traversable(")
+            ->subcompile($this->getNode('seq'))
+            ->raw(");\n")
+        ;
+
+        if ($this->hasNode('else')) {
+            $compiler->write("\$context['_iterated'] = false;\n");
+        }
+
+        if ($this->getAttribute('with_loop')) {
+            $compiler
+                ->write("\$context['loop'] = [\n")
+                ->write("  'parent' => \$context['_parent'],\n")
+                ->write("  'index0' => 0,\n")
+                ->write("  'index'  => 1,\n")
+                ->write("  'first'  => true,\n")
+                ->write("];\n")
+            ;
+
+            if (!$this->getAttribute('ifexpr')) {
+                $compiler
+                    ->write("if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof \Countable)) {\n")
+                    ->indent()
+                    ->write("\$length = count(\$context['_seq']);\n")
+                    ->write("\$context['loop']['revindex0'] = \$length - 1;\n")
+                    ->write("\$context['loop']['revindex'] = \$length;\n")
+                    ->write("\$context['loop']['length'] = \$length;\n")
+                    ->write("\$context['loop']['last'] = 1 === \$length;\n")
+                    ->outdent()
+                    ->write("}\n")
+                ;
+            }
+        }
+
+        $this->loop->setAttribute('else', $this->hasNode('else'));
+        $this->loop->setAttribute('with_loop', $this->getAttribute('with_loop'));
+        $this->loop->setAttribute('ifexpr', $this->getAttribute('ifexpr'));
+
+        $compiler
+            ->write("foreach (\$context['_seq'] as ")
+            ->subcompile($this->getNode('key_target'))
+            ->raw(' => ')
+            ->subcompile($this->getNode('value_target'))
+            ->raw(") {\n")
+            ->indent()
+            ->subcompile($this->getNode('body'))
+            ->outdent()
+            ->write("}\n")
+        ;
+
+        if ($this->hasNode('else')) {
+            $compiler
+                ->write("if (!\$context['_iterated']) {\n")
+                ->indent()
+                ->subcompile($this->getNode('else'))
+                ->outdent()
+                ->write("}\n")
+            ;
+        }
+
+        $compiler->write("\$_parent = \$context['_parent'];\n");
+
+        // remove some "private" loop variables (needed for nested loops)
+        $compiler->write('unset($context[\'_seq\'], $context[\'_iterated\'], $context[\''.$this->getNode('key_target')->getAttribute('name').'\'], $context[\''.$this->getNode('value_target')->getAttribute('name').'\'], $context[\'_parent\'], $context[\'loop\']);'."\n");
+
+        // keep the values set in the inner context for variables defined in the outer context
+        $compiler->write("\$context = array_intersect_key(\$context, \$_parent) + \$_parent;\n");
     }
 }
+
+class_alias('Twig\Node\ForNode', 'Twig_Node_For');
diff --git a/vendor/twig/twig/src/Node/IfNode.php b/vendor/twig/twig/src/Node/IfNode.php
index 2710ead0..814a6f3a 100644
--- a/vendor/twig/twig/src/Node/IfNode.php
+++ b/vendor/twig/twig/src/Node/IfNode.php
@@ -1,11 +1,72 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_If');
+use Twig\Compiler;
 
-if (\false) {
-    class IfNode extends \Twig_Node_If
+/**
+ * Represents an if node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class IfNode extends Node
+{
+    public function __construct(Node $tests, Node $else = null, int $lineno, string $tag = null)
     {
+        $nodes = ['tests' => $tests];
+        if (null !== $else) {
+            $nodes['else'] = $else;
+        }
+
+        parent::__construct($nodes, [], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler->addDebugInfo($this);
+        for ($i = 0, $count = \count($this->getNode('tests')); $i < $count; $i += 2) {
+            if ($i > 0) {
+                $compiler
+                    ->outdent()
+                    ->write('} elseif (')
+                ;
+            } else {
+                $compiler
+                    ->write('if (')
+                ;
+            }
+
+            $compiler
+                ->subcompile($this->getNode('tests')->getNode($i))
+                ->raw(") {\n")
+                ->indent()
+                ->subcompile($this->getNode('tests')->getNode($i + 1))
+            ;
+        }
+
+        if ($this->hasNode('else')) {
+            $compiler
+                ->outdent()
+                ->write("} else {\n")
+                ->indent()
+                ->subcompile($this->getNode('else'))
+            ;
+        }
+
+        $compiler
+            ->outdent()
+            ->write("}\n");
     }
 }
+
+class_alias('Twig\Node\IfNode', 'Twig_Node_If');
diff --git a/vendor/twig/twig/src/Node/ImportNode.php b/vendor/twig/twig/src/Node/ImportNode.php
index 0bc23f33..b661f431 100644
--- a/vendor/twig/twig/src/Node/ImportNode.php
+++ b/vendor/twig/twig/src/Node/ImportNode.php
@@ -1,11 +1,65 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Import');
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
+use Twig\Node\Expression\NameExpression;
+
+/**
+ * Represents an import node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class ImportNode extends Node
+{
+    public function __construct(AbstractExpression $expr, AbstractExpression $var, int $lineno, string $tag = null, bool $global = true)
+    {
+        parent::__construct(['expr' => $expr, 'var' => $var], ['global' => $global], $lineno, $tag);
+    }
 
-if (\false) {
-    class ImportNode extends \Twig_Node_Import
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->addDebugInfo($this)
+            ->write('$macros[')
+            ->repr($this->getNode('var')->getAttribute('name'))
+            ->raw('] = ')
+        ;
+
+        if ($this->getAttribute('global')) {
+            $compiler
+                ->raw('$this->macros[')
+                ->repr($this->getNode('var')->getAttribute('name'))
+                ->raw('] = ')
+            ;
+        }
+
+        if ($this->getNode('expr') instanceof NameExpression && '_self' === $this->getNode('expr')->getAttribute('name')) {
+            $compiler->raw('$this');
+        } else {
+            $compiler
+                ->raw('$this->loadTemplate(')
+                ->subcompile($this->getNode('expr'))
+                ->raw(', ')
+                ->repr($this->getTemplateName())
+                ->raw(', ')
+                ->repr($this->getTemplateLine())
+                ->raw(')->unwrap()')
+            ;
+        }
+
+        $compiler->raw(";\n");
     }
 }
+
+class_alias('Twig\Node\ImportNode', 'Twig_Node_Import');
diff --git a/vendor/twig/twig/src/Node/IncludeNode.php b/vendor/twig/twig/src/Node/IncludeNode.php
index d557efee..d4530301 100644
--- a/vendor/twig/twig/src/Node/IncludeNode.php
+++ b/vendor/twig/twig/src/Node/IncludeNode.php
@@ -1,11 +1,108 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Include');
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
+
+/**
+ * Represents an include node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class IncludeNode extends Node implements NodeOutputInterface
+{
+    public function __construct(AbstractExpression $expr, AbstractExpression $variables = null, bool $only = false, bool $ignoreMissing = false, int $lineno, string $tag = null)
+    {
+        $nodes = ['expr' => $expr];
+        if (null !== $variables) {
+            $nodes['variables'] = $variables;
+        }
+
+        parent::__construct($nodes, ['only' => (bool) $only, 'ignore_missing' => (bool) $ignoreMissing], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler->addDebugInfo($this);
+
+        if ($this->getAttribute('ignore_missing')) {
+            $template = $compiler->getVarName();
 
-if (\false) {
-    class IncludeNode extends \Twig_Node_Include
+            $compiler
+                ->write(sprintf("$%s = null;\n", $template))
+                ->write("try {\n")
+                ->indent()
+                ->write(sprintf('$%s = ', $template))
+            ;
+
+            $this->addGetTemplate($compiler);
+
+            $compiler
+                ->raw(";\n")
+                ->outdent()
+                ->write("} catch (LoaderError \$e) {\n")
+                ->indent()
+                ->write("// ignore missing template\n")
+                ->outdent()
+                ->write("}\n")
+                ->write(sprintf("if ($%s) {\n", $template))
+                ->indent()
+                ->write(sprintf('$%s->display(', $template))
+            ;
+            $this->addTemplateArguments($compiler);
+            $compiler
+                ->raw(");\n")
+                ->outdent()
+                ->write("}\n")
+            ;
+        } else {
+            $this->addGetTemplate($compiler);
+            $compiler->raw('->display(');
+            $this->addTemplateArguments($compiler);
+            $compiler->raw(");\n");
+        }
+    }
+
+    protected function addGetTemplate(Compiler $compiler)
     {
+        $compiler
+            ->write('$this->loadTemplate(')
+            ->subcompile($this->getNode('expr'))
+            ->raw(', ')
+            ->repr($this->getTemplateName())
+            ->raw(', ')
+            ->repr($this->getTemplateLine())
+            ->raw(')')
+        ;
+    }
+
+    protected function addTemplateArguments(Compiler $compiler)
+    {
+        if (!$this->hasNode('variables')) {
+            $compiler->raw(false === $this->getAttribute('only') ? '$context' : '[]');
+        } elseif (false === $this->getAttribute('only')) {
+            $compiler
+                ->raw('twig_array_merge($context, ')
+                ->subcompile($this->getNode('variables'))
+                ->raw(')')
+            ;
+        } else {
+            $compiler->raw('twig_to_array(');
+            $compiler->subcompile($this->getNode('variables'));
+            $compiler->raw(')');
+        }
     }
 }
+
+class_alias('Twig\Node\IncludeNode', 'Twig_Node_Include');
diff --git a/vendor/twig/twig/src/Node/MacroNode.php b/vendor/twig/twig/src/Node/MacroNode.php
index 5752c6c8..a133720b 100644
--- a/vendor/twig/twig/src/Node/MacroNode.php
+++ b/vendor/twig/twig/src/Node/MacroNode.php
@@ -1,11 +1,115 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Macro');
+use Twig\Compiler;
+use Twig\Error\SyntaxError;
+
+/**
+ * Represents a macro node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class MacroNode extends Node
+{
+    const VARARGS_NAME = 'varargs';
 
-if (\false) {
-    class MacroNode extends \Twig_Node_Macro
+    public function __construct(string $name, Node $body, Node $arguments, int $lineno, string $tag = null)
     {
+        foreach ($arguments as $argumentName => $argument) {
+            if (self::VARARGS_NAME === $argumentName) {
+                throw new SyntaxError(sprintf('The argument "%s" in macro "%s" cannot be defined because the variable "%s" is reserved for arbitrary arguments.', self::VARARGS_NAME, $name, self::VARARGS_NAME), $argument->getTemplateLine(), $argument->getSourceContext());
+            }
+        }
+
+        parent::__construct(['body' => $body, 'arguments' => $arguments], ['name' => $name], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write(sprintf('public function macro_%s(', $this->getAttribute('name')))
+        ;
+
+        $count = \count($this->getNode('arguments'));
+        $pos = 0;
+        foreach ($this->getNode('arguments') as $name => $default) {
+            $compiler
+                ->raw('$__'.$name.'__ = ')
+                ->subcompile($default)
+            ;
+
+            if (++$pos < $count) {
+                $compiler->raw(', ');
+            }
+        }
+
+        if ($count) {
+            $compiler->raw(', ');
+        }
+
+        $compiler
+            ->raw('...$__varargs__')
+            ->raw(")\n")
+            ->write("{\n")
+            ->indent()
+            ->write("\$macros = \$this->macros;\n")
+            ->write("\$context = \$this->env->mergeGlobals([\n")
+            ->indent()
+        ;
+
+        foreach ($this->getNode('arguments') as $name => $default) {
+            $compiler
+                ->write('')
+                ->string($name)
+                ->raw(' => $__'.$name.'__')
+                ->raw(",\n")
+            ;
+        }
+
+        $compiler
+            ->write('')
+            ->string(self::VARARGS_NAME)
+            ->raw(' => ')
+        ;
+
+        $compiler
+            ->raw("\$__varargs__,\n")
+            ->outdent()
+            ->write("]);\n\n")
+            ->write("\$blocks = [];\n\n")
+        ;
+        if ($compiler->getEnvironment()->isDebug()) {
+            $compiler->write("ob_start();\n");
+        } else {
+            $compiler->write("ob_start(function () { return ''; });\n");
+        }
+        $compiler
+            ->write("try {\n")
+            ->indent()
+            ->subcompile($this->getNode('body'))
+            ->raw("\n")
+            ->write("return ('' === \$tmp = ob_get_contents()) ? '' : new Markup(\$tmp, \$this->env->getCharset());\n")
+            ->outdent()
+            ->write("} finally {\n")
+            ->indent()
+            ->write("ob_end_clean();\n")
+            ->outdent()
+            ->write("}\n")
+            ->outdent()
+            ->write("}\n\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\MacroNode', 'Twig_Node_Macro');
diff --git a/vendor/twig/twig/src/Node/ModuleNode.php b/vendor/twig/twig/src/Node/ModuleNode.php
index d39c6ff0..b23a342e 100644
--- a/vendor/twig/twig/src/Node/ModuleNode.php
+++ b/vendor/twig/twig/src/Node/ModuleNode.php
@@ -1,11 +1,472 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Module');
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Source;
 
-if (\false) {
-    class ModuleNode extends \Twig_Node_Module
+/**
+ * Represents a module node.
+ *
+ * Consider this class as being final. If you need to customize the behavior of
+ * the generated class, consider adding nodes to the following nodes: display_start,
+ * display_end, constructor_start, constructor_end, and class_end.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @final since Twig 2.4.0
+ */
+class ModuleNode extends Node
+{
+    public function __construct(Node $body, AbstractExpression $parent = null, Node $blocks, Node $macros, Node $traits, $embeddedTemplates, Source $source)
     {
+        if (__CLASS__ !== \get_class($this)) {
+            @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED);
+        }
+
+        $nodes = [
+            'body' => $body,
+            'blocks' => $blocks,
+            'macros' => $macros,
+            'traits' => $traits,
+            'display_start' => new Node(),
+            'display_end' => new Node(),
+            'constructor_start' => new Node(),
+            'constructor_end' => new Node(),
+            'class_end' => new Node(),
+        ];
+        if (null !== $parent) {
+            $nodes['parent'] = $parent;
+        }
+
+        // embedded templates are set as attributes so that they are only visited once by the visitors
+        parent::__construct($nodes, [
+            'index' => null,
+            'embedded_templates' => $embeddedTemplates,
+        ], 1);
+
+        // populate the template name of all node children
+        $this->setSourceContext($source);
+    }
+
+    public function setIndex($index)
+    {
+        $this->setAttribute('index', $index);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $this->compileTemplate($compiler);
+
+        foreach ($this->getAttribute('embedded_templates') as $template) {
+            $compiler->subcompile($template);
+        }
+    }
+
+    protected function compileTemplate(Compiler $compiler)
+    {
+        if (!$this->getAttribute('index')) {
+            $compiler->write('<?php');
+        }
+
+        $this->compileClassHeader($compiler);
+
+        $this->compileConstructor($compiler);
+
+        $this->compileGetParent($compiler);
+
+        $this->compileDisplay($compiler);
+
+        $compiler->subcompile($this->getNode('blocks'));
+
+        $this->compileMacros($compiler);
+
+        $this->compileGetTemplateName($compiler);
+
+        $this->compileIsTraitable($compiler);
+
+        $this->compileDebugInfo($compiler);
+
+        $this->compileGetSourceContext($compiler);
+
+        $this->compileClassFooter($compiler);
+    }
+
+    protected function compileGetParent(Compiler $compiler)
+    {
+        if (!$this->hasNode('parent')) {
+            return;
+        }
+        $parent = $this->getNode('parent');
+
+        $compiler
+            ->write("protected function doGetParent(array \$context)\n", "{\n")
+            ->indent()
+            ->addDebugInfo($parent)
+            ->write('return ')
+        ;
+
+        if ($parent instanceof ConstantExpression) {
+            $compiler->subcompile($parent);
+        } else {
+            $compiler
+                ->raw('$this->loadTemplate(')
+                ->subcompile($parent)
+                ->raw(', ')
+                ->repr($this->getSourceContext()->getName())
+                ->raw(', ')
+                ->repr($parent->getTemplateLine())
+                ->raw(')')
+            ;
+        }
+
+        $compiler
+            ->raw(";\n")
+            ->outdent()
+            ->write("}\n\n")
+        ;
+    }
+
+    protected function compileClassHeader(Compiler $compiler)
+    {
+        $compiler
+            ->write("\n\n")
+        ;
+        if (!$this->getAttribute('index')) {
+            $compiler
+                ->write("use Twig\Environment;\n")
+                ->write("use Twig\Error\LoaderError;\n")
+                ->write("use Twig\Error\RuntimeError;\n")
+                ->write("use Twig\Extension\SandboxExtension;\n")
+                ->write("use Twig\Markup;\n")
+                ->write("use Twig\Sandbox\SecurityError;\n")
+                ->write("use Twig\Sandbox\SecurityNotAllowedTagError;\n")
+                ->write("use Twig\Sandbox\SecurityNotAllowedFilterError;\n")
+                ->write("use Twig\Sandbox\SecurityNotAllowedFunctionError;\n")
+                ->write("use Twig\Source;\n")
+                ->write("use Twig\Template;\n\n")
+            ;
+        }
+        $compiler
+            // if the template name contains */, add a blank to avoid a PHP parse error
+            ->write('/* '.str_replace('*/', '* /', $this->getSourceContext()->getName())." */\n")
+            ->write('class '.$compiler->getEnvironment()->getTemplateClass($this->getSourceContext()->getName(), $this->getAttribute('index')))
+            ->raw(sprintf(" extends %s\n", $compiler->getEnvironment()->getBaseTemplateClass(false)))
+            ->write("{\n")
+            ->indent()
+            ->write("private \$source;\n")
+            ->write("private \$macros = [];\n\n")
+        ;
+    }
+
+    protected function compileConstructor(Compiler $compiler)
+    {
+        $compiler
+            ->write("public function __construct(Environment \$env)\n", "{\n")
+            ->indent()
+            ->subcompile($this->getNode('constructor_start'))
+            ->write("parent::__construct(\$env);\n\n")
+            ->write("\$this->source = \$this->getSourceContext();\n\n")
+        ;
+
+        // parent
+        if (!$this->hasNode('parent')) {
+            $compiler->write("\$this->parent = false;\n\n");
+        }
+
+        $countTraits = \count($this->getNode('traits'));
+        if ($countTraits) {
+            // traits
+            foreach ($this->getNode('traits') as $i => $trait) {
+                $node = $trait->getNode('template');
+
+                $compiler
+                    ->addDebugInfo($node)
+                    ->write(sprintf('$_trait_%s = $this->loadTemplate(', $i))
+                    ->subcompile($node)
+                    ->raw(', ')
+                    ->repr($node->getTemplateName())
+                    ->raw(', ')
+                    ->repr($node->getTemplateLine())
+                    ->raw(");\n")
+                    ->write(sprintf("if (!\$_trait_%s->isTraitable()) {\n", $i))
+                    ->indent()
+                    ->write("throw new RuntimeError('Template \"'.")
+                    ->subcompile($trait->getNode('template'))
+                    ->raw(".'\" cannot be used as a trait.', ")
+                    ->repr($node->getTemplateLine())
+                    ->raw(", \$this->source);\n")
+                    ->outdent()
+                    ->write("}\n")
+                    ->write(sprintf("\$_trait_%s_blocks = \$_trait_%s->getBlocks();\n\n", $i, $i))
+                ;
+
+                foreach ($trait->getNode('targets') as $key => $value) {
+                    $compiler
+                        ->write(sprintf('if (!isset($_trait_%s_blocks[', $i))
+                        ->string($key)
+                        ->raw("])) {\n")
+                        ->indent()
+                        ->write("throw new RuntimeError('Block ")
+                        ->string($key)
+                        ->raw(' is not defined in trait ')
+                        ->subcompile($trait->getNode('template'))
+                        ->raw(".', ")
+                        ->repr($node->getTemplateLine())
+                        ->raw(", \$this->source);\n")
+                        ->outdent()
+                        ->write("}\n\n")
+
+                        ->write(sprintf('$_trait_%s_blocks[', $i))
+                        ->subcompile($value)
+                        ->raw(sprintf('] = $_trait_%s_blocks[', $i))
+                        ->string($key)
+                        ->raw(sprintf(']; unset($_trait_%s_blocks[', $i))
+                        ->string($key)
+                        ->raw("]);\n\n")
+                    ;
+                }
+            }
+
+            if ($countTraits > 1) {
+                $compiler
+                    ->write("\$this->traits = array_merge(\n")
+                    ->indent()
+                ;
+
+                for ($i = 0; $i < $countTraits; ++$i) {
+                    $compiler
+                        ->write(sprintf('$_trait_%s_blocks'.($i == $countTraits - 1 ? '' : ',')."\n", $i))
+                    ;
+                }
+
+                $compiler
+                    ->outdent()
+                    ->write(");\n\n")
+                ;
+            } else {
+                $compiler
+                    ->write("\$this->traits = \$_trait_0_blocks;\n\n")
+                ;
+            }
+
+            $compiler
+                ->write("\$this->blocks = array_merge(\n")
+                ->indent()
+                ->write("\$this->traits,\n")
+                ->write("[\n")
+            ;
+        } else {
+            $compiler
+                ->write("\$this->blocks = [\n")
+            ;
+        }
+
+        // blocks
+        $compiler
+            ->indent()
+        ;
+
+        foreach ($this->getNode('blocks') as $name => $node) {
+            $compiler
+                ->write(sprintf("'%s' => [\$this, 'block_%s'],\n", $name, $name))
+            ;
+        }
+
+        if ($countTraits) {
+            $compiler
+                ->outdent()
+                ->write("]\n")
+                ->outdent()
+                ->write(");\n")
+            ;
+        } else {
+            $compiler
+                ->outdent()
+                ->write("];\n")
+            ;
+        }
+
+        $compiler
+            ->subcompile($this->getNode('constructor_end'))
+            ->outdent()
+            ->write("}\n\n")
+        ;
+    }
+
+    protected function compileDisplay(Compiler $compiler)
+    {
+        $compiler
+            ->write("protected function doDisplay(array \$context, array \$blocks = [])\n", "{\n")
+            ->indent()
+            ->write("\$macros = \$this->macros;\n")
+            ->subcompile($this->getNode('display_start'))
+            ->subcompile($this->getNode('body'))
+        ;
+
+        if ($this->hasNode('parent')) {
+            $parent = $this->getNode('parent');
+
+            $compiler->addDebugInfo($parent);
+            if ($parent instanceof ConstantExpression) {
+                $compiler
+                    ->write('$this->parent = $this->loadTemplate(')
+                    ->subcompile($parent)
+                    ->raw(', ')
+                    ->repr($this->getSourceContext()->getName())
+                    ->raw(', ')
+                    ->repr($parent->getTemplateLine())
+                    ->raw(");\n")
+                ;
+                $compiler->write('$this->parent');
+            } else {
+                $compiler->write('$this->getParent($context)');
+            }
+            $compiler->raw("->display(\$context, array_merge(\$this->blocks, \$blocks));\n");
+        }
+
+        $compiler
+            ->subcompile($this->getNode('display_end'))
+            ->outdent()
+            ->write("}\n\n")
+        ;
+    }
+
+    protected function compileClassFooter(Compiler $compiler)
+    {
+        $compiler
+            ->subcompile($this->getNode('class_end'))
+            ->outdent()
+            ->write("}\n")
+        ;
+    }
+
+    protected function compileMacros(Compiler $compiler)
+    {
+        $compiler->subcompile($this->getNode('macros'));
+    }
+
+    protected function compileGetTemplateName(Compiler $compiler)
+    {
+        $compiler
+            ->write("public function getTemplateName()\n", "{\n")
+            ->indent()
+            ->write('return ')
+            ->repr($this->getSourceContext()->getName())
+            ->raw(";\n")
+            ->outdent()
+            ->write("}\n\n")
+        ;
+    }
+
+    protected function compileIsTraitable(Compiler $compiler)
+    {
+        // A template can be used as a trait if:
+        //   * it has no parent
+        //   * it has no macros
+        //   * it has no body
+        //
+        // Put another way, a template can be used as a trait if it
+        // only contains blocks and use statements.
+        $traitable = !$this->hasNode('parent') && 0 === \count($this->getNode('macros'));
+        if ($traitable) {
+            if ($this->getNode('body') instanceof BodyNode) {
+                $nodes = $this->getNode('body')->getNode(0);
+            } else {
+                $nodes = $this->getNode('body');
+            }
+
+            if (!\count($nodes)) {
+                $nodes = new Node([$nodes]);
+            }
+
+            foreach ($nodes as $node) {
+                if (!\count($node)) {
+                    continue;
+                }
+
+                if ($node instanceof TextNode && ctype_space($node->getAttribute('data'))) {
+                    continue;
+                }
+
+                if ($node instanceof BlockReferenceNode) {
+                    continue;
+                }
+
+                $traitable = false;
+                break;
+            }
+        }
+
+        if ($traitable) {
+            return;
+        }
+
+        $compiler
+            ->write("public function isTraitable()\n", "{\n")
+            ->indent()
+            ->write(sprintf("return %s;\n", $traitable ? 'true' : 'false'))
+            ->outdent()
+            ->write("}\n\n")
+        ;
+    }
+
+    protected function compileDebugInfo(Compiler $compiler)
+    {
+        $compiler
+            ->write("public function getDebugInfo()\n", "{\n")
+            ->indent()
+            ->write(sprintf("return %s;\n", str_replace("\n", '', var_export(array_reverse($compiler->getDebugInfo(), true), true))))
+            ->outdent()
+            ->write("}\n\n")
+        ;
+    }
+
+    protected function compileGetSourceContext(Compiler $compiler)
+    {
+        $compiler
+            ->write("public function getSourceContext()\n", "{\n")
+            ->indent()
+            ->write('return new Source(')
+            ->string($compiler->getEnvironment()->isDebug() ? $this->getSourceContext()->getCode() : '')
+            ->raw(', ')
+            ->string($this->getSourceContext()->getName())
+            ->raw(', ')
+            ->string($this->getSourceContext()->getPath())
+            ->raw(");\n")
+            ->outdent()
+            ->write("}\n")
+        ;
+    }
+
+    protected function compileLoadTemplate(Compiler $compiler, $node, $var)
+    {
+        if ($node instanceof ConstantExpression) {
+            $compiler
+                ->write(sprintf('%s = $this->loadTemplate(', $var))
+                ->subcompile($node)
+                ->raw(', ')
+                ->repr($node->getTemplateName())
+                ->raw(', ')
+                ->repr($node->getTemplateLine())
+                ->raw(");\n")
+            ;
+        } else {
+            throw new \LogicException('Trait templates can only be constant nodes.');
+        }
     }
 }
+
+class_alias('Twig\Node\ModuleNode', 'Twig_Node_Module');
diff --git a/vendor/twig/twig/src/Node/Node.php b/vendor/twig/twig/src/Node/Node.php
index ca14a38c..909a687e 100644
--- a/vendor/twig/twig/src/Node/Node.php
+++ b/vendor/twig/twig/src/Node/Node.php
@@ -1,11 +1,211 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node');
+use Twig\Compiler;
+use Twig\Source;
+
+/**
+ * Represents a node in the AST.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class Node implements \Countable, \IteratorAggregate
+{
+    protected $nodes;
+    protected $attributes;
+    protected $lineno;
+    protected $tag;
+
+    private $name;
+    private $sourceContext;
+
+    /**
+     * @param array  $nodes      An array of named nodes
+     * @param array  $attributes An array of attributes (should not be nodes)
+     * @param int    $lineno     The line number
+     * @param string $tag        The tag name associated with the Node
+     */
+    public function __construct(array $nodes = [], array $attributes = [], int $lineno = 0, string $tag = null)
+    {
+        foreach ($nodes as $name => $node) {
+            if (!$node instanceof self) {
+                throw new \InvalidArgumentException(sprintf('Using "%s" for the value of node "%s" of "%s" is not supported. You must pass a \Twig\Node\Node instance.', \is_object($node) ? \get_class($node) : (null === $node ? 'null' : \gettype($node)), $name, \get_class($this)));
+            }
+        }
+        $this->nodes = $nodes;
+        $this->attributes = $attributes;
+        $this->lineno = $lineno;
+        $this->tag = $tag;
+    }
+
+    public function __toString()
+    {
+        $attributes = [];
+        foreach ($this->attributes as $name => $value) {
+            $attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true)));
+        }
+
+        $repr = [\get_class($this).'('.implode(', ', $attributes)];
+
+        if (\count($this->nodes)) {
+            foreach ($this->nodes as $name => $node) {
+                $len = \strlen($name) + 4;
+                $noderepr = [];
+                foreach (explode("\n", (string) $node) as $line) {
+                    $noderepr[] = str_repeat(' ', $len).$line;
+                }
+
+                $repr[] = sprintf('  %s: %s', $name, ltrim(implode("\n", $noderepr)));
+            }
+
+            $repr[] = ')';
+        } else {
+            $repr[0] .= ')';
+        }
+
+        return implode("\n", $repr);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        foreach ($this->nodes as $node) {
+            $node->compile($compiler);
+        }
+    }
+
+    public function getTemplateLine()
+    {
+        return $this->lineno;
+    }
+
+    public function getNodeTag()
+    {
+        return $this->tag;
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasAttribute($name)
+    {
+        return \array_key_exists($name, $this->attributes);
+    }
+
+    /**
+     * @return mixed
+     */
+    public function getAttribute($name)
+    {
+        if (!\array_key_exists($name, $this->attributes)) {
+            throw new \LogicException(sprintf('Attribute "%s" does not exist for Node "%s".', $name, \get_class($this)));
+        }
+
+        return $this->attributes[$name];
+    }
+
+    /**
+     * @param string $name
+     * @param mixed  $value
+     */
+    public function setAttribute($name, $value)
+    {
+        $this->attributes[$name] = $value;
+    }
+
+    public function removeAttribute($name)
+    {
+        unset($this->attributes[$name]);
+    }
+
+    /**
+     * @return bool
+     */
+    public function hasNode($name)
+    {
+        return isset($this->nodes[$name]);
+    }
+
+    /**
+     * @return Node
+     */
+    public function getNode($name)
+    {
+        if (!isset($this->nodes[$name])) {
+            throw new \LogicException(sprintf('Node "%s" does not exist for Node "%s".', $name, \get_class($this)));
+        }
+
+        return $this->nodes[$name];
+    }
+
+    public function setNode($name, self $node)
+    {
+        $this->nodes[$name] = $node;
+    }
+
+    public function removeNode($name)
+    {
+        unset($this->nodes[$name]);
+    }
+
+    public function count()
+    {
+        return \count($this->nodes);
+    }
 
-if (\false) {
-    class Node extends \Twig_Node
+    public function getIterator()
     {
+        return new \ArrayIterator($this->nodes);
+    }
+
+    /**
+     * @deprecated since 2.8 (to be removed in 3.0)
+     */
+    public function setTemplateName($name/*, $triggerDeprecation = true */)
+    {
+        $triggerDeprecation = 2 > \func_num_args() || \func_get_arg(1);
+        if ($triggerDeprecation) {
+            @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0. Use setSourceContext() instead.', E_USER_DEPRECATED);
+        }
+
+        $this->name = $name;
+        foreach ($this->nodes as $node) {
+            $node->setTemplateName($name, $triggerDeprecation);
+        }
+    }
+
+    public function getTemplateName()
+    {
+        return $this->sourceContext ? $this->sourceContext->getName() : null;
+    }
+
+    public function setSourceContext(Source $source)
+    {
+        $this->sourceContext = $source;
+        foreach ($this->nodes as $node) {
+            $node->setSourceContext($source);
+        }
+
+        $this->setTemplateName($source->getName(), false);
+    }
+
+    public function getSourceContext()
+    {
+        return $this->sourceContext;
     }
 }
+
+class_alias('Twig\Node\Node', 'Twig_Node');
+
+// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name.
+class_exists('Twig\Compiler');
diff --git a/vendor/twig/twig/src/Node/NodeCaptureInterface.php b/vendor/twig/twig/src/Node/NodeCaptureInterface.php
index 4ba4e21f..474003f3 100644
--- a/vendor/twig/twig/src/Node/NodeCaptureInterface.php
+++ b/vendor/twig/twig/src/Node/NodeCaptureInterface.php
@@ -1,11 +1,23 @@
 <?php
 
-namespace Twig\Node;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_NodeCaptureInterface');
+namespace Twig\Node;
 
-if (\false) {
-    interface NodeCaptureInterface extends \Twig_NodeCaptureInterface
-    {
-    }
+/**
+ * Represents a node that captures any nested displayable nodes.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+interface NodeCaptureInterface
+{
 }
+
+class_alias('Twig\Node\NodeCaptureInterface', 'Twig_NodeCaptureInterface');
diff --git a/vendor/twig/twig/src/Node/NodeOutputInterface.php b/vendor/twig/twig/src/Node/NodeOutputInterface.php
index 5602e7a1..8b046ee7 100644
--- a/vendor/twig/twig/src/Node/NodeOutputInterface.php
+++ b/vendor/twig/twig/src/Node/NodeOutputInterface.php
@@ -1,11 +1,23 @@
 <?php
 
-namespace Twig\Node;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_NodeOutputInterface');
+namespace Twig\Node;
 
-if (\false) {
-    interface NodeOutputInterface extends \Twig_NodeOutputInterface
-    {
-    }
+/**
+ * Represents a displayable node in the AST.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+interface NodeOutputInterface
+{
 }
+
+class_alias('Twig\Node\NodeOutputInterface', 'Twig_NodeOutputInterface');
diff --git a/vendor/twig/twig/src/Node/PrintNode.php b/vendor/twig/twig/src/Node/PrintNode.php
index 4ff2ed61..fcc086ac 100644
--- a/vendor/twig/twig/src/Node/PrintNode.php
+++ b/vendor/twig/twig/src/Node/PrintNode.php
@@ -1,11 +1,41 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Print');
+use Twig\Compiler;
+use Twig\Node\Expression\AbstractExpression;
 
-if (\false) {
-    class PrintNode extends \Twig_Node_Print
+/**
+ * Represents a node that outputs an expression.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class PrintNode extends Node implements NodeOutputInterface
+{
+    public function __construct(AbstractExpression $expr, int $lineno, string $tag = null)
     {
+        parent::__construct(['expr' => $expr], [], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write('echo ')
+            ->subcompile($this->getNode('expr'))
+            ->raw(";\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\PrintNode', 'Twig_Node_Print');
diff --git a/vendor/twig/twig/src/Node/SandboxNode.php b/vendor/twig/twig/src/Node/SandboxNode.php
index a24219f1..fe59313b 100644
--- a/vendor/twig/twig/src/Node/SandboxNode.php
+++ b/vendor/twig/twig/src/Node/SandboxNode.php
@@ -1,11 +1,47 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Sandbox');
+use Twig\Compiler;
 
-if (\false) {
-    class SandboxNode extends \Twig_Node_Sandbox
+/**
+ * Represents a sandbox node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class SandboxNode extends Node
+{
+    public function __construct(Node $body, int $lineno, string $tag = null)
     {
+        parent::__construct(['body' => $body], [], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write("if (!\$alreadySandboxed = \$this->sandbox->isSandboxed()) {\n")
+            ->indent()
+            ->write("\$this->sandbox->enableSandbox();\n")
+            ->outdent()
+            ->write("}\n")
+            ->subcompile($this->getNode('body'))
+            ->write("if (!\$alreadySandboxed) {\n")
+            ->indent()
+            ->write("\$this->sandbox->disableSandbox();\n")
+            ->outdent()
+            ->write("}\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\SandboxNode', 'Twig_Node_Sandbox');
diff --git a/vendor/twig/twig/src/Node/SandboxedPrintNode.php b/vendor/twig/twig/src/Node/SandboxedPrintNode.php
index a9f42bd5..54e92e66 100644
--- a/vendor/twig/twig/src/Node/SandboxedPrintNode.php
+++ b/vendor/twig/twig/src/Node/SandboxedPrintNode.php
@@ -1,11 +1,54 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_SandboxedPrint');
+use Twig\Compiler;
+use Twig\Node\Expression\ConstantExpression;
 
-if (\false) {
-    class SandboxedPrintNode extends \Twig_Node_SandboxedPrint
+/**
+ * Adds a check for the __toString() method when the variable is an object and the sandbox is activated.
+ *
+ * When there is a simple Print statement, like {{ article }},
+ * and if the sandbox is enabled, we need to check that the __toString()
+ * method is allowed if 'article' is an object.
+ *
+ * Not used anymore, to be deprecated in 2.x and removed in 3.0
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class SandboxedPrintNode extends PrintNode
+{
+    public function compile(Compiler $compiler)
     {
+        $compiler
+            ->addDebugInfo($this)
+            ->write('echo ')
+        ;
+        $expr = $this->getNode('expr');
+        if ($expr instanceof ConstantExpression) {
+            $compiler
+                ->subcompile($expr)
+                ->raw(";\n")
+            ;
+        } else {
+            $compiler
+                ->write('$this->extensions[SandboxExtension::class]->ensureToStringAllowed(')
+                ->subcompile($expr)
+                ->raw(', ')
+                ->repr($expr->getTemplateLine())
+                ->raw(", \$this->source);\n")
+            ;
+        }
     }
 }
+
+class_alias('Twig\Node\SandboxedPrintNode', 'Twig_Node_SandboxedPrint');
diff --git a/vendor/twig/twig/src/Node/SetNode.php b/vendor/twig/twig/src/Node/SetNode.php
index d45f133e..3cf4615f 100644
--- a/vendor/twig/twig/src/Node/SetNode.php
+++ b/vendor/twig/twig/src/Node/SetNode.php
@@ -1,11 +1,107 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Set');
+use Twig\Compiler;
+use Twig\Node\Expression\ConstantExpression;
 
-if (\false) {
-    class SetNode extends \Twig_Node_Set
+/**
+ * Represents a set node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class SetNode extends Node implements NodeCaptureInterface
+{
+    public function __construct(bool $capture, Node $names, Node $values, int $lineno, string $tag = null)
     {
+        parent::__construct(['names' => $names, 'values' => $values], ['capture' => $capture, 'safe' => false], $lineno, $tag);
+
+        /*
+         * Optimizes the node when capture is used for a large block of text.
+         *
+         * {% set foo %}foo{% endset %} is compiled to $context['foo'] = new Twig\Markup("foo");
+         */
+        if ($this->getAttribute('capture')) {
+            $this->setAttribute('safe', true);
+
+            $values = $this->getNode('values');
+            if ($values instanceof TextNode) {
+                $this->setNode('values', new ConstantExpression($values->getAttribute('data'), $values->getTemplateLine()));
+                $this->setAttribute('capture', false);
+            }
+        }
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler->addDebugInfo($this);
+
+        if (\count($this->getNode('names')) > 1) {
+            $compiler->write('list(');
+            foreach ($this->getNode('names') as $idx => $node) {
+                if ($idx) {
+                    $compiler->raw(', ');
+                }
+
+                $compiler->subcompile($node);
+            }
+            $compiler->raw(')');
+        } else {
+            if ($this->getAttribute('capture')) {
+                if ($compiler->getEnvironment()->isDebug()) {
+                    $compiler->write("ob_start();\n");
+                } else {
+                    $compiler->write("ob_start(function () { return ''; });\n");
+                }
+                $compiler
+                    ->subcompile($this->getNode('values'))
+                ;
+            }
+
+            $compiler->subcompile($this->getNode('names'), false);
+
+            if ($this->getAttribute('capture')) {
+                $compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Markup(\$tmp, \$this->env->getCharset())");
+            }
+        }
+
+        if (!$this->getAttribute('capture')) {
+            $compiler->raw(' = ');
+
+            if (\count($this->getNode('names')) > 1) {
+                $compiler->write('[');
+                foreach ($this->getNode('values') as $idx => $value) {
+                    if ($idx) {
+                        $compiler->raw(', ');
+                    }
+
+                    $compiler->subcompile($value);
+                }
+                $compiler->raw(']');
+            } else {
+                if ($this->getAttribute('safe')) {
+                    $compiler
+                        ->raw("('' === \$tmp = ")
+                        ->subcompile($this->getNode('values'))
+                        ->raw(") ? '' : new Markup(\$tmp, \$this->env->getCharset())")
+                    ;
+                } else {
+                    $compiler->subcompile($this->getNode('values'));
+                }
+            }
+        }
+
+        $compiler->raw(";\n");
     }
 }
+
+class_alias('Twig\Node\SetNode', 'Twig_Node_Set');
diff --git a/vendor/twig/twig/src/Node/SetTempNode.php b/vendor/twig/twig/src/Node/SetTempNode.php
deleted file mode 100644
index 90915d2f..00000000
--- a/vendor/twig/twig/src/Node/SetTempNode.php
+++ /dev/null
@@ -1,11 +0,0 @@
-<?php
-
-namespace Twig\Node;
-
-class_exists('Twig_Node_SetTemp');
-
-if (\false) {
-    class SetTempNode extends \Twig_Node_SetTemp
-    {
-    }
-}
diff --git a/vendor/twig/twig/src/Node/SpacelessNode.php b/vendor/twig/twig/src/Node/SpacelessNode.php
index 08cf9d08..8fc4a2df 100644
--- a/vendor/twig/twig/src/Node/SpacelessNode.php
+++ b/vendor/twig/twig/src/Node/SpacelessNode.php
@@ -1,11 +1,49 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Spaceless');
+use Twig\Compiler;
 
-if (\false) {
-    class SpacelessNode extends \Twig_Node_Spaceless
+/**
+ * Represents a spaceless node.
+ *
+ * It removes spaces between HTML tags.
+ *
+ * @deprecated since Twig 2.7, to be removed in 3.0
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class SpacelessNode extends Node implements NodeOutputInterface
+{
+    public function __construct(Node $body, int $lineno, string $tag = 'spaceless')
     {
+        parent::__construct(['body' => $body], [], $lineno, $tag);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+        ;
+        if ($compiler->getEnvironment()->isDebug()) {
+            $compiler->write("ob_start();\n");
+        } else {
+            $compiler->write("ob_start(function () { return ''; });\n");
+        }
+        $compiler
+            ->subcompile($this->getNode('body'))
+            ->write("echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\SpacelessNode', 'Twig_Node_Spaceless');
diff --git a/vendor/twig/twig/src/Node/TextNode.php b/vendor/twig/twig/src/Node/TextNode.php
index daff7647..85640a56 100644
--- a/vendor/twig/twig/src/Node/TextNode.php
+++ b/vendor/twig/twig/src/Node/TextNode.php
@@ -1,11 +1,40 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_Text');
+use Twig\Compiler;
 
-if (\false) {
-    class TextNode extends \Twig_Node_Text
+/**
+ * Represents a text node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class TextNode extends Node implements NodeOutputInterface
+{
+    public function __construct(string $data, int $lineno)
     {
+        parent::__construct([], ['data' => $data], $lineno);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->addDebugInfo($this)
+            ->write('echo ')
+            ->string($this->getAttribute('data'))
+            ->raw(";\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\TextNode', 'Twig_Node_Text');
diff --git a/vendor/twig/twig/src/Node/WithNode.php b/vendor/twig/twig/src/Node/WithNode.php
index 072fa6d8..74d1ea0a 100644
--- a/vendor/twig/twig/src/Node/WithNode.php
+++ b/vendor/twig/twig/src/Node/WithNode.php
@@ -1,11 +1,72 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Node;
 
-class_exists('Twig_Node_With');
+use Twig\Compiler;
+
+/**
+ * Represents a nested "with" scope.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class WithNode extends Node
+{
+    public function __construct(Node $body, Node $variables = null, bool $only = false, int $lineno, string $tag = null)
+    {
+        $nodes = ['body' => $body];
+        if (null !== $variables) {
+            $nodes['variables'] = $variables;
+        }
+
+        parent::__construct($nodes, ['only' => $only], $lineno, $tag);
+    }
 
-if (\false) {
-    class WithNode extends \Twig_Node_With
+    public function compile(Compiler $compiler)
     {
+        $compiler->addDebugInfo($this);
+
+        if ($this->hasNode('variables')) {
+            $node = $this->getNode('variables');
+            $varsName = $compiler->getVarName();
+            $compiler
+                ->write(sprintf('$%s = ', $varsName))
+                ->subcompile($node)
+                ->raw(";\n")
+                ->write(sprintf("if (!twig_test_iterable(\$%s)) {\n", $varsName))
+                ->indent()
+                ->write("throw new RuntimeError('Variables passed to the \"with\" tag must be a hash.', ")
+                ->repr($node->getTemplateLine())
+                ->raw(", \$this->getSourceContext());\n")
+                ->outdent()
+                ->write("}\n")
+                ->write(sprintf("\$%s = twig_to_array(\$%s);\n", $varsName, $varsName))
+            ;
+
+            if ($this->getAttribute('only')) {
+                $compiler->write("\$context = ['_parent' => \$context];\n");
+            } else {
+                $compiler->write("\$context['_parent'] = \$context;\n");
+            }
+
+            $compiler->write(sprintf("\$context = \$this->env->mergeGlobals(array_merge(\$context, \$%s));\n", $varsName));
+        } else {
+            $compiler->write("\$context['_parent'] = \$context;\n");
+        }
+
+        $compiler
+            ->subcompile($this->getNode('body'))
+            ->write("\$context = \$context['_parent'];\n")
+        ;
     }
 }
+
+class_alias('Twig\Node\WithNode', 'Twig_Node_With');
diff --git a/vendor/twig/twig/src/NodeTraverser.php b/vendor/twig/twig/src/NodeTraverser.php
index 7fe843b7..625b049a 100644
--- a/vendor/twig/twig/src/NodeTraverser.php
+++ b/vendor/twig/twig/src/NodeTraverser.php
@@ -1,11 +1,85 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_NodeTraverser');
+use Twig\Node\Node;
+use Twig\NodeVisitor\NodeVisitorInterface;
+
+/**
+ * A node traverser.
+ *
+ * It visits all nodes and their children and calls the given visitor for each.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class NodeTraverser
+{
+    private $env;
+    private $visitors = [];
+
+    /**
+     * @param NodeVisitorInterface[] $visitors
+     */
+    public function __construct(Environment $env, array $visitors = [])
+    {
+        $this->env = $env;
+        foreach ($visitors as $visitor) {
+            $this->addVisitor($visitor);
+        }
+    }
+
+    public function addVisitor(NodeVisitorInterface $visitor)
+    {
+        $this->visitors[$visitor->getPriority()][] = $visitor;
+    }
+
+    /**
+     * Traverses a node and calls the registered visitors.
+     */
+    public function traverse(Node $node): Node
+    {
+        ksort($this->visitors);
+        foreach ($this->visitors as $visitors) {
+            foreach ($visitors as $visitor) {
+                $node = $this->traverseForVisitor($visitor, $node);
+            }
+        }
+
+        return $node;
+    }
 
-if (\false) {
-    class NodeTraverser extends \Twig_NodeTraverser
+    /**
+     * @return Node|null
+     */
+    private function traverseForVisitor(NodeVisitorInterface $visitor, Node $node)
     {
+        $node = $visitor->enterNode($node, $this->env);
+
+        foreach ($node as $k => $n) {
+            if (false !== ($m = $this->traverseForVisitor($visitor, $n)) && null !== $m) {
+                if ($m !== $n) {
+                    $node->setNode($k, $m);
+                }
+            } else {
+                if (false === $m) {
+                    @trigger_error('Returning "false" to remove a Node from NodeVisitorInterface::leaveNode() is deprecated since Twig version 2.9; return "null" instead.', E_USER_DEPRECATED);
+                }
+
+                $node->removeNode($k);
+            }
+        }
+
+        return $visitor->leaveNode($node, $this->env);
     }
 }
+
+class_alias('Twig\NodeTraverser', 'Twig_NodeTraverser');
diff --git a/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php
index 30e956fb..9c6cb124 100644
--- a/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php
+++ b/vendor/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php
@@ -1,11 +1,51 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\NodeVisitor;
 
-class_exists('Twig_BaseNodeVisitor');
+use Twig\Environment;
+use Twig\Node\Node;
+
+/**
+ * Used to make node visitors compatible with Twig 1.x and 2.x.
+ *
+ * To be removed in Twig 3.1.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+abstract class AbstractNodeVisitor implements NodeVisitorInterface
+{
+    final public function enterNode(Node $node, Environment $env)
+    {
+        return $this->doEnterNode($node, $env);
+    }
 
-if (\false) {
-    class AbstractNodeVisitor extends \Twig_BaseNodeVisitor
+    final public function leaveNode(Node $node, Environment $env)
     {
+        return $this->doLeaveNode($node, $env);
     }
+
+    /**
+     * Called before child nodes are visited.
+     *
+     * @return Node The modified node
+     */
+    abstract protected function doEnterNode(Node $node, Environment $env);
+
+    /**
+     * Called after child nodes are visited.
+     *
+     * @return Node|null The modified node or null if the node must be removed
+     */
+    abstract protected function doLeaveNode(Node $node, Environment $env);
 }
+
+class_alias('Twig\NodeVisitor\AbstractNodeVisitor', 'Twig_BaseNodeVisitor');
diff --git a/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php
index 68c28322..bfbfdc9e 100644
--- a/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php
+++ b/vendor/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php
@@ -1,11 +1,208 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\NodeVisitor;
 
-class_exists('Twig_NodeVisitor_Escaper');
+use Twig\Environment;
+use Twig\Extension\EscaperExtension;
+use Twig\Node\AutoEscapeNode;
+use Twig\Node\BlockNode;
+use Twig\Node\BlockReferenceNode;
+use Twig\Node\DoNode;
+use Twig\Node\Expression\ConditionalExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\FilterExpression;
+use Twig\Node\Expression\InlinePrint;
+use Twig\Node\ImportNode;
+use Twig\Node\ModuleNode;
+use Twig\Node\Node;
+use Twig\Node\PrintNode;
+use Twig\NodeTraverser;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class EscaperNodeVisitor extends AbstractNodeVisitor
+{
+    private $statusStack = [];
+    private $blocks = [];
+    private $safeAnalysis;
+    private $traverser;
+    private $defaultStrategy = false;
+    private $safeVars = [];
+
+    public function __construct()
+    {
+        $this->safeAnalysis = new SafeAnalysisNodeVisitor();
+    }
+
+    protected function doEnterNode(Node $node, Environment $env)
+    {
+        if ($node instanceof ModuleNode) {
+            if ($env->hasExtension(EscaperExtension::class) && $defaultStrategy = $env->getExtension(EscaperExtension::class)->getDefaultStrategy($node->getTemplateName())) {
+                $this->defaultStrategy = $defaultStrategy;
+            }
+            $this->safeVars = [];
+            $this->blocks = [];
+        } elseif ($node instanceof AutoEscapeNode) {
+            $this->statusStack[] = $node->getAttribute('value');
+        } elseif ($node instanceof BlockNode) {
+            $this->statusStack[] = isset($this->blocks[$node->getAttribute('name')]) ? $this->blocks[$node->getAttribute('name')] : $this->needEscaping($env);
+        } elseif ($node instanceof ImportNode) {
+            $this->safeVars[] = $node->getNode('var')->getAttribute('name');
+        }
+
+        return $node;
+    }
+
+    protected function doLeaveNode(Node $node, Environment $env)
+    {
+        if ($node instanceof ModuleNode) {
+            $this->defaultStrategy = false;
+            $this->safeVars = [];
+            $this->blocks = [];
+        } elseif ($node instanceof FilterExpression) {
+            return $this->preEscapeFilterNode($node, $env);
+        } elseif ($node instanceof PrintNode && false !== $type = $this->needEscaping($env)) {
+            $expression = $node->getNode('expr');
+            if ($expression instanceof ConditionalExpression && $this->shouldUnwrapConditional($expression, $env, $type)) {
+                return new DoNode($this->unwrapConditional($expression, $env, $type), $expression->getTemplateLine());
+            }
+
+            return $this->escapePrintNode($node, $env, $type);
+        }
+
+        if ($node instanceof AutoEscapeNode || $node instanceof BlockNode) {
+            array_pop($this->statusStack);
+        } elseif ($node instanceof BlockReferenceNode) {
+            $this->blocks[$node->getAttribute('name')] = $this->needEscaping($env);
+        }
+
+        return $node;
+    }
+
+    private function shouldUnwrapConditional(ConditionalExpression $expression, Environment $env, $type)
+    {
+        $expr2Safe = $this->isSafeFor($type, $expression->getNode('expr2'), $env);
+        $expr3Safe = $this->isSafeFor($type, $expression->getNode('expr3'), $env);
+
+        return $expr2Safe !== $expr3Safe;
+    }
+
+    private function unwrapConditional(ConditionalExpression $expression, Environment $env, $type)
+    {
+        // convert "echo a ? b : c" to "a ? echo b : echo c" recursively
+        $expr2 = $expression->getNode('expr2');
+        if ($expr2 instanceof ConditionalExpression && $this->shouldUnwrapConditional($expr2, $env, $type)) {
+            $expr2 = $this->unwrapConditional($expr2, $env, $type);
+        } else {
+            $expr2 = $this->escapeInlinePrintNode(new InlinePrint($expr2, $expr2->getTemplateLine()), $env, $type);
+        }
+        $expr3 = $expression->getNode('expr3');
+        if ($expr3 instanceof ConditionalExpression && $this->shouldUnwrapConditional($expr3, $env, $type)) {
+            $expr3 = $this->unwrapConditional($expr3, $env, $type);
+        } else {
+            $expr3 = $this->escapeInlinePrintNode(new InlinePrint($expr3, $expr3->getTemplateLine()), $env, $type);
+        }
+
+        return new ConditionalExpression($expression->getNode('expr1'), $expr2, $expr3, $expression->getTemplateLine());
+    }
+
+    private function escapeInlinePrintNode(InlinePrint $node, Environment $env, $type)
+    {
+        $expression = $node->getNode('node');
+
+        if ($this->isSafeFor($type, $expression, $env)) {
+            return $node;
+        }
+
+        return new InlinePrint($this->getEscaperFilter($type, $expression), $node->getTemplateLine());
+    }
+
+    private function escapePrintNode(PrintNode $node, Environment $env, $type)
+    {
+        if (false === $type) {
+            return $node;
+        }
+
+        $expression = $node->getNode('expr');
+
+        if ($this->isSafeFor($type, $expression, $env)) {
+            return $node;
+        }
+
+        $class = \get_class($node);
 
-if (\false) {
-    class EscaperNodeVisitor extends \Twig_NodeVisitor_Escaper
+        return new $class($this->getEscaperFilter($type, $expression), $node->getTemplateLine());
+    }
+
+    private function preEscapeFilterNode(FilterExpression $filter, Environment $env)
     {
+        $name = $filter->getNode('filter')->getAttribute('value');
+
+        $type = $env->getFilter($name)->getPreEscape();
+        if (null === $type) {
+            return $filter;
+        }
+
+        $node = $filter->getNode('node');
+        if ($this->isSafeFor($type, $node, $env)) {
+            return $filter;
+        }
+
+        $filter->setNode('node', $this->getEscaperFilter($type, $node));
+
+        return $filter;
+    }
+
+    private function isSafeFor($type, Node $expression, $env)
+    {
+        $safe = $this->safeAnalysis->getSafe($expression);
+
+        if (null === $safe) {
+            if (null === $this->traverser) {
+                $this->traverser = new NodeTraverser($env, [$this->safeAnalysis]);
+            }
+
+            $this->safeAnalysis->setSafeVars($this->safeVars);
+
+            $this->traverser->traverse($expression);
+            $safe = $this->safeAnalysis->getSafe($expression);
+        }
+
+        return \in_array($type, $safe) || \in_array('all', $safe);
+    }
+
+    private function needEscaping(Environment $env)
+    {
+        if (\count($this->statusStack)) {
+            return $this->statusStack[\count($this->statusStack) - 1];
+        }
+
+        return $this->defaultStrategy ? $this->defaultStrategy : false;
+    }
+
+    private function getEscaperFilter(string $type, Node $node): FilterExpression
+    {
+        $line = $node->getTemplateLine();
+        $name = new ConstantExpression('escape', $line);
+        $args = new Node([new ConstantExpression((string) $type, $line), new ConstantExpression(null, $line), new ConstantExpression(true, $line)]);
+
+        return new FilterExpression($node, $name, $args, $line);
+    }
+
+    public function getPriority()
+    {
+        return 0;
     }
 }
+
+class_alias('Twig\NodeVisitor\EscaperNodeVisitor', 'Twig_NodeVisitor_Escaper');
diff --git a/vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php
new file mode 100644
index 00000000..f41d4637
--- /dev/null
+++ b/vendor/twig/twig/src/NodeVisitor/MacroAutoImportNodeVisitor.php
@@ -0,0 +1,72 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Twig\NodeVisitor;
+
+use Twig\Environment;
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\GetAttrExpression;
+use Twig\Node\Expression\MethodCallExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\ImportNode;
+use Twig\Node\ModuleNode;
+use Twig\Node\Node;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class MacroAutoImportNodeVisitor implements NodeVisitorInterface
+{
+    private $inAModule = false;
+    private $hasMacroCalls = false;
+
+    public function enterNode(Node $node, Environment $env)
+    {
+        if ($node instanceof ModuleNode) {
+            $this->inAModule = true;
+            $this->hasMacroCalls = false;
+        }
+
+        return $node;
+    }
+
+    public function leaveNode(Node $node, Environment $env)
+    {
+        if ($node instanceof ModuleNode) {
+            $this->inAModule = false;
+            if ($this->hasMacroCalls) {
+                $node->getNode('constructor_end')->setNode('_auto_macro_import', new ImportNode(new NameExpression('_self', 0), new AssignNameExpression('_self', 0), 0, 'import', true));
+            }
+        } elseif ($this->inAModule) {
+            if (
+                $node instanceof GetAttrExpression &&
+                $node->getNode('node') instanceof NameExpression &&
+                '_self' === $node->getNode('node')->getAttribute('name') &&
+                $node->getNode('attribute') instanceof ConstantExpression
+            ) {
+                $this->hasMacroCalls = true;
+
+                $name = $node->getNode('attribute')->getAttribute('value');
+                $node = new MethodCallExpression($node->getNode('node'), 'macro_'.$name, $node->getNode('arguments'), $node->getTemplateLine());
+                $node->setAttribute('safe', true);
+            }
+        }
+
+        return $node;
+    }
+
+    public function getPriority()
+    {
+        // we must be ran before auto-escaping
+        return -10;
+    }
+}
diff --git a/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php b/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php
index f78f1d73..e0ffae2c 100644
--- a/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php
+++ b/vendor/twig/twig/src/NodeVisitor/NodeVisitorInterface.php
@@ -1,11 +1,51 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\NodeVisitor;
 
-class_exists('Twig_NodeVisitorInterface');
+use Twig\Environment;
+use Twig\Node\Node;
+
+/**
+ * Interface for node visitor classes.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+interface NodeVisitorInterface
+{
+    /**
+     * Called before child nodes are visited.
+     *
+     * @return Node The modified node
+     */
+    public function enterNode(Node $node, Environment $env);
+
+    /**
+     * Called after child nodes are visited.
+     *
+     * @return Node|null The modified node or null if the node must be removed
+     */
+    public function leaveNode(Node $node, Environment $env);
 
-if (\false) {
-    interface NodeVisitorInterface extends \Twig_NodeVisitorInterface
-    {
-    }
+    /**
+     * Returns the priority for this visitor.
+     *
+     * Priority should be between -10 and 10 (0 is the default).
+     *
+     * @return int The priority level
+     */
+    public function getPriority();
 }
+
+class_alias('Twig\NodeVisitor\NodeVisitorInterface', 'Twig_NodeVisitorInterface');
+
+// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name.
+class_exists('Twig\Environment');
diff --git a/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php
index 9ed37a55..9f7cae4d 100644
--- a/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php
+++ b/vendor/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php
@@ -1,11 +1,219 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\NodeVisitor;
 
-class_exists('Twig_NodeVisitor_Optimizer');
+use Twig\Environment;
+use Twig\Node\BlockReferenceNode;
+use Twig\Node\Expression\BlockReferenceExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\FilterExpression;
+use Twig\Node\Expression\FunctionExpression;
+use Twig\Node\Expression\GetAttrExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\Expression\ParentExpression;
+use Twig\Node\ForNode;
+use Twig\Node\IncludeNode;
+use Twig\Node\Node;
+use Twig\Node\PrintNode;
+
+/**
+ * Tries to optimize the AST.
+ *
+ * This visitor is always the last registered one.
+ *
+ * You can configure which optimizations you want to activate via the
+ * optimizer mode.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class OptimizerNodeVisitor extends AbstractNodeVisitor
+{
+    const OPTIMIZE_ALL = -1;
+    const OPTIMIZE_NONE = 0;
+    const OPTIMIZE_FOR = 2;
+    const OPTIMIZE_RAW_FILTER = 4;
+    // obsolete, does not do anything
+    const OPTIMIZE_VAR_ACCESS = 8;
+
+    private $loops = [];
+    private $loopsTargets = [];
+    private $optimizers;
+
+    /**
+     * @param int $optimizers The optimizer mode
+     */
+    public function __construct(int $optimizers = -1)
+    {
+        if (!\is_int($optimizers) || $optimizers > (self::OPTIMIZE_FOR | self::OPTIMIZE_RAW_FILTER | self::OPTIMIZE_VAR_ACCESS)) {
+            throw new \InvalidArgumentException(sprintf('Optimizer mode "%s" is not valid.', $optimizers));
+        }
+
+        $this->optimizers = $optimizers;
+    }
+
+    protected function doEnterNode(Node $node, Environment $env)
+    {
+        if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
+            $this->enterOptimizeFor($node, $env);
+        }
+
+        return $node;
+    }
+
+    protected function doLeaveNode(Node $node, Environment $env)
+    {
+        if (self::OPTIMIZE_FOR === (self::OPTIMIZE_FOR & $this->optimizers)) {
+            $this->leaveOptimizeFor($node, $env);
+        }
+
+        if (self::OPTIMIZE_RAW_FILTER === (self::OPTIMIZE_RAW_FILTER & $this->optimizers)) {
+            $node = $this->optimizeRawFilter($node, $env);
+        }
+
+        $node = $this->optimizePrintNode($node, $env);
+
+        return $node;
+    }
+
+    /**
+     * Optimizes print nodes.
+     *
+     * It replaces:
+     *
+     *   * "echo $this->render(Parent)Block()" with "$this->display(Parent)Block()"
+     */
+    private function optimizePrintNode(Node $node, Environment $env): Node
+    {
+        if (!$node instanceof PrintNode) {
+            return $node;
+        }
+
+        $exprNode = $node->getNode('expr');
+        if (
+            $exprNode instanceof BlockReferenceExpression ||
+            $exprNode instanceof ParentExpression
+        ) {
+            $exprNode->setAttribute('output', true);
+
+            return $exprNode;
+        }
 
-if (\false) {
-    class OptimizerNodeVisitor extends \Twig_NodeVisitor_Optimizer
+        return $node;
+    }
+
+    /**
+     * Removes "raw" filters.
+     */
+    private function optimizeRawFilter(Node $node, Environment $env): Node
     {
+        if ($node instanceof FilterExpression && 'raw' == $node->getNode('filter')->getAttribute('value')) {
+            return $node->getNode('node');
+        }
+
+        return $node;
+    }
+
+    /**
+     * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
+     */
+    private function enterOptimizeFor(Node $node, Environment $env)
+    {
+        if ($node instanceof ForNode) {
+            // disable the loop variable by default
+            $node->setAttribute('with_loop', false);
+            array_unshift($this->loops, $node);
+            array_unshift($this->loopsTargets, $node->getNode('value_target')->getAttribute('name'));
+            array_unshift($this->loopsTargets, $node->getNode('key_target')->getAttribute('name'));
+        } elseif (!$this->loops) {
+            // we are outside a loop
+            return;
+        }
+
+        // when do we need to add the loop variable back?
+
+        // the loop variable is referenced for the current loop
+        elseif ($node instanceof NameExpression && 'loop' === $node->getAttribute('name')) {
+            $node->setAttribute('always_defined', true);
+            $this->addLoopToCurrent();
+        }
+
+        // optimize access to loop targets
+        elseif ($node instanceof NameExpression && \in_array($node->getAttribute('name'), $this->loopsTargets)) {
+            $node->setAttribute('always_defined', true);
+        }
+
+        // block reference
+        elseif ($node instanceof BlockReferenceNode || $node instanceof BlockReferenceExpression) {
+            $this->addLoopToCurrent();
+        }
+
+        // include without the only attribute
+        elseif ($node instanceof IncludeNode && !$node->getAttribute('only')) {
+            $this->addLoopToAll();
+        }
+
+        // include function without the with_context=false parameter
+        elseif ($node instanceof FunctionExpression
+            && 'include' === $node->getAttribute('name')
+            && (!$node->getNode('arguments')->hasNode('with_context')
+                 || false !== $node->getNode('arguments')->getNode('with_context')->getAttribute('value')
+               )
+        ) {
+            $this->addLoopToAll();
+        }
+
+        // the loop variable is referenced via an attribute
+        elseif ($node instanceof GetAttrExpression
+            && (!$node->getNode('attribute') instanceof ConstantExpression
+                || 'parent' === $node->getNode('attribute')->getAttribute('value')
+               )
+            && (true === $this->loops[0]->getAttribute('with_loop')
+                || ($node->getNode('node') instanceof NameExpression
+                    && 'loop' === $node->getNode('node')->getAttribute('name')
+                   )
+               )
+        ) {
+            $this->addLoopToAll();
+        }
+    }
+
+    /**
+     * Optimizes "for" tag by removing the "loop" variable creation whenever possible.
+     */
+    private function leaveOptimizeFor(Node $node, Environment $env)
+    {
+        if ($node instanceof ForNode) {
+            array_shift($this->loops);
+            array_shift($this->loopsTargets);
+            array_shift($this->loopsTargets);
+        }
+    }
+
+    private function addLoopToCurrent()
+    {
+        $this->loops[0]->setAttribute('with_loop', true);
+    }
+
+    private function addLoopToAll()
+    {
+        foreach ($this->loops as $loop) {
+            $loop->setAttribute('with_loop', true);
+        }
+    }
+
+    public function getPriority()
+    {
+        return 255;
     }
 }
+
+class_alias('Twig\NodeVisitor\OptimizerNodeVisitor', 'Twig_NodeVisitor_Optimizer');
diff --git a/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php
index 8906b37c..02a2af43 100644
--- a/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php
+++ b/vendor/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php
@@ -1,11 +1,160 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\NodeVisitor;
 
-class_exists('Twig_NodeVisitor_SafeAnalysis');
+use Twig\Environment;
+use Twig\Node\Expression\BlockReferenceExpression;
+use Twig\Node\Expression\ConditionalExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\FilterExpression;
+use Twig\Node\Expression\FunctionExpression;
+use Twig\Node\Expression\GetAttrExpression;
+use Twig\Node\Expression\MethodCallExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\Expression\ParentExpression;
+use Twig\Node\Node;
+
+final class SafeAnalysisNodeVisitor extends AbstractNodeVisitor
+{
+    private $data = [];
+    private $safeVars = [];
+
+    public function setSafeVars($safeVars)
+    {
+        $this->safeVars = $safeVars;
+    }
+
+    public function getSafe(Node $node)
+    {
+        $hash = spl_object_hash($node);
+        if (!isset($this->data[$hash])) {
+            return;
+        }
+
+        foreach ($this->data[$hash] as $bucket) {
+            if ($bucket['key'] !== $node) {
+                continue;
+            }
+
+            if (\in_array('html_attr', $bucket['value'])) {
+                $bucket['value'][] = 'html';
+            }
+
+            return $bucket['value'];
+        }
+    }
+
+    private function setSafe(Node $node, array $safe)
+    {
+        $hash = spl_object_hash($node);
+        if (isset($this->data[$hash])) {
+            foreach ($this->data[$hash] as &$bucket) {
+                if ($bucket['key'] === $node) {
+                    $bucket['value'] = $safe;
+
+                    return;
+                }
+            }
+        }
+        $this->data[$hash][] = [
+            'key' => $node,
+            'value' => $safe,
+        ];
+    }
 
-if (\false) {
-    class SafeAnalysisNodeVisitor extends \Twig_NodeVisitor_SafeAnalysis
+    protected function doEnterNode(Node $node, Environment $env)
     {
+        return $node;
+    }
+
+    protected function doLeaveNode(Node $node, Environment $env)
+    {
+        if ($node instanceof ConstantExpression) {
+            // constants are marked safe for all
+            $this->setSafe($node, ['all']);
+        } elseif ($node instanceof BlockReferenceExpression) {
+            // blocks are safe by definition
+            $this->setSafe($node, ['all']);
+        } elseif ($node instanceof ParentExpression) {
+            // parent block is safe by definition
+            $this->setSafe($node, ['all']);
+        } elseif ($node instanceof ConditionalExpression) {
+            // intersect safeness of both operands
+            $safe = $this->intersectSafe($this->getSafe($node->getNode('expr2')), $this->getSafe($node->getNode('expr3')));
+            $this->setSafe($node, $safe);
+        } elseif ($node instanceof FilterExpression) {
+            // filter expression is safe when the filter is safe
+            $name = $node->getNode('filter')->getAttribute('value');
+            $args = $node->getNode('arguments');
+            if (false !== $filter = $env->getFilter($name)) {
+                $safe = $filter->getSafe($args);
+                if (null === $safe) {
+                    $safe = $this->intersectSafe($this->getSafe($node->getNode('node')), $filter->getPreservesSafety());
+                }
+                $this->setSafe($node, $safe);
+            } else {
+                $this->setSafe($node, []);
+            }
+        } elseif ($node instanceof FunctionExpression) {
+            // function expression is safe when the function is safe
+            $name = $node->getAttribute('name');
+            $args = $node->getNode('arguments');
+            $function = $env->getFunction($name);
+            if (false !== $function) {
+                $this->setSafe($node, $function->getSafe($args));
+            } else {
+                $this->setSafe($node, []);
+            }
+        } elseif ($node instanceof MethodCallExpression) {
+            if ($node->getAttribute('safe')) {
+                $this->setSafe($node, ['all']);
+            } else {
+                $this->setSafe($node, []);
+            }
+        } elseif ($node instanceof GetAttrExpression && $node->getNode('node') instanceof NameExpression) {
+            $name = $node->getNode('node')->getAttribute('name');
+            if (\in_array($name, $this->safeVars)) {
+                $this->setSafe($node, ['all']);
+            } else {
+                $this->setSafe($node, []);
+            }
+        } else {
+            $this->setSafe($node, []);
+        }
+
+        return $node;
+    }
+
+    private function intersectSafe(array $a = null, array $b = null): array
+    {
+        if (null === $a || null === $b) {
+            return [];
+        }
+
+        if (\in_array('all', $a)) {
+            return $b;
+        }
+
+        if (\in_array('all', $b)) {
+            return $a;
+        }
+
+        return array_intersect($a, $b);
+    }
+
+    public function getPriority()
+    {
+        return 0;
     }
 }
+
+class_alias('Twig\NodeVisitor\SafeAnalysisNodeVisitor', 'Twig_NodeVisitor_SafeAnalysis');
diff --git a/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php b/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php
index 1e4632f3..3e8d0bca 100644
--- a/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php
+++ b/vendor/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php
@@ -1,11 +1,135 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\NodeVisitor;
 
-class_exists('Twig_NodeVisitor_Sandbox');
+use Twig\Environment;
+use Twig\Node\CheckSecurityNode;
+use Twig\Node\CheckToStringNode;
+use Twig\Node\Expression\Binary\ConcatBinary;
+use Twig\Node\Expression\Binary\RangeBinary;
+use Twig\Node\Expression\FilterExpression;
+use Twig\Node\Expression\FunctionExpression;
+use Twig\Node\Expression\GetAttrExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\ModuleNode;
+use Twig\Node\Node;
+use Twig\Node\PrintNode;
+use Twig\Node\SetNode;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class SandboxNodeVisitor extends AbstractNodeVisitor
+{
+    private $inAModule = false;
+    private $tags;
+    private $filters;
+    private $functions;
+
+    private $needsToStringWrap = false;
+
+    protected function doEnterNode(Node $node, Environment $env)
+    {
+        if ($node instanceof ModuleNode) {
+            $this->inAModule = true;
+            $this->tags = [];
+            $this->filters = [];
+            $this->functions = [];
+
+            return $node;
+        } elseif ($this->inAModule) {
+            // look for tags
+            if ($node->getNodeTag() && !isset($this->tags[$node->getNodeTag()])) {
+                $this->tags[$node->getNodeTag()] = $node;
+            }
+
+            // look for filters
+            if ($node instanceof FilterExpression && !isset($this->filters[$node->getNode('filter')->getAttribute('value')])) {
+                $this->filters[$node->getNode('filter')->getAttribute('value')] = $node;
+            }
+
+            // look for functions
+            if ($node instanceof FunctionExpression && !isset($this->functions[$node->getAttribute('name')])) {
+                $this->functions[$node->getAttribute('name')] = $node;
+            }
+
+            // the .. operator is equivalent to the range() function
+            if ($node instanceof RangeBinary && !isset($this->functions['range'])) {
+                $this->functions['range'] = $node;
+            }
+
+            if ($node instanceof PrintNode) {
+                $this->needsToStringWrap = true;
+                $this->wrapNode($node, 'expr');
+            }
+
+            if ($node instanceof SetNode && !$node->getAttribute('capture')) {
+                $this->needsToStringWrap = true;
+            }
+
+            // wrap outer nodes that can implicitly call __toString()
+            if ($this->needsToStringWrap) {
+                if ($node instanceof ConcatBinary) {
+                    $this->wrapNode($node, 'left');
+                    $this->wrapNode($node, 'right');
+                }
+                if ($node instanceof FilterExpression) {
+                    $this->wrapNode($node, 'node');
+                    $this->wrapArrayNode($node, 'arguments');
+                }
+                if ($node instanceof FunctionExpression) {
+                    $this->wrapArrayNode($node, 'arguments');
+                }
+            }
+        }
+
+        return $node;
+    }
 
-if (\false) {
-    class SandboxNodeVisitor extends \Twig_NodeVisitor_Sandbox
+    protected function doLeaveNode(Node $node, Environment $env)
     {
+        if ($node instanceof ModuleNode) {
+            $this->inAModule = false;
+
+            $node->getNode('constructor_end')->setNode('_security_check', new Node([new CheckSecurityNode($this->filters, $this->tags, $this->functions), $node->getNode('display_start')]));
+        } elseif ($this->inAModule) {
+            if ($node instanceof PrintNode || $node instanceof SetNode) {
+                $this->needsToStringWrap = false;
+            }
+        }
+
+        return $node;
+    }
+
+    private function wrapNode(Node $node, string $name)
+    {
+        $expr = $node->getNode($name);
+        if ($expr instanceof NameExpression || $expr instanceof GetAttrExpression) {
+            $node->setNode($name, new CheckToStringNode($expr));
+        }
+    }
+
+    private function wrapArrayNode(Node $node, string $name)
+    {
+        $args = $node->getNode($name);
+        foreach ($args as $name => $_) {
+            $this->wrapNode($args, $name);
+        }
+    }
+
+    public function getPriority()
+    {
+        return 0;
     }
 }
+
+class_alias('Twig\NodeVisitor\SandboxNodeVisitor', 'Twig_NodeVisitor_Sandbox');
diff --git a/vendor/twig/twig/src/Parser.php b/vendor/twig/twig/src/Parser.php
index 738a4047..8a937e32 100644
--- a/vendor/twig/twig/src/Parser.php
+++ b/vendor/twig/twig/src/Parser.php
@@ -1,11 +1,394 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_Parser');
+use Twig\Error\SyntaxError;
+use Twig\Node\BlockNode;
+use Twig\Node\BlockReferenceNode;
+use Twig\Node\BodyNode;
+use Twig\Node\Expression\AbstractExpression;
+use Twig\Node\MacroNode;
+use Twig\Node\ModuleNode;
+use Twig\Node\Node;
+use Twig\Node\NodeCaptureInterface;
+use Twig\Node\NodeOutputInterface;
+use Twig\Node\PrintNode;
+use Twig\Node\SpacelessNode;
+use Twig\Node\TextNode;
+use Twig\TokenParser\TokenParserInterface;
+
+/**
+ * Default parser implementation.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class Parser
+{
+    private $stack = [];
+    private $stream;
+    private $parent;
+    private $handlers;
+    private $visitors;
+    private $expressionParser;
+    private $blocks;
+    private $blockStack;
+    private $macros;
+    private $env;
+    private $importedSymbols;
+    private $traits;
+    private $embeddedTemplates = [];
+    private $varNameSalt = 0;
+
+    public function __construct(Environment $env)
+    {
+        $this->env = $env;
+    }
+
+    public function getVarName()
+    {
+        return sprintf('__internal_%s', hash('sha256', __METHOD__.$this->stream->getSourceContext()->getCode().$this->varNameSalt++));
+    }
+
+    public function parse(TokenStream $stream, $test = null, $dropNeedle = false)
+    {
+        $vars = get_object_vars($this);
+        unset($vars['stack'], $vars['env'], $vars['handlers'], $vars['visitors'], $vars['expressionParser'], $vars['reservedMacroNames']);
+        $this->stack[] = $vars;
+
+        // tag handlers
+        if (null === $this->handlers) {
+            $this->handlers = [];
+            foreach ($this->env->getTokenParsers() as $handler) {
+                $handler->setParser($this);
+
+                $this->handlers[$handler->getTag()] = $handler;
+            }
+        }
+
+        // node visitors
+        if (null === $this->visitors) {
+            $this->visitors = $this->env->getNodeVisitors();
+        }
+
+        if (null === $this->expressionParser) {
+            $this->expressionParser = new ExpressionParser($this, $this->env);
+        }
+
+        $this->stream = $stream;
+        $this->parent = null;
+        $this->blocks = [];
+        $this->macros = [];
+        $this->traits = [];
+        $this->blockStack = [];
+        $this->importedSymbols = [[]];
+        $this->embeddedTemplates = [];
+        $this->varNameSalt = 0;
+
+        try {
+            $body = $this->subparse($test, $dropNeedle);
+
+            if (null !== $this->parent && null === $body = $this->filterBodyNodes($body)) {
+                $body = new Node();
+            }
+        } catch (SyntaxError $e) {
+            if (!$e->getSourceContext()) {
+                $e->setSourceContext($this->stream->getSourceContext());
+            }
+
+            if (!$e->getTemplateLine()) {
+                $e->setTemplateLine($this->stream->getCurrent()->getLine());
+            }
+
+            throw $e;
+        }
+
+        $node = new ModuleNode(new BodyNode([$body]), $this->parent, new Node($this->blocks), new Node($this->macros), new Node($this->traits), $this->embeddedTemplates, $stream->getSourceContext());
+
+        $traverser = new NodeTraverser($this->env, $this->visitors);
+
+        $node = $traverser->traverse($node);
+
+        // restore previous stack so previous parse() call can resume working
+        foreach (array_pop($this->stack) as $key => $val) {
+            $this->$key = $val;
+        }
+
+        return $node;
+    }
+
+    public function subparse($test, $dropNeedle = false)
+    {
+        $lineno = $this->getCurrentToken()->getLine();
+        $rv = [];
+        while (!$this->stream->isEOF()) {
+            switch ($this->getCurrentToken()->getType()) {
+                case /* Token::TEXT_TYPE */ 0:
+                    $token = $this->stream->next();
+                    $rv[] = new TextNode($token->getValue(), $token->getLine());
+                    break;
+
+                case /* Token::VAR_START_TYPE */ 2:
+                    $token = $this->stream->next();
+                    $expr = $this->expressionParser->parseExpression();
+                    $this->stream->expect(/* Token::VAR_END_TYPE */ 4);
+                    $rv[] = new PrintNode($expr, $token->getLine());
+                    break;
+
+                case /* Token::BLOCK_START_TYPE */ 1:
+                    $this->stream->next();
+                    $token = $this->getCurrentToken();
+
+                    if (/* Token::NAME_TYPE */ 5 !== $token->getType()) {
+                        throw new SyntaxError('A block must start with a tag name.', $token->getLine(), $this->stream->getSourceContext());
+                    }
+
+                    if (null !== $test && $test($token)) {
+                        if ($dropNeedle) {
+                            $this->stream->next();
+                        }
+
+                        if (1 === \count($rv)) {
+                            return $rv[0];
+                        }
+
+                        return new Node($rv, [], $lineno);
+                    }
+
+                    if (!isset($this->handlers[$token->getValue()])) {
+                        if (null !== $test) {
+                            $e = new SyntaxError(sprintf('Unexpected "%s" tag', $token->getValue()), $token->getLine(), $this->stream->getSourceContext());
+
+                            if (\is_array($test) && isset($test[0]) && $test[0] instanceof TokenParserInterface) {
+                                $e->appendMessage(sprintf(' (expecting closing tag for the "%s" tag defined near line %s).', $test[0]->getTag(), $lineno));
+                            }
+                        } else {
+                            $e = new SyntaxError(sprintf('Unknown "%s" tag.', $token->getValue()), $token->getLine(), $this->stream->getSourceContext());
+                            $e->addSuggestions($token->getValue(), array_keys($this->env->getTags()));
+                        }
+
+                        throw $e;
+                    }
+
+                    $this->stream->next();
+
+                    $subparser = $this->handlers[$token->getValue()];
+                    $node = $subparser->parse($token);
+                    if (null !== $node) {
+                        $rv[] = $node;
+                    }
+                    break;
+
+                default:
+                    throw new SyntaxError('Lexer or parser ended up in unsupported state.', $this->getCurrentToken()->getLine(), $this->stream->getSourceContext());
+            }
+        }
+
+        if (1 === \count($rv)) {
+            return $rv[0];
+        }
+
+        return new Node($rv, [], $lineno);
+    }
+
+    public function getBlockStack()
+    {
+        return $this->blockStack;
+    }
+
+    public function peekBlockStack()
+    {
+        return isset($this->blockStack[\count($this->blockStack) - 1]) ? $this->blockStack[\count($this->blockStack) - 1] : null;
+    }
+
+    public function popBlockStack()
+    {
+        array_pop($this->blockStack);
+    }
+
+    public function pushBlockStack($name)
+    {
+        $this->blockStack[] = $name;
+    }
+
+    public function hasBlock($name)
+    {
+        return isset($this->blocks[$name]);
+    }
+
+    public function getBlock($name)
+    {
+        return $this->blocks[$name];
+    }
+
+    public function setBlock($name, BlockNode $value)
+    {
+        $this->blocks[$name] = new BodyNode([$value], [], $value->getTemplateLine());
+    }
+
+    public function hasMacro($name)
+    {
+        return isset($this->macros[$name]);
+    }
+
+    public function setMacro($name, MacroNode $node)
+    {
+        $this->macros[$name] = $node;
+    }
+
+    /**
+     * @deprecated since Twig 2.7 as there are no reserved macro names anymore, will be removed in 3.0.
+     */
+    public function isReservedMacroName($name)
+    {
+        @trigger_error(sprintf('The "%s" method is deprecated since Twig 2.7 and will be removed in 3.0.', __METHOD__), E_USER_DEPRECATED);
+
+        return false;
+    }
+
+    public function addTrait($trait)
+    {
+        $this->traits[] = $trait;
+    }
+
+    public function hasTraits()
+    {
+        return \count($this->traits) > 0;
+    }
+
+    public function embedTemplate(ModuleNode $template)
+    {
+        $template->setIndex(mt_rand());
+
+        $this->embeddedTemplates[] = $template;
+    }
+
+    public function addImportedSymbol($type, $alias, $name = null, AbstractExpression $node = null)
+    {
+        $this->importedSymbols[0][$type][$alias] = ['name' => $name, 'node' => $node];
+    }
+
+    public function getImportedSymbol($type, $alias)
+    {
+        // if the symbol does not exist in the current scope (0), try in the main/global scope (last index)
+        return $this->importedSymbols[0][$type][$alias] ?? ($this->importedSymbols[\count($this->importedSymbols) - 1][$type][$alias] ?? null);
+    }
+
+    public function isMainScope()
+    {
+        return 1 === \count($this->importedSymbols);
+    }
 
-if (\false) {
-    class Parser extends \Twig_Parser
+    public function pushLocalScope()
     {
+        array_unshift($this->importedSymbols, []);
+    }
+
+    public function popLocalScope()
+    {
+        array_shift($this->importedSymbols);
+    }
+
+    /**
+     * @return ExpressionParser
+     */
+    public function getExpressionParser()
+    {
+        return $this->expressionParser;
+    }
+
+    public function getParent()
+    {
+        return $this->parent;
+    }
+
+    public function setParent($parent)
+    {
+        $this->parent = $parent;
+    }
+
+    /**
+     * @return TokenStream
+     */
+    public function getStream()
+    {
+        return $this->stream;
+    }
+
+    /**
+     * @return Token
+     */
+    public function getCurrentToken()
+    {
+        return $this->stream->getCurrent();
+    }
+
+    private function filterBodyNodes(Node $node, bool $nested = false)
+    {
+        // check that the body does not contain non-empty output nodes
+        if (
+            ($node instanceof TextNode && !ctype_space($node->getAttribute('data')))
+            ||
+            // the "&& !$node instanceof SpacelessNode" part of the condition must be removed in 3.0
+            (!$node instanceof TextNode && !$node instanceof BlockReferenceNode && ($node instanceof NodeOutputInterface && !$node instanceof SpacelessNode))
+        ) {
+            if (false !== strpos((string) $node, \chr(0xEF).\chr(0xBB).\chr(0xBF))) {
+                $t = substr($node->getAttribute('data'), 3);
+                if ('' === $t || ctype_space($t)) {
+                    // bypass empty nodes starting with a BOM
+                    return;
+                }
+            }
+
+            throw new SyntaxError('A template that extends another one cannot include content outside Twig blocks. Did you forget to put the content inside a {% block %} tag?', $node->getTemplateLine(), $this->stream->getSourceContext());
+        }
+
+        // bypass nodes that "capture" the output
+        if ($node instanceof NodeCaptureInterface) {
+            // a "block" tag in such a node will serve as a block definition AND be displayed in place as well
+            return $node;
+        }
+
+        // to be removed completely in Twig 3.0
+        if (!$nested && $node instanceof SpacelessNode) {
+            @trigger_error(sprintf('Using the spaceless tag at the root level of a child template in "%s" at line %d is deprecated since Twig 2.5.0 and will become a syntax error in 3.0.', $this->stream->getSourceContext()->getName(), $node->getTemplateLine()), E_USER_DEPRECATED);
+        }
+
+        // "block" tags that are not captured (see above) are only used for defining
+        // the content of the block. In such a case, nesting it does not work as
+        // expected as the definition is not part of the default template code flow.
+        if ($nested && ($node instanceof BlockReferenceNode || $node instanceof \Twig_Node_BlockReference)) {
+            //throw new SyntaxError('A block definition cannot be nested under non-capturing nodes.', $node->getTemplateLine(), $this->stream->getSourceContext());
+            @trigger_error(sprintf('Nesting a block definition under a non-capturing node in "%s" at line %d is deprecated since Twig 2.5.0 and will become a syntax error in 3.0.', $this->stream->getSourceContext()->getName(), $node->getTemplateLine()), E_USER_DEPRECATED);
+
+            return;
+        }
+
+        // the "&& !$node instanceof SpacelessNode" part of the condition must be removed in 3.0
+        if ($node instanceof NodeOutputInterface && !$node instanceof SpacelessNode) {
+            return;
+        }
+
+        // here, $nested means "being at the root level of a child template"
+        // we need to discard the wrapping "Twig_Node" for the "body" node
+        $nested = $nested || ('Twig_Node' !== \get_class($node) && Node::class !== \get_class($node));
+        foreach ($node as $k => $n) {
+            if (null !== $n && null === $this->filterBodyNodes($n, $nested)) {
+                $node->removeNode($k);
+            }
+        }
+
+        return $node;
     }
 }
+
+class_alias('Twig\Parser', 'Twig_Parser');
diff --git a/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php b/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php
index 33c32801..1631987b 100644
--- a/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php
+++ b/vendor/twig/twig/src/Profiler/Dumper/BaseDumper.php
@@ -1,11 +1,65 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Profiler\Dumper;
 
-class_exists('Twig_Profiler_Dumper_Base');
+use Twig\Profiler\Profile;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+abstract class BaseDumper
+{
+    private $root;
 
-if (\false) {
-    class BaseDumper extends \Twig_Profiler_Dumper_Base
+    public function dump(Profile $profile)
     {
+        return $this->dumpProfile($profile);
+    }
+
+    abstract protected function formatTemplate(Profile $profile, $prefix);
+
+    abstract protected function formatNonTemplate(Profile $profile, $prefix);
+
+    abstract protected function formatTime(Profile $profile, $percent);
+
+    private function dumpProfile(Profile $profile, $prefix = '', $sibling = false): string
+    {
+        if ($profile->isRoot()) {
+            $this->root = $profile->getDuration();
+            $start = $profile->getName();
+        } else {
+            if ($profile->isTemplate()) {
+                $start = $this->formatTemplate($profile, $prefix);
+            } else {
+                $start = $this->formatNonTemplate($profile, $prefix);
+            }
+            $prefix .= $sibling ? 'â?? ' : '  ';
+        }
+
+        $percent = $this->root ? $profile->getDuration() / $this->root * 100 : 0;
+
+        if ($profile->getDuration() * 1000 < 1) {
+            $str = $start."\n";
+        } else {
+            $str = sprintf("%s %s\n", $start, $this->formatTime($profile, $percent));
+        }
+
+        $nCount = \count($profile->getProfiles());
+        foreach ($profile as $i => $p) {
+            $str .= $this->dumpProfile($p, $prefix, $i + 1 !== $nCount);
+        }
+
+        return $str;
     }
 }
+
+class_alias('Twig\Profiler\Dumper\BaseDumper', 'Twig_Profiler_Dumper_Base');
diff --git a/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php b/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php
index afab9394..f3334290 100644
--- a/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php
+++ b/vendor/twig/twig/src/Profiler/Dumper/BlackfireDumper.php
@@ -1,11 +1,74 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Profiler\Dumper;
 
-class_exists('Twig_Profiler_Dumper_Blackfire');
+use Twig\Profiler\Profile;
 
-if (\false) {
-    class BlackfireDumper extends \Twig_Profiler_Dumper_Blackfire
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class BlackfireDumper
+{
+    public function dump(Profile $profile)
     {
+        $data = [];
+        $this->dumpProfile('main()', $profile, $data);
+        $this->dumpChildren('main()', $profile, $data);
+
+        $start = sprintf('%f', microtime(true));
+        $str = <<<EOF
+file-format: BlackfireProbe
+cost-dimensions: wt mu pmu
+request-start: {$start}
+
+
+EOF;
+
+        foreach ($data as $name => $values) {
+            $str .= "{$name}//{$values['ct']} {$values['wt']} {$values['mu']} {$values['pmu']}\n";
+        }
+
+        return $str;
+    }
+
+    private function dumpChildren(string $parent, Profile $profile, &$data)
+    {
+        foreach ($profile as $p) {
+            if ($p->isTemplate()) {
+                $name = $p->getTemplate();
+            } else {
+                $name = sprintf('%s::%s(%s)', $p->getTemplate(), $p->getType(), $p->getName());
+            }
+            $this->dumpProfile(sprintf('%s==>%s', $parent, $name), $p, $data);
+            $this->dumpChildren($name, $p, $data);
+        }
+    }
+
+    private function dumpProfile(string $edge, Profile $profile, &$data)
+    {
+        if (isset($data[$edge])) {
+            ++$data[$edge]['ct'];
+            $data[$edge]['wt'] += floor($profile->getDuration() * 1000000);
+            $data[$edge]['mu'] += $profile->getMemoryUsage();
+            $data[$edge]['pmu'] += $profile->getPeakMemoryUsage();
+        } else {
+            $data[$edge] = [
+                'ct' => 1,
+                'wt' => floor($profile->getDuration() * 1000000),
+                'mu' => $profile->getMemoryUsage(),
+                'pmu' => $profile->getPeakMemoryUsage(),
+            ];
+        }
     }
 }
+
+class_alias('Twig\Profiler\Dumper\BlackfireDumper', 'Twig_Profiler_Dumper_Blackfire');
diff --git a/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php b/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php
index 51654d2d..5be5abeb 100644
--- a/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php
+++ b/vendor/twig/twig/src/Profiler/Dumper/HtmlDumper.php
@@ -1,11 +1,49 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Profiler\Dumper;
 
-class_exists('Twig_Profiler_Dumper_Html');
+use Twig\Profiler\Profile;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class HtmlDumper extends BaseDumper
+{
+    private static $colors = [
+        'block' => '#dfd',
+        'macro' => '#ddf',
+        'template' => '#ffd',
+        'big' => '#d44',
+    ];
+
+    public function dump(Profile $profile)
+    {
+        return '<pre>'.parent::dump($profile).'</pre>';
+    }
+
+    protected function formatTemplate(Profile $profile, $prefix)
+    {
+        return sprintf('%sâ?? <span style="background-color: %s">%s</span>', $prefix, self::$colors['template'], $profile->getTemplate());
+    }
+
+    protected function formatNonTemplate(Profile $profile, $prefix)
+    {
+        return sprintf('%sâ?? %s::%s(<span style="background-color: %s">%s</span>)', $prefix, $profile->getTemplate(), $profile->getType(), isset(self::$colors[$profile->getType()]) ? self::$colors[$profile->getType()] : 'auto', $profile->getName());
+    }
 
-if (\false) {
-    class HtmlDumper extends \Twig_Profiler_Dumper_Html
+    protected function formatTime(Profile $profile, $percent)
     {
+        return sprintf('<span style="color: %s">%.2fms/%.0f%%</span>', $percent > 20 ? self::$colors['big'] : 'auto', $profile->getDuration() * 1000, $percent);
     }
 }
+
+class_alias('Twig\Profiler\Dumper\HtmlDumper', 'Twig_Profiler_Dumper_Html');
diff --git a/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php b/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php
index a9ec4efa..395ef9d3 100644
--- a/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php
+++ b/vendor/twig/twig/src/Profiler/Dumper/TextDumper.php
@@ -1,11 +1,37 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Profiler\Dumper;
 
-class_exists('Twig_Profiler_Dumper_Text');
+use Twig\Profiler\Profile;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class TextDumper extends BaseDumper
+{
+    protected function formatTemplate(Profile $profile, $prefix)
+    {
+        return sprintf('%sâ?? %s', $prefix, $profile->getTemplate());
+    }
+
+    protected function formatNonTemplate(Profile $profile, $prefix)
+    {
+        return sprintf('%sâ?? %s::%s(%s)', $prefix, $profile->getTemplate(), $profile->getType(), $profile->getName());
+    }
 
-if (\false) {
-    class TextDumper extends \Twig_Profiler_Dumper_Text
+    protected function formatTime(Profile $profile, $percent)
     {
+        return sprintf('%.2fms/%.0f%%', $profile->getDuration() * 1000, $percent);
     }
 }
+
+class_alias('Twig\Profiler\Dumper\TextDumper', 'Twig_Profiler_Dumper_Text');
diff --git a/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php b/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php
index 3b9786b2..91de5ffc 100644
--- a/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php
+++ b/vendor/twig/twig/src/Profiler/Node/EnterProfileNode.php
@@ -1,11 +1,44 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Profiler\Node;
 
-class_exists('Twig_Profiler_Node_EnterProfile');
+use Twig\Compiler;
+use Twig\Node\Node;
 
-if (\false) {
-    class EnterProfileNode extends \Twig_Profiler_Node_EnterProfile
+/**
+ * Represents a profile enter node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class EnterProfileNode extends Node
+{
+    public function __construct(string $extensionName, string $type, string $name, string $varName)
     {
+        parent::__construct([], ['extension_name' => $extensionName, 'name' => $name, 'type' => $type, 'var_name' => $varName]);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->write(sprintf('$%s = $this->extensions[', $this->getAttribute('var_name')))
+            ->repr($this->getAttribute('extension_name'))
+            ->raw("];\n")
+            ->write(sprintf('$%s->enter($%s = new \Twig\Profiler\Profile($this->getTemplateName(), ', $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof'))
+            ->repr($this->getAttribute('type'))
+            ->raw(', ')
+            ->repr($this->getAttribute('name'))
+            ->raw("));\n\n")
+        ;
     }
 }
+
+class_alias('Twig\Profiler\Node\EnterProfileNode', 'Twig_Profiler_Node_EnterProfile');
diff --git a/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php b/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php
index c4024f3e..7fbf4354 100644
--- a/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php
+++ b/vendor/twig/twig/src/Profiler/Node/LeaveProfileNode.php
@@ -1,11 +1,38 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Profiler\Node;
 
-class_exists('Twig_Profiler_Node_LeaveProfile');
+use Twig\Compiler;
+use Twig\Node\Node;
 
-if (\false) {
-    class LeaveProfileNode extends \Twig_Profiler_Node_LeaveProfile
+/**
+ * Represents a profile leave node.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class LeaveProfileNode extends Node
+{
+    public function __construct(string $varName)
     {
+        parent::__construct([], ['var_name' => $varName]);
+    }
+
+    public function compile(Compiler $compiler)
+    {
+        $compiler
+            ->write("\n")
+            ->write(sprintf("\$%s->leave(\$%s);\n\n", $this->getAttribute('var_name'), $this->getAttribute('var_name').'_prof'))
+        ;
     }
 }
+
+class_alias('Twig\Profiler\Node\LeaveProfileNode', 'Twig_Profiler_Node_LeaveProfile');
diff --git a/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php b/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php
index 0e401a73..f19f6b78 100644
--- a/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php
+++ b/vendor/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php
@@ -1,11 +1,78 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Profiler\NodeVisitor;
 
-class_exists('Twig_Profiler_NodeVisitor_Profiler');
+use Twig\Environment;
+use Twig\Node\BlockNode;
+use Twig\Node\BodyNode;
+use Twig\Node\MacroNode;
+use Twig\Node\ModuleNode;
+use Twig\Node\Node;
+use Twig\NodeVisitor\AbstractNodeVisitor;
+use Twig\Profiler\Node\EnterProfileNode;
+use Twig\Profiler\Node\LeaveProfileNode;
+use Twig\Profiler\Profile;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class ProfilerNodeVisitor extends AbstractNodeVisitor
+{
+    private $extensionName;
+
+    public function __construct(string $extensionName)
+    {
+        $this->extensionName = $extensionName;
+    }
+
+    protected function doEnterNode(Node $node, Environment $env)
+    {
+        return $node;
+    }
+
+    protected function doLeaveNode(Node $node, Environment $env)
+    {
+        if ($node instanceof ModuleNode) {
+            $varName = $this->getVarName();
+            $node->setNode('display_start', new Node([new EnterProfileNode($this->extensionName, Profile::TEMPLATE, $node->getTemplateName(), $varName), $node->getNode('display_start')]));
+            $node->setNode('display_end', new Node([new LeaveProfileNode($varName), $node->getNode('display_end')]));
+        } elseif ($node instanceof BlockNode) {
+            $varName = $this->getVarName();
+            $node->setNode('body', new BodyNode([
+                new EnterProfileNode($this->extensionName, Profile::BLOCK, $node->getAttribute('name'), $varName),
+                $node->getNode('body'),
+                new LeaveProfileNode($varName),
+            ]));
+        } elseif ($node instanceof MacroNode) {
+            $varName = $this->getVarName();
+            $node->setNode('body', new BodyNode([
+                new EnterProfileNode($this->extensionName, Profile::MACRO, $node->getAttribute('name'), $varName),
+                $node->getNode('body'),
+                new LeaveProfileNode($varName),
+            ]));
+        }
+
+        return $node;
+    }
+
+    private function getVarName(): string
+    {
+        return sprintf('__internal_%s', hash('sha256', $this->extensionName));
+    }
 
-if (\false) {
-    class ProfilerNodeVisitor extends \Twig_Profiler_NodeVisitor_Profiler
+    public function getPriority()
     {
+        return 0;
     }
 }
+
+class_alias('Twig\Profiler\NodeVisitor\ProfilerNodeVisitor', 'Twig_Profiler_NodeVisitor_Profiler');
diff --git a/vendor/twig/twig/src/Profiler/Profile.php b/vendor/twig/twig/src/Profiler/Profile.php
index b18a7f4c..e9726d6d 100644
--- a/vendor/twig/twig/src/Profiler/Profile.php
+++ b/vendor/twig/twig/src/Profiler/Profile.php
@@ -1,11 +1,192 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Profiler;
 
-class_exists('Twig_Profiler_Profile');
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @final since Twig 2.4.0
+ */
+class Profile implements \IteratorAggregate, \Serializable
+{
+    const ROOT = 'ROOT';
+    const BLOCK = 'block';
+    const TEMPLATE = 'template';
+    const MACRO = 'macro';
+
+    private $template;
+    private $name;
+    private $type;
+    private $starts = [];
+    private $ends = [];
+    private $profiles = [];
+
+    public function __construct(string $template = 'main', string $type = self::ROOT, string $name = 'main')
+    {
+        if (__CLASS__ !== \get_class($this)) {
+            @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED);
+        }
+
+        $this->template = $template;
+        $this->type = $type;
+        $this->name = 0 === strpos($name, '__internal_') ? 'INTERNAL' : $name;
+        $this->enter();
+    }
+
+    public function getTemplate()
+    {
+        return $this->template;
+    }
+
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function isRoot()
+    {
+        return self::ROOT === $this->type;
+    }
+
+    public function isTemplate()
+    {
+        return self::TEMPLATE === $this->type;
+    }
+
+    public function isBlock()
+    {
+        return self::BLOCK === $this->type;
+    }
+
+    public function isMacro()
+    {
+        return self::MACRO === $this->type;
+    }
+
+    public function getProfiles()
+    {
+        return $this->profiles;
+    }
+
+    public function addProfile(self $profile)
+    {
+        $this->profiles[] = $profile;
+    }
+
+    /**
+     * Returns the duration in microseconds.
+     *
+     * @return float
+     */
+    public function getDuration()
+    {
+        if ($this->isRoot() && $this->profiles) {
+            // for the root node with children, duration is the sum of all child durations
+            $duration = 0;
+            foreach ($this->profiles as $profile) {
+                $duration += $profile->getDuration();
+            }
+
+            return $duration;
+        }
+
+        return isset($this->ends['wt']) && isset($this->starts['wt']) ? $this->ends['wt'] - $this->starts['wt'] : 0;
+    }
+
+    /**
+     * Returns the memory usage in bytes.
+     *
+     * @return int
+     */
+    public function getMemoryUsage()
+    {
+        return isset($this->ends['mu']) && isset($this->starts['mu']) ? $this->ends['mu'] - $this->starts['mu'] : 0;
+    }
+
+    /**
+     * Returns the peak memory usage in bytes.
+     *
+     * @return int
+     */
+    public function getPeakMemoryUsage()
+    {
+        return isset($this->ends['pmu']) && isset($this->starts['pmu']) ? $this->ends['pmu'] - $this->starts['pmu'] : 0;
+    }
+
+    /**
+     * Starts the profiling.
+     */
+    public function enter()
+    {
+        $this->starts = [
+            'wt' => microtime(true),
+            'mu' => memory_get_usage(),
+            'pmu' => memory_get_peak_usage(),
+        ];
+    }
+
+    /**
+     * Stops the profiling.
+     */
+    public function leave()
+    {
+        $this->ends = [
+            'wt' => microtime(true),
+            'mu' => memory_get_usage(),
+            'pmu' => memory_get_peak_usage(),
+        ];
+    }
 
-if (\false) {
-    class Profile extends \Twig_Profiler_Profile
+    public function reset()
     {
+        $this->starts = $this->ends = $this->profiles = [];
+        $this->enter();
+    }
+
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->profiles);
+    }
+
+    public function serialize()
+    {
+        return serialize($this->__serialize());
+    }
+
+    public function unserialize($data)
+    {
+        $this->__unserialize(unserialize($data));
+    }
+
+    /**
+     * @internal
+     */
+    public function __serialize()
+    {
+        return [$this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles];
+    }
+
+    /**
+     * @internal
+     */
+    public function __unserialize(array $data)
+    {
+        list($this->template, $this->name, $this->type, $this->starts, $this->ends, $this->profiles) = $data;
     }
 }
+
+class_alias('Twig\Profiler\Profile', 'Twig_Profiler_Profile');
diff --git a/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php b/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php
index 35ff7afb..04a6602f 100644
--- a/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php
+++ b/vendor/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php
@@ -1,11 +1,41 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\RuntimeLoader;
 
-class_exists('Twig_ContainerRuntimeLoader');
+use Psr\Container\ContainerInterface;
+
+/**
+ * Lazily loads Twig runtime implementations from a PSR-11 container.
+ *
+ * Note that the runtime services MUST use their class names as identifiers.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ * @author Robin Chalas <robin.chalas@xxxxxxxxx>
+ */
+class ContainerRuntimeLoader implements RuntimeLoaderInterface
+{
+    private $container;
+
+    public function __construct(ContainerInterface $container)
+    {
+        $this->container = $container;
+    }
 
-if (\false) {
-    class ContainerRuntimeLoader extends \Twig_ContainerRuntimeLoader
+    public function load($class)
     {
+        if ($this->container->has($class)) {
+            return $this->container->get($class);
+        }
     }
 }
+
+class_alias('Twig\RuntimeLoader\ContainerRuntimeLoader', 'Twig_ContainerRuntimeLoader');
diff --git a/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php b/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php
index bb988076..e4676f7c 100644
--- a/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php
+++ b/vendor/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php
@@ -1,11 +1,41 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\RuntimeLoader;
 
-class_exists('Twig_FactoryRuntimeLoader');
+/**
+ * Lazy loads the runtime implementations for a Twig element.
+ *
+ * @author Robin Chalas <robin.chalas@xxxxxxxxx>
+ */
+class FactoryRuntimeLoader implements RuntimeLoaderInterface
+{
+    private $map;
+
+    /**
+     * @param array $map An array where keys are class names and values factory callables
+     */
+    public function __construct(array $map = [])
+    {
+        $this->map = $map;
+    }
 
-if (\false) {
-    class FactoryRuntimeLoader extends \Twig_FactoryRuntimeLoader
+    public function load($class)
     {
+        if (isset($this->map[$class])) {
+            $runtimeFactory = $this->map[$class];
+
+            return $runtimeFactory();
+        }
     }
 }
+
+class_alias('Twig\RuntimeLoader\FactoryRuntimeLoader', 'Twig_FactoryRuntimeLoader');
diff --git a/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php b/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php
index 4721a447..4eb5ad85 100644
--- a/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php
+++ b/vendor/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php
@@ -1,11 +1,31 @@
 <?php
 
-namespace Twig\RuntimeLoader;
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
 
-class_exists('Twig_RuntimeLoaderInterface');
+namespace Twig\RuntimeLoader;
 
-if (\false) {
-    interface RuntimeLoaderInterface extends \Twig_RuntimeLoaderInterface
-    {
-    }
+/**
+ * Creates runtime implementations for Twig elements (filters/functions/tests).
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+interface RuntimeLoaderInterface
+{
+    /**
+     * Creates the runtime implementation of a Twig element (filter/function/test).
+     *
+     * @param string $class A runtime class
+     *
+     * @return object|null The runtime instance or null if the loader does not know how to create the runtime for this class
+     */
+    public function load($class);
 }
+
+class_alias('Twig\RuntimeLoader\RuntimeLoaderInterface', 'Twig_RuntimeLoaderInterface');
diff --git a/vendor/twig/twig/src/Sandbox/SecurityError.php b/vendor/twig/twig/src/Sandbox/SecurityError.php
index e1cd3f06..5f96d46b 100644
--- a/vendor/twig/twig/src/Sandbox/SecurityError.php
+++ b/vendor/twig/twig/src/Sandbox/SecurityError.php
@@ -1,11 +1,25 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Sandbox;
 
-class_exists('Twig_Sandbox_SecurityError');
+use Twig\Error\Error;
 
-if (\false) {
-    class SecurityError extends \Twig_Sandbox_SecurityError
-    {
-    }
+/**
+ * Exception thrown when a security error occurs at runtime.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class SecurityError extends Error
+{
 }
+
+class_alias('Twig\Sandbox\SecurityError', 'Twig_Sandbox_SecurityError');
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php
index b56d2c9b..767ec5b3 100644
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php
+++ b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php
@@ -1,11 +1,46 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Sandbox;
 
-class_exists('Twig_Sandbox_SecurityNotAllowedFilterError');
+/**
+ * Exception thrown when a not allowed filter is used in a template.
+ *
+ * @author Martin HasoÅ? <martin.hason@xxxxxxxxx>
+ *
+ * @final
+ */
+class SecurityNotAllowedFilterError extends SecurityError
+{
+    private $filterName;
 
-if (\false) {
-    class SecurityNotAllowedFilterError extends \Twig_Sandbox_SecurityNotAllowedFilterError
+    public function __construct(string $message, string $functionName, int $lineno = -1, string $filename = null, \Exception $previous = null)
     {
+        if (-1 !== $lineno) {
+            @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $filename) {
+            @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $previous) {
+            @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        parent::__construct($message, $lineno, $filename, $previous);
+        $this->filterName = $functionName;
+    }
+
+    public function getFilterName()
+    {
+        return $this->filterName;
     }
 }
+
+class_alias('Twig\Sandbox\SecurityNotAllowedFilterError', 'Twig_Sandbox_SecurityNotAllowedFilterError');
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php
index 1a91764f..5a301399 100644
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php
+++ b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php
@@ -1,11 +1,46 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Sandbox;
 
-class_exists('Twig_Sandbox_SecurityNotAllowedFunctionError');
+/**
+ * Exception thrown when a not allowed function is used in a template.
+ *
+ * @author Martin HasoÅ? <martin.hason@xxxxxxxxx>
+ *
+ * @final
+ */
+class SecurityNotAllowedFunctionError extends SecurityError
+{
+    private $functionName;
 
-if (\false) {
-    class SecurityNotAllowedFunctionError extends \Twig_Sandbox_SecurityNotAllowedFunctionError
+    public function __construct(string $message, string $functionName, int $lineno = -1, string $filename = null, \Exception $previous = null)
     {
+        if (-1 !== $lineno) {
+            @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $filename) {
+            @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $previous) {
+            @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        parent::__construct($message, $lineno, $filename, $previous);
+        $this->functionName = $functionName;
+    }
+
+    public function getFunctionName()
+    {
+        return $this->functionName;
     }
 }
+
+class_alias('Twig\Sandbox\SecurityNotAllowedFunctionError', 'Twig_Sandbox_SecurityNotAllowedFunctionError');
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php
index 9f81c69e..c8103ea0 100644
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php
+++ b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php
@@ -1,11 +1,53 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Sandbox;
 
-class_exists('Twig_Sandbox_SecurityNotAllowedMethodError');
+/**
+ * Exception thrown when a not allowed class method is used in a template.
+ *
+ * @author Kit Burton-Senior <mail@xxxxxxxxx>
+ *
+ * @final
+ */
+class SecurityNotAllowedMethodError extends SecurityError
+{
+    private $className;
+    private $methodName;
+
+    public function __construct(string $message, string $className, string $methodName, int $lineno = -1, string $filename = null, \Exception $previous = null)
+    {
+        if (-1 !== $lineno) {
+            @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $filename) {
+            @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $previous) {
+            @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        parent::__construct($message, $lineno, $filename, $previous);
+        $this->className = $className;
+        $this->methodName = $methodName;
+    }
+
+    public function getClassName()
+    {
+        return $this->className;
+    }
 
-if (\false) {
-    class SecurityNotAllowedMethodError extends \Twig_Sandbox_SecurityNotAllowedMethodError
+    public function getMethodName()
     {
+        return $this->methodName;
     }
 }
+
+class_alias('Twig\Sandbox\SecurityNotAllowedMethodError', 'Twig_Sandbox_SecurityNotAllowedMethodError');
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php
index 5a5d4307..d148f08d 100644
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php
+++ b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php
@@ -1,11 +1,53 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Sandbox;
 
-class_exists('Twig_Sandbox_SecurityNotAllowedPropertyError');
+/**
+ * Exception thrown when a not allowed class property is used in a template.
+ *
+ * @author Kit Burton-Senior <mail@xxxxxxxxx>
+ *
+ * @final
+ */
+class SecurityNotAllowedPropertyError extends SecurityError
+{
+    private $className;
+    private $propertyName;
+
+    public function __construct(string $message, string $className, string $propertyName, int $lineno = -1, string $filename = null, \Exception $previous = null)
+    {
+        if (-1 !== $lineno) {
+            @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $filename) {
+            @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $previous) {
+            @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        parent::__construct($message, $lineno, $filename, $previous);
+        $this->className = $className;
+        $this->propertyName = $propertyName;
+    }
+
+    public function getClassName()
+    {
+        return $this->className;
+    }
 
-if (\false) {
-    class SecurityNotAllowedPropertyError extends \Twig_Sandbox_SecurityNotAllowedPropertyError
+    public function getPropertyName()
     {
+        return $this->propertyName;
     }
 }
+
+class_alias('Twig\Sandbox\SecurityNotAllowedPropertyError', 'Twig_Sandbox_SecurityNotAllowedPropertyError');
diff --git a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php
index 0463f2a3..25f63611 100644
--- a/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php
+++ b/vendor/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php
@@ -1,11 +1,46 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Sandbox;
 
-class_exists('Twig_Sandbox_SecurityNotAllowedTagError');
+/**
+ * Exception thrown when a not allowed tag is used in a template.
+ *
+ * @author Martin HasoÅ? <martin.hason@xxxxxxxxx>
+ *
+ * @final
+ */
+class SecurityNotAllowedTagError extends SecurityError
+{
+    private $tagName;
 
-if (\false) {
-    class SecurityNotAllowedTagError extends \Twig_Sandbox_SecurityNotAllowedTagError
+    public function __construct(string $message, string $tagName, int $lineno = -1, string $filename = null, \Exception $previous = null)
     {
+        if (-1 !== $lineno) {
+            @trigger_error(sprintf('Passing $lineno as a 3th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $filename) {
+            @trigger_error(sprintf('Passing $filename as a 4th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        if (null !== $previous) {
+            @trigger_error(sprintf('Passing $previous as a 5th argument of the %s constructor is deprecated since Twig 2.8.1.', __CLASS__), E_USER_DEPRECATED);
+        }
+        parent::__construct($message, $lineno, $filename, $previous);
+        $this->tagName = $tagName;
+    }
+
+    public function getTagName()
+    {
+        return $this->tagName;
     }
 }
+
+class_alias('Twig\Sandbox\SecurityNotAllowedTagError', 'Twig_Sandbox_SecurityNotAllowedTagError');
diff --git a/vendor/twig/twig/src/Sandbox/SecurityPolicy.php b/vendor/twig/twig/src/Sandbox/SecurityPolicy.php
index b45b2852..01fecf80 100644
--- a/vendor/twig/twig/src/Sandbox/SecurityPolicy.php
+++ b/vendor/twig/twig/src/Sandbox/SecurityPolicy.php
@@ -1,11 +1,128 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Sandbox;
 
-class_exists('Twig_Sandbox_SecurityPolicy');
+use Twig\Markup;
+use Twig\Template;
+
+/**
+ * Represents a security policy which need to be enforced when sandbox mode is enabled.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class SecurityPolicy implements SecurityPolicyInterface
+{
+    private $allowedTags;
+    private $allowedFilters;
+    private $allowedMethods;
+    private $allowedProperties;
+    private $allowedFunctions;
+
+    public function __construct(array $allowedTags = [], array $allowedFilters = [], array $allowedMethods = [], array $allowedProperties = [], array $allowedFunctions = [])
+    {
+        $this->allowedTags = $allowedTags;
+        $this->allowedFilters = $allowedFilters;
+        $this->setAllowedMethods($allowedMethods);
+        $this->allowedProperties = $allowedProperties;
+        $this->allowedFunctions = $allowedFunctions;
+    }
+
+    public function setAllowedTags(array $tags)
+    {
+        $this->allowedTags = $tags;
+    }
+
+    public function setAllowedFilters(array $filters)
+    {
+        $this->allowedFilters = $filters;
+    }
+
+    public function setAllowedMethods(array $methods)
+    {
+        $this->allowedMethods = [];
+        foreach ($methods as $class => $m) {
+            $this->allowedMethods[$class] = array_map('strtolower', \is_array($m) ? $m : [$m]);
+        }
+    }
+
+    public function setAllowedProperties(array $properties)
+    {
+        $this->allowedProperties = $properties;
+    }
+
+    public function setAllowedFunctions(array $functions)
+    {
+        $this->allowedFunctions = $functions;
+    }
 
-if (\false) {
-    class SecurityPolicy extends \Twig_Sandbox_SecurityPolicy
+    public function checkSecurity($tags, $filters, $functions)
     {
+        foreach ($tags as $tag) {
+            if (!\in_array($tag, $this->allowedTags)) {
+                throw new SecurityNotAllowedTagError(sprintf('Tag "%s" is not allowed.', $tag), $tag);
+            }
+        }
+
+        foreach ($filters as $filter) {
+            if (!\in_array($filter, $this->allowedFilters)) {
+                throw new SecurityNotAllowedFilterError(sprintf('Filter "%s" is not allowed.', $filter), $filter);
+            }
+        }
+
+        foreach ($functions as $function) {
+            if (!\in_array($function, $this->allowedFunctions)) {
+                throw new SecurityNotAllowedFunctionError(sprintf('Function "%s" is not allowed.', $function), $function);
+            }
+        }
+    }
+
+    public function checkMethodAllowed($obj, $method)
+    {
+        if ($obj instanceof Template || $obj instanceof Markup) {
+            return;
+        }
+
+        $allowed = false;
+        $method = strtolower($method);
+        foreach ($this->allowedMethods as $class => $methods) {
+            if ($obj instanceof $class) {
+                $allowed = \in_array($method, $methods);
+
+                break;
+            }
+        }
+
+        if (!$allowed) {
+            $class = \get_class($obj);
+            throw new SecurityNotAllowedMethodError(sprintf('Calling "%s" method on a "%s" object is not allowed.', $method, $class), $class, $method);
+        }
+    }
+
+    public function checkPropertyAllowed($obj, $property)
+    {
+        $allowed = false;
+        foreach ($this->allowedProperties as $class => $properties) {
+            if ($obj instanceof $class) {
+                $allowed = \in_array($property, \is_array($properties) ? $properties : [$properties]);
+
+                break;
+            }
+        }
+
+        if (!$allowed) {
+            $class = \get_class($obj);
+            throw new SecurityNotAllowedPropertyError(sprintf('Calling "%s" property on a "%s" object is not allowed.', $property, $class), $class, $property);
+        }
     }
 }
+
+class_alias('Twig\Sandbox\SecurityPolicy', 'Twig_Sandbox_SecurityPolicy');
diff --git a/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php b/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php
index 78a84e38..8b2ab4a9 100644
--- a/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php
+++ b/vendor/twig/twig/src/Sandbox/SecurityPolicyInterface.php
@@ -1,11 +1,37 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Sandbox;
 
-class_exists('Twig_Sandbox_SecurityPolicyInterface');
+/**
+ * Interface that all security policy classes must implements.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+interface SecurityPolicyInterface
+{
+    /**
+     * @throws SecurityError
+     */
+    public function checkSecurity($tags, $filters, $functions);
+
+    /**
+     * @throws SecurityNotAllowedMethodError
+     */
+    public function checkMethodAllowed($obj, $method);
 
-if (\false) {
-    interface SecurityPolicyInterface extends \Twig_Sandbox_SecurityPolicyInterface
-    {
-    }
+    /**
+     * @throws SecurityNotAllowedPropertyError
+     */
+    public function checkPropertyAllowed($obj, $method);
 }
+
+class_alias('Twig\Sandbox\SecurityPolicyInterface', 'Twig_Sandbox_SecurityPolicyInterface');
diff --git a/vendor/twig/twig/src/Source.php b/vendor/twig/twig/src/Source.php
index b4978136..a7287788 100644
--- a/vendor/twig/twig/src/Source.php
+++ b/vendor/twig/twig/src/Source.php
@@ -1,11 +1,53 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_Source');
+/**
+ * Holds information about a non-compiled Twig template.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class Source
+{
+    private $code;
+    private $name;
+    private $path;
+
+    /**
+     * @param string $code The template source code
+     * @param string $name The template logical name
+     * @param string $path The filesystem path of the template if any
+     */
+    public function __construct(string $code, string $name, string $path = '')
+    {
+        $this->code = $code;
+        $this->name = $name;
+        $this->path = $path;
+    }
 
-if (\false) {
-    class Source extends \Twig_Source
+    public function getCode(): string
     {
+        return $this->code;
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    public function getPath(): string
+    {
+        return $this->path;
     }
 }
+
+class_alias('Twig\Source', 'Twig_Source');
diff --git a/vendor/twig/twig/src/Template.php b/vendor/twig/twig/src/Template.php
index 13677f60..0f09e19d 100644
--- a/vendor/twig/twig/src/Template.php
+++ b/vendor/twig/twig/src/Template.php
@@ -1,11 +1,437 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_Template');
+use Twig\Error\Error;
+use Twig\Error\LoaderError;
+use Twig\Error\RuntimeError;
+
+/**
+ * Default base class for compiled templates.
+ *
+ * This class is an implementation detail of how template compilation currently
+ * works, which might change. It should never be used directly. Use $twig->load()
+ * instead, which returns an instance of \Twig\TemplateWrapper.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @internal
+ */
+abstract class Template
+{
+    const ANY_CALL = 'any';
+    const ARRAY_CALL = 'array';
+    const METHOD_CALL = 'method';
+
+    protected $parent;
+    protected $parents = [];
+    protected $env;
+    protected $blocks = [];
+    protected $traits = [];
+    protected $extensions = [];
+    protected $sandbox;
+
+    public function __construct(Environment $env)
+    {
+        $this->env = $env;
+        $this->extensions = $env->getExtensions();
+    }
+
+    /**
+     * @internal this method will be removed in 3.0 and is only used internally to provide an upgrade path from 1.x to 2.0
+     */
+    public function __toString()
+    {
+        return $this->getTemplateName();
+    }
+
+    /**
+     * Returns the template name.
+     *
+     * @return string The template name
+     */
+    abstract public function getTemplateName();
+
+    /**
+     * Returns debug information about the template.
+     *
+     * @return array Debug information
+     */
+    abstract public function getDebugInfo();
+
+    /**
+     * Returns information about the original template source code.
+     *
+     * @return Source
+     */
+    public function getSourceContext()
+    {
+        return new Source('', $this->getTemplateName());
+    }
+
+    /**
+     * Returns the parent template.
+     *
+     * This method is for internal use only and should never be called
+     * directly.
+     *
+     * @param array $context
+     *
+     * @return Template|TemplateWrapper|false The parent template or false if there is no parent
+     */
+    public function getParent(array $context)
+    {
+        if (null !== $this->parent) {
+            return $this->parent;
+        }
+
+        try {
+            $parent = $this->doGetParent($context);
+
+            if (false === $parent) {
+                return false;
+            }
+
+            if ($parent instanceof self || $parent instanceof TemplateWrapper) {
+                return $this->parents[$parent->getSourceContext()->getName()] = $parent;
+            }
+
+            if (!isset($this->parents[$parent])) {
+                $this->parents[$parent] = $this->loadTemplate($parent);
+            }
+        } catch (LoaderError $e) {
+            $e->setSourceContext(null);
+            $e->guess();
+
+            throw $e;
+        }
+
+        return $this->parents[$parent];
+    }
+
+    protected function doGetParent(array $context)
+    {
+        return false;
+    }
+
+    public function isTraitable()
+    {
+        return true;
+    }
+
+    /**
+     * Displays a parent block.
+     *
+     * This method is for internal use only and should never be called
+     * directly.
+     *
+     * @param string $name    The block name to display from the parent
+     * @param array  $context The context
+     * @param array  $blocks  The current set of blocks
+     */
+    public function displayParentBlock($name, array $context, array $blocks = [])
+    {
+        if (isset($this->traits[$name])) {
+            $this->traits[$name][0]->displayBlock($name, $context, $blocks, false);
+        } elseif (false !== $parent = $this->getParent($context)) {
+            $parent->displayBlock($name, $context, $blocks, false);
+        } else {
+            throw new RuntimeError(sprintf('The template has no parent and no traits defining the "%s" block.', $name), -1, $this->getSourceContext());
+        }
+    }
+
+    /**
+     * Displays a block.
+     *
+     * This method is for internal use only and should never be called
+     * directly.
+     *
+     * @param string $name      The block name to display
+     * @param array  $context   The context
+     * @param array  $blocks    The current set of blocks
+     * @param bool   $useBlocks Whether to use the current set of blocks
+     */
+    public function displayBlock($name, array $context, array $blocks = [], $useBlocks = true, self $templateContext = null)
+    {
+        if ($useBlocks && isset($blocks[$name])) {
+            $template = $blocks[$name][0];
+            $block = $blocks[$name][1];
+        } elseif (isset($this->blocks[$name])) {
+            $template = $this->blocks[$name][0];
+            $block = $this->blocks[$name][1];
+        } else {
+            $template = null;
+            $block = null;
+        }
+
+        // avoid RCEs when sandbox is enabled
+        if (null !== $template && !$template instanceof self) {
+            throw new \LogicException('A block must be a method on a \Twig\Template instance.');
+        }
+
+        if (null !== $template) {
+            try {
+                $template->$block($context, $blocks);
+            } catch (Error $e) {
+                if (!$e->getSourceContext()) {
+                    $e->setSourceContext($template->getSourceContext());
+                }
+
+                // this is mostly useful for \Twig\Error\LoaderError exceptions
+                // see \Twig\Error\LoaderError
+                if (-1 === $e->getTemplateLine()) {
+                    $e->guess();
+                }
+
+                throw $e;
+            } catch (\Exception $e) {
+                $e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $template->getSourceContext(), $e);
+                $e->guess();
+
+                throw $e;
+            }
+        } elseif (false !== $parent = $this->getParent($context)) {
+            $parent->displayBlock($name, $context, array_merge($this->blocks, $blocks), false, $templateContext ?? $this);
+        } elseif (isset($blocks[$name])) {
+            throw new RuntimeError(sprintf('Block "%s" should not call parent() in "%s" as the block does not exist in the parent template "%s".', $name, $blocks[$name][0]->getTemplateName(), $this->getTemplateName()), -1, $blocks[$name][0]->getSourceContext());
+        } else {
+            throw new RuntimeError(sprintf('Block "%s" on template "%s" does not exist.', $name, $this->getTemplateName()), -1, ($templateContext ?? $this)->getSourceContext());
+        }
+    }
+
+    /**
+     * Renders a parent block.
+     *
+     * This method is for internal use only and should never be called
+     * directly.
+     *
+     * @param string $name    The block name to render from the parent
+     * @param array  $context The context
+     * @param array  $blocks  The current set of blocks
+     *
+     * @return string The rendered block
+     */
+    public function renderParentBlock($name, array $context, array $blocks = [])
+    {
+        if ($this->env->isDebug()) {
+            ob_start();
+        } else {
+            ob_start(function () { return ''; });
+        }
+        $this->displayParentBlock($name, $context, $blocks);
+
+        return ob_get_clean();
+    }
+
+    /**
+     * Renders a block.
+     *
+     * This method is for internal use only and should never be called
+     * directly.
+     *
+     * @param string $name      The block name to render
+     * @param array  $context   The context
+     * @param array  $blocks    The current set of blocks
+     * @param bool   $useBlocks Whether to use the current set of blocks
+     *
+     * @return string The rendered block
+     */
+    public function renderBlock($name, array $context, array $blocks = [], $useBlocks = true)
+    {
+        if ($this->env->isDebug()) {
+            ob_start();
+        } else {
+            ob_start(function () { return ''; });
+        }
+        $this->displayBlock($name, $context, $blocks, $useBlocks);
+
+        return ob_get_clean();
+    }
+
+    /**
+     * Returns whether a block exists or not in the current context of the template.
+     *
+     * This method checks blocks defined in the current template
+     * or defined in "used" traits or defined in parent templates.
+     *
+     * @param string $name    The block name
+     * @param array  $context The context
+     * @param array  $blocks  The current set of blocks
+     *
+     * @return bool true if the block exists, false otherwise
+     */
+    public function hasBlock($name, array $context, array $blocks = [])
+    {
+        if (isset($blocks[$name])) {
+            return $blocks[$name][0] instanceof self;
+        }
+
+        if (isset($this->blocks[$name])) {
+            return true;
+        }
+
+        if (false !== $parent = $this->getParent($context)) {
+            return $parent->hasBlock($name, $context);
+        }
+
+        return false;
+    }
+
+    /**
+     * Returns all block names in the current context of the template.
+     *
+     * This method checks blocks defined in the current template
+     * or defined in "used" traits or defined in parent templates.
+     *
+     * @param array $context The context
+     * @param array $blocks  The current set of blocks
+     *
+     * @return array An array of block names
+     */
+    public function getBlockNames(array $context, array $blocks = [])
+    {
+        $names = array_merge(array_keys($blocks), array_keys($this->blocks));
+
+        if (false !== $parent = $this->getParent($context)) {
+            $names = array_merge($names, $parent->getBlockNames($context));
+        }
+
+        return array_unique($names);
+    }
+
+    /**
+     * @return Template|TemplateWrapper
+     */
+    protected function loadTemplate($template, $templateName = null, $line = null, $index = null)
+    {
+        try {
+            if (\is_array($template)) {
+                return $this->env->resolveTemplate($template);
+            }
+
+            if ($template instanceof self || $template instanceof TemplateWrapper) {
+                return $template;
+            }
+
+            if ($template === $this->getTemplateName()) {
+                $class = \get_class($this);
+                if (false !== $pos = strrpos($class, '___', -1)) {
+                    $class = substr($class, 0, $pos);
+                }
+
+                return $this->env->loadClass($class, $template, $index);
+            }
+
+            return $this->env->loadTemplate($template, $index);
+        } catch (Error $e) {
+            if (!$e->getSourceContext()) {
+                $e->setSourceContext($templateName ? new Source('', $templateName) : $this->getSourceContext());
+            }
+
+            if ($e->getTemplateLine() > 0) {
+                throw $e;
+            }
 
-if (\false) {
-    class Template extends \Twig_Template
+            if (!$line) {
+                $e->guess();
+            } else {
+                $e->setTemplateLine($line);
+            }
+
+            throw $e;
+        }
+    }
+
+    /**
+     * @internal
+     *
+     * @return Template
+     */
+    protected function unwrap()
+    {
+        return $this;
+    }
+
+    /**
+     * Returns all blocks.
+     *
+     * This method is for internal use only and should never be called
+     * directly.
+     *
+     * @return array An array of blocks
+     */
+    public function getBlocks()
+    {
+        return $this->blocks;
+    }
+
+    public function display(array $context, array $blocks = [])
+    {
+        $this->displayWithErrorHandling($this->env->mergeGlobals($context), array_merge($this->blocks, $blocks));
+    }
+
+    public function render(array $context)
     {
+        $level = ob_get_level();
+        if ($this->env->isDebug()) {
+            ob_start();
+        } else {
+            ob_start(function () { return ''; });
+        }
+        try {
+            $this->display($context);
+        } catch (\Throwable $e) {
+            while (ob_get_level() > $level) {
+                ob_end_clean();
+            }
+
+            throw $e;
+        }
+
+        return ob_get_clean();
     }
+
+    protected function displayWithErrorHandling(array $context, array $blocks = [])
+    {
+        try {
+            $this->doDisplay($context, $blocks);
+        } catch (Error $e) {
+            if (!$e->getSourceContext()) {
+                $e->setSourceContext($this->getSourceContext());
+            }
+
+            // this is mostly useful for \Twig\Error\LoaderError exceptions
+            // see \Twig\Error\LoaderError
+            if (-1 === $e->getTemplateLine()) {
+                $e->guess();
+            }
+
+            throw $e;
+        } catch (\Exception $e) {
+            $e = new RuntimeError(sprintf('An exception has been thrown during the rendering of a template ("%s").', $e->getMessage()), -1, $this->getSourceContext(), $e);
+            $e->guess();
+
+            throw $e;
+        }
+    }
+
+    /**
+     * Auto-generated method to display the template with the given context.
+     *
+     * @param array $context An array of parameters to pass to the template
+     * @param array $blocks  An array of blocks to pass to the template
+     */
+    abstract protected function doDisplay(array $context, array $blocks = []);
 }
+
+class_alias('Twig\Template', 'Twig_Template');
diff --git a/vendor/twig/twig/src/TemplateWrapper.php b/vendor/twig/twig/src/TemplateWrapper.php
index d11ad81c..8b448153 100644
--- a/vendor/twig/twig/src/TemplateWrapper.php
+++ b/vendor/twig/twig/src/TemplateWrapper.php
@@ -1,11 +1,145 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_TemplateWrapper');
+/**
+ * Exposes a template to userland.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class TemplateWrapper
+{
+    private $env;
+    private $template;
+
+    /**
+     * This method is for internal use only and should never be called
+     * directly (use Twig\Environment::load() instead).
+     *
+     * @internal
+     */
+    public function __construct(Environment $env, Template $template)
+    {
+        $this->env = $env;
+        $this->template = $template;
+    }
+
+    /**
+     * Renders the template.
+     *
+     * @param array $context An array of parameters to pass to the template
+     */
+    public function render(array $context = []): string
+    {
+        // using func_get_args() allows to not expose the blocks argument
+        // as it should only be used by internal code
+        return $this->template->render($context, \func_get_args()[1] ?? []);
+    }
+
+    /**
+     * Displays the template.
+     *
+     * @param array $context An array of parameters to pass to the template
+     */
+    public function display(array $context = [])
+    {
+        // using func_get_args() allows to not expose the blocks argument
+        // as it should only be used by internal code
+        $this->template->display($context, \func_get_args()[1] ?? []);
+    }
+
+    /**
+     * Checks if a block is defined.
+     *
+     * @param string $name    The block name
+     * @param array  $context An array of parameters to pass to the template
+     */
+    public function hasBlock(string $name, array $context = []): bool
+    {
+        return $this->template->hasBlock($name, $context);
+    }
 
-if (\false) {
-    class TemplateWrapper extends \Twig_TemplateWrapper
+    /**
+     * Returns defined block names in the template.
+     *
+     * @param array $context An array of parameters to pass to the template
+     *
+     * @return string[] An array of defined template block names
+     */
+    public function getBlockNames(array $context = []): array
     {
+        return $this->template->getBlockNames($context);
+    }
+
+    /**
+     * Renders a template block.
+     *
+     * @param string $name    The block name to render
+     * @param array  $context An array of parameters to pass to the template
+     *
+     * @return string The rendered block
+     */
+    public function renderBlock(string $name, array $context = []): string
+    {
+        $context = $this->env->mergeGlobals($context);
+        $level = ob_get_level();
+        if ($this->env->isDebug()) {
+            ob_start();
+        } else {
+            ob_start(function () { return ''; });
+        }
+        try {
+            $this->template->displayBlock($name, $context);
+        } catch (\Throwable $e) {
+            while (ob_get_level() > $level) {
+                ob_end_clean();
+            }
+
+            throw $e;
+        }
+
+        return ob_get_clean();
+    }
+
+    /**
+     * Displays a template block.
+     *
+     * @param string $name    The block name to render
+     * @param array  $context An array of parameters to pass to the template
+     */
+    public function displayBlock(string $name, array $context = [])
+    {
+        $this->template->displayBlock($name, $this->env->mergeGlobals($context));
+    }
+
+    public function getSourceContext(): Source
+    {
+        return $this->template->getSourceContext();
+    }
+
+    public function getTemplateName(): string
+    {
+        return $this->template->getTemplateName();
+    }
+
+    /**
+     * @internal
+     *
+     * @return Template
+     */
+    public function unwrap()
+    {
+        return $this->template;
     }
 }
+
+class_alias('Twig\TemplateWrapper', 'Twig_TemplateWrapper');
diff --git a/vendor/twig/twig/src/Test/IntegrationTestCase.php b/vendor/twig/twig/src/Test/IntegrationTestCase.php
index 50f90ac4..d9c32902 100644
--- a/vendor/twig/twig/src/Test/IntegrationTestCase.php
+++ b/vendor/twig/twig/src/Test/IntegrationTestCase.php
@@ -1,11 +1,267 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Test;
 
-class_exists('Twig_Test_IntegrationTestCase');
+use PHPUnit\Framework\TestCase;
+use Twig\Environment;
+use Twig\Error\Error;
+use Twig\Extension\ExtensionInterface;
+use Twig\Loader\ArrayLoader;
+use Twig\RuntimeLoader\RuntimeLoaderInterface;
+use Twig\TwigFilter;
+use Twig\TwigFunction;
+use Twig\TwigTest;
+
+/**
+ * Integration test helper.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ * @author Karma Dordrak <drak@xxxxxxxxxx>
+ */
+abstract class IntegrationTestCase extends TestCase
+{
+    /**
+     * @return string
+     */
+    abstract protected function getFixturesDir();
+
+    /**
+     * @return RuntimeLoaderInterface[]
+     */
+    protected function getRuntimeLoaders()
+    {
+        return [];
+    }
+
+    /**
+     * @return ExtensionInterface[]
+     */
+    protected function getExtensions()
+    {
+        return [];
+    }
+
+    /**
+     * @return TwigFilter[]
+     */
+    protected function getTwigFilters()
+    {
+        return [];
+    }
+
+    /**
+     * @return TwigFunction[]
+     */
+    protected function getTwigFunctions()
+    {
+        return [];
+    }
+
+    /**
+     * @return TwigTest[]
+     */
+    protected function getTwigTests()
+    {
+        return [];
+    }
+
+    /**
+     * @dataProvider getTests
+     */
+    public function testIntegration($file, $message, $condition, $templates, $exception, $outputs, $deprecation = '')
+    {
+        $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs, $deprecation);
+    }
+
+    /**
+     * @dataProvider getLegacyTests
+     * @group legacy
+     */
+    public function testLegacyIntegration($file, $message, $condition, $templates, $exception, $outputs, $deprecation = '')
+    {
+        $this->doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs, $deprecation);
+    }
+
+    public function getTests($name, $legacyTests = false)
+    {
+        $fixturesDir = realpath($this->getFixturesDir());
+        $tests = [];
+
+        foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($fixturesDir), \RecursiveIteratorIterator::LEAVES_ONLY) as $file) {
+            if (!preg_match('/\.test$/', $file)) {
+                continue;
+            }
+
+            if ($legacyTests xor false !== strpos($file->getRealpath(), '.legacy.test')) {
+                continue;
+            }
+
+            $test = file_get_contents($file->getRealpath());
+
+            if (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*(?:--DEPRECATION--\s*(.*?))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)\s*(?:--DATA--\s*(.*))?\s*--EXCEPTION--\s*(.*)/sx', $test, $match)) {
+                $message = $match[1];
+                $condition = $match[2];
+                $deprecation = $match[3];
+                $templates = self::parseTemplates($match[4]);
+                $exception = $match[6];
+                $outputs = [[null, $match[5], null, '']];
+            } elseif (preg_match('/--TEST--\s*(.*?)\s*(?:--CONDITION--\s*(.*))?\s*(?:--DEPRECATION--\s*(.*?))?\s*((?:--TEMPLATE(?:\(.*?\))?--(?:.*?))+)--DATA--.*?--EXPECT--.*/s', $test, $match)) {
+                $message = $match[1];
+                $condition = $match[2];
+                $deprecation = $match[3];
+                $templates = self::parseTemplates($match[4]);
+                $exception = false;
+                preg_match_all('/--DATA--(.*?)(?:--CONFIG--(.*?))?--EXPECT--(.*?)(?=\-\-DATA\-\-|$)/s', $test, $outputs, PREG_SET_ORDER);
+            } else {
+                throw new \InvalidArgumentException(sprintf('Test "%s" is not valid.', str_replace($fixturesDir.'/', '', $file)));
+            }
+
+            $tests[] = [str_replace($fixturesDir.'/', '', $file), $message, $condition, $templates, $exception, $outputs, $deprecation];
+        }
+
+        if ($legacyTests && empty($tests)) {
+            // add a dummy test to avoid a PHPUnit message
+            return [['not', '-', '', [], '', []]];
+        }
+
+        return $tests;
+    }
+
+    public function getLegacyTests()
+    {
+        return $this->getTests('testLegacyIntegration', true);
+    }
+
+    protected function doIntegrationTest($file, $message, $condition, $templates, $exception, $outputs, $deprecation = '')
+    {
+        if (!$outputs) {
+            $this->markTestSkipped('no tests to run');
+        }
+
+        if ($condition) {
+            eval('$ret = '.$condition.';');
+            if (!$ret) {
+                $this->markTestSkipped($condition);
+            }
+        }
+
+        $loader = new ArrayLoader($templates);
+
+        foreach ($outputs as $i => $match) {
+            $config = array_merge([
+                'cache' => false,
+                'strict_variables' => true,
+            ], $match[2] ? eval($match[2].';') : []);
+            $twig = new Environment($loader, $config);
+            $twig->addGlobal('global', 'global');
+            foreach ($this->getRuntimeLoaders() as $runtimeLoader) {
+                $twig->addRuntimeLoader($runtimeLoader);
+            }
+
+            foreach ($this->getExtensions() as $extension) {
+                $twig->addExtension($extension);
+            }
+
+            foreach ($this->getTwigFilters() as $filter) {
+                $twig->addFilter($filter);
+            }
+
+            foreach ($this->getTwigTests() as $test) {
+                $twig->addTest($test);
+            }
+
+            foreach ($this->getTwigFunctions() as $function) {
+                $twig->addFunction($function);
+            }
+
+            // avoid using the same PHP class name for different cases
+            $p = new \ReflectionProperty($twig, 'templateClassPrefix');
+            $p->setAccessible(true);
+            $p->setValue($twig, '__TwigTemplate_'.hash('sha256', uniqid(mt_rand(), true), false).'_');
+
+            $deprecations = [];
+            try {
+                $prevHandler = set_error_handler(function ($type, $msg, $file, $line, $context = []) use (&$deprecations, &$prevHandler) {
+                    if (E_USER_DEPRECATED === $type) {
+                        $deprecations[] = $msg;
+
+                        return true;
+                    }
 
-if (\false) {
-    class IntegrationTestCase extends \Twig_Test_IntegrationTestCase
+                    return $prevHandler ? $prevHandler($type, $msg, $file, $line, $context) : false;
+                });
+
+                $template = $twig->load('index.twig');
+            } catch (\Exception $e) {
+                if (false !== $exception) {
+                    $message = $e->getMessage();
+                    $this->assertSame(trim($exception), trim(sprintf('%s: %s', \get_class($e), $message)));
+                    $last = substr($message, \strlen($message) - 1);
+                    $this->assertTrue('.' === $last || '?' === $last, 'Exception message must end with a dot or a question mark.');
+
+                    return;
+                }
+
+                throw new Error(sprintf('%s: %s', \get_class($e), $e->getMessage()), -1, null, $e);
+            } finally {
+                restore_error_handler();
+            }
+
+            $this->assertSame($deprecation, implode("\n", $deprecations));
+
+            try {
+                $output = trim($template->render(eval($match[1].';')), "\n ");
+            } catch (\Exception $e) {
+                if (false !== $exception) {
+                    $this->assertSame(trim($exception), trim(sprintf('%s: %s', \get_class($e), $e->getMessage())));
+
+                    return;
+                }
+
+                $e = new Error(sprintf('%s: %s', \get_class($e), $e->getMessage()), -1, null, $e);
+
+                $output = trim(sprintf('%s: %s', \get_class($e), $e->getMessage()));
+            }
+
+            if (false !== $exception) {
+                list($class) = explode(':', $exception);
+                $constraintClass = class_exists('PHPUnit\Framework\Constraint\Exception') ? 'PHPUnit\Framework\Constraint\Exception' : 'PHPUnit_Framework_Constraint_Exception';
+                $this->assertThat(null, new $constraintClass($class));
+            }
+
+            $expected = trim($match[3], "\n ");
+
+            if ($expected !== $output) {
+                printf("Compiled templates that failed on case %d:\n", $i + 1);
+
+                foreach (array_keys($templates) as $name) {
+                    echo "Template: $name\n";
+                    echo $twig->compile($twig->parse($twig->tokenize($twig->getLoader()->getSourceContext($name))));
+                }
+            }
+            $this->assertEquals($expected, $output, $message.' (in '.$file.')');
+        }
+    }
+
+    protected static function parseTemplates($test)
     {
+        $templates = [];
+        preg_match_all('/--TEMPLATE(?:\((.*?)\))?--(.*?)(?=\-\-TEMPLATE|$)/s', $test, $matches, PREG_SET_ORDER);
+        foreach ($matches as $match) {
+            $templates[($match[1] ? $match[1] : 'index.twig')] = $match[2];
+        }
+
+        return $templates;
     }
 }
+
+class_alias('Twig\Test\IntegrationTestCase', 'Twig_Test_IntegrationTestCase');
diff --git a/vendor/twig/twig/src/Test/NodeTestCase.php b/vendor/twig/twig/src/Test/NodeTestCase.php
index bf56b974..368ceb10 100644
--- a/vendor/twig/twig/src/Test/NodeTestCase.php
+++ b/vendor/twig/twig/src/Test/NodeTestCase.php
@@ -1,11 +1,67 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Test;
 
-class_exists('Twig_Test_NodeTestCase');
+use PHPUnit\Framework\TestCase;
+use Twig\Compiler;
+use Twig\Environment;
+use Twig\Loader\ArrayLoader;
+use Twig\Node\Node;
+
+abstract class NodeTestCase extends TestCase
+{
+    abstract public function getTests();
+
+    /**
+     * @dataProvider getTests
+     */
+    public function testCompile($node, $source, $environment = null, $isPattern = false)
+    {
+        $this->assertNodeCompilation($source, $node, $environment, $isPattern);
+    }
+
+    public function assertNodeCompilation($source, Node $node, Environment $environment = null, $isPattern = false)
+    {
+        $compiler = $this->getCompiler($environment);
+        $compiler->compile($node);
+
+        if ($isPattern) {
+            $this->assertStringMatchesFormat($source, trim($compiler->getSource()));
+        } else {
+            $this->assertEquals($source, trim($compiler->getSource()));
+        }
+    }
+
+    protected function getCompiler(Environment $environment = null)
+    {
+        return new Compiler(null === $environment ? $this->getEnvironment() : $environment);
+    }
+
+    protected function getEnvironment()
+    {
+        return new Environment(new ArrayLoader([]));
+    }
 
-if (\false) {
-    class NodeTestCase extends \Twig_Test_NodeTestCase
+    protected function getVariableGetter($name, $line = false)
     {
+        $line = $line > 0 ? "// line {$line}\n" : '';
+
+        return sprintf('%s($context["%s"] ?? null)', $line, $name);
+    }
+
+    protected function getAttributeGetter()
+    {
+        return 'twig_get_attribute($this->env, $this->source, ';
     }
 }
+
+class_alias('Twig\Test\NodeTestCase', 'Twig_Test_NodeTestCase');
diff --git a/vendor/twig/twig/src/Token.php b/vendor/twig/twig/src/Token.php
index c7751aa4..262fa48d 100644
--- a/vendor/twig/twig/src/Token.php
+++ b/vendor/twig/twig/src/Token.php
@@ -1,11 +1,213 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_Token');
+/**
+ * Represents a Token.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class Token
+{
+    private $value;
+    private $type;
+    private $lineno;
+
+    const EOF_TYPE = -1;
+    const TEXT_TYPE = 0;
+    const BLOCK_START_TYPE = 1;
+    const VAR_START_TYPE = 2;
+    const BLOCK_END_TYPE = 3;
+    const VAR_END_TYPE = 4;
+    const NAME_TYPE = 5;
+    const NUMBER_TYPE = 6;
+    const STRING_TYPE = 7;
+    const OPERATOR_TYPE = 8;
+    const PUNCTUATION_TYPE = 9;
+    const INTERPOLATION_START_TYPE = 10;
+    const INTERPOLATION_END_TYPE = 11;
+    const ARROW_TYPE = 12;
+
+    /**
+     * @param int    $type   The type of the token
+     * @param string $value  The token value
+     * @param int    $lineno The line position in the source
+     */
+    public function __construct($type, $value, $lineno)
+    {
+        $this->type = $type;
+        $this->value = $value;
+        $this->lineno = $lineno;
+    }
+
+    public function __toString()
+    {
+        return sprintf('%s(%s)', self::typeToString($this->type, true), $this->value);
+    }
+
+    /**
+     * Tests the current token for a type and/or a value.
+     *
+     * Parameters may be:
+     *  * just type
+     *  * type and value (or array of possible values)
+     *  * just value (or array of possible values) (NAME_TYPE is used as type)
+     *
+     * @param array|string|int  $type   The type to test
+     * @param array|string|null $values The token value
+     *
+     * @return bool
+     */
+    public function test($type, $values = null)
+    {
+        if (null === $values && !\is_int($type)) {
+            $values = $type;
+            $type = self::NAME_TYPE;
+        }
+
+        return ($this->type === $type) && (
+            null === $values ||
+            (\is_array($values) && \in_array($this->value, $values)) ||
+            $this->value == $values
+        );
+    }
+
+    /**
+     * @return int
+     */
+    public function getLine()
+    {
+        return $this->lineno;
+    }
 
-if (\false) {
-    class Token extends \Twig_Token
+    /**
+     * @return int
+     */
+    public function getType()
     {
+        return $this->type;
+    }
+
+    /**
+     * @return string
+     */
+    public function getValue()
+    {
+        return $this->value;
+    }
+
+    /**
+     * Returns the constant representation (internal) of a given type.
+     *
+     * @param int  $type  The type as an integer
+     * @param bool $short Whether to return a short representation or not
+     *
+     * @return string The string representation
+     */
+    public static function typeToString($type, $short = false)
+    {
+        switch ($type) {
+            case self::EOF_TYPE:
+                $name = 'EOF_TYPE';
+                break;
+            case self::TEXT_TYPE:
+                $name = 'TEXT_TYPE';
+                break;
+            case self::BLOCK_START_TYPE:
+                $name = 'BLOCK_START_TYPE';
+                break;
+            case self::VAR_START_TYPE:
+                $name = 'VAR_START_TYPE';
+                break;
+            case self::BLOCK_END_TYPE:
+                $name = 'BLOCK_END_TYPE';
+                break;
+            case self::VAR_END_TYPE:
+                $name = 'VAR_END_TYPE';
+                break;
+            case self::NAME_TYPE:
+                $name = 'NAME_TYPE';
+                break;
+            case self::NUMBER_TYPE:
+                $name = 'NUMBER_TYPE';
+                break;
+            case self::STRING_TYPE:
+                $name = 'STRING_TYPE';
+                break;
+            case self::OPERATOR_TYPE:
+                $name = 'OPERATOR_TYPE';
+                break;
+            case self::PUNCTUATION_TYPE:
+                $name = 'PUNCTUATION_TYPE';
+                break;
+            case self::INTERPOLATION_START_TYPE:
+                $name = 'INTERPOLATION_START_TYPE';
+                break;
+            case self::INTERPOLATION_END_TYPE:
+                $name = 'INTERPOLATION_END_TYPE';
+                break;
+            case self::ARROW_TYPE:
+                $name = 'ARROW_TYPE';
+                break;
+            default:
+                throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type));
+        }
+
+        return $short ? $name : 'Twig\Token::'.$name;
+    }
+
+    /**
+     * Returns the English representation of a given type.
+     *
+     * @param int $type The type as an integer
+     *
+     * @return string The string representation
+     */
+    public static function typeToEnglish($type)
+    {
+        switch ($type) {
+            case self::EOF_TYPE:
+                return 'end of template';
+            case self::TEXT_TYPE:
+                return 'text';
+            case self::BLOCK_START_TYPE:
+                return 'begin of statement block';
+            case self::VAR_START_TYPE:
+                return 'begin of print statement';
+            case self::BLOCK_END_TYPE:
+                return 'end of statement block';
+            case self::VAR_END_TYPE:
+                return 'end of print statement';
+            case self::NAME_TYPE:
+                return 'name';
+            case self::NUMBER_TYPE:
+                return 'number';
+            case self::STRING_TYPE:
+                return 'string';
+            case self::OPERATOR_TYPE:
+                return 'operator';
+            case self::PUNCTUATION_TYPE:
+                return 'punctuation';
+            case self::INTERPOLATION_START_TYPE:
+                return 'begin of string interpolation';
+            case self::INTERPOLATION_END_TYPE:
+                return 'end of string interpolation';
+            case self::ARROW_TYPE:
+                return 'arrow function';
+            default:
+                throw new \LogicException(sprintf('Token of type "%s" does not exist.', $type));
+        }
     }
 }
+
+class_alias('Twig\Token', 'Twig_Token');
diff --git a/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php b/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php
index 6ae78a59..2c2f90b7 100644
--- a/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/AbstractTokenParser.php
@@ -1,11 +1,34 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser');
+use Twig\Parser;
+
+/**
+ * Base class for all token parsers.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+abstract class AbstractTokenParser implements TokenParserInterface
+{
+    /**
+     * @var Parser
+     */
+    protected $parser;
 
-if (\false) {
-    class AbstractTokenParser extends \Twig_TokenParser
+    public function setParser(Parser $parser)
     {
+        $this->parser = $parser;
     }
 }
+
+class_alias('Twig\TokenParser\AbstractTokenParser', 'Twig_TokenParser');
diff --git a/vendor/twig/twig/src/TokenParser/ApplyTokenParser.php b/vendor/twig/twig/src/TokenParser/ApplyTokenParser.php
new file mode 100644
index 00000000..879879a2
--- /dev/null
+++ b/vendor/twig/twig/src/TokenParser/ApplyTokenParser.php
@@ -0,0 +1,58 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Twig\TokenParser;
+
+use Twig\Node\Expression\TempNameExpression;
+use Twig\Node\Node;
+use Twig\Node\PrintNode;
+use Twig\Node\SetNode;
+use Twig\Token;
+
+/**
+ * Applies filters on a section of a template.
+ *
+ *   {% apply upper %}
+ *      This text becomes uppercase
+ *   {% endapplys %}
+ */
+final class ApplyTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
+    {
+        $lineno = $token->getLine();
+        $name = $this->parser->getVarName();
+
+        $ref = new TempNameExpression($name, $lineno);
+        $ref->setAttribute('always_defined', true);
+
+        $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag());
+
+        $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
+        $body = $this->parser->subparse([$this, 'decideApplyEnd'], true);
+        $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
+
+        return new Node([
+            new SetNode(true, $ref, $body, $lineno, $this->getTag()),
+            new PrintNode($filter, $lineno, $this->getTag()),
+        ]);
+    }
+
+    public function decideApplyEnd(Token $token)
+    {
+        return $token->test('endapply');
+    }
+
+    public function getTag()
+    {
+        return 'apply';
+    }
+}
diff --git a/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php b/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php
index 68a99da5..10fdb818 100644
--- a/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/AutoEscapeTokenParser.php
@@ -1,11 +1,57 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_AutoEscape');
+use Twig\Error\SyntaxError;
+use Twig\Node\AutoEscapeNode;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Token;
 
-if (\false) {
-    class AutoEscapeTokenParser extends \Twig_TokenParser_AutoEscape
+/**
+ * Marks a section of a template to be escaped or not.
+ */
+final class AutoEscapeTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
+
+        if ($stream->test(/* Token::BLOCK_END_TYPE */ 3)) {
+            $value = 'html';
+        } else {
+            $expr = $this->parser->getExpressionParser()->parseExpression();
+            if (!$expr instanceof ConstantExpression) {
+                throw new SyntaxError('An escaping strategy must be a string or false.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
+            }
+            $value = $expr->getAttribute('value');
+        }
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+        $body = $this->parser->subparse([$this, 'decideBlockEnd'], true);
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        return new AutoEscapeNode($value, $body, $lineno, $this->getTag());
+    }
+
+    public function decideBlockEnd(Token $token)
+    {
+        return $token->test('endautoescape');
+    }
+
+    public function getTag()
+    {
+        return 'autoescape';
     }
 }
+
+class_alias('Twig\TokenParser\AutoEscapeTokenParser', 'Twig_TokenParser_AutoEscape');
diff --git a/vendor/twig/twig/src/TokenParser/BlockTokenParser.php b/vendor/twig/twig/src/TokenParser/BlockTokenParser.php
index 8be16830..449a2c05 100644
--- a/vendor/twig/twig/src/TokenParser/BlockTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/BlockTokenParser.php
@@ -1,11 +1,78 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Block');
+use Twig\Error\SyntaxError;
+use Twig\Node\BlockNode;
+use Twig\Node\BlockReferenceNode;
+use Twig\Node\Node;
+use Twig\Node\PrintNode;
+use Twig\Token;
+
+/**
+ * Marks a section of a template as being reusable.
+ *
+ *  {% block head %}
+ *    <link rel="stylesheet" href="style.css" />
+ *    <title>{% block title %}{% endblock %} - My Webpage</title>
+ *  {% endblock %}
+ */
+final class BlockTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
+    {
+        $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
+        $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
+        if ($this->parser->hasBlock($name)) {
+            throw new SyntaxError(sprintf("The block '%s' has already been defined line %d.", $name, $this->parser->getBlock($name)->getTemplateLine()), $stream->getCurrent()->getLine(), $stream->getSourceContext());
+        }
+        $this->parser->setBlock($name, $block = new BlockNode($name, new Node([]), $lineno));
+        $this->parser->pushLocalScope();
+        $this->parser->pushBlockStack($name);
+
+        if ($stream->nextIf(/* Token::BLOCK_END_TYPE */ 3)) {
+            $body = $this->parser->subparse([$this, 'decideBlockEnd'], true);
+            if ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) {
+                $value = $token->getValue();
+
+                if ($value != $name) {
+                    throw new SyntaxError(sprintf('Expected endblock for block "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
+                }
+            }
+        } else {
+            $body = new Node([
+                new PrintNode($this->parser->getExpressionParser()->parseExpression(), $lineno),
+            ]);
+        }
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        $block->setNode('body', $body);
+        $this->parser->popBlockStack();
+        $this->parser->popLocalScope();
 
-if (\false) {
-    class BlockTokenParser extends \Twig_TokenParser_Block
+        return new BlockReferenceNode($name, $lineno, $this->getTag());
+    }
+
+    public function decideBlockEnd(Token $token)
+    {
+        return $token->test('endblock');
+    }
+
+    public function getTag()
     {
+        return 'block';
     }
 }
+
+class_alias('Twig\TokenParser\BlockTokenParser', 'Twig_TokenParser_Block');
diff --git a/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php b/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php
new file mode 100644
index 00000000..6575cff1
--- /dev/null
+++ b/vendor/twig/twig/src/TokenParser/DeprecatedTokenParser.php
@@ -0,0 +1,44 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Twig\TokenParser;
+
+use Twig\Node\DeprecatedNode;
+use Twig\Token;
+
+/**
+ * Deprecates a section of a template.
+ *
+ *    {% deprecated 'The "base.twig" template is deprecated, use "layout.twig" instead.' %}
+ *    {% extends 'layout.html.twig' %}
+ *
+ * @author Yonel Ceruto <yonelceruto@xxxxxxxxx>
+ *
+ * @final
+ */
+class DeprecatedTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
+    {
+        $expr = $this->parser->getExpressionParser()->parseExpression();
+
+        $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
+
+        return new DeprecatedNode($expr, $token->getLine(), $this->getTag());
+    }
+
+    public function getTag()
+    {
+        return 'deprecated';
+    }
+}
+
+class_alias('Twig\TokenParser\DeprecatedTokenParser', 'Twig_TokenParser_Deprecated');
diff --git a/vendor/twig/twig/src/TokenParser/DoTokenParser.php b/vendor/twig/twig/src/TokenParser/DoTokenParser.php
index a40b166d..e5a07d69 100644
--- a/vendor/twig/twig/src/TokenParser/DoTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/DoTokenParser.php
@@ -1,11 +1,37 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Do');
+use Twig\Node\DoNode;
+use Twig\Token;
 
-if (\false) {
-    class DoTokenParser extends \Twig_TokenParser_Do
+/**
+ * Evaluates an expression, discarding the returned value.
+ */
+final class DoTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $expr = $this->parser->getExpressionParser()->parseExpression();
+
+        $this->parser->getStream()->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        return new DoNode($expr, $token->getLine(), $this->getTag());
+    }
+
+    public function getTag()
+    {
+        return 'do';
     }
 }
+
+class_alias('Twig\TokenParser\DoTokenParser', 'Twig_TokenParser_Do');
diff --git a/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php b/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php
index f557db9d..83a545e7 100644
--- a/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/EmbedTokenParser.php
@@ -1,11 +1,72 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Embed');
+use Twig\Node\EmbedNode;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Token;
 
-if (\false) {
-    class EmbedTokenParser extends \Twig_TokenParser_Embed
+/**
+ * Embeds a template.
+ */
+final class EmbedTokenParser extends IncludeTokenParser
+{
+    public function parse(Token $token)
     {
+        $stream = $this->parser->getStream();
+
+        $parent = $this->parser->getExpressionParser()->parseExpression();
+
+        list($variables, $only, $ignoreMissing) = $this->parseArguments();
+
+        $parentToken = $fakeParentToken = new Token(/* Token::STRING_TYPE */ 7, '__parent__', $token->getLine());
+        if ($parent instanceof ConstantExpression) {
+            $parentToken = new Token(/* Token::STRING_TYPE */ 7, $parent->getAttribute('value'), $token->getLine());
+        } elseif ($parent instanceof NameExpression) {
+            $parentToken = new Token(/* Token::NAME_TYPE */ 5, $parent->getAttribute('name'), $token->getLine());
+        }
+
+        // inject a fake parent to make the parent() function work
+        $stream->injectTokens([
+            new Token(/* Token::BLOCK_START_TYPE */ 1, '', $token->getLine()),
+            new Token(/* Token::NAME_TYPE */ 5, 'extends', $token->getLine()),
+            $parentToken,
+            new Token(/* Token::BLOCK_END_TYPE */ 3, '', $token->getLine()),
+        ]);
+
+        $module = $this->parser->parse($stream, [$this, 'decideBlockEnd'], true);
+
+        // override the parent with the correct one
+        if ($fakeParentToken === $parentToken) {
+            $module->setNode('parent', $parent);
+        }
+
+        $this->parser->embedTemplate($module);
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        return new EmbedNode($module->getTemplateName(), $module->getAttribute('index'), $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
+    }
+
+    public function decideBlockEnd(Token $token)
+    {
+        return $token->test('endembed');
+    }
+
+    public function getTag()
+    {
+        return 'embed';
     }
 }
+
+class_alias('Twig\TokenParser\EmbedTokenParser', 'Twig_TokenParser_Embed');
diff --git a/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php b/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php
index cf929ab4..a44980fb 100644
--- a/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/ExtendsTokenParser.php
@@ -1,11 +1,52 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Extends');
+use Twig\Error\SyntaxError;
+use Twig\Node\Node;
+use Twig\Token;
 
-if (\false) {
-    class ExtendsTokenParser extends \Twig_TokenParser_Extends
+/**
+ * Extends a template by another one.
+ *
+ *  {% extends "base.html" %}
+ */
+final class ExtendsTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $stream = $this->parser->getStream();
+
+        if ($this->parser->peekBlockStack()) {
+            throw new SyntaxError('Cannot use "extend" in a block.', $token->getLine(), $stream->getSourceContext());
+        } elseif (!$this->parser->isMainScope()) {
+            throw new SyntaxError('Cannot use "extend" in a macro.', $token->getLine(), $stream->getSourceContext());
+        }
+
+        if (null !== $this->parser->getParent()) {
+            throw new SyntaxError('Multiple extends tags are forbidden.', $token->getLine(), $stream->getSourceContext());
+        }
+        $this->parser->setParent($this->parser->getExpressionParser()->parseExpression());
+
+        $stream->expect(Token::BLOCK_END_TYPE);
+
+        return new Node();
+    }
+
+    public function getTag()
+    {
+        return 'extends';
     }
 }
+
+class_alias('Twig\TokenParser\ExtendsTokenParser', 'Twig_TokenParser_Extends');
diff --git a/vendor/twig/twig/src/TokenParser/FilterTokenParser.php b/vendor/twig/twig/src/TokenParser/FilterTokenParser.php
index de9d6ab4..e57fc90a 100644
--- a/vendor/twig/twig/src/TokenParser/FilterTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/FilterTokenParser.php
@@ -1,11 +1,64 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Filter');
+use Twig\Node\BlockNode;
+use Twig\Node\Expression\BlockReferenceExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\PrintNode;
+use Twig\Token;
+
+/**
+ * Filters a section of a template by applying filters.
+ *
+ *   {% filter upper %}
+ *      This text becomes uppercase
+ *   {% endfilter %}
+ *
+ * @deprecated since Twig 2.9, to be removed in 3.0 (use the "apply" tag instead)
+ */
+final class FilterTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
+    {
+        $stream = $this->parser->getStream();
+        $lineno = $token->getLine();
+
+        @trigger_error(sprintf('The "filter" tag in "%s" at line %d is deprecated since Twig 2.9, use the "apply" tag instead.', $stream->getSourceContext()->getName(), $lineno), E_USER_DEPRECATED);
+
+        $name = $this->parser->getVarName();
+        $ref = new BlockReferenceExpression(new ConstantExpression($name, $lineno), null, $lineno, $this->getTag());
+
+        $filter = $this->parser->getExpressionParser()->parseFilterExpressionRaw($ref, $this->getTag());
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        $body = $this->parser->subparse([$this, 'decideBlockEnd'], true);
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
 
-if (\false) {
-    class FilterTokenParser extends \Twig_TokenParser_Filter
+        $block = new BlockNode($name, $body, $lineno);
+        $this->parser->setBlock($name, $block);
+
+        return new PrintNode($filter, $lineno, $this->getTag());
+    }
+
+    public function decideBlockEnd(Token $token)
     {
+        return $token->test('endfilter');
+    }
+
+    public function getTag()
+    {
+        return 'filter';
     }
 }
+
+class_alias('Twig\TokenParser\FilterTokenParser', 'Twig_TokenParser_Filter');
diff --git a/vendor/twig/twig/src/TokenParser/FlushTokenParser.php b/vendor/twig/twig/src/TokenParser/FlushTokenParser.php
index ce130264..70f43393 100644
--- a/vendor/twig/twig/src/TokenParser/FlushTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/FlushTokenParser.php
@@ -1,11 +1,37 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Flush');
+use Twig\Node\FlushNode;
+use Twig\Token;
+
+/**
+ * Flushes the output to the client.
+ *
+ * @see flush()
+ */
+final class FlushTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
+    {
+        $this->parser->getStream()->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        return new FlushNode($token->getLine(), $this->getTag());
+    }
 
-if (\false) {
-    class FlushTokenParser extends \Twig_TokenParser_Flush
+    public function getTag()
     {
+        return 'flush';
     }
 }
+
+class_alias('Twig\TokenParser\FlushTokenParser', 'Twig_TokenParser_Flush');
diff --git a/vendor/twig/twig/src/TokenParser/ForTokenParser.php b/vendor/twig/twig/src/TokenParser/ForTokenParser.php
index 25ddcea3..34430f00 100644
--- a/vendor/twig/twig/src/TokenParser/ForTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/ForTokenParser.php
@@ -1,11 +1,137 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_For');
+use Twig\Error\SyntaxError;
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\GetAttrExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\ForNode;
+use Twig\Node\Node;
+use Twig\Token;
+use Twig\TokenStream;
+
+/**
+ * Loops over each item of a sequence.
+ *
+ *   <ul>
+ *    {% for user in users %}
+ *      <li>{{ user.username|e }}</li>
+ *    {% endfor %}
+ *   </ul>
+ */
+final class ForTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
+    {
+        $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
+        $targets = $this->parser->getExpressionParser()->parseAssignmentExpression();
+        $stream->expect(/* Token::OPERATOR_TYPE */ 8, 'in');
+        $seq = $this->parser->getExpressionParser()->parseExpression();
+
+        $ifexpr = null;
+        if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'if')) {
+            @trigger_error(sprintf('Using an "if" condition on "for" tag in "%s" at line %d is deprecated since Twig 2.10.0, use a "filter" filter or an "if" condition inside the "for" body instead (if your condition depends on a variable updated inside the loop).', $stream->getSourceContext()->getName(), $lineno), E_USER_DEPRECATED);
+
+            $ifexpr = $this->parser->getExpressionParser()->parseExpression();
+        }
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+        $body = $this->parser->subparse([$this, 'decideForFork']);
+        if ('else' == $stream->next()->getValue()) {
+            $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+            $else = $this->parser->subparse([$this, 'decideForEnd'], true);
+        } else {
+            $else = null;
+        }
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        if (\count($targets) > 1) {
+            $keyTarget = $targets->getNode(0);
+            $keyTarget = new AssignNameExpression($keyTarget->getAttribute('name'), $keyTarget->getTemplateLine());
+            $valueTarget = $targets->getNode(1);
+            $valueTarget = new AssignNameExpression($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
+        } else {
+            $keyTarget = new AssignNameExpression('_key', $lineno);
+            $valueTarget = $targets->getNode(0);
+            $valueTarget = new AssignNameExpression($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
+        }
+
+        if ($ifexpr) {
+            $this->checkLoopUsageCondition($stream, $ifexpr);
+            $this->checkLoopUsageBody($stream, $body);
+        }
+
+        return new ForNode($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, $lineno, $this->getTag());
+    }
+
+    public function decideForFork(Token $token)
+    {
+        return $token->test(['else', 'endfor']);
+    }
+
+    public function decideForEnd(Token $token)
+    {
+        return $token->test('endfor');
+    }
+
+    // the loop variable cannot be used in the condition
+    private function checkLoopUsageCondition(TokenStream $stream, Node $node)
+    {
+        if ($node instanceof GetAttrExpression && $node->getNode('node') instanceof NameExpression && 'loop' == $node->getNode('node')->getAttribute('name')) {
+            throw new SyntaxError('The "loop" variable cannot be used in a looping condition.', $node->getTemplateLine(), $stream->getSourceContext());
+        }
+
+        foreach ($node as $n) {
+            if (!$n) {
+                continue;
+            }
+
+            $this->checkLoopUsageCondition($stream, $n);
+        }
+    }
 
-if (\false) {
-    class ForTokenParser extends \Twig_TokenParser_For
+    // check usage of non-defined loop-items
+    // it does not catch all problems (for instance when a for is included into another or when the variable is used in an include)
+    private function checkLoopUsageBody(TokenStream $stream, Node $node)
     {
+        if ($node instanceof GetAttrExpression && $node->getNode('node') instanceof NameExpression && 'loop' == $node->getNode('node')->getAttribute('name')) {
+            $attribute = $node->getNode('attribute');
+            if ($attribute instanceof ConstantExpression && \in_array($attribute->getAttribute('value'), ['length', 'revindex0', 'revindex', 'last'])) {
+                throw new SyntaxError(sprintf('The "loop.%s" variable is not defined when looping with a condition.', $attribute->getAttribute('value')), $node->getTemplateLine(), $stream->getSourceContext());
+            }
+        }
+
+        // should check for parent.loop.XXX usage
+        if ($node instanceof ForNode) {
+            return;
+        }
+
+        foreach ($node as $n) {
+            if (!$n) {
+                continue;
+            }
+
+            $this->checkLoopUsageBody($stream, $n);
+        }
+    }
+
+    public function getTag()
+    {
+        return 'for';
     }
 }
+
+class_alias('Twig\TokenParser\ForTokenParser', 'Twig_TokenParser_For');
diff --git a/vendor/twig/twig/src/TokenParser/FromTokenParser.php b/vendor/twig/twig/src/TokenParser/FromTokenParser.php
index 1e5a4bc0..dd49f2fd 100644
--- a/vendor/twig/twig/src/TokenParser/FromTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/FromTokenParser.php
@@ -1,11 +1,65 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_From');
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Node\ImportNode;
+use Twig\Token;
 
-if (\false) {
-    class FromTokenParser extends \Twig_TokenParser_From
+/**
+ * Imports macros.
+ *
+ *   {% from 'forms.html' import forms %}
+ */
+final class FromTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $macro = $this->parser->getExpressionParser()->parseExpression();
+        $stream = $this->parser->getStream();
+        $stream->expect(/* Token::NAME_TYPE */ 5, 'import');
+
+        $targets = [];
+        do {
+            $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
+
+            $alias = $name;
+            if ($stream->nextIf('as')) {
+                $alias = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
+            }
+
+            $targets[$name] = $alias;
+
+            if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
+                break;
+            }
+        } while (true);
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        $var = new AssignNameExpression($this->parser->getVarName(), $token->getLine());
+        $node = new ImportNode($macro, $var, $token->getLine(), $this->getTag(), $this->parser->isMainScope());
+
+        foreach ($targets as $name => $alias) {
+            $this->parser->addImportedSymbol('function', $alias, 'macro_'.$name, $var);
+        }
+
+        return $node;
+    }
+
+    public function getTag()
+    {
+        return 'from';
     }
 }
+
+class_alias('Twig\TokenParser\FromTokenParser', 'Twig_TokenParser_From');
diff --git a/vendor/twig/twig/src/TokenParser/IfTokenParser.php b/vendor/twig/twig/src/TokenParser/IfTokenParser.php
index 1852cf1e..8ad99f07 100644
--- a/vendor/twig/twig/src/TokenParser/IfTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/IfTokenParser.php
@@ -1,11 +1,89 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_If');
+use Twig\Error\SyntaxError;
+use Twig\Node\IfNode;
+use Twig\Node\Node;
+use Twig\Token;
 
-if (\false) {
-    class IfTokenParser extends \Twig_TokenParser_If
+/**
+ * Tests a condition.
+ *
+ *   {% if users %}
+ *    <ul>
+ *      {% for user in users %}
+ *        <li>{{ user.username|e }}</li>
+ *      {% endfor %}
+ *    </ul>
+ *   {% endif %}
+ */
+final class IfTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $lineno = $token->getLine();
+        $expr = $this->parser->getExpressionParser()->parseExpression();
+        $stream = $this->parser->getStream();
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+        $body = $this->parser->subparse([$this, 'decideIfFork']);
+        $tests = [$expr, $body];
+        $else = null;
+
+        $end = false;
+        while (!$end) {
+            switch ($stream->next()->getValue()) {
+                case 'else':
+                    $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+                    $else = $this->parser->subparse([$this, 'decideIfEnd']);
+                    break;
+
+                case 'elseif':
+                    $expr = $this->parser->getExpressionParser()->parseExpression();
+                    $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+                    $body = $this->parser->subparse([$this, 'decideIfFork']);
+                    $tests[] = $expr;
+                    $tests[] = $body;
+                    break;
+
+                case 'endif':
+                    $end = true;
+                    break;
+
+                default:
+                    throw new SyntaxError(sprintf('Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d).', $lineno), $stream->getCurrent()->getLine(), $stream->getSourceContext());
+            }
+        }
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        return new IfNode(new Node($tests), $else, $lineno, $this->getTag());
+    }
+
+    public function decideIfFork(Token $token)
+    {
+        return $token->test(['elseif', 'else', 'endif']);
+    }
+
+    public function decideIfEnd(Token $token)
+    {
+        return $token->test(['endif']);
+    }
+
+    public function getTag()
+    {
+        return 'if';
     }
 }
+
+class_alias('Twig\TokenParser\IfTokenParser', 'Twig_TokenParser_If');
diff --git a/vendor/twig/twig/src/TokenParser/ImportTokenParser.php b/vendor/twig/twig/src/TokenParser/ImportTokenParser.php
index 1a42d012..b5674c19 100644
--- a/vendor/twig/twig/src/TokenParser/ImportTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/ImportTokenParser.php
@@ -1,11 +1,43 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Import');
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Node\ImportNode;
+use Twig\Token;
 
-if (\false) {
-    class ImportTokenParser extends \Twig_TokenParser_Import
+/**
+ * Imports macros.
+ *
+ *   {% import 'forms.html' as forms %}
+ */
+final class ImportTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $macro = $this->parser->getExpressionParser()->parseExpression();
+        $this->parser->getStream()->expect(/* Token::NAME_TYPE */ 5, 'as');
+        $var = new AssignNameExpression($this->parser->getStream()->expect(/* Token::NAME_TYPE */ 5)->getValue(), $token->getLine());
+        $this->parser->getStream()->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        $this->parser->addImportedSymbol('template', $var->getAttribute('name'));
+
+        return new ImportNode($macro, $var, $token->getLine(), $this->getTag(), $this->parser->isMainScope());
+    }
+
+    public function getTag()
+    {
+        return 'import';
     }
 }
+
+class_alias('Twig\TokenParser\ImportTokenParser', 'Twig_TokenParser_Import');
diff --git a/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php b/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php
index 7f8c061f..e1e95da3 100644
--- a/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/IncludeTokenParser.php
@@ -1,11 +1,68 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Include');
+use Twig\Node\IncludeNode;
+use Twig\Token;
+
+/**
+ * Includes a template.
+ *
+ *   {% include 'header.html' %}
+ *     Body
+ *   {% include 'footer.html' %}
+ */
+class IncludeTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
+    {
+        $expr = $this->parser->getExpressionParser()->parseExpression();
+
+        list($variables, $only, $ignoreMissing) = $this->parseArguments();
+
+        return new IncludeNode($expr, $variables, $only, $ignoreMissing, $token->getLine(), $this->getTag());
+    }
+
+    protected function parseArguments()
+    {
+        $stream = $this->parser->getStream();
+
+        $ignoreMissing = false;
+        if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'ignore')) {
+            $stream->expect(/* Token::NAME_TYPE */ 5, 'missing');
+
+            $ignoreMissing = true;
+        }
+
+        $variables = null;
+        if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'with')) {
+            $variables = $this->parser->getExpressionParser()->parseExpression();
+        }
+
+        $only = false;
+        if ($stream->nextIf(/* Token::NAME_TYPE */ 5, 'only')) {
+            $only = true;
+        }
 
-if (\false) {
-    class IncludeTokenParser extends \Twig_TokenParser_Include
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        return [$variables, $only, $ignoreMissing];
+    }
+
+    public function getTag()
     {
+        return 'include';
     }
 }
+
+class_alias('Twig\TokenParser\IncludeTokenParser', 'Twig_TokenParser_Include');
diff --git a/vendor/twig/twig/src/TokenParser/MacroTokenParser.php b/vendor/twig/twig/src/TokenParser/MacroTokenParser.php
index 152fb267..d2673876 100644
--- a/vendor/twig/twig/src/TokenParser/MacroTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/MacroTokenParser.php
@@ -1,11 +1,66 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Macro');
+use Twig\Error\SyntaxError;
+use Twig\Node\BodyNode;
+use Twig\Node\MacroNode;
+use Twig\Node\Node;
+use Twig\Token;
 
-if (\false) {
-    class MacroTokenParser extends \Twig_TokenParser_Macro
+/**
+ * Defines a macro.
+ *
+ *   {% macro input(name, value, type, size) %}
+ *      <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
+ *   {% endmacro %}
+ */
+final class MacroTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
+        $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
+
+        $arguments = $this->parser->getExpressionParser()->parseArguments(true, true);
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+        $this->parser->pushLocalScope();
+        $body = $this->parser->subparse([$this, 'decideBlockEnd'], true);
+        if ($token = $stream->nextIf(/* Token::NAME_TYPE */ 5)) {
+            $value = $token->getValue();
+
+            if ($value != $name) {
+                throw new SyntaxError(sprintf('Expected endmacro for macro "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
+            }
+        }
+        $this->parser->popLocalScope();
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        $this->parser->setMacro($name, new MacroNode($name, new BodyNode([$body]), $arguments, $lineno, $this->getTag()));
+
+        return new Node();
+    }
+
+    public function decideBlockEnd(Token $token)
+    {
+        return $token->test('endmacro');
+    }
+
+    public function getTag()
+    {
+        return 'macro';
     }
 }
+
+class_alias('Twig\TokenParser\MacroTokenParser', 'Twig_TokenParser_Macro');
diff --git a/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php b/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php
index e54c315a..1f579879 100644
--- a/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/SandboxTokenParser.php
@@ -1,11 +1,65 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Sandbox');
+use Twig\Error\SyntaxError;
+use Twig\Node\IncludeNode;
+use Twig\Node\SandboxNode;
+use Twig\Node\TextNode;
+use Twig\Token;
 
-if (\false) {
-    class SandboxTokenParser extends \Twig_TokenParser_Sandbox
+/**
+ * Marks a section of a template as untrusted code that must be evaluated in the sandbox mode.
+ *
+ *    {% sandbox %}
+ *        {% include 'user.html' %}
+ *    {% endsandbox %}
+ *
+ * @see https://twig.symfony.com/doc/api.html#sandbox-extension for details
+ */
+final class SandboxTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $stream = $this->parser->getStream();
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+        $body = $this->parser->subparse([$this, 'decideBlockEnd'], true);
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        // in a sandbox tag, only include tags are allowed
+        if (!$body instanceof IncludeNode) {
+            foreach ($body as $node) {
+                if ($node instanceof TextNode && ctype_space($node->getAttribute('data'))) {
+                    continue;
+                }
+
+                if (!$node instanceof IncludeNode) {
+                    throw new SyntaxError('Only "include" tags are allowed within a "sandbox" section.', $node->getTemplateLine(), $stream->getSourceContext());
+                }
+            }
+        }
+
+        return new SandboxNode($body, $token->getLine(), $this->getTag());
+    }
+
+    public function decideBlockEnd(Token $token)
+    {
+        return $token->test('endsandbox');
+    }
+
+    public function getTag()
+    {
+        return 'sandbox';
     }
 }
+
+class_alias('Twig\TokenParser\SandboxTokenParser', 'Twig_TokenParser_Sandbox');
diff --git a/vendor/twig/twig/src/TokenParser/SetTokenParser.php b/vendor/twig/twig/src/TokenParser/SetTokenParser.php
index a9d04d7d..82fee26a 100644
--- a/vendor/twig/twig/src/TokenParser/SetTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/SetTokenParser.php
@@ -1,11 +1,72 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Set');
+use Twig\Error\SyntaxError;
+use Twig\Node\SetNode;
+use Twig\Token;
 
-if (\false) {
-    class SetTokenParser extends \Twig_TokenParser_Set
+/**
+ * Defines a variable.
+ *
+ *  {% set foo = 'foo' %}
+ *  {% set foo = [1, 2] %}
+ *  {% set foo = {'foo': 'bar'} %}
+ *  {% set foo = 'foo' ~ 'bar' %}
+ *  {% set foo, bar = 'foo', 'bar' %}
+ *  {% set foo %}Some content{% endset %}
+ */
+final class SetTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $lineno = $token->getLine();
+        $stream = $this->parser->getStream();
+        $names = $this->parser->getExpressionParser()->parseAssignmentExpression();
+
+        $capture = false;
+        if ($stream->nextIf(/* Token::OPERATOR_TYPE */ 8, '=')) {
+            $values = $this->parser->getExpressionParser()->parseMultitargetExpression();
+
+            $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+            if (\count($names) !== \count($values)) {
+                throw new SyntaxError('When using set, you must have the same number of variables and assignments.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
+            }
+        } else {
+            $capture = true;
+
+            if (\count($names) > 1) {
+                throw new SyntaxError('When using set with a block, you cannot have a multi-target.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
+            }
+
+            $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+            $values = $this->parser->subparse([$this, 'decideBlockEnd'], true);
+            $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+        }
+
+        return new SetNode($capture, $names, $values, $lineno, $this->getTag());
+    }
+
+    public function decideBlockEnd(Token $token)
+    {
+        return $token->test('endset');
+    }
+
+    public function getTag()
+    {
+        return 'set';
     }
 }
+
+class_alias('Twig\TokenParser\SetTokenParser', 'Twig_TokenParser_Set');
diff --git a/vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php b/vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php
index 5e7e3dd9..601e476f 100644
--- a/vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/SpacelessTokenParser.php
@@ -1,11 +1,56 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Spaceless');
+use Twig\Node\SpacelessNode;
+use Twig\Token;
 
-if (\false) {
-    class SpacelessTokenParser extends \Twig_TokenParser_Spaceless
+/**
+ * Remove whitespaces between HTML tags.
+ *
+ *   {% spaceless %}
+ *      <div>
+ *          <strong>foo</strong>
+ *      </div>
+ *   {% endspaceless %}
+ *   {# output will be <div><strong>foo</strong></div> #}
+ *
+ * @deprecated since Twig 2.7, to be removed in 3.0 (use the spaceless filter instead)
+ */
+final class SpacelessTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $stream = $this->parser->getStream();
+        $lineno = $token->getLine();
+
+        @trigger_error(sprintf('The spaceless tag in "%s" at line %d is deprecated since Twig 2.7, use the spaceless filter instead.', $stream->getSourceContext()->getName(), $lineno), E_USER_DEPRECATED);
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+        $body = $this->parser->subparse([$this, 'decideSpacelessEnd'], true);
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        return new SpacelessNode($body, $lineno, $this->getTag());
+    }
+
+    public function decideSpacelessEnd(Token $token)
+    {
+        return $token->test('endspaceless');
+    }
+
+    public function getTag()
+    {
+        return 'spaceless';
     }
 }
+
+class_alias('Twig\TokenParser\SpacelessTokenParser', 'Twig_TokenParser_Spaceless');
diff --git a/vendor/twig/twig/src/TokenParser/TokenParserInterface.php b/vendor/twig/twig/src/TokenParser/TokenParserInterface.php
index 08ab0c92..6f34106f 100644
--- a/vendor/twig/twig/src/TokenParser/TokenParserInterface.php
+++ b/vendor/twig/twig/src/TokenParser/TokenParserInterface.php
@@ -1,11 +1,52 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParserInterface');
+use Twig\Error\SyntaxError;
+use Twig\Node\Node;
+use Twig\Parser;
+use Twig\Token;
+
+/**
+ * Interface implemented by token parsers.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+interface TokenParserInterface
+{
+    /**
+     * Sets the parser associated with this token parser.
+     */
+    public function setParser(Parser $parser);
+
+    /**
+     * Parses a token and returns a node.
+     *
+     * @return Node
+     *
+     * @throws SyntaxError
+     */
+    public function parse(Token $token);
 
-if (\false) {
-    interface TokenParserInterface extends \Twig_TokenParserInterface
-    {
-    }
+    /**
+     * Gets the tag name associated with this token parser.
+     *
+     * @return string The tag name
+     */
+    public function getTag();
 }
+
+class_alias('Twig\TokenParser\TokenParserInterface', 'Twig_TokenParserInterface');
+
+// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name.
+class_exists('Twig\Token');
+class_exists('Twig\Parser');
diff --git a/vendor/twig/twig/src/TokenParser/UseTokenParser.php b/vendor/twig/twig/src/TokenParser/UseTokenParser.php
index db58a605..266efe5d 100644
--- a/vendor/twig/twig/src/TokenParser/UseTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/UseTokenParser.php
@@ -1,11 +1,73 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_Use');
+use Twig\Error\SyntaxError;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Node;
+use Twig\Token;
 
-if (\false) {
-    class UseTokenParser extends \Twig_TokenParser_Use
+/**
+ * Imports blocks defined in another template into the current template.
+ *
+ *    {% extends "base.html" %}
+ *
+ *    {% use "blocks.html" %}
+ *
+ *    {% block title %}{% endblock %}
+ *    {% block content %}{% endblock %}
+ *
+ * @see https://twig.symfony.com/doc/templates.html#horizontal-reuse for details.
+ */
+final class UseTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $template = $this->parser->getExpressionParser()->parseExpression();
+        $stream = $this->parser->getStream();
+
+        if (!$template instanceof ConstantExpression) {
+            throw new SyntaxError('The template references in a "use" statement must be a string.', $stream->getCurrent()->getLine(), $stream->getSourceContext());
+        }
+
+        $targets = [];
+        if ($stream->nextIf('with')) {
+            do {
+                $name = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
+
+                $alias = $name;
+                if ($stream->nextIf('as')) {
+                    $alias = $stream->expect(/* Token::NAME_TYPE */ 5)->getValue();
+                }
+
+                $targets[$name] = new ConstantExpression($alias, -1);
+
+                if (!$stream->nextIf(/* Token::PUNCTUATION_TYPE */ 9, ',')) {
+                    break;
+                }
+            } while (true);
+        }
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        $this->parser->addTrait(new Node(['template' => $template, 'targets' => new Node($targets)]));
+
+        return new Node();
+    }
+
+    public function getTag()
+    {
+        return 'use';
     }
 }
+
+class_alias('Twig\TokenParser\UseTokenParser', 'Twig_TokenParser_Use');
diff --git a/vendor/twig/twig/src/TokenParser/WithTokenParser.php b/vendor/twig/twig/src/TokenParser/WithTokenParser.php
index 518d6f59..c184fd75 100644
--- a/vendor/twig/twig/src/TokenParser/WithTokenParser.php
+++ b/vendor/twig/twig/src/TokenParser/WithTokenParser.php
@@ -1,11 +1,55 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\TokenParser;
 
-class_exists('Twig_TokenParser_With');
+use Twig\Node\WithNode;
+use Twig\Token;
 
-if (\false) {
-    class WithTokenParser extends \Twig_TokenParser_With
+/**
+ * Creates a nested scope.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class WithTokenParser extends AbstractTokenParser
+{
+    public function parse(Token $token)
     {
+        $stream = $this->parser->getStream();
+
+        $variables = null;
+        $only = false;
+        if (!$stream->test(/* Token::BLOCK_END_TYPE */ 3)) {
+            $variables = $this->parser->getExpressionParser()->parseExpression();
+            $only = (bool) $stream->nextIf(/* Token::NAME_TYPE */ 5, 'only');
+        }
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        $body = $this->parser->subparse([$this, 'decideWithEnd'], true);
+
+        $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
+
+        return new WithNode($body, $variables, $only, $token->getLine(), $this->getTag());
+    }
+
+    public function decideWithEnd(Token $token)
+    {
+        return $token->test('endwith');
+    }
+
+    public function getTag()
+    {
+        return 'with';
     }
 }
+
+class_alias('Twig\TokenParser\WithTokenParser', 'Twig_TokenParser_With');
diff --git a/vendor/twig/twig/src/TokenStream.php b/vendor/twig/twig/src/TokenStream.php
index 2dcf38ea..3fb9e86e 100644
--- a/vendor/twig/twig/src/TokenStream.php
+++ b/vendor/twig/twig/src/TokenStream.php
@@ -1,11 +1,134 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ * (c) Armin Ronacher
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_TokenStream');
+use Twig\Error\SyntaxError;
+
+/**
+ * Represents a token stream.
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class TokenStream
+{
+    private $tokens;
+    private $current = 0;
+    private $source;
+
+    public function __construct(array $tokens, Source $source = null)
+    {
+        $this->tokens = $tokens;
+        $this->source = $source ?: new Source('', '');
+    }
+
+    public function __toString()
+    {
+        return implode("\n", $this->tokens);
+    }
+
+    public function injectTokens(array $tokens)
+    {
+        $this->tokens = array_merge(\array_slice($this->tokens, 0, $this->current), $tokens, \array_slice($this->tokens, $this->current));
+    }
+
+    /**
+     * Sets the pointer to the next token and returns the old one.
+     */
+    public function next(): Token
+    {
+        if (!isset($this->tokens[++$this->current])) {
+            throw new SyntaxError('Unexpected end of template.', $this->tokens[$this->current - 1]->getLine(), $this->source);
+        }
+
+        return $this->tokens[$this->current - 1];
+    }
+
+    /**
+     * Tests a token, sets the pointer to the next one and returns it or throws a syntax error.
+     *
+     * @return Token|null The next token if the condition is true, null otherwise
+     */
+    public function nextIf($primary, $secondary = null)
+    {
+        if ($this->tokens[$this->current]->test($primary, $secondary)) {
+            return $this->next();
+        }
+    }
+
+    /**
+     * Tests a token and returns it or throws a syntax error.
+     */
+    public function expect($type, $value = null, string $message = null): Token
+    {
+        $token = $this->tokens[$this->current];
+        if (!$token->test($type, $value)) {
+            $line = $token->getLine();
+            throw new SyntaxError(sprintf('%sUnexpected token "%s"%s ("%s" expected%s).',
+                $message ? $message.'. ' : '',
+                Token::typeToEnglish($token->getType()),
+                $token->getValue() ? sprintf(' of value "%s"', $token->getValue()) : '',
+                Token::typeToEnglish($type), $value ? sprintf(' with value "%s"', $value) : ''),
+                $line,
+                $this->source
+            );
+        }
+        $this->next();
+
+        return $token;
+    }
+
+    /**
+     * Looks at the next token.
+     */
+    public function look(int $number = 1): Token
+    {
+        if (!isset($this->tokens[$this->current + $number])) {
+            throw new SyntaxError('Unexpected end of template.', $this->tokens[$this->current + $number - 1]->getLine(), $this->source);
+        }
+
+        return $this->tokens[$this->current + $number];
+    }
+
+    /**
+     * Tests the current token.
+     */
+    public function test($primary, $secondary = null): bool
+    {
+        return $this->tokens[$this->current]->test($primary, $secondary);
+    }
+
+    /**
+     * Checks if end of stream was reached.
+     */
+    public function isEOF(): bool
+    {
+        return /* Token::EOF_TYPE */ -1 === $this->tokens[$this->current]->getType();
+    }
 
-if (\false) {
-    class TokenStream extends \Twig_TokenStream
+    public function getCurrent(): Token
     {
+        return $this->tokens[$this->current];
+    }
+
+    /**
+     * Gets the source associated with this stream.
+     *
+     * @internal
+     */
+    public function getSourceContext(): Source
+    {
+        return $this->source;
     }
 }
+
+class_alias('Twig\TokenStream', 'Twig_TokenStream');
diff --git a/vendor/twig/twig/src/TwigFilter.php b/vendor/twig/twig/src/TwigFilter.php
index 8207048f..9e7b8388 100644
--- a/vendor/twig/twig/src/TwigFilter.php
+++ b/vendor/twig/twig/src/TwigFilter.php
@@ -1,11 +1,150 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_SimpleFilter');
+use Twig\Node\Expression\FilterExpression;
+use Twig\Node\Node;
+
+/**
+ * Represents a template filter.
+ *
+ * @final since Twig 2.4.0
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @see https://twig.symfony.com/doc/templates.html#filters
+ */
+class TwigFilter
+{
+    private $name;
+    private $callable;
+    private $options;
+    private $arguments = [];
 
-if (\false) {
-    class TwigFilter extends \Twig_SimpleFilter
+    /**
+     * Creates a template filter.
+     *
+     * @param string        $name     Name of this filter
+     * @param callable|null $callable A callable implementing the filter. If null, you need to overwrite the "node_class" option to customize compilation.
+     * @param array         $options  Options array
+     */
+    public function __construct(string $name, $callable = null, array $options = [])
     {
+        if (__CLASS__ !== \get_class($this)) {
+            @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED);
+        }
+
+        $this->name = $name;
+        $this->callable = $callable;
+        $this->options = array_merge([
+            'needs_environment' => false,
+            'needs_context' => false,
+            'is_variadic' => false,
+            'is_safe' => null,
+            'is_safe_callback' => null,
+            'pre_escape' => null,
+            'preserves_safety' => null,
+            'node_class' => FilterExpression::class,
+            'deprecated' => false,
+            'alternative' => null,
+        ], $options);
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns the callable to execute for this filter.
+     *
+     * @return callable|null
+     */
+    public function getCallable()
+    {
+        return $this->callable;
+    }
+
+    public function getNodeClass()
+    {
+        return $this->options['node_class'];
+    }
+
+    public function setArguments($arguments)
+    {
+        $this->arguments = $arguments;
+    }
+
+    public function getArguments()
+    {
+        return $this->arguments;
+    }
+
+    public function needsEnvironment()
+    {
+        return $this->options['needs_environment'];
+    }
+
+    public function needsContext()
+    {
+        return $this->options['needs_context'];
+    }
+
+    public function getSafe(Node $filterArgs)
+    {
+        if (null !== $this->options['is_safe']) {
+            return $this->options['is_safe'];
+        }
+
+        if (null !== $this->options['is_safe_callback']) {
+            return $this->options['is_safe_callback']($filterArgs);
+        }
+    }
+
+    public function getPreservesSafety()
+    {
+        return $this->options['preserves_safety'];
+    }
+
+    public function getPreEscape()
+    {
+        return $this->options['pre_escape'];
+    }
+
+    public function isVariadic()
+    {
+        return $this->options['is_variadic'];
+    }
+
+    public function isDeprecated()
+    {
+        return (bool) $this->options['deprecated'];
+    }
+
+    public function getDeprecatedVersion()
+    {
+        return $this->options['deprecated'];
+    }
+
+    public function getAlternative()
+    {
+        return $this->options['alternative'];
     }
 }
+
+// For Twig 1.x compatibility
+class_alias('Twig\TwigFilter', 'Twig_SimpleFilter', false);
+
+class_alias('Twig\TwigFilter', 'Twig_Filter');
+
+// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name.
+class_exists('Twig\Node\Node');
diff --git a/vendor/twig/twig/src/TwigFunction.php b/vendor/twig/twig/src/TwigFunction.php
index d8b8605f..c5779af6 100644
--- a/vendor/twig/twig/src/TwigFunction.php
+++ b/vendor/twig/twig/src/TwigFunction.php
@@ -1,11 +1,140 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_SimpleFunction');
+use Twig\Node\Expression\FunctionExpression;
+use Twig\Node\Node;
+
+/**
+ * Represents a template function.
+ *
+ * @final
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @see https://twig.symfony.com/doc/templates.html#functions
+ */
+class TwigFunction
+{
+    private $name;
+    private $callable;
+    private $options;
+    private $arguments = [];
+
+    /**
+     * Creates a template function.
+     *
+     * @param string        $name     Name of this function
+     * @param callable|null $callable A callable implementing the function. If null, you need to overwrite the "node_class" option to customize compilation.
+     * @param array         $options  Options array
+     */
+    public function __construct(string $name, $callable = null, array $options = [])
+    {
+        if (__CLASS__ !== \get_class($this)) {
+            @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED);
+        }
+
+        $this->name = $name;
+        $this->callable = $callable;
+        $this->options = array_merge([
+            'needs_environment' => false,
+            'needs_context' => false,
+            'is_variadic' => false,
+            'is_safe' => null,
+            'is_safe_callback' => null,
+            'node_class' => FunctionExpression::class,
+            'deprecated' => false,
+            'alternative' => null,
+        ], $options);
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns the callable to execute for this function.
+     *
+     * @return callable|null
+     */
+    public function getCallable()
+    {
+        return $this->callable;
+    }
+
+    public function getNodeClass()
+    {
+        return $this->options['node_class'];
+    }
+
+    public function setArguments($arguments)
+    {
+        $this->arguments = $arguments;
+    }
+
+    public function getArguments()
+    {
+        return $this->arguments;
+    }
+
+    public function needsEnvironment()
+    {
+        return $this->options['needs_environment'];
+    }
+
+    public function needsContext()
+    {
+        return $this->options['needs_context'];
+    }
+
+    public function getSafe(Node $functionArgs)
+    {
+        if (null !== $this->options['is_safe']) {
+            return $this->options['is_safe'];
+        }
+
+        if (null !== $this->options['is_safe_callback']) {
+            return $this->options['is_safe_callback']($functionArgs);
+        }
+
+        return [];
+    }
+
+    public function isVariadic()
+    {
+        return $this->options['is_variadic'];
+    }
+
+    public function isDeprecated()
+    {
+        return (bool) $this->options['deprecated'];
+    }
 
-if (\false) {
-    class TwigFunction extends \Twig_SimpleFunction
+    public function getDeprecatedVersion()
     {
+        return $this->options['deprecated'];
+    }
+
+    public function getAlternative()
+    {
+        return $this->options['alternative'];
     }
 }
+
+// For Twig 1.x compatibility
+class_alias('Twig\TwigFunction', 'Twig_SimpleFunction', false);
+
+class_alias('Twig\TwigFunction', 'Twig_Function');
+
+// Ensure that the aliased name is loaded to keep BC for classes implementing the typehint with the old aliased name.
+class_exists('Twig\Node\Node');
diff --git a/vendor/twig/twig/src/TwigTest.php b/vendor/twig/twig/src/TwigTest.php
index 11248827..e15da41c 100644
--- a/vendor/twig/twig/src/TwigTest.php
+++ b/vendor/twig/twig/src/TwigTest.php
@@ -1,11 +1,109 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig;
 
-class_exists('Twig_SimpleTest');
+use Twig\Node\Expression\TestExpression;
+
+/**
+ * Represents a template test.
+ *
+ * @final since Twig 2.4.0
+ *
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ *
+ * @see https://twig.symfony.com/doc/templates.html#test-operator
+ */
+class TwigTest
+{
+    private $name;
+    private $callable;
+    private $options;
+    private $arguments = [];
+
+    /**
+     * Creates a template test.
+     *
+     * @param string        $name     Name of this test
+     * @param callable|null $callable A callable implementing the test. If null, you need to overwrite the "node_class" option to customize compilation.
+     * @param array         $options  Options array
+     */
+    public function __construct(string $name, $callable = null, array $options = [])
+    {
+        if (__CLASS__ !== \get_class($this)) {
+            @trigger_error('Overriding '.__CLASS__.' is deprecated since Twig 2.4.0 and the class will be final in 3.0.', E_USER_DEPRECATED);
+        }
+
+        $this->name = $name;
+        $this->callable = $callable;
+        $this->options = array_merge([
+            'is_variadic' => false,
+            'node_class' => TestExpression::class,
+            'deprecated' => false,
+            'alternative' => null,
+        ], $options);
+    }
+
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Returns the callable to execute for this test.
+     *
+     * @return callable|null
+     */
+    public function getCallable()
+    {
+        return $this->callable;
+    }
+
+    public function getNodeClass()
+    {
+        return $this->options['node_class'];
+    }
+
+    public function setArguments($arguments)
+    {
+        $this->arguments = $arguments;
+    }
+
+    public function getArguments()
+    {
+        return $this->arguments;
+    }
+
+    public function isVariadic()
+    {
+        return $this->options['is_variadic'];
+    }
 
-if (\false) {
-    class TwigTest extends \Twig_SimpleTest
+    public function isDeprecated()
     {
+        return (bool) $this->options['deprecated'];
+    }
+
+    public function getDeprecatedVersion()
+    {
+        return $this->options['deprecated'];
+    }
+
+    public function getAlternative()
+    {
+        return $this->options['alternative'];
     }
 }
+
+// For Twig 1.x compatibility
+class_alias('Twig\TwigTest', 'Twig_SimpleTest', false);
+
+class_alias('Twig\TwigTest', 'Twig_Test');
diff --git a/vendor/twig/twig/src/Util/DeprecationCollector.php b/vendor/twig/twig/src/Util/DeprecationCollector.php
index 002713f1..d3736984 100644
--- a/vendor/twig/twig/src/Util/DeprecationCollector.php
+++ b/vendor/twig/twig/src/Util/DeprecationCollector.php
@@ -1,11 +1,79 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Util;
 
-class_exists('Twig_Util_DeprecationCollector');
+use Twig\Environment;
+use Twig\Error\SyntaxError;
+use Twig\Source;
+
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+final class DeprecationCollector
+{
+    private $twig;
 
-if (\false) {
-    class DeprecationCollector extends \Twig_Util_DeprecationCollector
+    public function __construct(Environment $twig)
     {
+        $this->twig = $twig;
+    }
+
+    /**
+     * Returns deprecations for templates contained in a directory.
+     *
+     * @param string $dir A directory where templates are stored
+     * @param string $ext Limit the loaded templates by extension
+     *
+     * @return array An array of deprecations
+     */
+    public function collectDir($dir, $ext = '.twig')
+    {
+        $iterator = new \RegexIterator(
+            new \RecursiveIteratorIterator(
+                new \RecursiveDirectoryIterator($dir), \RecursiveIteratorIterator::LEAVES_ONLY
+            ), '{'.preg_quote($ext).'$}'
+        );
+
+        return $this->collect(new TemplateDirIterator($iterator));
+    }
+
+    /**
+     * Returns deprecations for passed templates.
+     *
+     * @param \Traversable $iterator An iterator of templates (where keys are template names and values the contents of the template)
+     *
+     * @return array An array of deprecations
+     */
+    public function collect(\Traversable $iterator)
+    {
+        $deprecations = [];
+        set_error_handler(function ($type, $msg) use (&$deprecations) {
+            if (E_USER_DEPRECATED === $type) {
+                $deprecations[] = $msg;
+            }
+        });
+
+        foreach ($iterator as $name => $contents) {
+            try {
+                $this->twig->parse($this->twig->tokenize(new Source($contents, $name)));
+            } catch (SyntaxError $e) {
+                // ignore templates containing syntax errors
+            }
+        }
+
+        restore_error_handler();
+
+        return $deprecations;
     }
 }
+
+class_alias('Twig\Util\DeprecationCollector', 'Twig_Util_DeprecationCollector');
diff --git a/vendor/twig/twig/src/Util/TemplateDirIterator.php b/vendor/twig/twig/src/Util/TemplateDirIterator.php
index 0e1352cc..1ab0dac5 100644
--- a/vendor/twig/twig/src/Util/TemplateDirIterator.php
+++ b/vendor/twig/twig/src/Util/TemplateDirIterator.php
@@ -1,11 +1,30 @@
 <?php
 
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
 namespace Twig\Util;
 
-class_exists('Twig_Util_TemplateDirIterator');
+/**
+ * @author Fabien Potencier <fabien@xxxxxxxxxxx>
+ */
+class TemplateDirIterator extends \IteratorIterator
+{
+    public function current()
+    {
+        return file_get_contents(parent::current());
+    }
 
-if (\false) {
-    class TemplateDirIterator extends \Twig_Util_TemplateDirIterator
+    public function key()
     {
+        return (string) parent::key();
     }
 }
+
+class_alias('Twig\Util\TemplateDirIterator', 'Twig_Util_TemplateDirIterator');
diff --git a/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php b/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php
deleted file mode 100644
index 42529402..00000000
--- a/vendor/twig/twig/test/Twig/Tests/AutoloaderTest.php
+++ /dev/null
@@ -1,24 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-class Twig_Tests_AutoloaderTest extends \PHPUnit\Framework\TestCase
-{
-    /**
-     * @group legacy
-     */
-    public function testAutoload()
-    {
-        $this->assertFalse(class_exists('FooBarFoo'), '->autoload() does not try to load classes that does not begin with Twig');
-
-        $autoloader = new Twig_Autoloader();
-        $this->assertNull($autoloader->autoload('Foo'), '->autoload() returns false if it is not able to load a class');
-    }
-}
diff --git a/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php b/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php
index e9e600c1..8ea464d6 100644
--- a/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Cache/FilesystemTest.php
@@ -9,7 +9,9 @@
  * file that was distributed with this source code.
  */
 
-require_once dirname(dirname(__FILE__)).'/FilesystemHelper.php';
+use Twig\Cache\FilesystemCache;
+
+require_once \dirname(__DIR__).'/FilesystemHelper.php';
 
 class Twig_Tests_Cache_FilesystemTest extends \PHPUnit\Framework\TestCase
 {
@@ -22,7 +24,7 @@ class Twig_Tests_Cache_FilesystemTest extends \PHPUnit\Framework\TestCase
         $nonce = hash('sha256', uniqid(mt_rand(), true));
         $this->classname = '__Twig_Tests_Cache_FilesystemTest_Template_'.$nonce;
         $this->directory = sys_get_temp_dir().'/twig-test';
-        $this->cache = new Twig_Cache_Filesystem($this->directory);
+        $this->cache = new FilesystemCache($this->directory);
     }
 
     protected function tearDown()
@@ -36,7 +38,7 @@ class Twig_Tests_Cache_FilesystemTest extends \PHPUnit\Framework\TestCase
     {
         $key = $this->directory.'/cache/cachefile.php';
 
-        $dir = dirname($key);
+        $dir = \dirname($key);
         @mkdir($dir, 0777, true);
         $this->assertTrue(is_dir($dir));
         $this->assertFalse(class_exists($this->classname, false));
@@ -76,12 +78,12 @@ class Twig_Tests_Cache_FilesystemTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * @expectedException RuntimeException
+     * @expectedException \RuntimeException
      * @expectedExceptionMessage Unable to create the cache directory
      */
     public function testWriteFailMkdir()
     {
-        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+        if (\defined('PHP_WINDOWS_VERSION_BUILD')) {
             $this->markTestSkipped('Read-only directories not possible on Windows.');
         }
 
@@ -98,12 +100,12 @@ class Twig_Tests_Cache_FilesystemTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * @expectedException RuntimeException
+     * @expectedException \RuntimeException
      * @expectedExceptionMessage Unable to write in the cache directory
      */
     public function testWriteFailDirWritable()
     {
-        if (defined('PHP_WINDOWS_VERSION_BUILD')) {
+        if (\defined('PHP_WINDOWS_VERSION_BUILD')) {
             $this->markTestSkipped('Read-only directories not possible on Windows.');
         }
 
@@ -122,7 +124,7 @@ class Twig_Tests_Cache_FilesystemTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * @expectedException RuntimeException
+     * @expectedException \RuntimeException
      * @expectedExceptionMessage Failed to write cache file
      */
     public function testWriteFailWriteFile()
@@ -143,7 +145,7 @@ class Twig_Tests_Cache_FilesystemTest extends \PHPUnit\Framework\TestCase
     {
         $key = $this->directory.'/cache/cachefile.php';
 
-        $dir = dirname($key);
+        $dir = \dirname($key);
         @mkdir($dir, 0777, true);
         $this->assertTrue(is_dir($dir));
 
@@ -166,28 +168,28 @@ class Twig_Tests_Cache_FilesystemTest extends \PHPUnit\Framework\TestCase
      */
     public function testGenerateKey($expected, $input)
     {
-        $cache = new Twig_Cache_Filesystem($input);
-        $this->assertRegExp($expected, $cache->generateKey('_test_', get_class($this)));
+        $cache = new FilesystemCache($input);
+        $this->assertRegExp($expected, $cache->generateKey('_test_', \get_class($this)));
     }
 
     public function provideDirectories()
     {
         $pattern = '#a/b/[a-zA-Z0-9]+/[a-zA-Z0-9]+.php$#';
 
-        return array(
-            array($pattern, 'a/b'),
-            array($pattern, 'a/b/'),
-            array($pattern, 'a/b\\'),
-            array($pattern, 'a/b\\/'),
-            array($pattern, 'a/b\\//'),
-            array('#/'.substr($pattern, 1), '/a/b'),
-        );
+        return [
+            [$pattern, 'a/b'],
+            [$pattern, 'a/b/'],
+            [$pattern, 'a/b\\'],
+            [$pattern, 'a/b\\/'],
+            [$pattern, 'a/b\\//'],
+            ['#/'.substr($pattern, 1), '/a/b'],
+        ];
     }
 
     private function generateSource()
     {
-        return strtr('<?php class {{classname}} {}', array(
+        return strtr('<?php class {{classname}} {}', [
             '{{classname}}' => $this->classname,
-        ));
+        ]);
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/CompilerTest.php b/vendor/twig/twig/test/Twig/Tests/CompilerTest.php
index 4d4b8df9..f03342af 100644
--- a/vendor/twig/twig/test/Twig/Tests/CompilerTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/CompilerTest.php
@@ -9,18 +9,22 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Compiler;
+use Twig\Environment;
+use Twig\Loader\LoaderInterface;
+
 class Twig_Tests_CompilerTest extends \PHPUnit\Framework\TestCase
 {
     public function testReprNumericValueWithLocale()
     {
-        $compiler = new Twig_Compiler(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
+        $compiler = new Compiler(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
 
         $locale = setlocale(LC_NUMERIC, 0);
         if (false === $locale) {
             $this->markTestSkipped('Your platform does not support locales.');
         }
 
-        $required_locales = array('fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252');
+        $required_locales = ['fr_FR.UTF-8', 'fr_FR.UTF8', 'fr_FR.utf-8', 'fr_FR.utf8', 'French_France.1252'];
         if (false === setlocale(LC_NUMERIC, $required_locales)) {
             $this->markTestSkipped('Could not set any of required locales: '.implode(', ', $required_locales));
         }
diff --git a/vendor/twig/twig/test/Twig/Tests/ContainerRuntimeLoaderTest.php b/vendor/twig/twig/test/Twig/Tests/ContainerRuntimeLoaderTest.php
index c111f928..488e855a 100644
--- a/vendor/twig/twig/test/Twig/Tests/ContainerRuntimeLoaderTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/ContainerRuntimeLoaderTest.php
@@ -9,32 +9,28 @@
  * file that was distributed with this source code.
  */
 
+use Psr\Container\ContainerInterface;
+use Twig\RuntimeLoader\ContainerRuntimeLoader;
+
 class Twig_Tests_ContainerRuntimeLoaderTest extends \PHPUnit\Framework\TestCase
 {
-    /**
-     * @requires PHP 5.3
-     */
     public function testLoad()
     {
-        $container = $this->getMockBuilder('Psr\Container\ContainerInterface')->getMock();
+        $container = $this->getMockBuilder(ContainerInterface::class)->getMock();
         $container->expects($this->once())->method('has')->with('stdClass')->willReturn(true);
-        $container->expects($this->once())->method('get')->with('stdClass')->willReturn(new stdClass());
+        $container->expects($this->once())->method('get')->with('stdClass')->willReturn(new \stdClass());
 
-        $loader = new Twig_ContainerRuntimeLoader($container);
+        $loader = new ContainerRuntimeLoader($container);
 
         $this->assertInstanceOf('stdClass', $loader->load('stdClass'));
     }
 
-    /**
-     * @requires PHP 5.3
-     */
     public function testLoadUnknownRuntimeReturnsNull()
     {
-        $container = $this->getMockBuilder('Psr\Container\ContainerInterface')->getMock();
+        $container = $this->getMockBuilder(ContainerInterface::class)->getMock();
         $container->expects($this->once())->method('has')->with('Foo');
         $container->expects($this->never())->method('get');
 
-        $loader = new Twig_ContainerRuntimeLoader($container);
-        $this->assertNull($loader->load('Foo'));
+        $this->assertNull((new ContainerRuntimeLoader($container))->load('Foo'));
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/CustomExtensionTest.php b/vendor/twig/twig/test/Twig/Tests/CustomExtensionTest.php
index f9d44fda..4d05ac14 100644
--- a/vendor/twig/twig/test/Twig/Tests/CustomExtensionTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/CustomExtensionTest.php
@@ -9,13 +9,16 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Environment;
+use Twig\Extension\ExtensionInterface;
+use Twig\Loader\LoaderInterface;
+
 class CustomExtensionTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @requires PHP 5.3
      * @dataProvider provideInvalidExtensions
      */
-    public function testGetInvalidOperators(Twig_ExtensionInterface $extension, $expectedExceptionMessage)
+    public function testGetInvalidOperators(ExtensionInterface $extension, $expectedExceptionMessage)
     {
         if (method_exists($this, 'expectException')) {
             $this->expectException('InvalidArgumentException');
@@ -24,21 +27,21 @@ class CustomExtensionTest extends \PHPUnit\Framework\TestCase
             $this->setExpectedException('InvalidArgumentException', $expectedExceptionMessage);
         }
 
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $env->addExtension($extension);
         $env->getUnaryOperators();
     }
 
     public function provideInvalidExtensions()
     {
-        return array(
-            array(new InvalidOperatorExtension(new stdClass()), '"InvalidOperatorExtension::getOperators()" must return an array with operators, got "stdClass".'),
-            array(new InvalidOperatorExtension(array(1, 2, 3)), '"InvalidOperatorExtension::getOperators()" must return an array of 2 elements, got 3.'),
-        );
+        return [
+            [new InvalidOperatorExtension(new \stdClass()), '"InvalidOperatorExtension::getOperators()" must return an array with operators, got "stdClass".'],
+            [new InvalidOperatorExtension([1, 2, 3]), '"InvalidOperatorExtension::getOperators()" must return an array of 2 elements, got 3.'],
+        ];
     }
 }
 
-class InvalidOperatorExtension implements Twig_ExtensionInterface
+class InvalidOperatorExtension implements ExtensionInterface
 {
     private $operators;
 
@@ -47,47 +50,33 @@ class InvalidOperatorExtension implements Twig_ExtensionInterface
         $this->operators = $operators;
     }
 
-    public function initRuntime(Twig_Environment $environment)
-    {
-    }
-
     public function getTokenParsers()
     {
-        return array();
+        return [];
     }
 
     public function getNodeVisitors()
     {
-        return array();
+        return [];
     }
 
     public function getFilters()
     {
-        return array();
+        return [];
     }
 
     public function getTests()
     {
-        return array();
+        return [];
     }
 
     public function getFunctions()
     {
-        return array();
-    }
-
-    public function getGlobals()
-    {
-        return array();
+        return [];
     }
 
     public function getOperators()
     {
         return $this->operators;
     }
-
-    public function getName()
-    {
-        return __CLASS__;
-    }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php b/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
index ca9f2cf8..a164a0cd 100644
--- a/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/EnvironmentTest.php
@@ -9,59 +9,42 @@
  * file that was distributed with this source code.
  */
 
-require_once dirname(__FILE__).'/FilesystemHelper.php';
+use Twig\Cache\CacheInterface;
+use Twig\Cache\FilesystemCache;
+use Twig\Environment;
+use Twig\Extension\AbstractExtension;
+use Twig\Extension\ExtensionInterface;
+use Twig\Extension\GlobalsInterface;
+use Twig\Extension\InitRuntimeInterface;
+use Twig\Loader\ArrayLoader;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\Node;
+use Twig\NodeVisitor\NodeVisitorInterface;
+use Twig\RuntimeLoader\RuntimeLoaderInterface;
+use Twig\Source;
+use Twig\Token;
+use Twig\TokenParser\AbstractTokenParser;
+use Twig\TwigFilter;
+use Twig\TwigFunction;
+use Twig\TwigTest;
 
 class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
 {
-    private $deprecations = array();
-
-    /**
-     * @group legacy
-     */
-    public function testLegacyTokenizeSignature()
-    {
-        $env = new Twig_Environment();
-        $stream = $env->tokenize('{{ foo }}', 'foo');
-        $this->assertEquals('{{ foo }}', $stream->getSource());
-        $this->assertEquals('foo', $stream->getFilename());
-    }
-
-    /**
-     * @group legacy
-     */
-    public function testLegacyCompileSourceSignature()
-    {
-        $loader = new Twig_Loader_Array(array('foo' => '{{ foo }}'));
-        $env = new Twig_Environment($loader);
-        $this->assertContains('getTemplateName', $env->compileSource('{{ foo }}', 'foo'));
-    }
-
-    /**
-     * @expectedException        LogicException
-     * @expectedExceptionMessage You must set a loader first.
-     * @group legacy
-     */
-    public function testRenderNoLoader()
-    {
-        $env = new Twig_Environment();
-        $env->render('test');
-    }
-
     public function testAutoescapeOption()
     {
-        $loader = new Twig_Loader_Array(array(
+        $loader = new ArrayLoader([
             'html' => '{{ foo }} {{ foo }}',
             'js' => '{{ bar }} {{ bar }}',
-        ));
+        ]);
 
-        $twig = new Twig_Environment($loader, array(
+        $twig = new Environment($loader, [
             'debug' => true,
             'cache' => false,
-            'autoescape' => array($this, 'escapingStrategyCallback'),
-        ));
+            'autoescape' => [$this, 'escapingStrategyCallback'],
+        ]);
 
-        $this->assertEquals('foo&lt;br/ &gt; foo&lt;br/ &gt;', $twig->render('html', array('foo' => 'foo<br/ >')));
-        $this->assertEquals('foo\x3Cbr\x2F\x20\x3E foo\x3Cbr\x2F\x20\x3E', $twig->render('js', array('bar' => 'foo<br/ >')));
+        $this->assertEquals('foo&lt;br/ &gt; foo&lt;br/ &gt;', $twig->render('html', ['foo' => 'foo<br/ >']));
+        $this->assertEquals('foo\u003Cbr\/\u0020\u003E foo\u003Cbr\/\u0020\u003E', $twig->render('js', ['bar' => 'foo<br/ >']));
     }
 
     public function escapingStrategyCallback($name)
@@ -71,14 +54,11 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
 
     public function testGlobals()
     {
-        // to be removed in 2.0
-        $loader = $this->getMockBuilder('Twig_EnvironmentTestLoaderInterface')->getMock();
-        //$loader = $this->getMockBuilder(array('Twig_LoaderInterface', 'Twig_SourceContextLoaderInterface'))->getMock();
-        $loader->expects($this->any())->method('getSourceContext')->will($this->returnValue(new Twig_Source('', '')));
+        $loader = $this->getMockBuilder(LoaderInterface::class)->getMock();
+        $loader->expects($this->any())->method('getSourceContext')->willReturn(new Source('', ''));
 
         // globals can be added after calling getGlobals
-
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
         $twig->addGlobal('foo', 'foo');
         $twig->getGlobals();
         $twig->addGlobal('foo', 'bar');
@@ -86,16 +66,16 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals('bar', $globals['foo']);
 
         // globals can be modified after a template has been loaded
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
         $twig->addGlobal('foo', 'foo');
         $twig->getGlobals();
-        $twig->loadTemplate('index');
+        $twig->load('index');
         $twig->addGlobal('foo', 'bar');
         $globals = $twig->getGlobals();
         $this->assertEquals('bar', $globals['foo']);
 
         // globals can be modified after extensions init
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
         $twig->addGlobal('foo', 'foo');
         $twig->getGlobals();
         $twig->getFunctions();
@@ -104,95 +84,93 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals('bar', $globals['foo']);
 
         // globals can be modified after extensions and a template has been loaded
-        $arrayLoader = new Twig_Loader_Array(array('index' => '{{foo}}'));
-        $twig = new Twig_Environment($arrayLoader);
+        $arrayLoader = new ArrayLoader(['index' => '{{foo}}']);
+        $twig = new Environment($arrayLoader);
         $twig->addGlobal('foo', 'foo');
         $twig->getGlobals();
         $twig->getFunctions();
-        $twig->loadTemplate('index');
+        $twig->load('index');
         $twig->addGlobal('foo', 'bar');
         $globals = $twig->getGlobals();
         $this->assertEquals('bar', $globals['foo']);
 
-        $twig = new Twig_Environment($arrayLoader);
+        $twig = new Environment($arrayLoader);
         $twig->getGlobals();
         $twig->addGlobal('foo', 'bar');
-        $template = $twig->loadTemplate('index');
-        $this->assertEquals('bar', $template->render(array()));
+        $template = $twig->load('index');
+        $this->assertEquals('bar', $template->render([]));
 
-        /* to be uncomment in Twig 2.0
         // globals cannot be added after a template has been loaded
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
         $twig->addGlobal('foo', 'foo');
         $twig->getGlobals();
-        $twig->loadTemplate('index');
+        $twig->load('index');
         try {
             $twig->addGlobal('bar', 'bar');
             $this->fail();
-        } catch (LogicException $e) {
-            $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
+        } catch (\LogicException $e) {
+            $this->assertArrayNotHasKey('bar', $twig->getGlobals());
         }
 
         // globals cannot be added after extensions init
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
         $twig->addGlobal('foo', 'foo');
         $twig->getGlobals();
         $twig->getFunctions();
         try {
             $twig->addGlobal('bar', 'bar');
             $this->fail();
-        } catch (LogicException $e) {
-            $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
+        } catch (\LogicException $e) {
+            $this->assertArrayNotHasKey('bar', $twig->getGlobals());
         }
 
         // globals cannot be added after extensions and a template has been loaded
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
         $twig->addGlobal('foo', 'foo');
         $twig->getGlobals();
         $twig->getFunctions();
-        $twig->loadTemplate('index');
+        $twig->load('index');
         try {
             $twig->addGlobal('bar', 'bar');
             $this->fail();
-        } catch (LogicException $e) {
-            $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
+        } catch (\LogicException $e) {
+            $this->assertArrayNotHasKey('bar', $twig->getGlobals());
         }
 
         // test adding globals after a template has been loaded without call to getGlobals
-        $twig = new Twig_Environment($loader);
-        $twig->loadTemplate('index');
+        $twig = new Environment($loader);
+        $twig->load('index');
         try {
             $twig->addGlobal('bar', 'bar');
             $this->fail();
-        } catch (LogicException $e) {
-            $this->assertFalse(array_key_exists('bar', $twig->getGlobals()));
+        } catch (\LogicException $e) {
+            $this->assertArrayNotHasKey('bar', $twig->getGlobals());
         }
-        */
     }
 
     public function testExtensionsAreNotInitializedWhenRenderingACompiledTemplate()
     {
-        $cache = new Twig_Cache_Filesystem($dir = sys_get_temp_dir().'/twig');
-        $options = array('cache' => $cache, 'auto_reload' => false, 'debug' => false);
+        $cache = new FilesystemCache($dir = sys_get_temp_dir().'/twig');
+        $options = ['cache' => $cache, 'auto_reload' => false, 'debug' => false];
 
         // force compilation
-        $twig = new Twig_Environment($loader = new Twig_Loader_Array(array('index' => '{{ foo }}')), $options);
+        $twig = new Environment($loader = new ArrayLoader(['index' => '{{ foo }}']), $options);
 
         $key = $cache->generateKey('index', $twig->getTemplateClass('index'));
-        $cache->write($key, $twig->compileSource(new Twig_Source('{{ foo }}', 'index')));
+        $cache->write($key, $twig->compileSource(new Source('{{ foo }}', 'index')));
 
         // check that extensions won't be initialized when rendering a template that is already in the cache
         $twig = $this
-            ->getMockBuilder('Twig_Environment')
-            ->setConstructorArgs(array($loader, $options))
-            ->setMethods(array('initExtensions'))
+            ->getMockBuilder(Environment::class)
+            ->setConstructorArgs([$loader, $options])
+            ->setMethods(['initExtensions'])
             ->getMock()
         ;
 
         $twig->expects($this->never())->method('initExtensions');
 
         // render template
-        $output = $twig->render('index', array('foo' => 'bar'));
+        $output = $twig->render('index', ['foo' => 'bar']);
         $this->assertEquals('bar', $output);
 
         Twig_Tests_FilesystemHelper::removeDir($dir);
@@ -203,18 +181,18 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
         $templateName = __FUNCTION__;
         $templateContent = __FUNCTION__;
 
-        $cache = $this->getMockBuilder('Twig_CacheInterface')->getMock();
+        $cache = $this->getMockBuilder(CacheInterface::class)->getMock();
         $loader = $this->getMockLoader($templateName, $templateContent);
-        $twig = new Twig_Environment($loader, array('cache' => $cache, 'auto_reload' => true, 'debug' => false));
+        $twig = new Environment($loader, ['cache' => $cache, 'auto_reload' => true, 'debug' => false]);
 
         // Cache miss: getTimestamp returns 0 and as a result the load() is
         // skipped.
         $cache->expects($this->once())
             ->method('generateKey')
-            ->will($this->returnValue('key'));
+            ->willReturn('key');
         $cache->expects($this->once())
             ->method('getTimestamp')
-            ->will($this->returnValue(0));
+            ->willReturn(0);
         $loader->expects($this->never())
             ->method('isFresh');
         $cache->expects($this->once())
@@ -222,7 +200,7 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
         $cache->expects($this->once())
             ->method('load');
 
-        $twig->loadTemplate($templateName);
+        $twig->load($templateName);
     }
 
     public function testAutoReloadCacheHit()
@@ -230,9 +208,9 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
         $templateName = __FUNCTION__;
         $templateContent = __FUNCTION__;
 
-        $cache = $this->getMockBuilder('Twig_CacheInterface')->getMock();
+        $cache = $this->getMockBuilder(CacheInterface::class)->getMock();
         $loader = $this->getMockLoader($templateName, $templateContent);
-        $twig = new Twig_Environment($loader, array('cache' => $cache, 'auto_reload' => true, 'debug' => false));
+        $twig = new Environment($loader, ['cache' => $cache, 'auto_reload' => true, 'debug' => false]);
 
         $now = time();
 
@@ -240,17 +218,17 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
         // the loader returns true for isFresh().
         $cache->expects($this->once())
             ->method('generateKey')
-            ->will($this->returnValue('key'));
+            ->willReturn('key');
         $cache->expects($this->once())
             ->method('getTimestamp')
-            ->will($this->returnValue($now));
+            ->willReturn($now);
         $loader->expects($this->once())
             ->method('isFresh')
-            ->will($this->returnValue(true));
+            ->willReturn(true);
         $cache->expects($this->atLeastOnce())
             ->method('load');
 
-        $twig->loadTemplate($templateName);
+        $twig->load($templateName);
     }
 
     public function testAutoReloadOutdatedCacheHit()
@@ -258,53 +236,32 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
         $templateName = __FUNCTION__;
         $templateContent = __FUNCTION__;
 
-        $cache = $this->getMockBuilder('Twig_CacheInterface')->getMock();
+        $cache = $this->getMockBuilder(CacheInterface::class)->getMock();
         $loader = $this->getMockLoader($templateName, $templateContent);
-        $twig = new Twig_Environment($loader, array('cache' => $cache, 'auto_reload' => true, 'debug' => false));
+        $twig = new Environment($loader, ['cache' => $cache, 'auto_reload' => true, 'debug' => false]);
 
         $now = time();
 
         $cache->expects($this->once())
             ->method('generateKey')
-            ->will($this->returnValue('key'));
+            ->willReturn('key');
         $cache->expects($this->once())
             ->method('getTimestamp')
-            ->will($this->returnValue($now));
+            ->willReturn($now);
         $loader->expects($this->once())
             ->method('isFresh')
-            ->will($this->returnValue(false));
+            ->willReturn(false);
         $cache->expects($this->once())
             ->method('write');
         $cache->expects($this->once())
             ->method('load');
 
-        $twig->loadTemplate($templateName);
-    }
-
-    /**
-     * @group legacy
-     */
-    public function testHasGetExtensionWithDynamicName()
-    {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-
-        $ext1 = new Twig_Tests_EnvironmentTest_Extension_DynamicWithDeprecatedName('ext1');
-        $ext2 = new Twig_Tests_EnvironmentTest_Extension_DynamicWithDeprecatedName('ext2');
-        $twig->addExtension($ext1);
-        $twig->addExtension($ext2);
-
-        $this->assertTrue($twig->hasExtension('ext1'));
-        $this->assertTrue($twig->hasExtension('ext2'));
-
-        $this->assertTrue($twig->hasExtension('Twig_Tests_EnvironmentTest_Extension_DynamicWithDeprecatedName'));
-
-        $this->assertSame($ext1, $twig->getExtension('ext1'));
-        $this->assertSame($ext2, $twig->getExtension('ext2'));
+        $twig->load($templateName);
     }
 
     public function testHasGetExtensionByClassName()
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $twig->addExtension($ext = new Twig_Tests_EnvironmentTest_Extension());
         $this->assertTrue($twig->hasExtension('Twig_Tests_EnvironmentTest_Extension'));
         $this->assertTrue($twig->hasExtension('\Twig_Tests_EnvironmentTest_Extension'));
@@ -318,7 +275,7 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
 
     public function testAddExtension()
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension());
 
         $this->assertArrayHasKey('test', $twig->getTags());
@@ -338,70 +295,29 @@ class Twig_Tests_EnvironmentTest extends \PHPUnit\Framework\TestCase
         $this->assertTrue($found);
     }
 
-    /**
-     * @requires PHP 5.3
-     */
-    public function testAddExtensionWithDeprecatedGetGlobals()
-    {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension_WithGlobals());
-
-        $this->deprecations = array();
-        set_error_handler(array($this, 'handleError'));
-
-        $this->assertArrayHasKey('foo_global', $twig->getGlobals());
-
-        $this->assertCount(1, $this->deprecations);
-        $this->assertContains('Defining the getGlobals() method in the "Twig_Tests_EnvironmentTest_Extension_WithGlobals" extension ', $this->deprecations[0]);
-
-        restore_error_handler();
-    }
-
-    /**
-     * @group legacy
-     */
-    public function testRemoveExtension()
-    {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension_WithDeprecatedName());
-        $twig->removeExtension('environment_test');
-
-        $this->assertArrayNotHasKey('test', $twig->getTags());
-        $this->assertArrayNotHasKey('foo_filter', $twig->getFilters());
-        $this->assertArrayNotHasKey('foo_function', $twig->getFunctions());
-        $this->assertArrayNotHasKey('foo_test', $twig->getTests());
-        $this->assertArrayNotHasKey('foo_unary', $twig->getUnaryOperators());
-        $this->assertArrayNotHasKey('foo_binary', $twig->getBinaryOperators());
-        $this->assertArrayNotHasKey('foo_global', $twig->getGlobals());
-        $this->assertCount(2, $twig->getNodeVisitors());
-    }
-
     public function testAddMockExtension()
     {
-        // should be replaced by the following in 2.0 (this current code is just to avoid a dep notice)
-        // $extension = $this->getMockBuilder('Twig_Extension')->getMock();
-        $extension = eval(<<<EOF
-class Twig_Tests_EnvironmentTest_ExtensionInEval extends Twig_Extension
-{
-}
-EOF
-        );
-        $extension = new Twig_Tests_EnvironmentTest_ExtensionInEval();
+        $extension = $this->getMockBuilder(ExtensionInterface::class)->getMock();
 
-        $loader = new Twig_Loader_Array(array('page' => 'hey'));
+        $loader = new ArrayLoader(['page' => 'hey']);
 
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
         $twig->addExtension($extension);
 
-        $this->assertInstanceOf('Twig_ExtensionInterface', $twig->getExtension(get_class($extension)));
+        $this->assertInstanceOf(ExtensionInterface::class, $twig->getExtension(\get_class($extension)));
         $this->assertTrue($twig->isTemplateFresh('page', time()));
     }
 
+    /**
+     * @group legacy
+     */
     public function testInitRuntimeWithAnExtensionUsingInitRuntimeNoDeprecation()
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $loader = $this->getMockBuilder(LoaderInterface::class)->getMock();
+        $twig = new Environment($loader);
+        $loader->expects($this->once())->method('getSourceContext')->willReturn(new Source('', ''));
         $twig->addExtension(new Twig_Tests_EnvironmentTest_ExtensionWithoutDeprecationInitRuntime());
-        $twig->initRuntime();
+        $twig->load('');
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any deprecations
@@ -409,66 +325,32 @@ EOF
     }
 
     /**
-     * @requires PHP 5.3
-     */
-    public function testInitRuntimeWithAnExtensionUsingInitRuntimeDeprecation()
-    {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $twig->addExtension(new Twig_Tests_EnvironmentTest_ExtensionWithDeprecationInitRuntime());
-
-        $this->deprecations = array();
-        set_error_handler(array($this, 'handleError'));
-
-        $twig->initRuntime();
-
-        $this->assertCount(1, $this->deprecations);
-        $this->assertContains('Defining the initRuntime() method in the "Twig_Tests_EnvironmentTest_ExtensionWithDeprecationInitRuntime" extension is deprecated since version 1.23.', $this->deprecations[0]);
-
-        restore_error_handler();
-    }
-
-    public function handleError($type, $msg)
-    {
-        if (E_USER_DEPRECATED === $type) {
-            $this->deprecations[] = $msg;
-        }
-    }
-
-    /**
-     * @requires PHP 5.3
+     * @expectedException \LogicException
+     * @expectedExceptionMessage Unable to register extension "Twig_Tests_EnvironmentTest_Extension" as it is already registered.
      */
     public function testOverrideExtension()
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $twig->addExtension(new Twig_Tests_EnvironmentTest_ExtensionWithDeprecationInitRuntime());
-
-        $this->deprecations = array();
-        set_error_handler(array($this, 'handleError'));
-
-        $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension_WithDeprecatedName());
-        $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension_WithDeprecatedName());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
 
-        $this->assertCount(1, $this->deprecations);
-        $this->assertContains('The possibility to register the same extension twice', $this->deprecations[0]);
-
-        restore_error_handler();
+        $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension());
+        $twig->addExtension(new Twig_Tests_EnvironmentTest_Extension());
     }
 
     public function testAddRuntimeLoader()
     {
-        $runtimeLoader = $this->getMockBuilder('Twig_RuntimeLoaderInterface')->getMock();
-        $runtimeLoader->expects($this->any())->method('load')->will($this->returnValue(new Twig_Tests_EnvironmentTest_Runtime()));
+        $runtimeLoader = $this->getMockBuilder(RuntimeLoaderInterface::class)->getMock();
+        $runtimeLoader->expects($this->any())->method('load')->willReturn(new Twig_Tests_EnvironmentTest_Runtime());
 
-        $loader = new Twig_Loader_Array(array(
+        $loader = new ArrayLoader([
             'func_array' => '{{ from_runtime_array("foo") }}',
             'func_array_default' => '{{ from_runtime_array() }}',
             'func_array_named_args' => '{{ from_runtime_array(name="foo") }}',
             'func_string' => '{{ from_runtime_string("foo") }}',
             'func_string_default' => '{{ from_runtime_string() }}',
             'func_string_named_args' => '{{ from_runtime_string(name="foo") }}',
-        ));
+        ]);
 
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
         $twig->addExtension(new Twig_Tests_EnvironmentTest_ExtensionWithoutRuntime());
         $twig->addRuntimeLoader($runtimeLoader);
 
@@ -481,140 +363,99 @@ EOF
     }
 
     /**
-     * @expectedException Twig_Error_Runtime
-     * @expectedExceptionMessage Circular reference detected for Twig template "base.html.twig", path: base.html.twig -> base.html.twig in "base.html.twig" at line 1
-     */
-    public function testFailLoadTemplateOnCircularReference()
-    {
-        $twig = new Twig_Environment(new Twig_Loader_Array(array(
-            'base.html.twig' => '{% extends "base.html.twig" %}',
-        )));
-
-        $twig->loadTemplate('base.html.twig');
-    }
-
-    /**
-     * @expectedException Twig_Error_Runtime
-     * @expectedExceptionMessage Circular reference detected for Twig template "base1.html.twig", path: base1.html.twig -> base2.html.twig -> base1.html.twig in "base1.html.twig" at line 1
+     * @expectedException \Twig\Error\RuntimeError
+     * @expectedExceptionMessage Failed to load Twig template "testFailLoadTemplate.twig", index "112233": cache might be corrupted in "testFailLoadTemplate.twig".
      */
-    public function testFailLoadTemplateOnComplexCircularReference()
+    public function testFailLoadTemplate()
     {
-        $twig = new Twig_Environment(new Twig_Loader_Array(array(
-            'base1.html.twig' => '{% extends "base2.html.twig" %}',
-            'base2.html.twig' => '{% extends "base1.html.twig" %}',
-        )));
-
-        $twig->loadTemplate('base1.html.twig');
+        $template = 'testFailLoadTemplate.twig';
+        $twig = new Environment(new ArrayLoader([$template => false]));
+        $twig->loadTemplate($template, 112233);
     }
 
     protected function getMockLoader($templateName, $templateContent)
     {
-        // to be removed in 2.0
-        $loader = $this->getMockBuilder('Twig_EnvironmentTestLoaderInterface')->getMock();
-        //$loader = $this->getMockBuilder(array('Twig_LoaderInterface', 'Twig_SourceContextLoaderInterface'))->getMock();
+        $loader = $this->getMockBuilder(LoaderInterface::class)->getMock();
         $loader->expects($this->any())
           ->method('getSourceContext')
           ->with($templateName)
-          ->will($this->returnValue(new Twig_Source($templateContent, $templateName)));
+          ->willReturn(new Source($templateContent, $templateName));
         $loader->expects($this->any())
           ->method('getCacheKey')
           ->with($templateName)
-          ->will($this->returnValue($templateName));
+          ->willReturn($templateName);
 
         return $loader;
     }
 }
 
-class Twig_Tests_EnvironmentTest_Extension_WithGlobals extends Twig_Extension
+class Twig_Tests_EnvironmentTest_Extension_WithGlobals extends AbstractExtension
 {
     public function getGlobals()
     {
-        return array(
+        return [
             'foo_global' => 'foo_global',
-        );
+        ];
     }
 }
 
-class Twig_Tests_EnvironmentTest_Extension extends Twig_Extension implements Twig_Extension_GlobalsInterface
+class Twig_Tests_EnvironmentTest_Extension extends AbstractExtension implements GlobalsInterface
 {
     public function getTokenParsers()
     {
-        return array(
+        return [
             new Twig_Tests_EnvironmentTest_TokenParser(),
-        );
+        ];
     }
 
     public function getNodeVisitors()
     {
-        return array(
+        return [
             new Twig_Tests_EnvironmentTest_NodeVisitor(),
-        );
+        ];
     }
 
     public function getFilters()
     {
-        return array(
-            new Twig_SimpleFilter('foo_filter', 'foo_filter'),
-        );
+        return [
+            new TwigFilter('foo_filter'),
+        ];
     }
 
     public function getTests()
     {
-        return array(
-            new Twig_SimpleTest('foo_test', 'foo_test'),
-        );
+        return [
+            new TwigTest('foo_test'),
+        ];
     }
 
     public function getFunctions()
     {
-        return array(
-            new Twig_SimpleFunction('foo_function', 'foo_function'),
-        );
+        return [
+            new TwigFunction('foo_function'),
+        ];
     }
 
     public function getOperators()
     {
-        return array(
-            array('foo_unary' => array()),
-            array('foo_binary' => array()),
-        );
+        return [
+            ['foo_unary' => []],
+            ['foo_binary' => []],
+        ];
     }
 
     public function getGlobals()
     {
-        return array(
+        return [
             'foo_global' => 'foo_global',
-        );
+        ];
     }
 }
 class_alias('Twig_Tests_EnvironmentTest_Extension', 'Twig\Tests\EnvironmentTest\Extension', false);
 
-class Twig_Tests_EnvironmentTest_Extension_WithDeprecatedName extends Twig_Extension
-{
-    public function getName()
-    {
-        return 'environment_test';
-    }
-}
-
-class Twig_Tests_EnvironmentTest_Extension_DynamicWithDeprecatedName extends Twig_Extension
-{
-    private $name;
-
-    public function __construct($name)
-    {
-        $this->name = $name;
-    }
-
-    public function getName()
-    {
-        return $this->name;
-    }
-}
-
-class Twig_Tests_EnvironmentTest_TokenParser extends Twig_TokenParser
+class Twig_Tests_EnvironmentTest_TokenParser extends AbstractTokenParser
 {
-    public function parse(Twig_Token $token)
+    public function parse(Token $token)
     {
     }
 
@@ -624,14 +465,14 @@ class Twig_Tests_EnvironmentTest_TokenParser extends Twig_TokenParser
     }
 }
 
-class Twig_Tests_EnvironmentTest_NodeVisitor implements Twig_NodeVisitorInterface
+class Twig_Tests_EnvironmentTest_NodeVisitor implements NodeVisitorInterface
 {
-    public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
+    public function enterNode(Node $node, Environment $env)
     {
         return $node;
     }
 
-    public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
+    public function leaveNode(Node $node, Environment $env)
     {
         return $node;
     }
@@ -642,33 +483,28 @@ class Twig_Tests_EnvironmentTest_NodeVisitor implements Twig_NodeVisitorInterfac
     }
 }
 
-class Twig_Tests_EnvironmentTest_ExtensionWithDeprecationInitRuntime extends Twig_Extension
+class Twig_Tests_EnvironmentTest_ExtensionWithDeprecationInitRuntime extends AbstractExtension
 {
-    public function initRuntime(Twig_Environment $env)
+    public function initRuntime(Environment $env)
     {
     }
 }
 
-class Twig_Tests_EnvironmentTest_ExtensionWithoutDeprecationInitRuntime extends Twig_Extension implements Twig_Extension_InitRuntimeInterface
+class Twig_Tests_EnvironmentTest_ExtensionWithoutDeprecationInitRuntime extends AbstractExtension implements InitRuntimeInterface
 {
-    public function initRuntime(Twig_Environment $env)
+    public function initRuntime(Environment $env)
     {
     }
 }
 
-class Twig_Tests_EnvironmentTest_ExtensionWithoutRuntime extends Twig_Extension
+class Twig_Tests_EnvironmentTest_ExtensionWithoutRuntime extends AbstractExtension
 {
     public function getFunctions()
     {
-        return array(
-            new Twig_SimpleFunction('from_runtime_array', array('Twig_Tests_EnvironmentTest_Runtime', 'fromRuntime')),
-            new Twig_SimpleFunction('from_runtime_string', 'Twig_Tests_EnvironmentTest_Runtime::fromRuntime'),
-        );
-    }
-
-    public function getName()
-    {
-        return 'from_runtime';
+        return [
+            new TwigFunction('from_runtime_array', ['Twig_Tests_EnvironmentTest_Runtime', 'fromRuntime']),
+            new TwigFunction('from_runtime_string', 'Twig_Tests_EnvironmentTest_Runtime::fromRuntime'),
+        ];
     }
 }
 
@@ -679,8 +515,3 @@ class Twig_Tests_EnvironmentTest_Runtime
         return $name;
     }
 }
-
-// to be removed in 2.0
-interface Twig_EnvironmentTestLoaderInterface extends Twig_LoaderInterface, Twig_SourceContextLoaderInterface
-{
-}
diff --git a/vendor/twig/twig/test/Twig/Tests/ErrorTest.php b/vendor/twig/twig/test/Twig/Tests/ErrorTest.php
index 3ec572ab..cde3b658 100644
--- a/vendor/twig/twig/test/Twig/Tests/ErrorTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/ErrorTest.php
@@ -9,27 +9,26 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Environment;
+use Twig\Error\Error;
+use Twig\Error\RuntimeError;
+use Twig\Loader\ArrayLoader;
+use Twig\Loader\FilesystemLoader;
+use Twig\Source;
+
 class Twig_Tests_ErrorTest extends \PHPUnit\Framework\TestCase
 {
     public function testErrorWithObjectFilename()
     {
-        $error = new Twig_Error('foo');
-        $error->setSourceContext(new Twig_Source('', new SplFileInfo(__FILE__)));
+        $error = new Error('foo');
+        $error->setSourceContext(new Source('', new \SplFileInfo(__FILE__)));
 
         $this->assertContains('test'.DIRECTORY_SEPARATOR.'Twig'.DIRECTORY_SEPARATOR.'Tests'.DIRECTORY_SEPARATOR.'ErrorTest.php', $error->getMessage());
     }
 
-    public function testErrorWithArrayFilename()
-    {
-        $error = new Twig_Error('foo');
-        $error->setSourceContext(new Twig_Source('', array('foo' => 'bar')));
-
-        $this->assertEquals('foo in {"foo":"bar"}', $error->getMessage());
-    }
-
     public function testTwigExceptionGuessWithMissingVarAndArrayLoader()
     {
-        $loader = new Twig_Loader_Array(array(
+        $loader = new ArrayLoader([
             'base.html' => '{% block content %}{% endblock %}',
             'index.html' => <<<EOHTML
 {% extends 'base.html' %}
@@ -40,15 +39,16 @@ class Twig_Tests_ErrorTest extends \PHPUnit\Framework\TestCase
     {{ foo.bar }}
 {% endblock %}
 EOHTML
-        ));
-        $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
+        ]);
+
+        $twig = new Environment($loader, ['strict_variables' => true, 'debug' => true, 'cache' => false]);
 
-        $template = $twig->loadTemplate('index.html');
+        $template = $twig->load('index.html');
         try {
-            $template->render(array());
+            $template->render([]);
 
             $this->fail();
-        } catch (Twig_Error_Runtime $e) {
+        } catch (RuntimeError $e) {
             $this->assertEquals('Variable "foo" does not exist in "index.html" at line 3.', $e->getMessage());
             $this->assertEquals(3, $e->getTemplateLine());
             $this->assertEquals('index.html', $e->getSourceContext()->getName());
@@ -57,7 +57,7 @@ EOHTML
 
     public function testTwigExceptionGuessWithExceptionAndArrayLoader()
     {
-        $loader = new Twig_Loader_Array(array(
+        $loader = new ArrayLoader([
             'base.html' => '{% block content %}{% endblock %}',
             'index.html' => <<<EOHTML
 {% extends 'base.html' %}
@@ -68,15 +68,15 @@ EOHTML
     {{ foo.bar }}
 {% endblock %}
 EOHTML
-        ));
-        $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
+        ]);
+        $twig = new Environment($loader, ['strict_variables' => true, 'debug' => true, 'cache' => false]);
 
-        $template = $twig->loadTemplate('index.html');
+        $template = $twig->load('index.html');
         try {
-            $template->render(array('foo' => new Twig_Tests_ErrorTest_Foo()));
+            $template->render(['foo' => new Twig_Tests_ErrorTest_Foo()]);
 
             $this->fail();
-        } catch (Twig_Error_Runtime $e) {
+        } catch (RuntimeError $e) {
             $this->assertEquals('An exception has been thrown during the rendering of a template ("Runtime error...") in "index.html" at line 3.', $e->getMessage());
             $this->assertEquals(3, $e->getTemplateLine());
             $this->assertEquals('index.html', $e->getSourceContext()->getName());
@@ -85,39 +85,39 @@ EOHTML
 
     public function testTwigExceptionGuessWithMissingVarAndFilesystemLoader()
     {
-        $loader = new Twig_Loader_Filesystem(dirname(__FILE__).'/Fixtures/errors');
-        $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
+        $loader = new FilesystemLoader(__DIR__.'/Fixtures/errors');
+        $twig = new Environment($loader, ['strict_variables' => true, 'debug' => true, 'cache' => false]);
 
-        $template = $twig->loadTemplate('index.html');
+        $template = $twig->load('index.html');
         try {
-            $template->render(array());
+            $template->render([]);
 
             $this->fail();
-        } catch (Twig_Error_Runtime $e) {
+        } catch (RuntimeError $e) {
             $this->assertEquals('Variable "foo" does not exist.', $e->getMessage());
             $this->assertEquals(3, $e->getTemplateLine());
             $this->assertEquals('index.html', $e->getSourceContext()->getName());
             $this->assertEquals(3, $e->getLine());
-            $this->assertEquals(strtr(dirname(__FILE__).'/Fixtures/errors/index.html', '/', DIRECTORY_SEPARATOR), $e->getFile());
+            $this->assertEquals(strtr(__DIR__.'/Fixtures/errors/index.html', '/', DIRECTORY_SEPARATOR), $e->getFile());
         }
     }
 
     public function testTwigExceptionGuessWithExceptionAndFilesystemLoader()
     {
-        $loader = new Twig_Loader_Filesystem(dirname(__FILE__).'/Fixtures/errors');
-        $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
+        $loader = new FilesystemLoader(__DIR__.'/Fixtures/errors');
+        $twig = new Environment($loader, ['strict_variables' => true, 'debug' => true, 'cache' => false]);
 
-        $template = $twig->loadTemplate('index.html');
+        $template = $twig->load('index.html');
         try {
-            $template->render(array('foo' => new Twig_Tests_ErrorTest_Foo()));
+            $template->render(['foo' => new Twig_Tests_ErrorTest_Foo()]);
 
             $this->fail();
-        } catch (Twig_Error_Runtime $e) {
+        } catch (RuntimeError $e) {
             $this->assertEquals('An exception has been thrown during the rendering of a template ("Runtime error...").', $e->getMessage());
             $this->assertEquals(3, $e->getTemplateLine());
             $this->assertEquals('index.html', $e->getSourceContext()->getName());
             $this->assertEquals(3, $e->getLine());
-            $this->assertEquals(strtr(dirname(__FILE__).'/Fixtures/errors/index.html', '/', DIRECTORY_SEPARATOR), $e->getFile());
+            $this->assertEquals(strtr(__DIR__.'/Fixtures/errors/index.html', '/', DIRECTORY_SEPARATOR), $e->getFile());
         }
     }
 
@@ -126,26 +126,26 @@ EOHTML
      */
     public function testTwigExceptionAddsFileAndLine($templates, $name, $line)
     {
-        $loader = new Twig_Loader_Array($templates);
-        $twig = new Twig_Environment($loader, array('strict_variables' => true, 'debug' => true, 'cache' => false));
+        $loader = new ArrayLoader($templates);
+        $twig = new Environment($loader, ['strict_variables' => true, 'debug' => true, 'cache' => false]);
 
-        $template = $twig->loadTemplate('index');
+        $template = $twig->load('index');
 
         try {
-            $template->render(array());
+            $template->render([]);
 
             $this->fail();
-        } catch (Twig_Error_Runtime $e) {
+        } catch (RuntimeError $e) {
             $this->assertEquals(sprintf('Variable "foo" does not exist in "%s" at line %d.', $name, $line), $e->getMessage());
             $this->assertEquals($line, $e->getTemplateLine());
             $this->assertEquals($name, $e->getSourceContext()->getName());
         }
 
         try {
-            $template->render(array('foo' => new Twig_Tests_ErrorTest_Foo()));
+            $template->render(['foo' => new Twig_Tests_ErrorTest_Foo()]);
 
             $this->fail();
-        } catch (Twig_Error_Runtime $e) {
+        } catch (RuntimeError $e) {
             $this->assertEquals(sprintf('An exception has been thrown during the rendering of a template ("Runtime error...") in "%s" at line %d.', $name, $line), $e->getMessage());
             $this->assertEquals($line, $e->getTemplateLine());
             $this->assertEquals($name, $e->getSourceContext()->getName());
@@ -154,39 +154,39 @@ EOHTML
 
     public function getErroredTemplates()
     {
-        return array(
+        return [
             // error occurs in a template
-            array(
-                array(
+            [
+                [
                     'index' => "\n\n{{ foo.bar }}\n\n\n{{ 'foo' }}",
-                ),
+                ],
                 'index', 3,
-            ),
+            ],
 
             // error occurs in an included template
-            array(
-                array(
+            [
+                [
                     'index' => "{% include 'partial' %}",
                     'partial' => '{{ foo.bar }}',
-                ),
+                ],
                 'partial', 1,
-            ),
+            ],
 
             // error occurs in a parent block when called via parent()
-            array(
-                array(
+            [
+                [
                     'index' => "{% extends 'base' %}
                     {% block content %}
                         {{ parent() }}
                     {% endblock %}",
                     'base' => '{% block content %}{{ foo.bar }}{% endblock %}',
-                ),
+                ],
                 'base', 1,
-            ),
+            ],
 
             // error occurs in a block from the child
-            array(
-                array(
+            [
+                [
                     'index' => "{% extends 'base' %}
                     {% block content %}
                         {{ foo.bar }}
@@ -195,10 +195,24 @@ EOHTML
                         {{ foo.bar }}
                     {% endblock %}",
                     'base' => '{% block content %}{% endblock %}',
-                ),
+                ],
                 'index', 3,
-            ),
-        );
+            ],
+        ];
+    }
+
+    public function testTwigLeakOutputInDebugMode()
+    {
+        $output = exec(sprintf('%s %s debug', \PHP_BINARY, escapeshellarg(__DIR__.'/Fixtures/errors/leak-output.php')));
+
+        $this->assertSame('Hello OOPS', $output);
+    }
+
+    public function testDoesNotTwigLeakOutput()
+    {
+        $output = exec(sprintf('%s %s', \PHP_BINARY, escapeshellarg(__DIR__.'/Fixtures/errors/leak-output.php')));
+
+        $this->assertSame('', $output);
     }
 }
 
@@ -206,6 +220,6 @@ class Twig_Tests_ErrorTest_Foo
 {
     public function bar()
     {
-        throw new Exception('Runtime error...');
+        throw new \Exception('Runtime error...');
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php b/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
index 3a173f03..ccf331ba 100644
--- a/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/ExpressionParserTest.php
@@ -9,36 +9,45 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Environment;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\Expression\ArrayExpression;
+use Twig\Node\Expression\Binary\ConcatBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Parser;
+use Twig\Source;
+
 class Twig_Tests_ExpressionParserTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @expectedException Twig_Error_Syntax
+     * @expectedException \Twig\Error\SyntaxError
      * @dataProvider getFailingTestsForAssignment
      */
     public function testCanOnlyAssignToNames($template)
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source($template, 'index')));
+        $parser->parse($env->tokenize(new Source($template, 'index')));
     }
 
     public function getFailingTestsForAssignment()
     {
-        return array(
-            array('{% set false = "foo" %}'),
-            array('{% set FALSE = "foo" %}'),
-            array('{% set true = "foo" %}'),
-            array('{% set TRUE = "foo" %}'),
-            array('{% set none = "foo" %}'),
-            array('{% set NONE = "foo" %}'),
-            array('{% set null = "foo" %}'),
-            array('{% set NULL = "foo" %}'),
-            array('{% set 3 = "foo" %}'),
-            array('{% set 1 + 2 = "foo" %}'),
-            array('{% set "bar" = "foo" %}'),
-            array('{% set %}{% endset %}'),
-        );
+        return [
+            ['{% set false = "foo" %}'],
+            ['{% set FALSE = "foo" %}'],
+            ['{% set true = "foo" %}'],
+            ['{% set TRUE = "foo" %}'],
+            ['{% set none = "foo" %}'],
+            ['{% set NONE = "foo" %}'],
+            ['{% set null = "foo" %}'],
+            ['{% set NULL = "foo" %}'],
+            ['{% set 3 = "foo" %}'],
+            ['{% set 1 + 2 = "foo" %}'],
+            ['{% set "bar" = "foo" %}'],
+            ['{% set %}{% endset %}'],
+        ];
     }
 
     /**
@@ -46,117 +55,118 @@ class Twig_Tests_ExpressionParserTest extends \PHPUnit\Framework\TestCase
      */
     public function testArrayExpression($template, $expected)
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $stream = $env->tokenize(new Twig_Source($template, ''));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $stream = $env->tokenize($source = new Source($template, ''));
+        $parser = new Parser($env);
+        $expected->setSourceContext($source);
 
         $this->assertEquals($expected, $parser->parse($stream)->getNode('body')->getNode(0)->getNode('expr'));
     }
 
     /**
-     * @expectedException Twig_Error_Syntax
+     * @expectedException \Twig\Error\SyntaxError
      * @dataProvider getFailingTestsForArray
      */
     public function testArraySyntaxError($template)
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source($template, 'index')));
+        $parser->parse($env->tokenize(new Source($template, 'index')));
     }
 
     public function getFailingTestsForArray()
     {
-        return array(
-            array('{{ [1, "a": "b"] }}'),
-            array('{{ {"a": "b", 2} }}'),
-        );
+        return [
+            ['{{ [1, "a": "b"] }}'],
+            ['{{ {"a": "b", 2} }}'],
+        ];
     }
 
     public function getTestsForArray()
     {
-        return array(
+        return [
             // simple array
-            array('{{ [1, 2] }}', new Twig_Node_Expression_Array(array(
-                  new Twig_Node_Expression_Constant(0, 1),
-                  new Twig_Node_Expression_Constant(1, 1),
+            ['{{ [1, 2] }}', new ArrayExpression([
+                  new ConstantExpression(0, 1),
+                  new ConstantExpression(1, 1),
 
-                  new Twig_Node_Expression_Constant(1, 1),
-                  new Twig_Node_Expression_Constant(2, 1),
-                ), 1),
-            ),
+                  new ConstantExpression(1, 1),
+                  new ConstantExpression(2, 1),
+                ], 1),
+            ],
 
             // array with trailing ,
-            array('{{ [1, 2, ] }}', new Twig_Node_Expression_Array(array(
-                  new Twig_Node_Expression_Constant(0, 1),
-                  new Twig_Node_Expression_Constant(1, 1),
+            ['{{ [1, 2, ] }}', new ArrayExpression([
+                  new ConstantExpression(0, 1),
+                  new ConstantExpression(1, 1),
 
-                  new Twig_Node_Expression_Constant(1, 1),
-                  new Twig_Node_Expression_Constant(2, 1),
-                ), 1),
-            ),
+                  new ConstantExpression(1, 1),
+                  new ConstantExpression(2, 1),
+                ], 1),
+            ],
 
             // simple hash
-            array('{{ {"a": "b", "b": "c"} }}', new Twig_Node_Expression_Array(array(
-                  new Twig_Node_Expression_Constant('a', 1),
-                  new Twig_Node_Expression_Constant('b', 1),
+            ['{{ {"a": "b", "b": "c"} }}', new ArrayExpression([
+                  new ConstantExpression('a', 1),
+                  new ConstantExpression('b', 1),
 
-                  new Twig_Node_Expression_Constant('b', 1),
-                  new Twig_Node_Expression_Constant('c', 1),
-                ), 1),
-            ),
+                  new ConstantExpression('b', 1),
+                  new ConstantExpression('c', 1),
+                ], 1),
+            ],
 
             // hash with trailing ,
-            array('{{ {"a": "b", "b": "c", } }}', new Twig_Node_Expression_Array(array(
-                  new Twig_Node_Expression_Constant('a', 1),
-                  new Twig_Node_Expression_Constant('b', 1),
+            ['{{ {"a": "b", "b": "c", } }}', new ArrayExpression([
+                  new ConstantExpression('a', 1),
+                  new ConstantExpression('b', 1),
 
-                  new Twig_Node_Expression_Constant('b', 1),
-                  new Twig_Node_Expression_Constant('c', 1),
-                ), 1),
-            ),
+                  new ConstantExpression('b', 1),
+                  new ConstantExpression('c', 1),
+                ], 1),
+            ],
 
             // hash in an array
-            array('{{ [1, {"a": "b", "b": "c"}] }}', new Twig_Node_Expression_Array(array(
-                  new Twig_Node_Expression_Constant(0, 1),
-                  new Twig_Node_Expression_Constant(1, 1),
+            ['{{ [1, {"a": "b", "b": "c"}] }}', new ArrayExpression([
+                  new ConstantExpression(0, 1),
+                  new ConstantExpression(1, 1),
 
-                  new Twig_Node_Expression_Constant(1, 1),
-                  new Twig_Node_Expression_Array(array(
-                        new Twig_Node_Expression_Constant('a', 1),
-                        new Twig_Node_Expression_Constant('b', 1),
+                  new ConstantExpression(1, 1),
+                  new ArrayExpression([
+                        new ConstantExpression('a', 1),
+                        new ConstantExpression('b', 1),
 
-                        new Twig_Node_Expression_Constant('b', 1),
-                        new Twig_Node_Expression_Constant('c', 1),
-                      ), 1),
-                ), 1),
-            ),
+                        new ConstantExpression('b', 1),
+                        new ConstantExpression('c', 1),
+                      ], 1),
+                ], 1),
+            ],
 
             // array in a hash
-            array('{{ {"a": [1, 2], "b": "c"} }}', new Twig_Node_Expression_Array(array(
-                  new Twig_Node_Expression_Constant('a', 1),
-                  new Twig_Node_Expression_Array(array(
-                        new Twig_Node_Expression_Constant(0, 1),
-                        new Twig_Node_Expression_Constant(1, 1),
-
-                        new Twig_Node_Expression_Constant(1, 1),
-                        new Twig_Node_Expression_Constant(2, 1),
-                      ), 1),
-                  new Twig_Node_Expression_Constant('b', 1),
-                  new Twig_Node_Expression_Constant('c', 1),
-                ), 1),
-            ),
-        );
+            ['{{ {"a": [1, 2], "b": "c"} }}', new ArrayExpression([
+                  new ConstantExpression('a', 1),
+                  new ArrayExpression([
+                        new ConstantExpression(0, 1),
+                        new ConstantExpression(1, 1),
+
+                        new ConstantExpression(1, 1),
+                        new ConstantExpression(2, 1),
+                      ], 1),
+                  new ConstantExpression('b', 1),
+                  new ConstantExpression('c', 1),
+                ], 1),
+            ],
+        ];
     }
 
     /**
-     * @expectedException Twig_Error_Syntax
+     * @expectedException \Twig\Error\SyntaxError
      */
     public function testStringExpressionDoesNotConcatenateTwoConsecutiveStrings()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0));
-        $stream = $env->tokenize(new Twig_Source('{{ "a" "b" }}', 'index'));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false, 'optimizations' => 0]);
+        $stream = $env->tokenize(new Source('{{ "a" "b" }}', 'index'));
+        $parser = new Parser($env);
 
         $parser->parse($stream);
     }
@@ -166,113 +176,114 @@ class Twig_Tests_ExpressionParserTest extends \PHPUnit\Framework\TestCase
      */
     public function testStringExpression($template, $expected)
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false, 'optimizations' => 0));
-        $stream = $env->tokenize(new Twig_Source($template, ''));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false, 'optimizations' => 0]);
+        $stream = $env->tokenize($source = new Source($template, ''));
+        $parser = new Parser($env);
+        $expected->setSourceContext($source);
 
         $this->assertEquals($expected, $parser->parse($stream)->getNode('body')->getNode(0)->getNode('expr'));
     }
 
     public function getTestsForString()
     {
-        return array(
-            array(
-                '{{ "foo" }}', new Twig_Node_Expression_Constant('foo', 1),
-            ),
-            array(
-                '{{ "foo #{bar}" }}', new Twig_Node_Expression_Binary_Concat(
-                    new Twig_Node_Expression_Constant('foo ', 1),
-                    new Twig_Node_Expression_Name('bar', 1),
+        return [
+            [
+                '{{ "foo" }}', new ConstantExpression('foo', 1),
+            ],
+            [
+                '{{ "foo #{bar}" }}', new ConcatBinary(
+                    new ConstantExpression('foo ', 1),
+                    new NameExpression('bar', 1),
                     1
                 ),
-            ),
-            array(
-                '{{ "foo #{bar} baz" }}', new Twig_Node_Expression_Binary_Concat(
-                    new Twig_Node_Expression_Binary_Concat(
-                        new Twig_Node_Expression_Constant('foo ', 1),
-                        new Twig_Node_Expression_Name('bar', 1),
+            ],
+            [
+                '{{ "foo #{bar} baz" }}', new ConcatBinary(
+                    new ConcatBinary(
+                        new ConstantExpression('foo ', 1),
+                        new NameExpression('bar', 1),
                         1
                     ),
-                    new Twig_Node_Expression_Constant(' baz', 1),
+                    new ConstantExpression(' baz', 1),
                     1
                 ),
-            ),
-
-            array(
-                '{{ "foo #{"foo #{bar} baz"} baz" }}', new Twig_Node_Expression_Binary_Concat(
-                    new Twig_Node_Expression_Binary_Concat(
-                        new Twig_Node_Expression_Constant('foo ', 1),
-                        new Twig_Node_Expression_Binary_Concat(
-                            new Twig_Node_Expression_Binary_Concat(
-                                new Twig_Node_Expression_Constant('foo ', 1),
-                                new Twig_Node_Expression_Name('bar', 1),
+            ],
+
+            [
+                '{{ "foo #{"foo #{bar} baz"} baz" }}', new ConcatBinary(
+                    new ConcatBinary(
+                        new ConstantExpression('foo ', 1),
+                        new ConcatBinary(
+                            new ConcatBinary(
+                                new ConstantExpression('foo ', 1),
+                                new NameExpression('bar', 1),
                                 1
                             ),
-                            new Twig_Node_Expression_Constant(' baz', 1),
+                            new ConstantExpression(' baz', 1),
                             1
                         ),
                         1
                     ),
-                    new Twig_Node_Expression_Constant(' baz', 1),
+                    new ConstantExpression(' baz', 1),
                     1
                 ),
-            ),
-        );
+            ],
+        ];
     }
 
     /**
-     * @expectedException Twig_Error_Syntax
+     * @expectedException \Twig\Error\SyntaxError
      */
     public function testAttributeCallDoesNotSupportNamedArguments()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source('{{ foo.bar(name="Foo") }}', 'index')));
+        $parser->parse($env->tokenize(new Source('{{ foo.bar(name="Foo") }}', 'index')));
     }
 
     /**
-     * @expectedException Twig_Error_Syntax
+     * @expectedException \Twig\Error\SyntaxError
      */
     public function testMacroCallDoesNotSupportNamedArguments()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source('{% from _self import foo %}{% macro foo() %}{% endmacro %}{{ foo(name="Foo") }}', 'index')));
+        $parser->parse($env->tokenize(new Source('{% from _self import foo %}{% macro foo() %}{% endmacro %}{{ foo(name="Foo") }}', 'index')));
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage An argument must be a name. Unexpected token "string" of value "a" ("name" expected) in "index" at line 1.
      */
     public function testMacroDefinitionDoesNotSupportNonNameVariableName()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source('{% macro foo("a") %}{% endmacro %}', 'index')));
+        $parser->parse($env->tokenize(new Source('{% macro foo("a") %}{% endmacro %}', 'index')));
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage A default value for an argument must be a constant (a boolean, a string, a number, or an array) in "index" at line 1
      * @dataProvider             getMacroDefinitionDoesNotSupportNonConstantDefaultValues
      */
     public function testMacroDefinitionDoesNotSupportNonConstantDefaultValues($template)
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source($template, 'index')));
+        $parser->parse($env->tokenize(new Source($template, 'index')));
     }
 
     public function getMacroDefinitionDoesNotSupportNonConstantDefaultValues()
     {
-        return array(
-            array('{% macro foo(name = "a #{foo} a") %}{% endmacro %}'),
-            array('{% macro foo(name = [["b", "a #{foo} a"]]) %}{% endmacro %}'),
-        );
+        return [
+            ['{% macro foo(name = "a #{foo} a") %}{% endmacro %}'],
+            ['{% macro foo(name = [["b", "a #{foo} a"]]) %}{% endmacro %}'],
+        ];
     }
 
     /**
@@ -280,10 +291,10 @@ class Twig_Tests_ExpressionParserTest extends \PHPUnit\Framework\TestCase
      */
     public function testMacroDefinitionSupportsConstantDefaultValues($template)
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source($template, 'index')));
+        $parser->parse($env->tokenize(new Source($template, 'index')));
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -292,86 +303,86 @@ class Twig_Tests_ExpressionParserTest extends \PHPUnit\Framework\TestCase
 
     public function getMacroDefinitionSupportsConstantDefaultValues()
     {
-        return array(
-            array('{% macro foo(name = "aa") %}{% endmacro %}'),
-            array('{% macro foo(name = 12) %}{% endmacro %}'),
-            array('{% macro foo(name = true) %}{% endmacro %}'),
-            array('{% macro foo(name = ["a"]) %}{% endmacro %}'),
-            array('{% macro foo(name = [["a"]]) %}{% endmacro %}'),
-            array('{% macro foo(name = {a: "a"}) %}{% endmacro %}'),
-            array('{% macro foo(name = {a: {b: "a"}}) %}{% endmacro %}'),
-        );
+        return [
+            ['{% macro foo(name = "aa") %}{% endmacro %}'],
+            ['{% macro foo(name = 12) %}{% endmacro %}'],
+            ['{% macro foo(name = true) %}{% endmacro %}'],
+            ['{% macro foo(name = ["a"]) %}{% endmacro %}'],
+            ['{% macro foo(name = [["a"]]) %}{% endmacro %}'],
+            ['{% macro foo(name = {a: "a"}) %}{% endmacro %}'],
+            ['{% macro foo(name = {a: {b: "a"}}) %}{% endmacro %}'],
+        ];
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown "cycl" function. Did you mean "cycle" in "index" at line 1?
      */
     public function testUnknownFunction()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source('{{ cycl() }}', 'index')));
+        $parser->parse($env->tokenize(new Source('{{ cycl() }}', 'index')));
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown "foobar" function in "index" at line 1.
      */
     public function testUnknownFunctionWithoutSuggestions()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source('{{ foobar() }}', 'index')));
+        $parser->parse($env->tokenize(new Source('{{ foobar() }}', 'index')));
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown "lowe" filter. Did you mean "lower" in "index" at line 1?
      */
     public function testUnknownFilter()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source('{{ 1|lowe }}', 'index')));
+        $parser->parse($env->tokenize(new Source('{{ 1|lowe }}', 'index')));
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown "foobar" filter in "index" at line 1.
      */
     public function testUnknownFilterWithoutSuggestions()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source('{{ 1|foobar }}', 'index')));
+        $parser->parse($env->tokenize(new Source('{{ 1|foobar }}', 'index')));
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown "nul" test. Did you mean "null" in "index" at line 1
      */
     public function testUnknownTest()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
-        $stream = $env->tokenize(new Twig_Source('{{ 1 is nul }}', 'index'));
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
+        $stream = $env->tokenize(new Source('{{ 1 is nul }}', 'index'));
         $parser->parse($stream);
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown "foobar" test in "index" at line 1.
      */
     public function testUnknownTestWithoutSuggestions()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $parser = new Twig_Parser($env);
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
+        $parser = new Parser($env);
 
-        $parser->parse($env->tokenize(new Twig_Source('{{ 1 is foobar }}', 'index')));
+        $parser->parse($env->tokenize(new Source('{{ 1 is foobar }}', 'index')));
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php b/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php
index ca69b4af..5dc06852 100644
--- a/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Extension/CoreTest.php
@@ -9,52 +9,70 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Environment;
+use Twig\Loader\LoaderInterface;
+
 class Twig_Tests_Extension_CoreTest extends \PHPUnit\Framework\TestCase
 {
     /**
      * @dataProvider getRandomFunctionTestData
      */
-    public function testRandomFunction($value, $expectedInArray)
+    public function testRandomFunction(array $expectedInArray, $value1, $value2 = null)
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
 
         for ($i = 0; $i < 100; ++$i) {
-            $this->assertTrue(in_array(twig_random($env, $value), $expectedInArray, true)); // assertContains() would not consider the type
+            $this->assertTrue(\in_array(twig_random($env, $value1, $value2), $expectedInArray, true)); // assertContains() would not consider the type
         }
     }
 
     public function getRandomFunctionTestData()
     {
-        return array(
-            array(// array
-                array('apple', 'orange', 'citrus'),
-                array('apple', 'orange', 'citrus'),
-            ),
-            array(// Traversable
-                new ArrayObject(array('apple', 'orange', 'citrus')),
-                array('apple', 'orange', 'citrus'),
-            ),
-            array(// unicode string
+        return [
+            'array' => [
+                ['apple', 'orange', 'citrus'],
+                ['apple', 'orange', 'citrus'],
+            ],
+            'Traversable' => [
+                ['apple', 'orange', 'citrus'],
+                new ArrayObject(['apple', 'orange', 'citrus']),
+            ],
+            'unicode string' => [
+                ['�', '�', 'é'],
                 '��é',
-                array('�', '�', 'é'),
-            ),
-            array(// numeric but string
+            ],
+            'numeric but string' => [
+                ['1', '2', '3'],
                 '123',
-                array('1', '2', '3'),
-            ),
-            array(// integer
+            ],
+            'integer' => [
+                range(0, 5, 1),
                 5,
+            ],
+            'float' => [
                 range(0, 5, 1),
-            ),
-            array(// float
                 5.9,
-                range(0, 5, 1),
-            ),
-            array(// negative
+            ],
+            'negative' => [
+                [0, -1, -2],
                 -2,
-                array(0, -1, -2),
-            ),
-        );
+            ],
+            'min max int' => [
+                range(50, 100),
+                50,
+                100,
+            ],
+            'min max float' => [
+                range(-10, 10),
+                -9.5,
+                9.5,
+            ],
+            'min null' => [
+                range(0, 100),
+                null,
+                100,
+            ],
+        ];
     }
 
     public function testRandomFunctionWithoutParameter()
@@ -62,107 +80,71 @@ class Twig_Tests_Extension_CoreTest extends \PHPUnit\Framework\TestCase
         $max = mt_getrandmax();
 
         for ($i = 0; $i < 100; ++$i) {
-            $val = twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-            $this->assertTrue(is_int($val) && $val >= 0 && $val <= $max);
+            $val = twig_random(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+            $this->assertTrue(\is_int($val) && $val >= 0 && $val <= $max);
         }
     }
 
     public function testRandomFunctionReturnsAsIs()
     {
-        $this->assertSame('', twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), ''));
-        $this->assertSame('', twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('charset' => null)), ''));
+        $this->assertSame('', twig_random(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()), ''));
+        $this->assertSame('', twig_random(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['charset' => null]), ''));
 
-        $instance = new stdClass();
-        $this->assertSame($instance, twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), $instance));
+        $instance = new \stdClass();
+        $this->assertSame($instance, twig_random(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()), $instance));
     }
 
     /**
-     * @expectedException Twig_Error_Runtime
+     * @expectedException \Twig\Error\RuntimeError
      */
     public function testRandomFunctionOfEmptyArrayThrowsException()
     {
-        twig_random(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), array());
+        twig_random(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()), []);
     }
 
     public function testRandomFunctionOnNonUTF8String()
     {
-        if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) {
-            $this->markTestSkipped('needs iconv or mbstring');
-        }
-
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $twig->setCharset('ISO-8859-1');
 
-        $text = twig_convert_encoding('�é', 'ISO-8859-1', 'UTF-8');
+        $text = iconv('UTF-8', 'ISO-8859-1', '�é');
         for ($i = 0; $i < 30; ++$i) {
             $rand = twig_random($twig, $text);
-            $this->assertTrue(in_array(twig_convert_encoding($rand, 'UTF-8', 'ISO-8859-1'), array('�', 'é'), true));
+            $this->assertTrue(\in_array(iconv('ISO-8859-1', 'UTF-8', $rand), ['�', 'é'], true));
         }
     }
 
     public function testReverseFilterOnNonUTF8String()
     {
-        if (!function_exists('iconv') && !function_exists('mb_convert_encoding')) {
-            $this->markTestSkipped('needs iconv or mbstring');
-        }
-
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $twig->setCharset('ISO-8859-1');
 
-        $input = twig_convert_encoding('�é', 'ISO-8859-1', 'UTF-8');
-        $output = twig_convert_encoding(twig_reverse_filter($twig, $input), 'UTF-8', 'ISO-8859-1');
+        $input = iconv('UTF-8', 'ISO-8859-1', '�é');
+        $output = iconv('ISO-8859-1', 'UTF-8', twig_reverse_filter($twig, $input));
 
         $this->assertEquals($output, 'é�');
     }
 
     /**
-     * @dataProvider provideCustomEscaperCases
-     */
-    public function testCustomEscaper($expected, $string, $strategy)
-    {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $twig->getExtension('Twig_Extension_Core')->setEscaper('foo', 'foo_escaper_for_test');
-
-        $this->assertSame($expected, twig_escape_filter($twig, $string, $strategy));
-    }
-
-    public function provideCustomEscaperCases()
-    {
-        return array(
-            array('fooUTF-8', 'foo', 'foo'),
-            array('UTF-8', null, 'foo'),
-            array('42UTF-8', 42, 'foo'),
-        );
-    }
-
-    /**
-     * @expectedException Twig_Error_Runtime
-     */
-    public function testUnknownCustomEscaper()
-    {
-        twig_escape_filter(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()), 'foo', 'bar');
-    }
-
-    /**
      * @dataProvider provideTwigFirstCases
      */
     public function testTwigFirst($expected, $input)
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $this->assertSame($expected, twig_first($twig, $input));
     }
 
     public function provideTwigFirstCases()
     {
-        $i = array(1 => 'a', 2 => 'b', 3 => 'c');
-
-        return array(
-            array('a', 'abc'),
-            array(1, array(1, 2, 3)),
-            array('', null),
-            array('', ''),
-            array('a', new CoreTestIterator($i, array_keys($i), true, 3)),
-        );
+        $i = [1 => 'a', 2 => 'b', 3 => 'c'];
+
+        return [
+            ['a', 'abc'],
+            [1, [1, 2, 3]],
+            ['', null],
+            ['', ''],
+            ['a', new CoreTestIterator($i, array_keys($i), true, 3)],
+        ];
     }
 
     /**
@@ -170,21 +152,21 @@ class Twig_Tests_Extension_CoreTest extends \PHPUnit\Framework\TestCase
      */
     public function testTwigLast($expected, $input)
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $this->assertSame($expected, twig_last($twig, $input));
     }
 
     public function provideTwigLastCases()
     {
-        $i = array(1 => 'a', 2 => 'b', 3 => 'c');
-
-        return array(
-            array('c', 'abc'),
-            array(3, array(1, 2, 3)),
-            array('', null),
-            array('', ''),
-            array('c', new CoreTestIterator($i, array_keys($i), true)),
-        );
+        $i = [1 => 'a', 2 => 'b', 3 => 'c'];
+
+        return [
+            ['c', 'abc'],
+            [3, [1, 2, 3]],
+            ['', null],
+            ['', ''],
+            ['c', new CoreTestIterator($i, array_keys($i), true)],
+        ];
     }
 
     /**
@@ -197,17 +179,17 @@ class Twig_Tests_Extension_CoreTest extends \PHPUnit\Framework\TestCase
 
     public function provideArrayKeyCases()
     {
-        $array = array('a' => 'a1', 'b' => 'b1', 'c' => 'c1');
+        $array = ['a' => 'a1', 'b' => 'b1', 'c' => 'c1'];
         $keys = array_keys($array);
 
-        return array(
-            array($keys, $array),
-            array($keys, new CoreTestIterator($array, $keys)),
-            array($keys, new CoreTestIteratorAggregate($array, $keys)),
-            array($keys, new CoreTestIteratorAggregateAggregate($array, $keys)),
-            array(array(), null),
-            array(array('a'), new SimpleXMLElement('<xml><a></a></xml>')),
-        );
+        return [
+            [$keys, $array],
+            [$keys, new CoreTestIterator($array, $keys)],
+            [$keys, new CoreTestIteratorAggregate($array, $keys)],
+            [$keys, new CoreTestIteratorAggregateAggregate($array, $keys)],
+            [[], null],
+            [['a'], new \SimpleXMLElement('<xml><a></a></xml>')],
+        ];
     }
 
     /**
@@ -220,22 +202,22 @@ class Twig_Tests_Extension_CoreTest extends \PHPUnit\Framework\TestCase
 
     public function provideInFilterCases()
     {
-        $array = array(1, 2, 'a' => 3, 5, 6, 7);
+        $array = [1, 2, 'a' => 3, 5, 6, 7];
         $keys = array_keys($array);
 
-        return array(
-            array(true, 1, $array),
-            array(true, '3', $array),
-            array(true, '3', 'abc3def'),
-            array(true, 1, new CoreTestIterator($array, $keys, true, 1)),
-            array(true, '3', new CoreTestIterator($array, $keys, true, 3)),
-            array(true, '3', new CoreTestIteratorAggregateAggregate($array, $keys, true, 3)),
-            array(false, 4, $array),
-            array(false, 4, new CoreTestIterator($array, $keys, true)),
-            array(false, 4, new CoreTestIteratorAggregateAggregate($array, $keys, true)),
-            array(false, 1, 1),
-            array(true, 'b', new SimpleXMLElement('<xml><a>b</a></xml>')),
-        );
+        return [
+            [true, 1, $array],
+            [true, '3', $array],
+            [true, '3', 'abc3def'],
+            [true, 1, new CoreTestIterator($array, $keys, true, 1)],
+            [true, '3', new CoreTestIterator($array, $keys, true, 3)],
+            [true, '3', new CoreTestIteratorAggregateAggregate($array, $keys, true, 3)],
+            [false, 4, $array],
+            [false, 4, new CoreTestIterator($array, $keys, true)],
+            [false, 4, new CoreTestIteratorAggregateAggregate($array, $keys, true)],
+            [false, 1, 1],
+            [true, 'b', new \SimpleXMLElement('<xml><a>b</a></xml>')],
+        ];
     }
 
     /**
@@ -243,38 +225,33 @@ class Twig_Tests_Extension_CoreTest extends \PHPUnit\Framework\TestCase
      */
     public function testSliceFilter($expected, $input, $start, $length = null, $preserveKeys = false)
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $this->assertSame($expected, twig_slice($twig, $input, $start, $length, $preserveKeys));
     }
 
     public function provideSliceFilterCases()
     {
-        $i = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4);
+        $i = ['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4];
         $keys = array_keys($i);
 
-        return array(
-            array(array('a' => 1), $i, 0, 1, true),
-            array(array('a' => 1), $i, 0, 1, false),
-            array(array('b' => 2, 'c' => 3), $i, 1, 2),
-            array(array(1), array(1, 2, 3, 4), 0, 1),
-            array(array(2, 3), array(1, 2, 3, 4), 1, 2),
-            array(array(2, 3), new CoreTestIterator($i, $keys, true), 1, 2),
-            array(array('c' => 3, 'd' => 4), new CoreTestIteratorAggregate($i, $keys, true), 2, null, true),
-            array($i, new CoreTestIterator($i, $keys, true), 0, count($keys) + 10, true),
-            array(array(), new CoreTestIterator($i, $keys, true), count($keys) + 10),
-            array('de', 'abcdef', 3, 2),
-            array(array(), new SimpleXMLElement('<items><item>1</item><item>2</item></items>'), 3),
-            array(array(), new ArrayIterator(array(1, 2)), 3),
-        );
+        return [
+            [['a' => 1], $i, 0, 1, true],
+            [['a' => 1], $i, 0, 1, false],
+            [['b' => 2, 'c' => 3], $i, 1, 2],
+            [[1], [1, 2, 3, 4], 0, 1],
+            [[2, 3], [1, 2, 3, 4], 1, 2],
+            [[2, 3], new CoreTestIterator($i, $keys, true), 1, 2],
+            [['c' => 3, 'd' => 4], new CoreTestIteratorAggregate($i, $keys, true), 2, null, true],
+            [$i, new CoreTestIterator($i, $keys, true), 0, \count($keys) + 10, true],
+            [[], new CoreTestIterator($i, $keys, true), \count($keys) + 10],
+            ['de', 'abcdef', 3, 2],
+            [[], new \SimpleXMLElement('<items><item>1</item><item>2</item></items>'), 3],
+            [[], new \ArrayIterator([1, 2]), 3],
+        ];
     }
 }
 
-function foo_escaper_for_test(Twig_Environment $env, $string, $charset)
-{
-    return $string.$charset;
-}
-
-final class CoreTestIteratorAggregate implements IteratorAggregate
+final class CoreTestIteratorAggregate implements \IteratorAggregate
 {
     private $iterator;
 
@@ -289,7 +266,7 @@ final class CoreTestIteratorAggregate implements IteratorAggregate
     }
 }
 
-final class CoreTestIteratorAggregateAggregate implements IteratorAggregate
+final class CoreTestIteratorAggregateAggregate implements \IteratorAggregate
 {
     private $iterator;
 
@@ -304,7 +281,7 @@ final class CoreTestIteratorAggregateAggregate implements IteratorAggregate
     }
 }
 
-final class CoreTestIterator implements Iterator
+final class CoreTestIterator implements \Iterator
 {
     private $position;
     private $array;
@@ -318,7 +295,7 @@ final class CoreTestIterator implements Iterator
         $this->arrayKeys = $keys;
         $this->position = 0;
         $this->allowValueAccess = $allowValueAccess;
-        $this->maxPosition = false === $maxPosition ? count($values) + 1 : $maxPosition;
+        $this->maxPosition = false === $maxPosition ? \count($values) + 1 : $maxPosition;
     }
 
     public function rewind()
@@ -332,7 +309,7 @@ final class CoreTestIterator implements Iterator
             return $this->array[$this->key()];
         }
 
-        throw new LogicException('Code should only use the keys, not the values provided by iterator.');
+        throw new \LogicException('Code should only use the keys, not the values provided by iterator.');
     }
 
     public function key()
@@ -344,7 +321,7 @@ final class CoreTestIterator implements Iterator
     {
         ++$this->position;
         if ($this->position === $this->maxPosition) {
-            throw new LogicException(sprintf('Code should not iterate beyond %d.', $this->maxPosition));
+            throw new \LogicException(sprintf('Code should not iterate beyond %d.', $this->maxPosition));
         }
     }
 
diff --git a/vendor/twig/twig/test/Twig/Tests/escapingTest.php b/vendor/twig/twig/test/Twig/Tests/Extension/EscaperTest.php
similarity index 52%
rename from vendor/twig/twig/test/Twig/Tests/escapingTest.php
rename to vendor/twig/twig/test/Twig/Tests/Extension/EscaperTest.php
index 9b98dddc..98f5a078 100644
--- a/vendor/twig/twig/test/Twig/Tests/escapingTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Extension/EscaperTest.php
@@ -1,28 +1,36 @@
 <?php
 
-/**
- * This class is adapted from code coming from Zend Framework.
+/*
+ * This file is part of Twig.
  *
- * @copyright Copyright (c) 2005-2012 Zend Technologies USA Inc. (http://www.zend.com)
- * @license   http://framework.zend.com/license/new-bsd New BSD License
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
  */
-class Twig_Test_EscapingTest extends \PHPUnit\Framework\TestCase
+
+use Twig\Environment;
+use Twig\Extension\EscaperExtension;
+use Twig\Loader\LoaderInterface;
+
+class Twig_Tests_Extension_EscaperTest extends \PHPUnit\Framework\TestCase
 {
     /**
      * All character encodings supported by htmlspecialchars().
      */
-    protected $htmlSpecialChars = array(
+    protected $htmlSpecialChars = [
         '\'' => '&#039;',
         '"' => '&quot;',
         '<' => '&lt;',
         '>' => '&gt;',
         '&' => '&amp;',
-    );
+    ];
 
-    protected $htmlAttrSpecialChars = array(
+    protected $htmlAttrSpecialChars = [
         '\'' => '&#x27;',
         /* Characters beyond ASCII value 255 to unicode escape */
         'Ä?' => '&#x0100;',
+        'ð???' => '&#x1F600;',
         /* Immune chars excluded */
         ',' => ',',
         '.' => '.',
@@ -47,17 +55,19 @@ class Twig_Test_EscapingTest extends \PHPUnit\Framework\TestCase
         '"' => '&quot;',
         /* Encode spaces for quoteless attribute protection */
         ' ' => '&#x20;',
-    );
+    ];
 
-    protected $jsSpecialChars = array(
+    protected $jsSpecialChars = [
         /* HTML special chars - escape without exception to hex */
-        '<' => '\\x3C',
-        '>' => '\\x3E',
-        '\'' => '\\x27',
-        '"' => '\\x22',
-        '&' => '\\x26',
+        '<' => '\\u003C',
+        '>' => '\\u003E',
+        '\'' => '\\u0027',
+        '"' => '\\u0022',
+        '&' => '\\u0026',
+        '/' => '\\/',
         /* Characters beyond ASCII value 255 to unicode escape */
         'Ä?' => '\\u0100',
+        'ð???' => '\\uD83D\\uDE00',
         /* Immune chars excluded */
         ',' => ',',
         '.' => '.',
@@ -70,15 +80,17 @@ class Twig_Test_EscapingTest extends \PHPUnit\Framework\TestCase
         '0' => '0',
         '9' => '9',
         /* Basic control characters and null */
-        "\r" => '\\x0D',
-        "\n" => '\\x0A',
-        "\t" => '\\x09',
-        "\0" => '\\x00',
+        "\r" => '\r',
+        "\n" => '\n',
+        "\x08" => '\b',
+        "\t" => '\t',
+        "\x0C" => '\f',
+        "\0" => '\\u0000',
         /* Encode spaces for quoteless attribute protection */
-        ' ' => '\\x20',
-    );
+        ' ' => '\\u0020',
+    ];
 
-    protected $urlSpecialChars = array(
+    protected $urlSpecialChars = [
         /* HTML special chars - escape without exception to percent encoding */
         '<' => '%3C',
         '>' => '%3E',
@@ -111,9 +123,9 @@ class Twig_Test_EscapingTest extends \PHPUnit\Framework\TestCase
         ' ' => '%20',
         '~' => '~',
         '+' => '%2B',
-    );
+    ];
 
-    protected $cssSpecialChars = array(
+    protected $cssSpecialChars = [
         /* HTML special chars - escape without exception to hex */
         '<' => '\\3C ',
         '>' => '\\3E ',
@@ -140,67 +152,69 @@ class Twig_Test_EscapingTest extends \PHPUnit\Framework\TestCase
         "\0" => '\\0 ',
         /* Encode spaces for quoteless attribute protection */
         ' ' => '\\20 ',
-    );
-
-    protected $env;
-
-    protected function setUp()
-    {
-        $this->env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-    }
+    ];
 
     public function testHtmlEscapingConvertsSpecialChars()
     {
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
         foreach ($this->htmlSpecialChars as $key => $value) {
-            $this->assertEquals($value, twig_escape_filter($this->env, $key, 'html'), 'Failed to escape: '.$key);
+            $this->assertEquals($value, twig_escape_filter($twig, $key, 'html'), 'Failed to escape: '.$key);
         }
     }
 
     public function testHtmlAttributeEscapingConvertsSpecialChars()
     {
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
         foreach ($this->htmlAttrSpecialChars as $key => $value) {
-            $this->assertEquals($value, twig_escape_filter($this->env, $key, 'html_attr'), 'Failed to escape: '.$key);
+            $this->assertEquals($value, twig_escape_filter($twig, $key, 'html_attr'), 'Failed to escape: '.$key);
         }
     }
 
     public function testJavascriptEscapingConvertsSpecialChars()
     {
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
         foreach ($this->jsSpecialChars as $key => $value) {
-            $this->assertEquals($value, twig_escape_filter($this->env, $key, 'js'), 'Failed to escape: '.$key);
+            $this->assertEquals($value, twig_escape_filter($twig, $key, 'js'), 'Failed to escape: '.$key);
         }
     }
 
     public function testJavascriptEscapingReturnsStringIfZeroLength()
     {
-        $this->assertEquals('', twig_escape_filter($this->env, '', 'js'));
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
+        $this->assertEquals('', twig_escape_filter($twig, '', 'js'));
     }
 
     public function testJavascriptEscapingReturnsStringIfContainsOnlyDigits()
     {
-        $this->assertEquals('123', twig_escape_filter($this->env, '123', 'js'));
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
+        $this->assertEquals('123', twig_escape_filter($twig, '123', 'js'));
     }
 
     public function testCssEscapingConvertsSpecialChars()
     {
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
         foreach ($this->cssSpecialChars as $key => $value) {
-            $this->assertEquals($value, twig_escape_filter($this->env, $key, 'css'), 'Failed to escape: '.$key);
+            $this->assertEquals($value, twig_escape_filter($twig, $key, 'css'), 'Failed to escape: '.$key);
         }
     }
 
     public function testCssEscapingReturnsStringIfZeroLength()
     {
-        $this->assertEquals('', twig_escape_filter($this->env, '', 'css'));
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
+        $this->assertEquals('', twig_escape_filter($twig, '', 'css'));
     }
 
     public function testCssEscapingReturnsStringIfContainsOnlyDigits()
     {
-        $this->assertEquals('123', twig_escape_filter($this->env, '123', 'css'));
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
+        $this->assertEquals('123', twig_escape_filter($twig, '123', 'css'));
     }
 
     public function testUrlEscapingConvertsSpecialChars()
     {
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
         foreach ($this->urlSpecialChars as $key => $value) {
-            $this->assertEquals($value, twig_escape_filter($this->env, $key, 'url'), 'Failed to escape: '.$key);
+            $this->assertEquals($value, twig_escape_filter($twig, $key, 'url'), 'Failed to escape: '.$key);
         }
     }
 
@@ -215,7 +229,7 @@ class Twig_Test_EscapingTest extends \PHPUnit\Framework\TestCase
     public function testUnicodeCodepointConversionToUtf8()
     {
         $expected = ' ~Þ?';
-        $codepoints = array(0x20, 0x7e, 0x799);
+        $codepoints = [0x20, 0x7e, 0x799];
         $result = '';
         foreach ($codepoints as $value) {
             $result .= $this->codepointToUtf8($value);
@@ -233,43 +247,44 @@ class Twig_Test_EscapingTest extends \PHPUnit\Framework\TestCase
     protected function codepointToUtf8($codepoint)
     {
         if ($codepoint < 0x80) {
-            return chr($codepoint);
+            return \chr($codepoint);
         }
         if ($codepoint < 0x800) {
-            return chr($codepoint >> 6 & 0x3f | 0xc0)
-                .chr($codepoint & 0x3f | 0x80);
+            return \chr($codepoint >> 6 & 0x3f | 0xc0)
+                .\chr($codepoint & 0x3f | 0x80);
         }
         if ($codepoint < 0x10000) {
-            return chr($codepoint >> 12 & 0x0f | 0xe0)
-                .chr($codepoint >> 6 & 0x3f | 0x80)
-                .chr($codepoint & 0x3f | 0x80);
+            return \chr($codepoint >> 12 & 0x0f | 0xe0)
+                .\chr($codepoint >> 6 & 0x3f | 0x80)
+                .\chr($codepoint & 0x3f | 0x80);
         }
         if ($codepoint < 0x110000) {
-            return chr($codepoint >> 18 & 0x07 | 0xf0)
-                .chr($codepoint >> 12 & 0x3f | 0x80)
-                .chr($codepoint >> 6 & 0x3f | 0x80)
-                .chr($codepoint & 0x3f | 0x80);
+            return \chr($codepoint >> 18 & 0x07 | 0xf0)
+                .\chr($codepoint >> 12 & 0x3f | 0x80)
+                .\chr($codepoint >> 6 & 0x3f | 0x80)
+                .\chr($codepoint & 0x3f | 0x80);
         }
-        throw new Exception('Codepoint requested outside of Unicode range.');
+        throw new \Exception('Codepoint requested outside of Unicode range.');
     }
 
     public function testJavascriptEscapingEscapesOwaspRecommendedRanges()
     {
-        $immune = array(',', '.', '_'); // Exceptions to escaping ranges
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
+        $immune = [',', '.', '_']; // Exceptions to escaping ranges
         for ($chr = 0; $chr < 0xFF; ++$chr) {
             if ($chr >= 0x30 && $chr <= 0x39
             || $chr >= 0x41 && $chr <= 0x5A
             || $chr >= 0x61 && $chr <= 0x7A) {
                 $literal = $this->codepointToUtf8($chr);
-                $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'js'));
+                $this->assertEquals($literal, twig_escape_filter($twig, $literal, 'js'));
             } else {
                 $literal = $this->codepointToUtf8($chr);
-                if (in_array($literal, $immune)) {
-                    $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'js'));
+                if (\in_array($literal, $immune)) {
+                    $this->assertEquals($literal, twig_escape_filter($twig, $literal, 'js'));
                 } else {
                     $this->assertNotEquals(
                         $literal,
-                        twig_escape_filter($this->env, $literal, 'js'),
+                        twig_escape_filter($twig, $literal, 'js'),
                         "$literal should be escaped!");
                 }
             }
@@ -278,21 +293,22 @@ class Twig_Test_EscapingTest extends \PHPUnit\Framework\TestCase
 
     public function testHtmlAttributeEscapingEscapesOwaspRecommendedRanges()
     {
-        $immune = array(',', '.', '-', '_'); // Exceptions to escaping ranges
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
+        $immune = [',', '.', '-', '_']; // Exceptions to escaping ranges
         for ($chr = 0; $chr < 0xFF; ++$chr) {
             if ($chr >= 0x30 && $chr <= 0x39
             || $chr >= 0x41 && $chr <= 0x5A
             || $chr >= 0x61 && $chr <= 0x7A) {
                 $literal = $this->codepointToUtf8($chr);
-                $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'html_attr'));
+                $this->assertEquals($literal, twig_escape_filter($twig, $literal, 'html_attr'));
             } else {
                 $literal = $this->codepointToUtf8($chr);
-                if (in_array($literal, $immune)) {
-                    $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'html_attr'));
+                if (\in_array($literal, $immune)) {
+                    $this->assertEquals($literal, twig_escape_filter($twig, $literal, 'html_attr'));
                 } else {
                     $this->assertNotEquals(
                         $literal,
-                        twig_escape_filter($this->env, $literal, 'html_attr'),
+                        twig_escape_filter($twig, $literal, 'html_attr'),
                         "$literal should be escaped!");
                 }
             }
@@ -301,20 +317,87 @@ class Twig_Test_EscapingTest extends \PHPUnit\Framework\TestCase
 
     public function testCssEscapingEscapesOwaspRecommendedRanges()
     {
+        $twig = new \Twig\Environment($this->getMockBuilder(\Twig\Loader\LoaderInterface::class)->getMock());
         // CSS has no exceptions to escaping ranges
         for ($chr = 0; $chr < 0xFF; ++$chr) {
             if ($chr >= 0x30 && $chr <= 0x39
             || $chr >= 0x41 && $chr <= 0x5A
             || $chr >= 0x61 && $chr <= 0x7A) {
                 $literal = $this->codepointToUtf8($chr);
-                $this->assertEquals($literal, twig_escape_filter($this->env, $literal, 'css'));
+                $this->assertEquals($literal, twig_escape_filter($twig, $literal, 'css'));
             } else {
                 $literal = $this->codepointToUtf8($chr);
                 $this->assertNotEquals(
                     $literal,
-                    twig_escape_filter($this->env, $literal, 'css'),
+                    twig_escape_filter($twig, $literal, 'css'),
                     "$literal should be escaped!");
             }
         }
     }
+
+    /**
+     * @dataProvider provideCustomEscaperCases
+     */
+    public function testCustomEscaper($expected, $string, $strategy)
+    {
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $twig->getExtension(EscaperExtension::class)->setEscaper('foo', 'foo_escaper_for_test');
+
+        $this->assertSame($expected, twig_escape_filter($twig, $string, $strategy));
+    }
+
+    public function provideCustomEscaperCases()
+    {
+        return [
+            ['fooUTF-8', 'foo', 'foo'],
+            ['UTF-8', null, 'foo'],
+            ['42UTF-8', 42, 'foo'],
+        ];
+    }
+
+    /**
+     * @expectedException \Twig\Error\RuntimeError
+     */
+    public function testUnknownCustomEscaper()
+    {
+        twig_escape_filter(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()), 'foo', 'bar');
+    }
+
+    /**
+     * @dataProvider provideObjectsForEscaping
+     */
+    public function testObjectEscaping(string $escapedHtml, string $escapedJs, array $safeClasses)
+    {
+        $obj = new Twig_Tests_Extension_TestClass();
+        $twig = new Environment($this->getMockBuilder('\Twig\Loader\LoaderInterface')->getMock());
+        $twig->getExtension('\Twig\Extension\EscaperExtension')->setSafeClasses($safeClasses);
+        $this->assertSame($escapedHtml, twig_escape_filter($twig, $obj, 'html', null, true));
+        $this->assertSame($escapedJs, twig_escape_filter($twig, $obj, 'js', null, true));
+    }
+
+    public function provideObjectsForEscaping()
+    {
+        return [
+            ['&lt;br /&gt;', '<br />', ['\Twig_Tests_Extension_TestClass' => ['js']]],
+            ['<br />', '\u003Cbr\u0020\/\u003E', ['\Twig_Tests_Extension_TestClass' => ['html']]],
+            ['&lt;br /&gt;', '<br />', ['\Twig_Tests_Extension_SafeHtmlInterface' => ['js']]],
+            ['<br />', '<br />', ['\Twig_Tests_Extension_SafeHtmlInterface' => ['all']]],
+        ];
+    }
+}
+
+function foo_escaper_for_test(Environment $twig, $string, $charset)
+{
+    return $string.$charset;
+}
+
+interface Twig_Tests_Extension_SafeHtmlInterface
+{
+}
+class Twig_Tests_Extension_TestClass implements Twig_Tests_Extension_SafeHtmlInterface
+{
+    public function __toString()
+    {
+        return '<br />';
+    }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php b/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php
index 9d90e0ea..5596180f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Extension/SandboxTest.php
@@ -9,6 +9,17 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Environment;
+use Twig\Extension\SandboxExtension;
+use Twig\Loader\ArrayLoader;
+use Twig\Sandbox\SecurityError;
+use Twig\Sandbox\SecurityNotAllowedFilterError;
+use Twig\Sandbox\SecurityNotAllowedFunctionError;
+use Twig\Sandbox\SecurityNotAllowedMethodError;
+use Twig\Sandbox\SecurityNotAllowedPropertyError;
+use Twig\Sandbox\SecurityNotAllowedTagError;
+use Twig\Sandbox\SecurityPolicy;
+
 class Twig_Tests_Extension_SandboxTest extends \PHPUnit\Framework\TestCase
 {
     protected static $params;
@@ -16,19 +27,18 @@ class Twig_Tests_Extension_SandboxTest extends \PHPUnit\Framework\TestCase
 
     protected function setUp()
     {
-        self::$params = array(
+        self::$params = [
             'name' => 'Fabien',
             'obj' => new FooObject(),
-            'arr' => array('obj' => new FooObject()),
-        );
+            'arr' => ['obj' => new FooObject()],
+        ];
 
-        self::$templates = array(
+        self::$templates = [
             '1_basic1' => '{{ obj.foo }}',
             '1_basic2' => '{{ name|upper }}',
             '1_basic3' => '{% if name %}foo{% endif %}',
             '1_basic4' => '{{ obj.bar }}',
             '1_basic5' => '{{ obj }}',
-            '1_basic6' => '{{ arr.obj }}',
             '1_basic7' => '{{ cycle(["foo","bar"], 1) }}',
             '1_basic8' => '{{ obj.getfoobar }}{{ obj.getFooBar }}',
             '1_basic9' => '{{ obj.foobar }}{{ obj.fooBar }}',
@@ -36,33 +46,34 @@ class Twig_Tests_Extension_SandboxTest extends \PHPUnit\Framework\TestCase
             '1_layout' => '{% block content %}{% endblock %}',
             '1_child' => "{% extends \"1_layout\" %}\n{% block content %}\n{{ \"a\"|json_encode }}\n{% endblock %}",
             '1_include' => '{{ include("1_basic1", sandboxed=true) }}',
-        );
+            '1_range_operator' => '{{ (1..2)[0] }}',
+        ];
     }
 
     /**
-     * @expectedException        Twig_Sandbox_SecurityError
+     * @expectedException        \Twig\Sandbox\SecurityError
      * @expectedExceptionMessage Filter "json_encode" is not allowed in "1_child" at line 3.
      */
     public function testSandboxWithInheritance()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates, array('block'));
-        $twig->loadTemplate('1_child')->render(array());
+        $twig = $this->getEnvironment(true, [], self::$templates, ['block']);
+        $twig->load('1_child')->render([]);
     }
 
     public function testSandboxGloballySet()
     {
-        $twig = $this->getEnvironment(false, array(), self::$templates);
-        $this->assertEquals('FOO', $twig->loadTemplate('1_basic')->render(self::$params), 'Sandbox does nothing if it is disabled globally');
+        $twig = $this->getEnvironment(false, [], self::$templates);
+        $this->assertEquals('FOO', $twig->load('1_basic')->render(self::$params), 'Sandbox does nothing if it is disabled globally');
     }
 
     public function testSandboxUnallowedMethodAccessor()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates);
+        $twig = $this->getEnvironment(true, [], self::$templates);
         try {
-            $twig->loadTemplate('1_basic1')->render(self::$params);
+            $twig->load('1_basic1')->render(self::$params);
             $this->fail('Sandbox throws a SecurityError exception if an unallowed method is called');
-        } catch (Twig_Sandbox_SecurityError $e) {
-            $this->assertInstanceOf('Twig_Sandbox_SecurityNotAllowedMethodError', $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedMethodError');
+        } catch (SecurityError $e) {
+            $this->assertInstanceOf(SecurityNotAllowedMethodError::class, $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedMethodError');
             $this->assertEquals('FooObject', $e->getClassName(), 'Exception should be raised on the "FooObject" class');
             $this->assertEquals('foo', $e->getMethodName(), 'Exception should be raised on the "foo" method');
         }
@@ -70,201 +81,249 @@ class Twig_Tests_Extension_SandboxTest extends \PHPUnit\Framework\TestCase
 
     public function testSandboxUnallowedFilter()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates);
+        $twig = $this->getEnvironment(true, [], self::$templates);
         try {
-            $twig->loadTemplate('1_basic2')->render(self::$params);
+            $twig->load('1_basic2')->render(self::$params);
             $this->fail('Sandbox throws a SecurityError exception if an unallowed filter is called');
-        } catch (Twig_Sandbox_SecurityError $e) {
-            $this->assertInstanceOf('Twig_Sandbox_SecurityNotAllowedFilterError', $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedFilterError');
+        } catch (SecurityError $e) {
+            $this->assertInstanceOf(SecurityNotAllowedFilterError::class, $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedFilterError');
             $this->assertEquals('upper', $e->getFilterName(), 'Exception should be raised on the "upper" filter');
         }
     }
 
     public function testSandboxUnallowedTag()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates);
+        $twig = $this->getEnvironment(true, [], self::$templates);
         try {
-            $twig->loadTemplate('1_basic3')->render(self::$params);
+            $twig->load('1_basic3')->render(self::$params);
             $this->fail('Sandbox throws a SecurityError exception if an unallowed tag is used in the template');
-        } catch (Twig_Sandbox_SecurityError $e) {
-            $this->assertInstanceOf('Twig_Sandbox_SecurityNotAllowedTagError', $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedTagError');
+        } catch (SecurityError $e) {
+            $this->assertInstanceOf(SecurityNotAllowedTagError::class, $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedTagError');
             $this->assertEquals('if', $e->getTagName(), 'Exception should be raised on the "if" tag');
         }
     }
 
     public function testSandboxUnallowedProperty()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates);
+        $twig = $this->getEnvironment(true, [], self::$templates);
         try {
-            $twig->loadTemplate('1_basic4')->render(self::$params);
+            $twig->load('1_basic4')->render(self::$params);
             $this->fail('Sandbox throws a SecurityError exception if an unallowed property is called in the template');
-        } catch (Twig_Sandbox_SecurityError $e) {
-            $this->assertInstanceOf('Twig_Sandbox_SecurityNotAllowedPropertyError', $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedPropertyError');
+        } catch (SecurityError $e) {
+            $this->assertInstanceOf(SecurityNotAllowedPropertyError::class, $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedPropertyError');
             $this->assertEquals('FooObject', $e->getClassName(), 'Exception should be raised on the "FooObject" class');
             $this->assertEquals('bar', $e->getPropertyName(), 'Exception should be raised on the "bar" property');
         }
     }
 
-    public function testSandboxUnallowedToString()
+    /**
+     * @dataProvider getSandboxUnallowedToStringTests
+     */
+    public function testSandboxUnallowedToString($template)
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates);
+        $twig = $this->getEnvironment(true, [], ['index' => $template], [], ['upper'], ['FooObject' => 'getAnotherFooObject'], [], ['random']);
         try {
-            $twig->loadTemplate('1_basic5')->render(self::$params);
+            $twig->load('index')->render(self::$params);
             $this->fail('Sandbox throws a SecurityError exception if an unallowed method (__toString()) is called in the template');
-        } catch (Twig_Sandbox_SecurityError $e) {
-            $this->assertInstanceOf('Twig_Sandbox_SecurityNotAllowedMethodError', $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedMethodError');
+        } catch (SecurityError $e) {
+            $this->assertInstanceOf(SecurityNotAllowedMethodError::class, $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedMethodError');
             $this->assertEquals('FooObject', $e->getClassName(), 'Exception should be raised on the "FooObject" class');
             $this->assertEquals('__tostring', $e->getMethodName(), 'Exception should be raised on the "__toString" method');
         }
     }
 
-    public function testSandboxUnallowedToStringArray()
+    public function getSandboxUnallowedToStringTests()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates);
-        try {
-            $twig->loadTemplate('1_basic6')->render(self::$params);
-            $this->fail('Sandbox throws a SecurityError exception if an unallowed method (__toString()) is called in the template');
-        } catch (Twig_Sandbox_SecurityError $e) {
-            $this->assertInstanceOf('Twig_Sandbox_SecurityNotAllowedMethodError', $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedMethodError');
-            $this->assertEquals('FooObject', $e->getClassName(), 'Exception should be raised on the "FooObject" class');
-            $this->assertEquals('__tostring', $e->getMethodName(), 'Exception should be raised on the "__toString" method');
-        }
+        return [
+            'simple' => ['{{ obj }}'],
+            'object_from_array' => ['{{ arr.obj }}'],
+            'object_chain' => ['{{ obj.anotherFooObject }}'],
+            'filter' => ['{{ obj|upper }}'],
+            'filter_from_array' => ['{{ arr.obj|upper }}'],
+            'function' => ['{{ random(obj) }}'],
+            'function_from_array' => ['{{ random(arr.obj) }}'],
+            'function_and_filter' => ['{{ random(obj|upper) }}'],
+            'function_and_filter_from_array' => ['{{ random(arr.obj|upper) }}'],
+            'object_chain_and_filter' => ['{{ obj.anotherFooObject|upper }}'],
+            'object_chain_and_function' => ['{{ random(obj.anotherFooObject) }}'],
+            'concat' => ['{{ obj ~ "" }}'],
+            'concat_again' => ['{{ "" ~ obj }}'],
+        ];
     }
 
-    public function testSandboxUnallowedFunction()
+    /**
+     * @dataProvider getSandboxAllowedToStringTests
+     */
+    public function testSandboxAllowedToString($template, $output)
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates);
-        try {
-            $twig->loadTemplate('1_basic7')->render(self::$params);
-            $this->fail('Sandbox throws a SecurityError exception if an unallowed function is called in the template');
-        } catch (Twig_Sandbox_SecurityError $e) {
-            $this->assertInstanceOf('Twig_Sandbox_SecurityNotAllowedFunctionError', $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedFunctionError');
-            $this->assertEquals('cycle', $e->getFunctionName(), 'Exception should be raised on the "cycle" function');
-        }
+        $twig = $this->getEnvironment(true, [], ['index' => $template], ['set'], [], ['FooObject' => ['foo', 'getAnotherFooObject']]);
+        $this->assertEquals($output, $twig->load('index')->render(self::$params));
     }
 
-    public function testSandboxAllowMethodFoo()
+    public function getSandboxAllowedToStringTests()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array('FooObject' => 'foo'));
-        FooObject::reset();
-        $this->assertEquals('foo', $twig->loadTemplate('1_basic1')->render(self::$params), 'Sandbox allow some methods');
-        $this->assertEquals(1, FooObject::$called['foo'], 'Sandbox only calls method once');
+        return [
+            'constant_test' => ['{{ obj is constant("PHP_INT_MAX") }}', ''],
+            'set_object' => ['{% set a = obj.anotherFooObject %}{{ a.foo }}', 'foo'],
+            'is_defined' => ['{{ obj.anotherFooObject is defined }}', '1'],
+            'is_null' => ['{{ obj is null }}', ''],
+            'is_sameas' => ['{{ obj is same as(obj) }}', '1'],
+            'is_sameas_from_array' => ['{{ arr.obj is same as(arr.obj) }}', '1'],
+            'is_sameas_from_another_method' => ['{{ obj.anotherFooObject is same as(obj.anotherFooObject) }}', ''],
+        ];
     }
 
     public function testSandboxAllowMethodToString()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array('FooObject' => '__toString'));
+        $twig = $this->getEnvironment(true, [], self::$templates, [], [], ['FooObject' => '__toString']);
         FooObject::reset();
-        $this->assertEquals('foo', $twig->loadTemplate('1_basic5')->render(self::$params), 'Sandbox allow some methods');
+        $this->assertEquals('foo', $twig->load('1_basic5')->render(self::$params), 'Sandbox allow some methods');
         $this->assertEquals(1, FooObject::$called['__toString'], 'Sandbox only calls method once');
     }
 
     public function testSandboxAllowMethodToStringDisabled()
     {
-        $twig = $this->getEnvironment(false, array(), self::$templates);
+        $twig = $this->getEnvironment(false, [], self::$templates);
         FooObject::reset();
-        $this->assertEquals('foo', $twig->loadTemplate('1_basic5')->render(self::$params), 'Sandbox allows __toString when sandbox disabled');
+        $this->assertEquals('foo', $twig->load('1_basic5')->render(self::$params), 'Sandbox allows __toString when sandbox disabled');
         $this->assertEquals(1, FooObject::$called['__toString'], 'Sandbox only calls method once');
     }
 
+    public function testSandboxUnallowedFunction()
+    {
+        $twig = $this->getEnvironment(true, [], self::$templates);
+        try {
+            $twig->load('1_basic7')->render(self::$params);
+            $this->fail('Sandbox throws a SecurityError exception if an unallowed function is called in the template');
+        } catch (SecurityError $e) {
+            $this->assertInstanceOf(SecurityNotAllowedFunctionError::class, $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedFunctionError');
+            $this->assertEquals('cycle', $e->getFunctionName(), 'Exception should be raised on the "cycle" function');
+        }
+    }
+
+    public function testSandboxUnallowedRangeOperator()
+    {
+        $twig = $this->getEnvironment(true, [], self::$templates);
+        try {
+            $twig->load('1_range_operator')->render(self::$params);
+            $this->fail('Sandbox throws a SecurityError exception if the unallowed range operator is called');
+        } catch (SecurityError $e) {
+            $this->assertInstanceOf(SecurityNotAllowedFunctionError::class, $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedFunctionError');
+            $this->assertEquals('range', $e->getFunctionName(), 'Exception should be raised on the "range" function');
+        }
+    }
+
+    public function testSandboxAllowMethodFoo()
+    {
+        $twig = $this->getEnvironment(true, [], self::$templates, [], [], ['FooObject' => 'foo']);
+        FooObject::reset();
+        $this->assertEquals('foo', $twig->load('1_basic1')->render(self::$params), 'Sandbox allow some methods');
+        $this->assertEquals(1, FooObject::$called['foo'], 'Sandbox only calls method once');
+    }
+
     public function testSandboxAllowFilter()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates, array(), array('upper'));
-        $this->assertEquals('FABIEN', $twig->loadTemplate('1_basic2')->render(self::$params), 'Sandbox allow some filters');
+        $twig = $this->getEnvironment(true, [], self::$templates, [], ['upper']);
+        $this->assertEquals('FABIEN', $twig->load('1_basic2')->render(self::$params), 'Sandbox allow some filters');
     }
 
     public function testSandboxAllowTag()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates, array('if'));
-        $this->assertEquals('foo', $twig->loadTemplate('1_basic3')->render(self::$params), 'Sandbox allow some tags');
+        $twig = $this->getEnvironment(true, [], self::$templates, ['if']);
+        $this->assertEquals('foo', $twig->load('1_basic3')->render(self::$params), 'Sandbox allow some tags');
     }
 
     public function testSandboxAllowProperty()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array(), array('FooObject' => 'bar'));
-        $this->assertEquals('bar', $twig->loadTemplate('1_basic4')->render(self::$params), 'Sandbox allow some properties');
+        $twig = $this->getEnvironment(true, [], self::$templates, [], [], [], ['FooObject' => 'bar']);
+        $this->assertEquals('bar', $twig->load('1_basic4')->render(self::$params), 'Sandbox allow some properties');
     }
 
     public function testSandboxAllowFunction()
     {
-        $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array(), array(), array('cycle'));
-        $this->assertEquals('bar', $twig->loadTemplate('1_basic7')->render(self::$params), 'Sandbox allow some functions');
+        $twig = $this->getEnvironment(true, [], self::$templates, [], [], [], [], ['cycle']);
+        $this->assertEquals('bar', $twig->load('1_basic7')->render(self::$params), 'Sandbox allow some functions');
+    }
+
+    public function testSandboxAllowRangeOperator()
+    {
+        $twig = $this->getEnvironment(true, [], self::$templates, [], [], [], [], ['range']);
+        $this->assertEquals('1', $twig->load('1_range_operator')->render(self::$params), 'Sandbox allow the range operator');
     }
 
     public function testSandboxAllowFunctionsCaseInsensitive()
     {
-        foreach (array('getfoobar', 'getFoobar', 'getFooBar') as $name) {
-            $twig = $this->getEnvironment(true, array(), self::$templates, array(), array(), array('FooObject' => $name));
+        foreach (['getfoobar', 'getFoobar', 'getFooBar'] as $name) {
+            $twig = $this->getEnvironment(true, [], self::$templates, [], [], ['FooObject' => $name]);
             FooObject::reset();
-            $this->assertEquals('foobarfoobar', $twig->loadTemplate('1_basic8')->render(self::$params), 'Sandbox allow methods in a case-insensitive way');
+            $this->assertEquals('foobarfoobar', $twig->load('1_basic8')->render(self::$params), 'Sandbox allow methods in a case-insensitive way');
             $this->assertEquals(2, FooObject::$called['getFooBar'], 'Sandbox only calls method once');
 
-            $this->assertEquals('foobarfoobar', $twig->loadTemplate('1_basic9')->render(self::$params), 'Sandbox allow methods via shortcut names (ie. without get/set)');
+            $this->assertEquals('foobarfoobar', $twig->load('1_basic9')->render(self::$params), 'Sandbox allow methods via shortcut names (ie. without get/set)');
         }
     }
 
     public function testSandboxLocallySetForAnInclude()
     {
-        self::$templates = array(
+        self::$templates = [
             '2_basic' => '{{ obj.foo }}{% include "2_included" %}{{ obj.foo }}',
             '2_included' => '{% if obj.foo %}{{ obj.foo|upper }}{% endif %}',
-        );
+        ];
 
-        $twig = $this->getEnvironment(false, array(), self::$templates);
-        $this->assertEquals('fooFOOfoo', $twig->loadTemplate('2_basic')->render(self::$params), 'Sandbox does nothing if disabled globally and sandboxed not used for the include');
+        $twig = $this->getEnvironment(false, [], self::$templates);
+        $this->assertEquals('fooFOOfoo', $twig->load('2_basic')->render(self::$params), 'Sandbox does nothing if disabled globally and sandboxed not used for the include');
 
-        self::$templates = array(
+        self::$templates = [
             '3_basic' => '{{ obj.foo }}{% sandbox %}{% include "3_included" %}{% endsandbox %}{{ obj.foo }}',
             '3_included' => '{% if obj.foo %}{{ obj.foo|upper }}{% endif %}',
-        );
+        ];
 
-        $twig = $this->getEnvironment(true, array(), self::$templates);
+        $twig = $this->getEnvironment(true, [], self::$templates);
         try {
-            $twig->loadTemplate('3_basic')->render(self::$params);
+            $twig->load('3_basic')->render(self::$params);
             $this->fail('Sandbox throws a SecurityError exception when the included file is sandboxed');
-        } catch (Twig_Sandbox_SecurityError $e) {
-            $this->assertInstanceOf('Twig_Sandbox_SecurityNotAllowedTagError', $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedTagError');
+        } catch (SecurityError $e) {
+            $this->assertInstanceOf(SecurityNotAllowedTagError::class, $e, 'Exception should be an instance of Twig_Sandbox_SecurityNotAllowedTagError');
             $this->assertEquals('sandbox', $e->getTagName());
         }
     }
 
     public function testMacrosInASandbox()
     {
-        $twig = $this->getEnvironment(true, array('autoescape' => 'html'), array('index' => <<<EOF
+        $twig = $this->getEnvironment(true, ['autoescape' => 'html'], ['index' => <<<EOF
 {%- import _self as macros %}
 
 {%- macro test(text) %}<p>{{ text }}</p>{% endmacro %}
 
 {{- macros.test('username') }}
 EOF
-        ), array('macro', 'import'), array('escape'));
+        ], ['macro', 'import'], ['escape']);
 
-        $this->assertEquals('<p>username</p>', $twig->loadTemplate('index')->render(array()));
+        $this->assertEquals('<p>username</p>', $twig->load('index')->render([]));
     }
 
     public function testSandboxDisabledAfterIncludeFunctionError()
     {
-        $twig = $this->getEnvironment(false, array(), self::$templates);
+        $twig = $this->getEnvironment(false, [], self::$templates);
 
         $e = null;
         try {
-            $twig->loadTemplate('1_include')->render(self::$params);
-        } catch (Throwable $e) {
-        } catch (Exception $e) {
+            $twig->load('1_include')->render(self::$params);
+        } catch (\Throwable $e) {
         }
-        if ($e === null) {
+        if (null === $e) {
             $this->fail('An exception should be thrown for this test to be valid.');
         }
 
-        $this->assertFalse($twig->getExtension('Twig_Extension_Sandbox')->isSandboxed(), 'Sandboxed include() function call should not leave Sandbox enabled when an error occurs.');
+        $this->assertFalse($twig->getExtension(SandboxExtension::class)->isSandboxed(), 'Sandboxed include() function call should not leave Sandbox enabled when an error occurs.');
     }
 
-    protected function getEnvironment($sandboxed, $options, $templates, $tags = array(), $filters = array(), $methods = array(), $properties = array(), $functions = array())
+    protected function getEnvironment($sandboxed, $options, $templates, $tags = [], $filters = [], $methods = [], $properties = [], $functions = [])
     {
-        $loader = new Twig_Loader_Array($templates);
-        $twig = new Twig_Environment($loader, array_merge(array('debug' => true, 'cache' => false, 'autoescape' => false), $options));
-        $policy = new Twig_Sandbox_SecurityPolicy($tags, $filters, $methods, $properties, $functions);
-        $twig->addExtension(new Twig_Extension_Sandbox($policy, $sandboxed));
+        $loader = new ArrayLoader($templates);
+        $twig = new Environment($loader, array_merge(['debug' => true, 'cache' => false, 'autoescape' => false], $options));
+        $policy = new SecurityPolicy($tags, $filters, $methods, $properties, $functions);
+        $twig->addExtension(new SandboxExtension($policy, $sandboxed));
 
         return $twig;
     }
@@ -272,13 +331,13 @@ EOF
 
 class FooObject
 {
-    public static $called = array('__toString' => 0, 'foo' => 0, 'getFooBar' => 0);
+    public static $called = ['__toString' => 0, 'foo' => 0, 'getFooBar' => 0];
 
     public $bar = 'bar';
 
     public static function reset()
     {
-        self::$called = array('__toString' => 0, 'foo' => 0, 'getFooBar' => 0);
+        self::$called = ['__toString' => 0, 'foo' => 0, 'getFooBar' => 0];
     }
 
     public function __toString()
@@ -301,4 +360,9 @@ class FooObject
 
         return 'foobar';
     }
+
+    public function getAnotherFooObject()
+    {
+        return new self();
+    }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/FactoryRuntimeLoaderTest.php b/vendor/twig/twig/test/Twig/Tests/FactoryRuntimeLoaderTest.php
index f97d3069..47d62afc 100644
--- a/vendor/twig/twig/test/Twig/Tests/FactoryRuntimeLoaderTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/FactoryRuntimeLoaderTest.php
@@ -9,18 +9,20 @@
  * file that was distributed with this source code.
  */
 
+use Twig\RuntimeLoader\FactoryRuntimeLoader;
+
 class Twig_Tests_FactoryRuntimeLoaderTest extends \PHPUnit\Framework\TestCase
 {
     public function testLoad()
     {
-        $loader = new Twig_FactoryRuntimeLoader(array('stdClass' => 'getRuntime'));
+        $loader = new FactoryRuntimeLoader(['stdClass' => 'getRuntime']);
 
         $this->assertInstanceOf('stdClass', $loader->load('stdClass'));
     }
 
     public function testLoadReturnsNullForUnmappedRuntime()
     {
-        $loader = new Twig_FactoryRuntimeLoader();
+        $loader = new FactoryRuntimeLoader();
 
         $this->assertNull($loader->load('stdClass'));
     }
@@ -28,5 +30,5 @@ class Twig_Tests_FactoryRuntimeLoaderTest extends \PHPUnit\Framework\TestCase
 
 function getRuntime()
 {
-    return new stdClass();
+    return new \stdClass();
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php b/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php
deleted file mode 100644
index e8a23ead..00000000
--- a/vendor/twig/twig/test/Twig/Tests/FileCachingTest.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-require_once dirname(__FILE__).'/FilesystemHelper.php';
-
-class Twig_Tests_FileCachingTest extends \PHPUnit\Framework\TestCase
-{
-    private $env;
-    private $tmpDir;
-
-    protected function setUp()
-    {
-        $this->tmpDir = sys_get_temp_dir().'/TwigTests';
-        if (!file_exists($this->tmpDir)) {
-            @mkdir($this->tmpDir, 0777, true);
-        }
-
-        if (!is_writable($this->tmpDir)) {
-            $this->markTestSkipped(sprintf('Unable to run the tests as "%s" is not writable.', $this->tmpDir));
-        }
-
-        $this->env = new Twig_Environment(new Twig_Loader_Array(array('index' => 'index', 'index2' => 'index2')), array('cache' => $this->tmpDir));
-    }
-
-    protected function tearDown()
-    {
-        Twig_Tests_FilesystemHelper::removeDir($this->tmpDir);
-    }
-
-    /**
-     * @group legacy
-     */
-    public function testWritingCacheFiles()
-    {
-        $name = 'index';
-        $this->env->loadTemplate($name);
-        $cacheFileName = $this->env->getCacheFilename($name);
-
-        $this->assertFileExists($cacheFileName, 'Cache file does not exist.');
-    }
-
-    /**
-     * @group legacy
-     */
-    public function testClearingCacheFiles()
-    {
-        $name = 'index2';
-        $this->env->loadTemplate($name);
-        $cacheFileName = $this->env->getCacheFilename($name);
-
-        $this->assertFileExists($cacheFileName, 'Cache file does not exist.');
-        $this->env->clearCacheFiles();
-        $this->assertFileNotExists($cacheFileName, 'Cache file was not cleared.');
-    }
-}
diff --git a/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php b/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php
index a983a47c..120d9ce7 100644
--- a/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/FileExtensionEscapingStrategyTest.php
@@ -9,6 +9,8 @@
  * file that was distributed with this source code.
  */
 
+use Twig\FileExtensionEscapingStrategy;
+
 class Twig_Tests_FileExtensionEscapingStrategyTest extends \PHPUnit\Framework\TestCase
 {
     /**
@@ -16,36 +18,36 @@ class Twig_Tests_FileExtensionEscapingStrategyTest extends \PHPUnit\Framework\Te
      */
     public function testGuess($strategy, $filename)
     {
-        $this->assertSame($strategy, Twig_FileExtensionEscapingStrategy::guess($filename));
+        $this->assertSame($strategy, FileExtensionEscapingStrategy::guess($filename));
     }
 
     public function getGuessData()
     {
-        return array(
+        return [
             // default
-            array('html', 'foo.html'),
-            array('html', 'foo.html.twig'),
-            array('html', 'foo'),
-            array('html', 'foo.bar.twig'),
-            array('html', 'foo.txt/foo'),
-            array('html', 'foo.txt/foo.js/'),
+            ['html', 'foo.html'],
+            ['html', 'foo.html.twig'],
+            ['html', 'foo'],
+            ['html', 'foo.bar.twig'],
+            ['html', 'foo.txt/foo'],
+            ['html', 'foo.txt/foo.js/'],
 
             // css
-            array('css', 'foo.css'),
-            array('css', 'foo.css.twig'),
-            array('css', 'foo.twig.css'),
-            array('css', 'foo.js.css'),
-            array('css', 'foo.js.css.twig'),
+            ['css', 'foo.css'],
+            ['css', 'foo.css.twig'],
+            ['css', 'foo.twig.css'],
+            ['css', 'foo.js.css'],
+            ['css', 'foo.js.css.twig'],
 
             // js
-            array('js', 'foo.js'),
-            array('js', 'foo.js.twig'),
-            array('js', 'foo.txt/foo.js'),
-            array('js', 'foo.txt.twig/foo.js'),
+            ['js', 'foo.js'],
+            ['js', 'foo.js.twig'],
+            ['js', 'foo.txt/foo.js'],
+            ['js', 'foo.txt.twig/foo.js'],
 
             // txt
-            array(false, 'foo.txt'),
-            array(false, 'foo.txt.twig'),
-        );
+            [false, 'foo.txt'],
+            [false, 'foo.txt.twig'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php b/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php
index 0e315e8f..b3ea3a8a 100644
--- a/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php
+++ b/vendor/twig/twig/test/Twig/Tests/FilesystemHelper.php
@@ -13,12 +13,8 @@ class Twig_Tests_FilesystemHelper
 {
     public static function removeDir($dir)
     {
-        $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir, PHP_VERSION_ID < 50300 ? 0 : FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST);
+        $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::CHILD_FIRST);
         foreach ($iterator as $filename => $fileInfo) {
-            if ($iterator->isDot()) {
-                continue;
-            }
-
             if ($fileInfo->isDir()) {
                 rmdir($filename);
             } else {
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/block.test
index 1290973a..a80b80c3 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/block.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/block.test
@@ -14,8 +14,8 @@ blocks and autoescape
 {% set _content = block('content')|raw %}
 {{ _content|raw }}
 --DATA--
-return array('br' => '<br />')
+return ['br' => '<br />']
 --CONFIG--
-return array('autoescape' => 'name')
+return ['autoescape' => 'name']
 --EXPECT--
 &lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/name.test
index 04299bed..5ad573cf 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/name.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/autoescape/name.test
@@ -12,11 +12,11 @@
 --TEMPLATE(index.txt.twig)--
 {{ br -}}
 --DATA--
-return array('br' => '<br />')
+return ['br' => '<br />']
 --CONFIG--
-return array('autoescape' => 'name')
+return ['autoescape' => 'name']
 --EXPECT--
 &lt;br /&gt;
-\x3Cbr\x20\x2F\x3E
+\u003Cbr\u0020\/\u003E
 &lt;br /&gt;
 <br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/leak-output.php b/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/leak-output.php
new file mode 100644
index 00000000..152a1828
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/errors/leak-output.php
@@ -0,0 +1,31 @@
+<?php
+
+require __DIR__.'/../../../../../vendor/autoload.php';
+
+use Twig\Environment;
+use Twig\Extension\AbstractExtension;
+use Twig\Loader\ArrayLoader;
+use Twig\TwigFilter;
+
+class BrokenExtension extends AbstractExtension
+{
+    public function getFilters()
+    {
+        return [
+            new TwigFilter('broken', [$this, 'broken']),
+        ];
+    }
+
+    public function broken()
+    {
+        die('OOPS');
+    }
+}
+
+$loader = new ArrayLoader([
+    'index.html.twig' => 'Hello {{ "world"|broken }}',
+]);
+$twig = new Environment($loader, ['debug' => isset($argv[1])]);
+$twig->addExtension(new BrokenExtension());
+
+echo $twig->render('index.html.twig');
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/child_contents_outside_blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/child_contents_outside_blocks.test
index a3f0b50f..74a1cc28 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/child_contents_outside_blocks.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/child_contents_outside_blocks.test
@@ -1,5 +1,5 @@
 --TEST--
-Exception for child templates defining contents outside blocks defined by parent
+Exception for child templates defining content outside blocks defined by parent
 --TEMPLATE--
 {% extends 'base.twig' %}
 
@@ -12,4 +12,4 @@ Content outside a block.
 {% block sidebar %}
 {% endblock %}
 --EXCEPTION--
-Twig_Error_Syntax: A template that extends another one cannot include contents outside Twig blocks. Did you forget to put the contents inside a {% block %} tag in "index.twig" at line 3?
+Twig\Error\SyntaxError: A template that extends another one cannot include content outside Twig blocks. Did you forget to put the content inside a {% block %} tag in "index.twig" at line 3?
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/exception_in_extension_extends.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/exception_in_extension_extends.test
new file mode 100644
index 00000000..2ab29805
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/exception_in_extension_extends.test
@@ -0,0 +1,12 @@
+--TEST--
+Exception thrown from a child for an extension error
+--TEMPLATE--
+{% extends 'base.twig' %}
+--TEMPLATE(base.twig)--
+
+
+{{ random([]) }}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\RuntimeError: The random function cannot pick from an empty array in "base.twig" at line 4.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/exception_in_extension_include.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/exception_in_extension_include.test
new file mode 100644
index 00000000..e2281b29
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/exception_in_extension_include.test
@@ -0,0 +1,12 @@
+--TEST--
+Exception thrown from an include for an extension error
+--TEMPLATE--
+{% include 'content.twig' %}
+--TEMPLATE(content.twig)--
+
+
+{{ random([]) }}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\RuntimeError: The random function cannot pick from an empty array in "content.twig" at line 4.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable.test
index 7ff2eedb..66784292 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable.test
@@ -13,6 +13,6 @@ Exception for multiline array with undefined variable
    foo2: foo2,
 } %}
 --DATA--
-return array('foobar' => 'foobar')
+return ['foobar' => 'foobar']
 --EXCEPTION--
-Twig_Error_Runtime: Variable "foo2" does not exist in "index.twig" at line 11.
+Twig\Error\RuntimeError: Variable "foo2" does not exist in "index.twig" at line 11.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable_again.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable_again.test
index c425069b..7f5e96b0 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable_again.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_array_with_undefined_variable_again.test
@@ -13,6 +13,6 @@ Exception for multiline array with undefined variable
    foo2: foo2,
 } %}
 --DATA--
-return array()
+return []
 --EXCEPTION--
-Twig_Error_Runtime: Variable "foobar" does not exist in "index.twig" at line 7.
+Twig\Error\RuntimeError: Variable "foobar" does not exist in "index.twig" at line 7.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_undefined_variable.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_undefined_variable.test
index 2f94a5ee..8bc524ef 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_undefined_variable.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_undefined_variable.test
@@ -7,6 +7,6 @@ Exception for multile function with undefined variable
 --TEMPLATE(foo)--
 Foo
 --DATA--
-return array()
+return []
 --EXCEPTION--
-Twig_Error_Runtime: Variable "with_context" does not exist in "index.twig" at line 3.
+Twig\Error\RuntimeError: Variable "with_context" does not exist in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_unknown_argument.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_unknown_argument.test
index 64761fcf..5f413d40 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_unknown_argument.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_function_with_unknown_argument.test
@@ -6,4 +6,4 @@ Exception for multiline function with unknown argument
    invalid=False
 ) }}
 --EXCEPTION--
-Twig_Error_Syntax: Unknown argument "invalid" for function "include(template, variables, with_context, ignore_missing, sandboxed)" in "index.twig" at line 4.
+Twig\Error\SyntaxError: Unknown argument "invalid" for function "include(template, variables, with_context, ignore_missing, sandboxed)" in "index.twig" at line 4.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_tag_with_undefined_variable.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_tag_with_undefined_variable.test
index 7b3b1daf..032ad831 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_tag_with_undefined_variable.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/multiline_tag_with_undefined_variable.test
@@ -7,6 +7,6 @@ Exception for multiline tag with undefined variable
 --TEMPLATE(foo)--
 Foo
 --DATA--
-return array()
+return []
 --EXCEPTION--
-Twig_Error_Runtime: Variable "vars" does not exist in "index.twig" at line 3.
+Twig\Error\RuntimeError: Variable "vars" does not exist in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/strict_comparison_operator.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/strict_comparison_operator.test
new file mode 100644
index 00000000..e14beb67
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/strict_comparison_operator.test
@@ -0,0 +1,6 @@
+--TEST--
+The PHP === strict comparison operator is not supported
+--TEMPLATE--
+{{ 1 === 2 }}
+--EXCEPTION--
+Twig\Error\SyntaxError: Unexpected operator of value "=". Did you try to use "===" or "!==" for strict comparison? Use "is same as(value)" instead in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/syntax_error_in_reused_template.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/syntax_error_in_reused_template.test
index 9ca418b2..4ce06854 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/syntax_error_in_reused_template.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/syntax_error_in_reused_template.test
@@ -7,4 +7,4 @@ Exception for syntax error in reused template
     {% do node.data = 5 %}
 {% endblock %}
 --EXCEPTION--
-Twig_Error_Syntax: Unexpected token "operator" of value "=" ("end of statement block" expected) in "foo.twig" at line 3.
+Twig\Error\SyntaxError: Unexpected token "operator" of value "=" ("end of statement block" expected) in "foo.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test
index 2c35ad56..b4fc1691 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/unclosed_tag.test
@@ -17,4 +17,4 @@ Exception for an unclosed tag
 
 {% endblock %}
 --EXCEPTION--
-Twig_Error_Syntax: Unexpected "endblock" tag (expecting closing tag for the "if" tag defined near line 4) in "index.twig" at line 16.
+Twig\Error\SyntaxError: Unexpected "endblock" tag (expecting closing tag for the "if" tag defined near line 4) in "index.twig" at line 16.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_parent.test
index c8e7a097..07f855a3 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_parent.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_parent.test
@@ -4,5 +4,7 @@ Exception for an undefined parent
 {% extends 'foo.html' %}
 
 {% set foo = "foo" %}
+--DATA--
+return []
 --EXCEPTION--
-Twig_Error_Loader: Template "foo.html" is not defined in "index.twig" at line 2.
+Twig\Error\LoaderError: Template "foo.html" is not defined in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_template_in_child_template.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_template_in_child_template.test
index 1992510b..904faa50 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_template_in_child_template.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_template_in_child_template.test
@@ -10,6 +10,6 @@ Exception for an undefined template in a child template
 {% block sidebar %}
 {% endblock %}
 --DATA--
-return array()
+return []
 --EXCEPTION--
-Twig_Error_Loader: Template "include.twig" is not defined in "index.twig" at line 5.
+Twig\Error\LoaderError: Template "include.twig" is not defined in "index.twig" at line 5.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_trait.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_trait.test
index 6679fbe1..5bfdd07e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_trait.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/exceptions/undefined_trait.test
@@ -6,4 +6,4 @@ Exception for an undefined trait
 {% block bar %}
 {% endblock %}
 --EXCEPTION--
-Twig_Error_Runtime: Block "foobar" is not defined in trait "foo" in "index.twig" at line 2.
+Twig\Error\RuntimeError: Block "foobar" is not defined in trait "foo" in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/_self.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/_self.test
index 32fed8fd..fb88f4c8 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/_self.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/_self.test
@@ -3,6 +3,6 @@ _self returns the template name
 --TEMPLATE--
 {{ _self }}
 --DATA--
-return array()
+return []
 --EXPECT--
 index.twig
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test
index c69b1192..35579dc1 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array.test
@@ -37,8 +37,16 @@ Twig supports array notation
 {% set ary = { (a): 'a', (b): 'b', 'c': 'c', (a ~ b): 'd' } %}
 {{ ary|keys|join(',') }}
 {{ ary|join(',') }}
+
+{# ArrayAccess #}
+{{ array_access['a'] }}
+
+{# array that does not exist #}
+{{ does_not_exist[0]|default('ok') }}
+{{ does_not_exist[0].does_not_exist_either|default('ok') }}
+{{ does_not_exist[0]['does_not_exist_either']|default('ok') }}
 --DATA--
-return array('bar' => 'bar', 'foo' => array('bar' => 'bar'))
+return ['bar' => 'bar', 'foo' => ['bar' => 'bar'], 'array_access' => new \ArrayObject(['a' => 'b'])]
 --EXPECT--
 1,2
 foo,bar
@@ -59,3 +67,39 @@ FOO,BAR,
 
 1,foo,c,1foo
 a,b,c,d
+
+b
+
+ok
+ok
+ok
+--DATA--
+return ['bar' => 'bar', 'foo' => ['bar' => 'bar'], 'array_access' => new \ArrayObject(['a' =>  'b'])]
+--CONFIG--
+return ['strict_variables' => false]
+--EXPECT--
+1,2
+foo,bar
+1,bar
+0,foo
+
+1,bar
+0,foo
+
+1,2
+bar
+
+bar
+
+FOO,BAR,
+
+1,2
+
+1,foo,c,1foo
+a,b,c,d
+
+b
+
+ok
+ok
+ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test
index f3df328f..8c7a2ee7 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/array_call.test
@@ -6,7 +6,7 @@ Twig supports method calls
 {{ items[foo] }}
 {{ items[items[foo]] }}
 --DATA--
-return array('foo' => 'bar', 'items' => array('foo' => 'bar', 'bar' => 'foo'))
+return ['foo' => 'bar', 'items' => ['foo' => 'bar', 'bar' => 'foo']]
 --EXPECT--
 bar
 bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test
index f5e68456..b4e8be58 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/binary.test
@@ -22,7 +22,7 @@ Twig supports binary operations (+, -, *, /, ~, %, and, or)
 {{ foo ~ bar }}
 {{ 20 // 7 }}
 --DATA--
-return array('foo' => 'bar', 'bar' => 'foo')
+return ['foo' => 'bar', 'bar' => 'foo']
 --EXPECT--
 2
 1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test
index 74fe6cab..c2bda1cc 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/bitwise.test
@@ -6,7 +6,7 @@ Twig supports bitwise operations
 {{ 1 b-xor 5 }}
 {{ (1 and 0 b-or 0) is same as(1 and (0 b-or 0)) ? 'ok' : 'ko' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 1
 5
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/call_argument_defined_twice.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/call_argument_defined_twice.test
new file mode 100644
index 00000000..36539a6d
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/call_argument_defined_twice.test
@@ -0,0 +1,8 @@
+--TEST--
+Argument is defined twice in a call
+--TEMPLATE--
+{{ date(987654, date = 123456) }}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Argument "date" is defined twice for function "date" in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/call_positional_arg_after_named_arg.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/call_positional_arg_after_named_arg.test
new file mode 100644
index 00000000..729c6748
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/call_positional_arg_after_named_arg.test
@@ -0,0 +1,8 @@
+--TEST--
+Positional arguments after named arguments in a call
+--TEMPLATE--
+{{ date(date = 123456, 'Y-m-d') }}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Positional arguments cannot be used after named arguments for function "date" in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test
index 726b8507..2811634f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/comparison.test
@@ -6,7 +6,7 @@ Twig supports comparison operators (==, !=, <, >, >=, <=)
 {{ 1 == 1 }}/{{ 1 == 2 }}
 {{ 1 != 1 }}/{{ 1 != 2 }}
 --DATA--
-return array()
+return []
 --EXPECT--
 ///1
 1//1/1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/divisibleby.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/divisibleby.test
index 238dd279..f1bf5681 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/divisibleby.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/divisibleby.test
@@ -9,7 +9,7 @@ Twig supports the "divisible by" operator
    by
    (3) ? 'OK' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 OK
 OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test
index 9cd0676c..0efa9305 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/dotdot.test
@@ -11,7 +11,7 @@ Twig supports the .. operator
 
 {% for i in 0 + 1 .. 10 - 1 %}{{ i }} {% endfor %}
 --DATA--
-return array('foo' => array(1, 10))
+return ['foo' => [1, 10]]
 --EXPECT--
 0 1 2 3 4 5 6 7 8 9 10 
 a b c d e f g h i j k l m n o p q r s t u v w x y z 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ends_with.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ends_with.test
index 9ad5e5e8..c8086d6d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ends_with.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ends_with.test
@@ -12,7 +12,7 @@ Twig supports the "ends with" operator
 {{ false ends with false ? 'OK' : 'KO' }}
 {{ false ends with '' ? 'OK' : 'KO' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 OK
 OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/floats.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/floats.test
new file mode 100644
index 00000000..be5bfafa
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/floats.test
@@ -0,0 +1,14 @@
+--TEST--
+Twig compiles floats properly
+--TEMPLATE--
+{% set val2 = 0.0 %}
+
+{{ val is same as (0.0) ? 'Yes' : 'No' }}
+{{ val2 is same as (0.0) ? 'Yes' : 'No' }}
+{{ val is same as (val2) ? 'Yes' : 'No' }}
+--DATA--
+return ['val' => 0.0]
+--EXPECT--
+Yes
+Yes
+Yes
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test
index 79f8e0b0..069ebf79 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/grouping.test
@@ -3,6 +3,6 @@ Twig supports grouping of expressions
 --TEMPLATE--
 {{ (2 + 2) / 2 }}
 --DATA--
-return array()
+return []
 --EXPECT--
 2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test
index 7ae3bae9..308e8df2 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/literals.test
@@ -10,7 +10,7 @@ Twig supports literals
 7 {{ null }}
 8 {{ NULL }}
 --DATA--
-return array()
+return []
 --EXPECT--
 1 1
 2 1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test
index 1a27a2d6..60417e04 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/magic_call.test
@@ -21,7 +21,7 @@ class TestClassForMagicCallAttributes
     }
 }
 
-return array('foo' => new TestClassForMagicCallAttributes())
+return ['foo' => new TestClassForMagicCallAttributes()]
 --EXPECT--
 foo_from_call
 bar_from_getbar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/matches.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/matches.test
index b6c77165..95459c3b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/matches.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/matches.test
@@ -5,7 +5,7 @@ Twig supports the "matches" operator
 {{ 'foo' matches '/^fo/' ? 'OK' : 'KO' }}
 {{ 'foo' matches '/O/i' ? 'OK' : 'KO' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 OK
 OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test
index 5f801e63..1826842b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/method_call.test
@@ -12,9 +12,9 @@ Twig supports method calls
 {{ items.foo.in }}
 {{ items.foo.not }}
 --DATA--
-return array('foo' => 'bar', 'items' => array('foo' => new TwigTestFoo(), 'bar' => 'foo'))
+return ['foo' => 'bar', 'items' => ['foo' => new TwigTestFoo(), 'bar' => 'foo']]
 --CONFIG--
-return array('strict_variables' => false)
+return ['strict_variables' => false]
 --EXPECT--
 foo
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/negative_numbers.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/negative_numbers.test
index 1853b1b0..c2a6e340 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/negative_numbers.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/negative_numbers.test
@@ -8,7 +8,7 @@ Twig manages negative numbers correctly
 {{ 5 + -1 }}
 {{ 5 + - 1 }}
 --DATA--
-return array()
+return []
 --EXPECT--
 -1
 -1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/not_arrow_fn.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/not_arrow_fn.test
new file mode 100644
index 00000000..af82c47c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/not_arrow_fn.test
@@ -0,0 +1,8 @@
+--TEST--
+A string in parentheses cannot be confused with an arrow function
+--TEMPLATE--
+{{ ["foo", "bar"]|join(("f")) }}
+--DATA--
+return []
+--EXPECT--
+foofbar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/operators_as_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/operators_as_variables.test
index fe29d08b..fa9a843c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/operators_as_variables.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/operators_as_variables.test
@@ -7,7 +7,7 @@ Twig allows to use named operators as variable names
 {{ in }}
 {{ is }}
 --DATA--
-return array('matches' => array(1, 2, 3), 'in' => 'in', 'is' => 'is')
+return ['matches' => [1, 2, 3], 'in' => 'in', 'is' => 'is']
 --EXPECT--
 1
 2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test
index 542c3504..276cbf19 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/postfix.test
@@ -12,7 +12,7 @@ Twig parses postfix expressions
 {{ macros.foo() }}
 {{ (macros).foo() }}
 --DATA--
-return array();
+return []
 --EXPECT--
 a
 A
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/power.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/power.test
index eacc98f8..84fd2369 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/power.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/power.test
@@ -9,7 +9,7 @@ Twig parses power expressions
 {{ b ** a }}
 {{ b ** b }}
 --DATA--
-return array('a' => 4, 'b' => -2);
+return ['a' => 4, 'b' => -2]
 --EXPECT--
 8
 -8
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/sameas.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/sameas.test
index 601201de..83f3691f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/sameas.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/sameas.test
@@ -11,7 +11,7 @@ Twig supports the "same as" operator
     as
     (true) ? 'OK' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 OK
 OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/starts_with.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/starts_with.test
index 75d331e9..a78ff1ea 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/starts_with.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/starts_with.test
@@ -13,7 +13,7 @@ with 'f' ? 'OK' : 'KO' }}
 {{ 'a' starts with false ? 'OK' : 'KO' }}
 {{ false starts with '' ? 'OK' : 'KO' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 OK
 OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/string_operator_as_var_assignment.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/string_operator_as_var_assignment.test
new file mode 100644
index 00000000..478d4eb5
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/string_operator_as_var_assignment.test
@@ -0,0 +1,18 @@
+--TEST--
+Twig supports the string operators as variable names in assignments
+--TEMPLATE--
+{% for matches in [1, 2] %}
+    {{- matches }}
+{% endfor %}
+
+{% set matches = [1, 2] %}
+
+OK
+--DATA--
+return []
+--EXPECT--
+1
+2
+
+
+OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test
index a9116613..f402c893 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/strings.test
@@ -4,7 +4,7 @@ Twig supports string interpolation
 {{ "foo #{"foo #{bar} baz"} baz" }}
 {{ "foo #{bar}#{bar} baz" }}
 --DATA--
-return array('bar' => 'BAR');
+return ['bar' => 'BAR']
 --EXPECT--
 foo foo BAR baz baz
 foo BARBAR baz
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test
index 0e6fa96e..37eccc0f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator.test
@@ -8,7 +8,7 @@ Twig supports the ternary operator
 {{ 1 == 1 ? 'foo<br />':'' }}
 {{ foo ~ (bar ? ('-' ~ bar) : '') }}
 --DATA--
-return array('foo' => 'foo', 'bar' => 'bar')
+return ['foo' => 'foo', 'bar' => 'bar']
 --EXPECT--
 YES
 NO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test
index fdc660fc..8b0f7284 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_noelse.test
@@ -4,7 +4,7 @@ Twig supports the ternary operator
 {{ 1 ? 'YES' }}
 {{ 0 ? 'YES' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 YES
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test
index 9057e837..ecd6b754 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/ternary_operator_nothen.test
@@ -4,7 +4,7 @@ Twig supports the ternary operator
 {{ 'YES' ?: 'NO' }}
 {{ 0 ?: 'NO' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 YES
 NO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/two_word_operators_as_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/two_word_operators_as_variables.test
index 0eaabb44..eca3b285 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/two_word_operators_as_variables.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/two_word_operators_as_variables.test
@@ -3,6 +3,6 @@ Twig does not allow to use two-word named operators as variable names
 --TEMPLATE--
 {{ starts with }}
 --DATA--
-return array()
+return []
 --EXCEPTION--
-Twig_Error_Syntax: Unexpected token "operator" of value "starts with" in "index.twig" at line 2.
+Twig\Error\SyntaxError: Unexpected token "operator" of value "starts with" in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test
index b79219a2..54225311 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary.test
@@ -5,7 +5,7 @@ Twig supports unary operators (not, -, +)
 {{ +1 + 1 }}/{{ -1 - 1 }}
 {{ not (false or true) }}
 --DATA--
-return array()
+return []
 --EXPECT--
 /1
 2/-2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_macro_arguments.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_macro_arguments.test
index ad84a9c2..27deba3e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_macro_arguments.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_macro_arguments.test
@@ -13,7 +13,7 @@ Twig manages negative numbers as default parameters
 {% macro positive_number1(nb = +1) %}{{ nb }}{% endmacro %}
 {% macro positive_number2(nb = ++1) %}{{ nb }}{% endmacro %}
 --DATA--
-return array()
+return []
 --EXPECT--
 -1
 1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test
index cc6eef8d..9c56ab12 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/expressions/unary_precedence.test
@@ -6,7 +6,7 @@ Twig unary operators precedence
 {{ -1 * -1 }}
 {{ 4 / -1 * 5 }}
 --DATA--
-return array()
+return []
 --EXPECT--
 -2
 0
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/extensions/anonymous_functions.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/extensions/anonymous_functions.test
new file mode 100644
index 00000000..842ecf7a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/extensions/anonymous_functions.test
@@ -0,0 +1,10 @@
+--TEST--
+use an anonymous function as a function
+--TEMPLATE--
+{{ anon_foo('bar') }}
+{{ 'bar'|anon_foo }}
+--DATA--
+return array()
+--EXPECT--
+*bar*
+*bar*
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test
index 27e93fd6..7518769d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/abs.test
@@ -14,7 +14,7 @@
 {{ number5|abs }}
 {{ number6|abs }}
 --DATA--
-return array('number1' => -5.5, 'number2' => -5, 'number3' => -0, 'number4' => 0, 'number5' => 5, 'number6' => 5.5)
+return ['number1' => -5.5, 'number2' => -5, 'number3' => -0, 'number4' => 0, 'number5' => 5, 'number6' => 5.5]
 --EXPECT--
 5.5
 5
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test
index cb6de7f9..0acf25bd 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch.test
@@ -9,7 +9,7 @@
   </div>
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
+return ['items' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']]
 --EXPECT--
 <div class=row>
       <div class=item>a</div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.test
index e2ec4beb..dad004ec 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_float.test
@@ -9,7 +9,7 @@
   </div>
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
+return ['items' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']]
 --EXPECT--
 <div class=row>
       <div class=item>a</div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test
index af996f24..411b4fc7 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_empty_fill.test
@@ -11,7 +11,7 @@
 {% endfor %}
 </table>
 --DATA--
-return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
+return ['items' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']]
 --EXPECT--
 <table>
   <tr>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test
index 72483f4b..750d1557 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_exact_elements.test
@@ -9,7 +9,7 @@
   </div>
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l'))
+return ['items' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']]
 --EXPECT--
 <div class=row>
       <div class=item>a</div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test
index 746295f1..5d470d00 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_fill.test
@@ -11,7 +11,7 @@
 {% endfor %}
 </table>
 --DATA--
-return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
+return ['items' => ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']]
 --EXPECT--
 <table>
   <tr>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_keys.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_keys.test
index 6015380e..e56cd79b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_keys.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_keys.test
@@ -1,10 +1,10 @@
 --TEST--
 "batch" filter preserves array keys
 --TEMPLATE--
-{{ {'foo': 'bar', 'key': 'value'}|batch(4)|first|keys|join(',')  }}
-{{ {'foo': 'bar', 'key': 'value'}|batch(4, 'fill')|first|keys|join(',')  }}
+{{ {'foo': 'bar', 'key': 'value'}|batch(4)|first|keys|join(',') }}
+{{ {'foo': 'bar', 'key': 'value'}|batch(4, 'fill')|first|keys|join(',') }}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo,key
 foo,key,0,1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_more_elements.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_more_elements.test
new file mode 100644
index 00000000..90f4de68
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_more_elements.test
@@ -0,0 +1,23 @@
+--TEST--
+"batch" filter
+--TEMPLATE--
+{% for row in items|batch(3, 'fill') %}
+  <div class=row>
+  {% for key, column in row %}
+    <div class={{ key }}>{{ column }}</div>
+  {% endfor %}
+  </div>
+{% endfor %}
+--DATA--
+return ['items' => ['a' => 'a', 'b' => 'b', 'c' => 'c', 'd' => 'd', '123' => 'e']]
+--EXPECT--
+<div class=row>
+      <div class=a>a</div>
+      <div class=b>b</div>
+      <div class=c>c</div>
+    </div>
+  <div class=row>
+      <div class=d>d</div>
+      <div class=123>e</div>
+      <div class=124>fill</div>
+    </div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_zero_elements.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_zero_elements.test
index b9c058d6..bc303da8 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_zero_elements.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/batch_with_zero_elements.test
@@ -4,7 +4,7 @@
 {{ []|batch(3)|length }}
 {{ []|batch(3, 'fill')|length }}
 --DATA--
-return array()
+return []
 --EXPECT--
 0
 0
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/column.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/column.test
new file mode 100644
index 00000000..a2a7f2eb
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/column.test
@@ -0,0 +1,11 @@
+--TEST--
+"column" filter
+--TEMPLATE--
+{{ array|column('foo')|join }}
+{{ traversable|column('foo')|join }}
+--DATA--
+$items = array(array('bar' => 'foo', 'foo' => 'bar'), array('foo' => 'foo', 'bar' => 'bar'));
+return array('array' => $items, 'traversable' => new ArrayIterator($items));
+--EXPECT--
+barfoo
+barfoo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test
index 380b04bb..6f0091f3 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/convert_encoding.test
@@ -1,10 +1,8 @@
 --TEST--
 "convert_encoding" filter
---CONDITION--
-function_exists('iconv') || function_exists('mb_convert_encoding')
 --TEMPLATE--
 {{ "æ??ã??ã?¦ã??ã?¾ã??ã??ï¼?"|convert_encoding('ISO-2022-JP', 'UTF-8')|convert_encoding('UTF-8', 'ISO-2022-JP') }}
 --DATA--
-return array()
+return []
 --EXPECT--
 æ??ã??ã?¦ã??ã?¾ã??ã??ï¼?
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test
index d17e5e2f..16816aa9 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date.test
@@ -40,16 +40,16 @@
 {{ '2010-01-28 15:00:00'|date(timezone="Asia/Hong_Kong") }}
 --DATA--
 date_default_timezone_set('Europe/Paris');
-return array(
+return [
     'date1' => mktime(13, 45, 0, 10, 4, 2010),
-    'date2' => new DateTime('2010-10-04 13:45'),
+    'date2' => new \DateTime('2010-10-04 13:45'),
     'date3' => '2010-10-04 13:45',
-    'date4' => 1286199900, // DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT
-    'date5' => -189291360, // DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new DateTimeZone('UTC'))->getTimestamp(),
-    'date6' => new DateTime('2010-10-04 13:45', new DateTimeZone('America/New_York')),
+    'date4' => 1286199900, // \DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new \DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT
+    'date5' => -189291360, // \DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new \DateTimeZone('UTC'))->getTimestamp(),
+    'date6' => new \DateTime('2010-10-04 13:45', new \DateTimeZone('America/New_York')),
     'date7' => '2010-01-28T15:00:00+04:00',
-    'timezone1' => new DateTimeZone('America/New_York'),
-)
+    'timezone1' => new \DateTimeZone('America/New_York'),
+]
 --EXPECT--
 October 4, 2010 13:45
 04/10/2010
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test
index 6ad504cd..3f56d4e6 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format.test
@@ -5,10 +5,10 @@
 {{ date1|date('d/m/Y') }}
 --DATA--
 date_default_timezone_set('UTC');
-$twig->getExtension('Twig_Extension_Core')->setDateFormat('Y-m-d', '%d days %h hours');
-return array(
+$twig->getExtension(\Twig\Extension\CoreExtension::class)->setDateFormat('Y-m-d', '%d days %h hours');
+return [
     'date1' => mktime(13, 45, 0, 10, 4, 2010),
-)
+]
 --EXPECT--
 2010-10-04
 04/10/2010
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test
index be4a642e..6b7879f7 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_default_format_interval.test
@@ -1,16 +1,14 @@
 --TEST--
-"date" filter (interval support as of PHP 5.3)
---CONDITION--
-version_compare(phpversion(), '5.3.0', '>=')
+"date" filter (interval support)
 --TEMPLATE--
 {{ date2|date }}
 {{ date2|date('%d days') }}
 --DATA--
 date_default_timezone_set('UTC');
-$twig->getExtension('Twig_Extension_Core')->setDateFormat('Y-m-d', '%d days %h hours');
-return array(
-    'date2' => new DateInterval('P2D'),
-)
+$twig->getExtension(\Twig\Extension\CoreExtension::class)->setDateFormat('Y-m-d', '%d days %h hours');
+return [
+    'date2' => new \DateInterval('P2D'),
+]
 --EXPECT--
 2 days 0 hours
 2 days
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_immutable.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_immutable.test
index 4e183256..b87a9739 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_immutable.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_immutable.test
@@ -1,7 +1,5 @@
 --TEST--
 "date" filter
---CONDITION--
-version_compare(phpversion(), '5.5.0', '>=')
 --TEMPLATE--
 {{ date1|date }}
 {{ date1|date('d/m/Y') }}
@@ -17,11 +15,11 @@ version_compare(phpversion(), '5.5.0', '>=')
 {{ date2|date('e', false) }}
 --DATA--
 date_default_timezone_set('Europe/Paris');
-return array(
-    'date1' => new DateTimeImmutable('2010-10-04 13:45'),
-    'date2' => new DateTimeImmutable('2010-10-04 13:45', new DateTimeZone('America/New_York')),
-    'timezone1' => new DateTimeZone('America/New_York'),
-)
+return [
+    'date1' => new \DateTimeImmutable('2010-10-04 13:45'),
+    'date2' => new \DateTimeImmutable('2010-10-04 13:45', new \DateTimeZone('America/New_York')),
+    'timezone1' => new \DateTimeZone('America/New_York'),
+]
 --EXPECT--
 October 4, 2010 13:45
 04/10/2010
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test
index 0c8c6f1a..89f0c0c5 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_interval.test
@@ -1,18 +1,16 @@
 --TEST--
-"date" filter (interval support as of PHP 5.3)
---CONDITION--
-version_compare(phpversion(), '5.3.0', '>=')
+"date" filter (interval support)
 --TEMPLATE--
 {{ date1|date }}
 {{ date1|date('%d days %h hours') }}
 {{ date1|date('%d days %h hours', timezone1) }}
 --DATA--
 date_default_timezone_set('UTC');
-return array(
-    'date1' => new DateInterval('P2D'),
-    // This should have no effect on DateInterval formatting
-    'timezone1' => new DateTimeZone('America/New_York'),
-)
+return [
+    'date1' => new \DateInterval('P2D'),
+    // This should have no effect on \DateInterval formatting
+    'timezone1' => new \DateTimeZone('America/New_York'),
+]
 --EXPECT--
 2 days
 2 days 0 hours
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test
index 53d3a69c..d7f8fdf4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_modify.test
@@ -5,10 +5,10 @@
 {{ date2|date_modify('-1day')|date('Y-m-d H:i:s') }}
 --DATA--
 date_default_timezone_set('UTC');
-return array(
+return [
     'date1' => '2010-10-04 13:45',
-    'date2' => new DateTime('2010-10-04 13:45'),
-)
+    'date2' => new \DateTime('2010-10-04 13:45'),
+]
 --EXPECT--
 2010-10-03 13:45:00
 2010-10-03 13:45:00
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test
index 4ecde8a1..2d1aa134 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/date_namedargs.test
@@ -6,7 +6,7 @@
 {{ date|date('d/m/Y H:i:s P', timezone='America/Chicago') }}
 --DATA--
 date_default_timezone_set('UTC');
-return array('date' => mktime(13, 45, 0, 10, 4, 2010))
+return ['date' => mktime(13, 45, 0, 10, 4, 2010)]
 --EXPECT--
 04/10/2010 08:45:00 -05:00
 04/10/2010 08:45:00 -05:00
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test
index b8d1d66f..bcbb34ed 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/default.test
@@ -15,6 +15,7 @@ Array access:
 {{ nested.nullVar              |default('default') is same as('default') ? 'ok' : 'ko' }}
 {{ nested.undefinedVar         |default('default') is same as('default') ? 'ok' : 'ko' }}
 {{ nested['undefinedVar']      |default('default') is same as('default') ? 'ok' : 'ko' }}
+{{ undefined['undefined']      |default('default') is same as('default') ? 'ok' : 'ko' }}
 {{ undefinedVar.foo            |default('default') is same as('default') ? 'ok' : 'ko' }}
 Plain values:
 {{ 'defined'                   |default('default') is same as('default') ? 'ko' : 'ok' }}
@@ -35,26 +36,28 @@ Deep nested:
 {{ nested.undefinedVar.foo.bar |default('default') is same as('default') ? 'ok' : 'ko' }}
 {{ nested.definedArray.0       |default('default') is same as('default') ? 'ko' : 'ok' }}
 {{ nested['definedArray'][0]   |default('default') is same as('default') ? 'ko' : 'ok' }}
+{{ nested['undefinedVar'][0]   |default('default') is same as('default') ? 'ok' : 'ko' }}
+{{ undefined['undefined'][0]   |default('default') is same as('default') ? 'ok' : 'ko' }}
 {{ object.self.foo             |default('default') is same as('default') ? 'ko' : 'ok' }}
 {{ object.self.undefinedMethod |default('default') is same as('default') ? 'ok' : 'ko' }}
 {{ object.undefinedMethod.self |default('default') is same as('default') ? 'ok' : 'ko' }}
 --DATA--
-return array(
+return [
     'definedVar' => 'defined',
     'zeroVar'    => 0,
     'emptyVar'   => '',
     'nullVar'    => null,
-    'nested'     => array(
+    'nested'     => [
         'definedVar'   => 'defined',
         'zeroVar'      => 0,
         'emptyVar'     => '',
         'nullVar'      => null,
-        'definedArray' => array(0),
-    ),
+        'definedArray' => [0],
+    ],
     'object' => new TwigTestFoo(),
-)
+]
 --CONFIG--
-return array('strict_variables' => false)
+return ['strict_variables' => false]
 --EXPECT--
 Variable:
 ok
@@ -71,6 +74,7 @@ ok
 ok
 ok
 ok
+ok
 Plain values:
 ok
 ok
@@ -93,23 +97,25 @@ ok
 ok
 ok
 ok
+ok
+ok
 --DATA--
-return array(
+return [
     'definedVar' => 'defined',
     'zeroVar'    => 0,
     'emptyVar'   => '',
     'nullVar'    => null,
-    'nested'     => array(
+    'nested'     => [
         'definedVar'   => 'defined',
         'zeroVar'      => 0,
         'emptyVar'     => '',
         'nullVar'      => null,
-        'definedArray' => array(0),
-    ),
+        'definedArray' => [0],
+    ],
     'object' => new TwigTestFoo(),
-)
+]
 --CONFIG--
-return array('strict_variables' => true)
+return ['strict_variables' => true]
 --EXPECT--
 Variable:
 ok
@@ -126,6 +132,7 @@ ok
 ok
 ok
 ok
+ok
 Plain values:
 ok
 ok
@@ -148,3 +155,5 @@ ok
 ok
 ok
 ok
+ok
+ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test
index 93c5913f..27dc8784 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/dynamic_filter.test
@@ -4,7 +4,7 @@ dynamic filter
 {{ 'bar'|foo_path }}
 {{ 'bar'|a_foo_b_bar }}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo/bar
 a/b/bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test
index a606c106..131f5b4e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {{ "foo <br />"|e }}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo &lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test
index 009a2453..10e32755 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_html_attr.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {{ '<br />'|escape('html_attr') }}
 --DATA--
-return array()
+return []
 --EXPECT--
 &lt;br&#x20;&#x2F;&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_javascript.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_javascript.test
index 647147a4..4c2fb7a3 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_javascript.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_javascript.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {{ "é â?? ð???"|e('js') }}
 --DATA--
-return array()
+return []
 --EXPECT--
-\u00E9\x20\u265C\x20\uD834\uDF06
+\u00E9\u0020\u265C\u0020\uD834\uDF06
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test
index bba26a0d..93f34297 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/escape_non_supported_charset.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {{ "æ??ã??ã?¦ã??ã?¾ã??ã??ï¼? <br />"|e }}
 --DATA--
-return array()
+return []
 --EXPECT--
 æ??ã??ã?¦ã??ã?¾ã??ã??ï¼? &lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/filter.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/filter.test
new file mode 100644
index 00000000..97b94696
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/filter.test
@@ -0,0 +1,77 @@
+--TEST--
+"filter" filter
+--TEMPLATE--
+{% set offset = 3 %}
+
+{% for k, v in [1, 5, 3, 4, 5]|filter((v) => v > offset) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in {a: 1, b: 2, c: 5, d: 8}|filter(v => v > offset) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in {a: 1, b: 2, c: 5, d: 8}|filter((v, k) => (v > offset) and (k != "d")) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in [1, 5, 3, 4, 5]|filter(v => v > offset) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in it|filter((v) => v > offset) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in ita|filter(v => v > offset) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in xml|filter(x => true) %}
+{{ k }}/{{ v }}
+{% endfor %}
+
+{# we can iterate more than once #}
+{% for k, v in xml|filter(x => true) %}
+{{ k }}/{{ v }}
+{% endfor %}
+
+{% set coll = ['a', 'b']|filter(v => v is same as('a')) %}
+{% if coll|length > 0 %}
+    {{- coll|join(', ') }}
+{% endif %}
+--DATA--
+return [
+    'it' => new \ArrayIterator(['a' => 1, 'b' => 2, 'c' => 5, 'd' => 8]),
+    'ita' => new IteratorAggregateStub(['a' => 1, 'b' => 2, 'c' => 5, 'd' => 8]),
+    'xml' => new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><doc><elem>foo</elem><elem>bar</elem><elem>baz</elem></doc>'),
+]
+--EXPECT--
+1 = 5
+3 = 4
+4 = 5
+
+c = 5
+d = 8
+
+c = 5
+
+1 = 5
+3 = 4
+4 = 5
+
+c = 5
+d = 8
+
+c = 5
+d = 8
+
+elem/foo
+elem/bar
+elem/baz
+
+elem/foo
+elem/bar
+elem/baz
+
+a
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test
index aa54645c..b19f2eed 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/first.test
@@ -8,7 +8,7 @@
 {{ '��é'|first }}
 {{ ''|first }}
 --DATA--
-return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
+return ['arr' => new \ArrayObject([1, 2, 3, 4])]
 --EXPECT--
 1
 1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test
index 85a9b717..7efbe320 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/force_escape.test
@@ -11,8 +11,8 @@
     {{ foo }}
 {% endautoescape %}
 --DATA--
-return array()
+return []
 --EXPECT--
     foo&lt;br /&gt;
-\x20\x20\x20\x20foo\x3Cbr\x20\x2F\x3E\x0A
+\u0020\u0020\u0020\u0020foo\u003Cbr\u0020\/\u003E\n
         foo<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test
index 97221ff8..efaf8317 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/format.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {{ string|format(foo, 3) }}
 --DATA--
-return array('string' => '%s/%d', 'foo' => 'bar')
+return ['string' => '%s/%d', 'foo' => 'bar']
 --EXPECT--
 bar/3
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test
index b342c174..57925863 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/join.test
@@ -4,9 +4,35 @@
 {{ ["foo", "bar"]|join(', ') }}
 {{ foo|join(', ') }}
 {{ bar|join(', ') }}
+
+{{ ["foo", "bar"]|join(', ', ' and ') }}
+{{ foo|join(', ', ' and ') }}
+{{ bar|join(', ', ' and ') }}
+{{ ["one", "two", "three"]|join(', ', ' and ') }}
+{{ ["a", "b", "c"]|join('','-') }}
+{{ ["a", "b", "c"]|join('-','-') }}
+{{ ["a", "b", "c"]|join('-','') }}
+{{ ["hello"]|join('|','-') }}
+
+{{ {"a": "w", "b": "x", "c": "y", "d": "z"}|join }}
+{{ {"a": "w", "b": "x", "c": "y", "d": "z"}|join(',') }}
+{{ {"a": "w", "b": "x", "c": "y", "d": "z"}|join(',','-') }}
 --DATA--
-return array('foo' => new TwigTestFoo(), 'bar' => new ArrayObject(array(3, 4)))
+return ['foo' => new TwigTestFoo(), 'bar' => new \ArrayObject([3, 4])]
 --EXPECT--
 foo, bar
 1, 2
 3, 4
+
+foo and bar
+1 and 2
+3 and 4
+one, two and three
+ab-c
+a-b-c
+a-bc
+hello
+
+wxyz
+w,x,y,z
+w,x,y-z
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test
index 1738d40c..902f90b3 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/json_encode.test
@@ -5,7 +5,7 @@
 {{ foo|json_encode|raw }}
 {{ [foo, "foo"]|json_encode|raw }}
 --DATA--
-return array('foo' => new Twig_Markup('foo', 'UTF-8'))
+return ['foo' => new \Twig\Markup('foo', 'UTF-8')]
 --EXPECT--
 "foo"
 "foo"
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test
index 1b8031ee..f71896c7 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/last.test
@@ -8,7 +8,7 @@
 {{ '��é'|last }}
 {{ ''|last }}
 --DATA--
-return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
+return ['arr' => new \ArrayObject([1, 2, 3, 4])]
 --EXPECT--
 4
 4
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test
index a7f1e503..52ad9e8b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length.test
@@ -6,26 +6,35 @@
 {{ number|length }}
 {{ to_string_able|length }}
 {{ countable|length }}
+{{ iterator_aggregate|length }}
 {{ null|length }}
 {{ magic|length }}
 {{ non_countable|length }}
+{{ simple_xml_element|length }}
+{{ iterator|length }}
 --DATA--
-return array(
-    'array' => array(1, 4),
+return [
+    'array' => [1, 4],
     'string' => 'foo',
     'number' => 1000,
     'to_string_able' => new ToStringStub('foobar'),
     'countable' => new CountableStub(42),       /* also asserts we do *not* call __toString() */
+    'iterator_aggregate' => new IteratorAggregateStub(['a', 'b', 'c']),   /* also asserts we do *not* call __toString() */
     'null'          => null,
     'magic'         => new MagicCallStub(),     /* used to assert we do *not* call __call */
     'non_countable' => new \StdClass(),
-);
+    'simple_xml_element' => new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><doc><elem/><elem/></doc>'),
+    'iterator' => new \SimpleIteratorForTesting()
+]
 --EXPECT--
 2
 3
 4
 6
 42
+3
 0
 1
 1
+2
+7
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test
index 5d5e2436..66b058b4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/length_utf8.test
@@ -1,12 +1,10 @@
 --TEST--
 "length" filter
---CONDITION--
-function_exists('mb_get_info')
 --TEMPLATE--
 {{ string|length }}
 {{ markup|length }}
 --DATA--
-return array('string' => 'été', 'markup' => new Twig_Markup('foo', 'UTF-8'))
+return ['string' => 'été', 'markup' => new \Twig\Markup('foo', 'UTF-8')]
 --EXPECT--
 3
 3
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/map.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/map.test
new file mode 100644
index 00000000..5552f816
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/map.test
@@ -0,0 +1,41 @@
+--TEST--
+"map" filter
+--TEMPLATE--
+{% set offset = 3 %}
+
+{% for k, v in [1, 2]|map((item) => item + 2 ) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in {a: 1, b: 2}|map((item) => item ~ "*" ) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in {a: 1, b: 2}|map((item, k) => item ~ "*" ~ k ) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in [1, 2]|map(item => item + 2 ) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+
+{% for k, v in it|map(item => item + 2 ) -%}
+    {{ k }} = {{ v }}
+{% endfor %}
+--DATA--
+return ['it' => new \ArrayIterator([1, 2])]
+--EXPECT--
+0 = 3
+1 = 4
+
+a = 1*
+b = 2*
+
+a = 1*a
+b = 2*b
+
+0 = 3
+1 = 4
+
+0 = 3
+1 = 4
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test
index 81371a41..8877501d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/merge.test
@@ -8,7 +8,14 @@
 {{ numerics|merge([4, 5, 6])|join }}
 {{ traversable.a|merge(traversable.b)|join }}
 --DATA--
-return array('items' => array('foo' => 'bar'), 'numerics' => array(1, 2, 3), 'traversable' => array('a' => new ArrayObject(array(0 => 1, 1 => 2, 2 => 3)), 'b' => new ArrayObject(array('a' => 'b'))))
+return [
+    'items' => ['foo' => 'bar'],
+    'numerics' => [1, 2, 3],
+    'traversable' => [
+        'a' => new \ArrayObject([0 => 1, 1 => 2, 2 => 3]),
+        'b' => new \ArrayObject(['a' => 'b'])
+    ]
+]
 --EXPECT--
 barfoo
 foobar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test
index 6545a9bb..524ec45f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/nl2br.test
@@ -4,7 +4,7 @@
 {{ "I like Twig.\nYou will like it too.\n\nEverybody like it!"|nl2br }}
 {{ text|nl2br }}
 --DATA--
-return array('text' => "If you have some <strong>HTML</strong>\nit will be escaped.")
+return ['text' => "If you have some <strong>HTML</strong>\nit will be escaped."]
 --EXPECT--
 I like Twig.<br />
 You will like it too.<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test
index 639a8659..7f1e2e16 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format.test
@@ -8,7 +8,7 @@
 {{ 1020.25|number_format(2, ',') }}
 {{ 1020.25|number_format(2, ',', '.') }}
 --DATA--
-return array();
+return []
 --EXPECT--
 20
 20
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test
index 65c1cdb4..5946680f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/number_format_default.test
@@ -9,8 +9,8 @@
 {{ 1020.25|number_format(2, ',') }}
 {{ 1020.25|number_format(2, ',', '.') }}
 --DATA--
-$twig->getExtension('Twig_Extension_Core')->setNumberFormat(2, '!', '=');
-return array();
+$twig->getExtension(\Twig\Extension\CoreExtension::class)->setNumberFormat(2, '!', '=');
+return []
 --EXPECT--
 20!00
 20!25
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reduce.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reduce.test
new file mode 100644
index 00000000..73cad416
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reduce.test
@@ -0,0 +1,14 @@
+--TEST--
+"reduce" filter
+--TEMPLATE--
+{% set offset = 3 %}
+
+{{ [1, -1, 4]|reduce((carry, item) => carry + item + offset, 10) }}
+
+{{ it|reduce((carry, item) => carry + item + offset, 10) }}
+--DATA--
+return ['it' => new \ArrayIterator([1, -1, 4])]
+--EXPECT--
+23
+
+23
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test
index 06be7e27..1b9670a1 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace.test
@@ -5,7 +5,7 @@
 {{ 'I like single replace operation only %that%'|replace({'%that%' : '%that%1'}) }}
 {{ 'I like %this% and %that%.'|replace(traversable) }}
 --DATA--
-return array('traversable' => new ArrayObject(array('%this%' => 'foo', '%that%' => 'bar')))
+return ['traversable' => new \ArrayObject(['%this%' => 'foo', '%that%' => 'bar'])]
 --EXPECT--
 I liké foo and bar.
 I like single replace operation only %that%1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace_invalid_arg.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace_invalid_arg.test
index 2143a869..ba6fea41 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace_invalid_arg.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/replace_invalid_arg.test
@@ -3,6 +3,6 @@ Exception for invalid argument type in replace call
 --TEMPLATE--
 {{ 'test %foo%'|replace(stdClass) }}
 --DATA--
-return array('stdClass' => new stdClass())
+return ['stdClass' => new \stdClass()]
 --EXCEPTION--
-Twig_Error_Runtime: The "replace" filter expects an array or "Traversable" as replace values, got "stdClass" in "index.twig" at line 2.
+Twig\Error\RuntimeError: The "replace" filter expects an array or "Traversable" as replace values, got "stdClass" in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
index 7948ac45..904e5839 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/reverse.test
@@ -8,7 +8,7 @@
 {{ {'a': 'c', 'b': 'a'}|reverse(preserveKeys=true)|join(glue=',') }}
 {{ {'a': 'c', 'b': 'a'}|reverse(preserve_keys=true)|join(glue=',') }}
 --DATA--
-return array('arr' => new ArrayObject(array(1, 2, 3, 4)))
+return ['arr' => new \ArrayObject([1, 2, 3, 4])]
 --EXPECT--
 4321
 tnemenèvé4321
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/round.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/round.test
index 57806b61..70923754 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/round.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/round.test
@@ -10,7 +10,7 @@
 {{ 21.3|round(-1, 'ceil')}}
 {{ 21.3|round(-1, 'floor')}}
 --DATA--
-return array()
+return []
 --EXPECT--
 3
 2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
index b49b89fe..fc975d7b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/slice.test
@@ -26,7 +26,7 @@
 {{ arr[2:]|join('') }}
 {{ xml|slice(1)|join('')}}
 --DATA--
-return array('start' => 1, 'length' => 2, 'arr' => new ArrayObject(array(1, 2, 3, 4)), 'xml' => new SimpleXMLElement('<items><item>1</item><item>2</item></items>'))
+return ['start' => 1, 'length' => 2, 'arr' => new \ArrayObject([1, 2, 3, 4]), 'xml' => new \SimpleXMLElement('<items><item>1</item><item>2</item></items>')]
 --EXPECT--
 23
 23
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test
index c67c18ea..c3b2c70d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/sort.test
@@ -5,7 +5,7 @@
 {{ array2|sort|join }}
 {{ traversable|sort|join }}
 --DATA--
-return array('array1' => array(4, 1), 'array2' => array('foo', 'bar'), 'traversable' => new ArrayObject(array(0 => 3, 1 => 2, 2 => 1)))
+return ['array1' => [4, 1], 'array2' => ['foo', 'bar'], 'traversable' => new \ArrayObject([0 => 3, 1 => 2, 2 => 1])]
 --EXPECT--
 14
 barfoo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/spaceless.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/spaceless.test
new file mode 100644
index 00000000..eadc1d49
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/spaceless.test
@@ -0,0 +1,8 @@
+--TEST--
+"spaceless" filter
+--TEMPLATE--
+{{ "    <div>   <div>   foo   </div>   </div>"|spaceless }}
+--DATA--
+return []
+--EXPECT--
+<div><div>   foo   </div></div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test
index dbaf7dc9..9869ec91 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/special_chars.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {{ 'foo'|§ }}
 --DATA--
-return array()
+return []
 --EXPECT--
 §foo§
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test
index a093ed79..92dbf0a0 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split.test
@@ -9,7 +9,7 @@
 {{ baz|split('', 2)|join('-') }}
 {{ foo|split(',', -2)|join('-') }}
 --DATA--
-return array('foo' => "one,two,three,four,five", 'baz' => '12345',)
+return ['foo' => "one,two,three,four,five", 'baz' => '12345',]
 --EXPECT--
 one-two-three-four-five
 one-two-three-four-five
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split_utf8.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split_utf8.test
index 305e162f..af48132f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split_utf8.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/split_utf8.test
@@ -1,7 +1,5 @@
 --TEST--
 "split" filter
---CONDITION--
-function_exists('mb_get_info')
 --TEMPLATE--
 {{ "é"|split('', 10)|join('-') }}
 {{ foo|split(',')|join('-') }}
@@ -12,7 +10,7 @@ function_exists('mb_get_info')
 {{ baz|split('', 1)|join('-') }}
 {{ baz|split('', 2)|join('-') }}
 --DATA--
-return array('foo' => 'Ã?,é,Ã?ã?»', 'baz' => 'éÃ?Ã?ã??a',)
+return ['foo' => 'Ã?,é,Ã?ã?»', 'baz' => 'éÃ?Ã?ã??a',]
 --EXPECT--
 é
 �-é-��
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/static_calls.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/static_calls.test
index 4e17b772..1626db0c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/static_calls.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/static_calls.test
@@ -4,7 +4,7 @@ Filters as static method calls
 {{ 'foo'|static_call_string }}
 {{ 'foo'|static_call_array }}
 --DATA--
-return array('foo' => 'foo')
+return ['foo' => 'foo']
 --EXPECT--
 *foo*
 *foo*
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test
index b1ef7b47..432989ff 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/trim.test
@@ -11,7 +11,7 @@
 {{ "/  foo/"|trim(character_mask="/", side="left") }}
 {{ "  do nothing.  "|trim("", "right") }}
 --DATA--
-return array('text' => "  If you have some <strong>HTML</strong> it will be escaped.  ")
+return ['text' => "  If you have some <strong>HTML</strong> it will be escaped.  "]
 --EXPECT--
 I like Twig.
 If you have some &lt;strong&gt;HTML&lt;/strong&gt; it will be escaped.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test
index 8726159d..ac236990 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode.test
@@ -1,14 +1,12 @@
 --TEST--
 "url_encode" filter
---CONDITION--
-defined('PHP_QUERY_RFC3986')
 --TEMPLATE--
 {{ {foo: "bar", number: 3, "spé�i%l": "e%c0d@d", "spa ce": ""}|url_encode }}
 {{ {foo: "bar", number: 3, "spé�i%l": "e%c0d@d", "spa ce": ""}|url_encode|raw }}
 {{ {}|url_encode|default("default") }}
 {{ 'spé�i%le%c0d@dspa ce'|url_encode }}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo=bar&amp;number=3&amp;sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&amp;spa%20ce=
 foo=bar&number=3&sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&spa%20ce=
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode_deprecated.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode_deprecated.test
deleted file mode 100644
index 35e50390..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/filters/urlencode_deprecated.test
+++ /dev/null
@@ -1,16 +0,0 @@
---TEST--
-"url_encode" filter for PHP < 5.4
---CONDITION--
-defined('PHP_QUERY_RFC3986')
---TEMPLATE--
-{{ {foo: "bar", number: 3, "spé�i%l": "e%c0d@d", "spa ce": ""}|url_encode }}
-{{ {foo: "bar", number: 3, "spé�i%l": "e%c0d@d", "spa ce": ""}|url_encode|raw }}
-{{ {}|url_encode|default("default") }}
-{{ 'spé�i%le%c0d@dspa ce'|url_encode }}
---DATA--
-return array()
---EXPECT--
-foo=bar&amp;number=3&amp;sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&amp;spa%20ce=
-foo=bar&number=3&sp%C3%A9%C3%9Fi%25l=e%25c0d%40d&spa%20ce=
-default
-sp%C3%A9%C3%9Fi%25le%25c0d%40dspa%20ce
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test
index 71b2038a..2972bd45 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/attribute.test
@@ -8,7 +8,7 @@
 {{ attribute(obj, method) is defined ? 'ok' : 'ko' }}
 {{ attribute(obj, nonmethod) is defined ? 'ok' : 'ko' }}
 --DATA--
-return array('obj' => new TwigTestFoo(), 'method' => 'foo', 'array' => array('foo' => 'bar'), 'item' => 'foo', 'nonmethod' => 'xxx', 'arguments' => array('a', 'b'))
+return ['obj' => new TwigTestFoo(), 'method' => 'foo', 'array' => ['foo' => 'bar'], 'item' => 'foo', 'nonmethod' => 'xxx', 'arguments' => ['a', 'b']]
 --EXPECT--
 foo
 bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test
index 8e54059a..1a4fd549 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block.test
@@ -7,6 +7,6 @@
 {% block foo %}{{ block('bar') }}{% endblock %}
 {% block bar %}BAR_BASE{% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 BARBAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_with_template.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_with_template.test
index 8305eb67..37cb7a48 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_with_template.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_with_template.test
@@ -10,10 +10,10 @@
 --TEMPLATE(included.twig)--
 {% block foo %}FOO{% endblock %}
 --DATA--
-return array(
+return [
     'included_loaded' => $twig->load('included.twig'),
-    'included_loaded_internal' => $twig->loadTemplate('included.twig'),
-)
+    'included_loaded_internal' => $twig->load('included.twig'),
+]
 --EXPECT--
 FOO
 FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_without_name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_without_name.test
index 665cc87e..236df945 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_without_name.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_without_name.test
@@ -7,6 +7,6 @@
 {% block foo %}{{ block() }}{% endblock %}
 {% block bar %}BAR_BASE{% endblock %}
 --DATA--
-return array()
+return []
 --EXCEPTION--
-Twig_Error_Syntax: The "block" function takes one argument (the block name) in "base.twig" at line 2.
+Twig\Error\SyntaxError: The "block" function takes one argument (the block name) in "base.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_without_parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_without_parent.test
new file mode 100644
index 00000000..7fb7ef63
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/block_without_parent.test
@@ -0,0 +1,11 @@
+--TEST--
+"block" calling parent() with no definition in parent template
+--TEMPLATE--
+{% extends "parent.twig" %}
+{% block label %}{{ parent() }}{% endblock %}
+--TEMPLATE(parent.twig)--
+{{ block('label') }}
+--DATA--
+return array()
+--EXCEPTION--
+Twig\Error\RuntimeError: Block "label" should not call parent() in "index.twig" as the block does not exist in the parent template "parent.twig" in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
index 63128791..fd6dd061 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/constant.test
@@ -4,7 +4,7 @@
 {{ constant('DATE_W3C') == expect ? 'true' : 'false' }}
 {{ constant('ARRAY_AS_PROPS', object) }}
 --DATA--
-return array('expect' => DATE_W3C, 'object' => new ArrayObject(array('hi')));
+return ['expect' => DATE_W3C, 'object' => new \ArrayObject(['hi'])]
 --EXPECT--
 true
 2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test
index 522a63b8..0ac6dccd 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/cycle.test
@@ -5,7 +5,7 @@
 {{ cycle(array1, i) }}-{{ cycle(array2, i) }}
 {% endfor %}
 --DATA--
-return array('array1' => array('odd', 'even'), 'array2' => array('apple', 'orange', 'citrus'))
+return ['array1' => ['odd', 'even'], 'array2' => ['apple', 'orange', 'citrus']]
 --EXPECT--
 odd-apple
 even-orange
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test
index c9f46446..c879da3c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date.test
@@ -10,13 +10,13 @@
 {{ date() > date('-1day') ? 'OK' : 'KO' }}
 --DATA--
 date_default_timezone_set('UTC');
-return array(
+return [
     'date1' => mktime(13, 45, 0, 10, 4, 2010),
-    'date2' => new DateTime('2010-10-04 13:45'),
+    'date2' => new \DateTime('2010-10-04 13:45'),
     'date3' => '2010-10-04 13:45',
-    'date4' => 1286199900, // DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT
-    'date5' => -189291360, // DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new DateTimeZone('UTC'))->getTimestamp(),
-)
+    'date4' => 1286199900, // \DateTime::createFromFormat('Y-m-d H:i', '2010-10-04 13:45', new \DateTimeZone('UTC'))->getTimestamp() -- A unixtimestamp is always GMT
+    'date5' => -189291360, // \DateTime::createFromFormat('Y-m-d H:i', '1964-01-02 03:04', new \DateTimeZone('UTC'))->getTimestamp(),
+]
 --EXPECT--
 OK
 OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test
index b9dd9e38..11f60ee8 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/date_namedargs.test
@@ -5,7 +5,7 @@
 {{ date(timezone="America/New_York", date=date)|date('d/m/Y H:i:s P', false) }}
 --DATA--
 date_default_timezone_set('UTC');
-return array('date' => mktime(13, 45, 0, 10, 4, 2010))
+return ['date' => mktime(13, 45, 0, 10, 4, 2010)]
 --EXPECT--
 04/10/2010 09:45:00 -04:00
 04/10/2010 09:45:00 -04:00
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test
index f4072375..691a3abe 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump.test
@@ -6,9 +6,9 @@
 {{ dump('foo') }}
 {{ dump('foo', 'bar') }}
 --DATA--
-return array('foo' => 'foo', 'bar' => 'bar')
+return ['foo' => 'foo', 'bar' => 'bar']
 --CONFIG--
-return array('debug' => true, 'autoescape' => false);
+return ['debug' => true, 'autoescape' => false]
 --EXPECT--
 string(3) "foo"
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test
index 889b7a92..5fd9383c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dump_array.test
@@ -1,13 +1,13 @@
 --TEST--
 "dump" function, xdebug is not loaded or xdebug <2.2-dev is loaded
 --CONDITION--
-!extension_loaded('xdebug') || (($r = new ReflectionExtension('xdebug')) && version_compare($r->getVersion(), '2.2-dev', '<'))
+!extension_loaded('xdebug') || (($r = new \ReflectionExtension('xdebug')) && version_compare($r->getVersion(), '2.2-dev', '<'))
 --TEMPLATE--
 {{ dump() }}
 --DATA--
-return array('foo' => 'foo', 'bar' => 'bar')
+return ['foo' => 'foo', 'bar' => 'bar']
 --CONFIG--
-return array('debug' => true, 'autoescape' => false);
+return ['debug' => true, 'autoescape' => false]
 --EXPECT--
 array(3) {
   ["foo"]=>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test
index 913fbc99..c7b3539c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/dynamic_function.test
@@ -4,7 +4,7 @@ dynamic function
 {{ foo_path('bar') }}
 {{ a_foo_b_bar('bar') }}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo/bar
 a/b/bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test
index b7653b4e..c9ce8123 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/assignment.test
@@ -7,7 +7,7 @@ FOO{{ tmp }}BAR
 --TEMPLATE(foo.twig)--
 FOOBAR
 --DATA--
-return array()
+return []
 --EXPECT--
 FOO
 FOOBARBAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test
index 56f8f3b5..a3666261 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/autoescaping.test
@@ -5,6 +5,6 @@
 --TEMPLATE(foo.twig)--
 <p>Test</p>
 --DATA--
-return array()
+return []
 --EXPECT--
 <p>Test</p>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test
index a434182a..f90983c0 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/basic.test
@@ -8,7 +8,7 @@ BAR
 --TEMPLATE(foo.twig)--
 FOOBAR
 --DATA--
-return array()
+return []
 --EXPECT--
 FOO
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test
index aba30ce3..c6d3d1c5 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/expression.test
@@ -8,7 +8,7 @@ BAR
 --TEMPLATE(foo.twig)--
 FOOBAR
 --DATA--
-return array('foo' => 'foo.twig')
+return ['foo' => 'foo.twig']
 --EXPECT--
 FOO
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test
index 43a2ccc2..c05b43e1 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing.test
@@ -6,5 +6,5 @@
 {{ include("foo.twig", ignore_missing = true, variables = {}) }}
 {{ include("foo.twig", ignore_missing = true, variables = {}, with_context = true) }}
 --DATA--
-return array()
+return []
 --EXPECT--
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing_exists.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing_exists.test
new file mode 100644
index 00000000..fc2d211a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/ignore_missing_exists.test
@@ -0,0 +1,11 @@
+--TEST--
+"include" function
+--TEMPLATE--
+{{ include("included.twig", ignore_missing = true) }}
+NOT DISPLAYED
+--TEMPLATE(included.twig)--
+{{ include("DOES NOT EXIST") }}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\LoaderError: Template "DOES NOT EXIST" is not defined in "included.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/include_missing_extends.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/include_missing_extends.test
new file mode 100644
index 00000000..810ae824
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/include_missing_extends.test
@@ -0,0 +1,13 @@
+--TEST--
+"include" function
+--TEMPLATE--
+{{ include(['bad.twig', 'good.twig'], ignore_missing = true) }}
+NOT DISPLAYED
+--TEMPLATE(bad.twig)--
+{% extends 'DOES NOT EXIST' %}
+--TEMPLATE(good.twig)--
+NOT DISPLAYED
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\LoaderError: Template "DOES NOT EXIST" is not defined in "bad.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test
index 4d2f6cf1..1d50f7ac 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {{ include("foo.twig") }}
 --DATA--
-return array();
+return []
 --EXCEPTION--
-Twig_Error_Loader: Template "foo.twig" is not defined in "index.twig" at line 2.
+Twig\Error\LoaderError: Template "foo.twig" is not defined in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test
index 78fddc7a..9ae8c9ee 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/missing_nested.test
@@ -11,6 +11,6 @@
     {{ include("foo.twig") }}
 {% endblock %}
 --DATA--
-return array();
+return []
 --EXCEPTION--
-Twig_Error_Loader: Template "foo.twig" is not defined in "base.twig" at line 3.
+Twig\Error\LoaderError: Template "foo.twig" is not defined in "base.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test
index 7b9ccaca..ebfdb1eb 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox.test
@@ -8,6 +8,6 @@
 {{ foo|e }}
 {{ foo|e }}
 --DATA--
-return array()
+return []
 --EXCEPTION--
-Twig_Sandbox_SecurityNotAllowedFilterError: Filter "e" is not allowed in "foo.twig" at line 4.
+Twig\Sandbox\SecurityNotAllowedFilterError: Filter "e" is not allowed in "foo.twig" at line 4.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test
index 8ffc4922..1206b67f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling.test
@@ -8,7 +8,7 @@ foo
 --TEMPLATE(bar.twig)--
 {{ foo|e }}
 --DATA--
-return array('foo' => 'bar<br />')
+return ['foo' => 'bar<br />']
 --EXPECT--
 foo
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test
index 8bf6e102..c5be0088 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/sandbox_disabling_ignore_missing.test
@@ -6,7 +6,7 @@
 --TEMPLATE(bar.twig)--
 {{ foo|e }}
 --DATA--
-return array('foo' => 'bar<br />')
+return ['foo' => 'bar<br />']
 --EXPECT--
 
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test
index 18d405a0..4c8b4508 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/template_instance.test
@@ -5,6 +5,6 @@
 --TEMPLATE(foo.twig)--
 BAR
 --DATA--
-return array('foo' => $twig->loadTemplate('foo.twig'))
+return ['foo' => $twig->load('foo.twig')]
 --EXPECT--
 BAR FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test
index 1a810068..21e5bb2e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/templates_as_array.test
@@ -6,7 +6,7 @@
 --TEMPLATE(foo.twig)--
 foo
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test
index 35611fbb..46ac8c79 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_context.test
@@ -8,7 +8,7 @@
 --TEMPLATE(foo.twig)--
 {% for k, v in _context %}{{ k }},{% endfor %}
 --DATA--
-return array('foo' => 'bar')
+return ['foo' => 'bar']
 --EXPECT--
 foo,global,_parent,
 global,_parent,
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test
index b2ace940..0ed98fed 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include/with_variables.test
@@ -6,7 +6,7 @@
 --TEMPLATE(foo.twig)--
 {{ foo }}
 --DATA--
-return array('vars' => array('foo' => 'bar'))
+return ['vars' => ['foo' => 'bar']]
 --EXPECT--
 bar
 bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include_template_from_string.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include_template_from_string.test
new file mode 100644
index 00000000..8d9ba60c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/include_template_from_string.test
@@ -0,0 +1,11 @@
+--TEST--
+"template_from_string" function works in an "include"
+--TEMPLATE--
+{% set embed = '{% embed "embed.twig" %}{% endembed %}' %}
+{{ include(template_from_string(embed)) }}
+--TEMPLATE(embed.twig)--
+Cool
+--DATA--
+return []
+--EXPECT--
+Cool
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call.test
index 93354431..4dd5e270 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call.test
@@ -3,6 +3,6 @@ __call calls
 --TEMPLATE--
 {{ 'foo'|magic_call }}
 --DATA--
-return array()
+return []
 --EXPECT--
 magic_foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call53.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_static_call.test
similarity index 67%
rename from vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call53.test
rename to vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_static_call.test
index a0f55e11..944f15af 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_call53.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/magic_static_call.test
@@ -1,12 +1,10 @@
 --TEST--
 __staticCall calls
---CONDITION--
-version_compare(phpversion(), '5.3.0', '>=')
 --TEMPLATE--
 {{ 'foo'|magic_call_string }}
 {{ 'foo'|magic_call_array }}
 --DATA--
-return array()
+return []
 --EXPECT--
 static_magic_foo
 static_magic_foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/max.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/max.test
index e6c94af6..6d2de000 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/max.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/max.test
@@ -5,7 +5,7 @@
 {{ max(2, 1, 3, 5, 4) }}
 {{ max({2:"two", 1:"one", 3:"three", 5:"five", 4:"for"}) }}
 --DATA--
-return array()
+return []
 --EXPECT--
 5
 5
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/min.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/min.test
index 660471c0..1fe5446b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/min.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/min.test
@@ -5,7 +5,7 @@
 {{ min([2, 1, 3, 5, 4]) }}
 {{ min({2:"two", 1:"one", 3:"three", 5:"five", 4:"for"}) }}
 --DATA--
-return array()
+return []
 --EXPECT--
 1
 1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test
index e0377c8d..2927333b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/range.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {{ range(low=0+1, high=10+0, step=2)|join(',') }}
 --DATA--
-return array()
+return []
 --EXPECT--
 1,3,5,7,9
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/recursive_block_with_inheritance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/recursive_block_with_inheritance.test
index bf0556d2..1c3fffb5 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/recursive_block_with_inheritance.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/recursive_block_with_inheritance.test
@@ -16,6 +16,6 @@
 --TEMPLATE(base.twig)--
 {{ block('list') }}
 --DATA--
-return array('item' => array('1', '2', array('3.1', array('3.2.1', '3.2.2'), '3.4')))
+return ['item' => ['1', '2', ['3.1', ['3.2.1', '3.2.2'], '3.4']]]
 --EXPECT--
 <ol class="b"><li>"1"</li><li>"2"</li><li><ol class="b"><li>"3.1"</li><li><ol class="b"><li>"3.2.1"</li><li>"3.2.2"</li></ol></li><li>"3.4"</li></ol></li></ol>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/source.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/source.test
index 0e094c3b..b691ce7b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/source.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/source.test
@@ -8,7 +8,7 @@ BAR
 --TEMPLATE(foo.twig)--
 {{ foo }}<br />
 --DATA--
-return array()
+return []
 --EXPECT--
 FOO
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test
index 30c3df51..9c9e2494 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/special_chars.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {{ §('foo') }}
 --DATA--
-return array()
+return []
 --EXPECT--
 §foo§
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/static_calls.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/static_calls.test
index 57e5be39..dd13abb0 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/static_calls.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/static_calls.test
@@ -4,7 +4,7 @@ Functions as static method calls
 {{ static_call_string('foo') }}
 {{ static_call_array('foo') }}
 --DATA--
-return array('foo' => 'foo')
+return ['foo' => 'foo']
 --EXPECT--
 *foo*
 *foo*
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test
index 3d3b9587..33b0e40d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string.test
@@ -8,7 +8,7 @@
 --TEMPLATE(parent.twig)--
 {% block content %}{% endblock %}
 --DATA--
-return array('name' => 'Fabien', 'template' => "Hello {{ name }}")
+return ['name' => 'Fabien', 'template' => "Hello {{ name }}"]
 --EXPECT--
 Hello Fabien
 Hello Fabien
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string_error.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string_error.test
new file mode 100644
index 00000000..900d238b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/template_from_string_error.test
@@ -0,0 +1,8 @@
+--TEST--
+"template_from_string" function
+--TEMPLATE--
+{% include template_from_string("{{ not a Twig template ", "foo.twig") %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Unclosed "variable" in "foo.twig (string template 4900163d56b1af4b704c6b0afee7f98ba53418ce7a93d37a3af1882735baf9cd)" at line 1.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/undefined_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/undefined_block.test
new file mode 100644
index 00000000..36584bd2
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/undefined_block.test
@@ -0,0 +1,16 @@
+--TEST--
+"block" function with undefined block
+--TEMPLATE--
+{% extends "base.twig" %}
+{% block foo %}
+    {{ parent() }}
+    {{ block('unknown') }}
+    {{ block('bar') }}
+{% endblock %}
+--TEMPLATE(base.twig)--
+{% block foo %}Foo{% endblock %}
+{% block bar %}Bar{% endblock %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\RuntimeError: Block "unknown" on template "base.twig" does not exist in "index.twig" at line 5.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/undefined_block_deep.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/undefined_block_deep.test
new file mode 100644
index 00000000..cc98ec09
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/functions/undefined_block_deep.test
@@ -0,0 +1,20 @@
+--TEST--
+"block" function with undefined block on deep inheritance
+--TEMPLATE--
+{% extends "base.twig" %}
+{% block foo %}
+    {{ parent() }}
+    {{ block('unknown') }}
+    {{ block('bar') }}
+{% endblock %}
+--TEMPLATE(base.twig)--
+{% extends "layout.twig" %}
+{% block foo %}Foo{% endblock %}
+{% block bar %}Bar{% endblock %}
+--TEMPLATE(layout.twig)--
+{% block foo %}Foo{% endblock %}
+{% block bar %}Bar{% endblock %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\RuntimeError: Block "unknown" on template "layout.twig" does not exist in "index.twig" at line 5.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test
index 4ccff7b6..18bba524 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/default_values.test
@@ -10,7 +10,7 @@ macro
 {{ test('foo') }}
 {{ test('bar', 'foo') }}
 --DATA--
-return array();
+return []
 --EXPECT--
 foobar
 barfoo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test
index cd254281..4577286d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/nested_calls.test
@@ -13,6 +13,6 @@ macro
 
 {{ macros.foo(macros.bar()) }}
 --DATA--
-return array();
+return []
 --EXPECT--
 <br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test
index cbfb921b..05dd9213 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/reserved_variables.test
@@ -9,6 +9,6 @@ macro
 
 {{ test(this) }}
 --DATA--
-return array('this' => 'foo');
+return ['this' => 'foo']
 --EXPECT--
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test
index 6a366cdf..8fc6b477 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/simple.test
@@ -14,7 +14,7 @@ macro
 {{ test.test(1, "c") }}
 {{ test(1, "c") }}
 --DATA--
-return array();
+return []
 --EXPECT--
 a<br />b<br />
 a<br />b<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/unknown_macro.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/unknown_macro.test
new file mode 100644
index 00000000..10ea6c62
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/unknown_macro.test
@@ -0,0 +1,10 @@
+--TEST--
+macro
+--TEMPLATE--
+{% import _self as macros %}
+
+{{ macros.unknown() }}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\RuntimeError: Macro "unknown" is not defined in template "index.twig" in "index.twig" at line 4.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs.test
index 412c90fa..dd4b5c9f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs.test
@@ -14,7 +14,7 @@ macro with arbitrary arguments
 {{ test1("foo", "bar", "foobar") }}
 {{ test2("foo", "bar", "foobar") }}
 --DATA--
-return array();
+return []
 --EXPECT--
 foo: bar, foobar
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs_argument.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs_argument.test
index 800c262e..1ad368bf 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs_argument.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/varargs_argument.test
@@ -4,4 +4,4 @@ macro with varargs argument
 {% macro test(varargs) %}
 {% endmacro %}
 --EXCEPTION--
-Twig_Error_Syntax: The argument "varargs" in macro "test" cannot be defined because the variable "varargs" is reserved for arbitrary arguments in "index.twig" at line 2.
+Twig\Error\SyntaxError: The argument "varargs" in macro "test" cannot be defined because the variable "varargs" is reserved for arbitrary arguments in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test
index 685626f2..72a7a2f4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/macros/with_filters.test
@@ -4,11 +4,11 @@ macro with a filter
 {% import _self as test %}
 
 {% macro test() %}
-    {% filter escape %}foo<br />{% endfilter %}
+    {% apply escape %}foo<br />{% endapply %}
 {% endmacro %}
 
 {{ test.test() }}
 --DATA--
-return array();
+return []
 --EXPECT--
 foo&lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/block_names_unicity.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/block_names_unicity.test
new file mode 100644
index 00000000..19414676
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/block_names_unicity.test
@@ -0,0 +1,19 @@
+--TEST--
+Block names are unique per template
+--TEMPLATE--
+{% extends 'layout' %}
+{% block content -%}
+    {% apply title -%}
+        second
+    {% endapply %}
+{% endblock %}
+--TEMPLATE(layout)--
+{% apply title -%}
+    first
+{% endapply %}
+{% block content %}{% endblock %}
+--DATA--
+return []
+--EXPECT--
+First
+Second
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/combined_debug_info.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/combined_debug_info.test
index ff977ad6..6426d2c1 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/combined_debug_info.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/combined_debug_info.test
@@ -10,6 +10,6 @@ index
 foo
 {{ foo.bar }}
 --DATA--
-return array('foo' => 'foo');
+return ['foo' => 'foo']
 --EXCEPTION--
-Twig_Error_Runtime: Impossible to access an attribute ("bar") on a string variable ("foo") in "foo" at line 3.
+Twig\Error\RuntimeError: Impossible to access an attribute ("bar") on a string variable ("foo") in "foo" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test
index 65f6cd2b..25bdc9e4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/empty_token.test
@@ -3,6 +3,6 @@ Twig outputs 0 nodes correctly
 --TEMPLATE--
 {{ foo }}0{{ foo }}
 --DATA--
-return array('foo' => 'foo')
+return ['foo' => 'foo']
 --EXPECT--
 foo0foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/issue_1143.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/issue_1143.test
index ff7c8bb7..e2ab950e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/issue_1143.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/issue_1143.test
@@ -8,7 +8,7 @@ class House
     const REGION_S = 1;
     const REGION_P = 2;
 
-    public static $regionChoices = array(self::REGION_S => 'house.region.s', self::REGION_P => 'house.region.p');
+    public static $regionChoices = [self::REGION_S => 'house.region.s', self::REGION_P => 'house.region.p'];
 
     public function getRegionChoices()
     {
@@ -18,6 +18,6 @@ class House
 
 $object = new House();
 $object->region = 1;
-return array('object' => $object)
+return ['object' => $object]
 --EXPECT--
 house.region.s
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/multi_word_tests.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/multi_word_tests.test
index 269a3057..96ca5517 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/multi_word_tests.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/multi_word_tests.test
@@ -4,7 +4,7 @@ Twig allows multi-word tests without a custom node class
 {{ 'foo' is multi word ? 'yes' : 'no' }}
 {{ 'foo bar' is multi word ? 'yes' : 'no' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 no
 yes
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test
index 60c3c51d..41e62c07 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/simple_xml_element.test
@@ -1,7 +1,5 @@
 --TEST--
 Twig is able to deal with SimpleXMLElement instances as variables
---CONDITION--
-version_compare(phpversion(), '5.3.0', '>=')
 --TEMPLATE--
 Hello '{{ images.image.0.group }}'!
 {{ images.image.0.group.attributes.myattr }}
@@ -10,7 +8,7 @@ Hello '{{ images.image.0.group }}'!
     - {{ image.group }}
 {% endfor %}
 --DATA--
-return array('images' => new SimpleXMLElement('<images><image><group myattr="example">foo</group></image><image><group>bar</group></image></images>'))
+return ['images' => new \SimpleXMLElement('<images><image><group myattr="example">foo</group></image><image><group>bar</group></image></images>')]
 --EXPECT--
 Hello 'foo'!
 example
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test
index e18e1107..62fe8848 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/regression/strings_like_numbers.test
@@ -3,6 +3,6 @@ Twig does not confuse strings with integers in getAttribute()
 --TEMPLATE--
 {{ hash['2e2'] }}
 --DATA--
-return array('hash' => array('2e2' => 'works'))
+return ['hash' => ['2e2' => 'works']]
 --EXPECT--
 works
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/basic.test
new file mode 100644
index 00000000..4848ee02
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/basic.test
@@ -0,0 +1,10 @@
+--TEST--
+"apply" tag applies a filter on its children
+--TEMPLATE--
+{% apply upper %}
+Some text with a {{ var }}
+{% endapply %}
+--DATA--
+return ['var' => 'var']
+--EXPECT--
+SOME TEXT WITH A VAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/json_encode.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/json_encode.test
new file mode 100644
index 00000000..8a590b44
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/json_encode.test
@@ -0,0 +1,8 @@
+--TEST--
+"apply" tag applies a filter on its children
+--TEMPLATE--
+{% apply json_encode|raw %}test{% endapply %}
+--DATA--
+return []
+--EXPECT--
+"test"
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/multiple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/multiple.test
new file mode 100644
index 00000000..e16998a5
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/multiple.test
@@ -0,0 +1,10 @@
+--TEST--
+"apply" tags accept multiple chained filters
+--TEMPLATE--
+{% apply lower|title %}
+  {{ var }}
+{% endapply %}
+--DATA--
+return ['var' => 'VAR']
+--EXPECT--
+    Var
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/nested.test
new file mode 100644
index 00000000..b64a6914
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/nested.test
@@ -0,0 +1,16 @@
+--TEST--
+"apply" tags can be nested at will
+--TEMPLATE--
+{% apply lower|title %}
+  {{ var }}
+  {% apply upper %}
+    {{ var }}
+  {% endapply %}
+  {{ var }}
+{% endapply %}
+--DATA--
+return ['var' => 'var']
+--EXPECT--
+  Var
+      Var
+    Var
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/scope.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/scope.test
new file mode 100644
index 00000000..a87ff911
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/scope.test
@@ -0,0 +1,15 @@
+--TEST--
+"apply" tag does not create a new scope
+--TEMPLATE--
+{% set foo = 'baz' %}
+{% apply spaceless %}
+    {% set foo = 'foo' %}
+    {% set bar = 'bar' %}
+{% endapply %}
+{{ 'foo' == foo ? 'OK ' ~ foo : 'KO' }}
+{{ 'bar' == bar ? 'OK ' ~ bar : 'KO' }}
+--DATA--
+return []
+--EXPECT--
+OK foo
+OK bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/with_for_tag.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/with_for_tag.test
new file mode 100644
index 00000000..4453880b
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/with_for_tag.test
@@ -0,0 +1,13 @@
+--TEST--
+"apply" tag applies the filter on "for" tags
+--TEMPLATE--
+{% apply upper %}
+{% for item in items %}
+{{ item }}
+{% endfor %}
+{% endapply %}
+--DATA--
+return ['items' => ['a', 'b']]
+--EXPECT--
+A
+B
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/with_if_tag.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/with_if_tag.test
new file mode 100644
index 00000000..ca7a592c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/apply/with_if_tag.test
@@ -0,0 +1,29 @@
+--TEST--
+"apply" tag applies the filter on "if" tags
+--TEMPLATE--
+{% apply upper %}
+{% if items %}
+{{ items|join(', ') }}
+{% endif %}
+
+{% if items.3 is defined %}
+FOO
+{% else %}
+{{ items.1 }}
+{% endif %}
+
+{% if items.3 is defined %}
+FOO
+{% elseif items.1 %}
+{{ items.0 }}
+{% endif %}
+
+{% endapply %}
+--DATA--
+return ['items' => ['a', 'b']]
+--EXPECT--
+A, B
+
+B
+
+A
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test
index 2f6a3e1a..7b037c7a 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/basic.test
@@ -10,17 +10,13 @@
 {% autoescape false %}
 {{ var }}<br />
 {% endautoescape %}
-{% autoescape true %}
-{{ var }}<br />
-{% endautoescape %}
 {% autoescape false %}
 {{ var }}<br />
 {% endautoescape %}
 --DATA--
-return array('var' => '<br />')
+return ['var' => '<br />']
 --EXPECT--
 &lt;br /&gt;<br />
 &lt;br /&gt;<br />
 <br /><br />
-&lt;br /&gt;<br />
 <br /><br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test
index 05ab83ce..292e1b41 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/blocks.test
@@ -7,6 +7,6 @@
   {% endblock %}
 {% endautoescape %}
 --DATA--
-return array('var' => '<br />')
+return ['var' => '<br />']
 --EXPECT--
 &lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test
index 9c097246..1724b487 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/double_escaping.test
@@ -5,6 +5,6 @@
 {{ var|escape }}
 {% endautoescape %}
 --DATA--
-return array('var' => '<br />')
+return ['var' => '<br />']
 --EXPECT--
 &lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test
index ce7ea789..170e7074 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/functions.test
@@ -44,7 +44,7 @@ safe_br
 
 {% endautoescape %}
 --DATA--
-return array()
+return []
 --EXPECT--
 
 autoescape false
@@ -80,4 +80,4 @@ unsafe_br()|escape
 autoescape js
 
 safe_br
-\x3Cbr\x20\x2F\x3E
+\u003Cbr\u0020\/\u003E
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test
index e389d4dd..3d8d4f8f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/literal.test
@@ -11,19 +11,40 @@
 
 3. Conditional expression with a variable
 {{ true ? "<br />" : someVar }}
+{{ false ? "<br />" : someVar }}
+{{ true ? someVar : "<br />" }}
+{{ false ? someVar : "<br />" }}
 
 4. Nested conditionals with only literals
 {{ true ? (true ? "<br />" : "<br>") : "\n" }}
 
 5. Nested conditionals with a variable
 {{ true ? (true ? "<br />" : someVar) : "\n" }}
+{{ true ? (false ? "<br />" : someVar) : "\n" }}
+{{ true ? (true ? someVar : "<br />") : "\n" }}
+{{ true ? (false ? someVar : "<br />") : "\n" }}
+{{ false ? "\n" : (true ? someVar : "<br />") }}
+{{ false ? "\n" : (false ? someVar : "<br />") }}
 
 6. Nested conditionals with a variable marked safe
 {{ true ? (true ? "<br />" : someVar|raw) : "\n" }}
+{{ true ? (false ? "<br />" : someVar|raw) : "\n" }}
+{{ true ? (true ? someVar|raw : "<br />") : "\n" }}
+{{ true ? (false ? someVar|raw : "<br />") : "\n" }}
+{{ false ? "\n" : (true ? someVar|raw : "<br />") }}
+{{ false ? "\n" : (false ? someVar|raw : "<br />") }}
+
+7. Without then clause
+{{ "<br />" ?: someVar }}
+{{ someFalseVar ?: "<br />" }}
+
+8. NullCoalesce
+{{ aaaa ?? "<br />" }}
+{{ "<br />" ?? someVar }}
 
 {% endautoescape %}
 --DATA--
-return array()
+return ['someVar' => '<br />', 'someFalseVar' => false]
 --EXPECT--
 
 1. Simple literal
@@ -33,13 +54,34 @@ return array()
 <br />
 
 3. Conditional expression with a variable
+<br />
 &lt;br /&gt;
+&lt;br /&gt;
+<br />
 
 4. Nested conditionals with only literals
 <br />
 
 5. Nested conditionals with a variable
+<br />
 &lt;br /&gt;
+&lt;br /&gt;
+<br />
+&lt;br /&gt;
+<br />
 
 6. Nested conditionals with a variable marked safe
 <br />
+<br />
+<br />
+<br />
+<br />
+<br />
+
+7. Without then clause
+<br />
+<br />
+
+8. NullCoalesce
+<br />
+<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test
index 798e6fea..0d88c7e3 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/nested.test
@@ -15,7 +15,7 @@
 {% endautoescape %}
 {{ var }}
 --DATA--
-return array('var' => '<br />')
+return ['var' => '<br />']
 --EXPECT--
 &lt;br /&gt;
   &lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test
index e896aa41..9d959b22 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/objects.test
@@ -19,7 +19,7 @@ class UserForAutoEscapeTest
      return 'Fabien<br />';
   }
 }
-return array('user' => new UserForAutoEscapeTest())
+return ['user' => new UserForAutoEscapeTest()]
 --EXPECT--
 Fabien&lt;br /&gt;
 fabien&lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test
index 9f1cedd3..187327c8 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/raw.test
@@ -5,6 +5,6 @@
 {{ var|raw }}
 {% endautoescape %}
 --DATA--
-return array('var' => '<br />')
+return ['var' => '<br />']
 --EXPECT--
 <br />
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.legacy.test
deleted file mode 100644
index bbf1356e..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.legacy.test
+++ /dev/null
@@ -1,11 +0,0 @@
---TEST--
-"autoescape" tag accepts an escaping strategy
---TEMPLATE--
-{% autoescape true js %}{{ var }}{% endautoescape %}
-
-{% autoescape true html %}{{ var }}{% endautoescape %}
---DATA--
-return array('var' => '<br />"')
---EXPECT--
-\x3Cbr\x20\x2F\x3E\x22
-&lt;br /&gt;&quot;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test
index e496f608..9a0137ee 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/strategy.test
@@ -5,7 +5,7 @@
 
 {% autoescape 'html' %}{{ var }}{% endautoescape %}
 --DATA--
-return array('var' => '<br />"')
+return ['var' => '<br />"']
 --EXPECT--
-\x3Cbr\x20\x2F\x3E\x22
+\u003Cbr\u0020\/\u003E\u0022
 &lt;br /&gt;&quot;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test
index 4f415201..9ae8d7bf 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/type.test
@@ -39,20 +39,20 @@ escape types
 {% endautoescape %}
 
 --DATA--
-return array('msg' => "<>\n'\"")
+return ['msg' => "<>\n'\""]
 --EXPECT--
 
 1. autoescape 'html' |escape('js')
 
-<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
+<a onclick="alert(&quot;\u003C\u003E\n\u0027\u0022&quot;)"></a>
 
 2. autoescape 'html' |escape('js')
 
-<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
+<a onclick="alert(&quot;\u003C\u003E\n\u0027\u0022&quot;)"></a>
 
 3. autoescape 'js' |escape('js')
 
-<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
+<a onclick="alert(&quot;\u003C\u003E\n\u0027\u0022&quot;)"></a>
 
 4. no escape
 
@@ -61,9 +61,9 @@ return array('msg' => "<>\n'\"")
 
 5. |escape('js')|escape('html')
 
-<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
+<a onclick="alert(&quot;\u003C\u003E\n\u0027\u0022&quot;)"></a>
 
 6. autoescape 'html' |escape('js')|escape('html')
 
-<a onclick="alert(&quot;\x3C\x3E\x0A\x27\x22&quot;)"></a>
+<a onclick="alert(&quot;\u003C\u003E\n\u0027\u0022&quot;)"></a>
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test
index 7821a9aa..f97105bb 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters.test
@@ -61,7 +61,7 @@
 
 {% endautoescape %}
 --DATA--
-return array('var' => "<Fabien>\nTwig")
+return ['var' => "<Fabien>\nTwig"]
 --EXPECT--
 
 (escape_and_nl2br is an escaper filter)
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test
index f58a1e09..50f72d83 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_filters_arguments.test
@@ -9,7 +9,7 @@
 {{ var|nl2br(sep|escape) }}
 {% endautoescape %}
 --DATA--
-return array('var' => "<Fabien>\nTwig", 'sep' => '<br />')
+return ['var' => "<Fabien>\nTwig", 'sep' => '<br />']
 --EXPECT--
 &lt;Fabien&gt;<br />
 Twig
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test
index 134c77ea..c9c73805 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_pre_escape_filters.test
@@ -31,7 +31,7 @@
 
 {% endautoescape %}
 --DATA--
-return array('var' => "<Fabien>\nTwig")
+return ['var' => "<Fabien>\nTwig"]
 --EXPECT--
 
 (nl2br is pre_escaped for "html" and declared safe for "html")
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test
index 32d3943b..c764d434 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/autoescape/with_preserves_safety_filters.test
@@ -23,7 +23,7 @@
 
 {% endautoescape %}
 --DATA--
-return array('var' => "<Fabien>\nTwig")
+return ['var' => "<Fabien>\nTwig"]
 --EXPECT--
 
 (preserves_safety is preserving safety for "html")
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test
index 360dcf03..988b09ce 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/basic.test
@@ -6,6 +6,6 @@
 --TEMPLATE(foo.twig)--
 {% block content %}{% endblock %}
 --DATA--
-return array('foo' => 'bar')
+return ['foo' => 'bar']
 --EXPECT--
 FOObar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test
index bc89ec82..3009f8b4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/block_unique_name.test
@@ -6,6 +6,6 @@
     {% endblock %}
 {% endblock %}
 --DATA--
-return array()
+return []
 --EXCEPTION--
-Twig_Error_Syntax: The block 'content' has already been defined line 2 in "index.twig" at line 3.
+Twig\Error\SyntaxError: The block 'content' has already been defined line 2 in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/capturing_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/capturing_block.test
new file mode 100644
index 00000000..4182b8c3
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/capturing_block.test
@@ -0,0 +1,24 @@
+--TEST--
+capturing "block" tag
+--DEPRECATION--
+The spaceless tag in "index.twig" at line 4 is deprecated since Twig 2.7, use the spaceless filter instead.
+--TEMPLATE--
+{% set foo %}{% block foo %}FOO{% endblock %}{% endset %}
+{{ foo }}
+{% spaceless %}
+{% block bar %}
+<h1>
+    <b>Title</b>
+</h1>
+{% endblock %}
+{% endspaceless %}
+
+{{ block('bar') }}
+--DATA--
+return array()
+--EXPECT--
+FOO
+<h1><b>Title</b></h1>
+<h1>
+    <b>Title</b>
+</h1>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/conditional_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/conditional_block.test
new file mode 100644
index 00000000..d4e2ae00
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/conditional_block.test
@@ -0,0 +1,9 @@
+--TEST--
+conditional "block" tag
+--TEMPLATE--
+{% if false %}{% block foo %}FOO{% endblock %}{% endif %}
+{% if true %}{% block bar %}BAR{% endblock %}{% endif %}
+--DATA--
+return array()
+--EXPECT--
+BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test
index be17fedf..e8e240eb 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/block/special_chars.test
@@ -5,6 +5,6 @@
 §
 {% endblock § %}
 --DATA--
-return array()
+return []
 --EXPECT--
 §
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/block.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/block.legacy.test
new file mode 100644
index 00000000..53729dd1
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/block.legacy.test
@@ -0,0 +1,20 @@
+--TEST--
+Deprecating a block with "deprecated" tag
+--TEMPLATE--
+{% use 'greeting.twig' %}
+
+{{ block('welcome') }}
+
+--TEMPLATE(greeting.twig)--
+{% block welcome %}
+  {% deprecated 'The "welcome" block is deprecated, use "hello" instead.' %}
+  {{ block('hello') }}
+{% endblock %}
+
+{% block hello %}
+Hello Fabien
+{% endblock %}
+--DATA--
+return []
+--EXPECT--
+  Hello Fabien
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/macro.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/macro.legacy.test
new file mode 100644
index 00000000..5cc48dd8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/macro.legacy.test
@@ -0,0 +1,21 @@
+--TEST--
+Deprecating a macro with "deprecated" tag
+--TEMPLATE--
+{% import 'greeting.twig' as greeting %}
+
+{{ greeting.welcome('Fabien') }}
+
+--TEMPLATE(greeting.twig)--
+{% macro welcome(name) %}
+  {% deprecated 'The "welcome" macro is deprecated, use "hello" instead.' %}
+  {% import _self as self %}
+  {{ self.hello(name) }}
+{% endmacro %}
+
+{% macro hello(name) %}
+Hello {{ name }}
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+  Hello Fabien
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/template.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/template.legacy.test
new file mode 100644
index 00000000..7f786d57
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/deprecated/template.legacy.test
@@ -0,0 +1,12 @@
+--TEST--
+Deprecating a template with "deprecated" tag
+--TEMPLATE--
+{% extends 'greeting.twig' %}
+
+{% deprecated 'The "index.twig" template is deprecated, use "greeting.twig" instead.' %}
+--TEMPLATE(greeting.twig)--
+Hello Fabien
+--DATA--
+return []
+--EXPECT--
+Hello Fabien
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test
index f44296ea..16781e41 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/basic.test
@@ -21,7 +21,7 @@ B
 {% endblock %}
 C
 --DATA--
-return array()
+return []
 --EXPECT--
 FOO
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/complex_dynamic_parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/complex_dynamic_parent.test
index de5ea7ee..b799a8c9 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/complex_dynamic_parent.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/complex_dynamic_parent.test
@@ -21,7 +21,7 @@ B
 {% endblock %}
 C
 --DATA--
-return array('foo' => 'foo')
+return ['foo' => 'foo']
 --EXPECT--
 FOO
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/dynamic_parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/dynamic_parent.test
index 2a125e6b..6f0879e2 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/dynamic_parent.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/dynamic_parent.test
@@ -21,7 +21,7 @@ B
 {% endblock %}
 C
 --DATA--
-return array('foo' => 'foo.twig')
+return ['foo' => 'foo.twig']
 --EXPECT--
 FOO
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test
index 43147370..b1c6c85e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/error_line.test
@@ -11,6 +11,6 @@ BAR
 --TEMPLATE(foo.twig)--
 {% block c1 %}{% endblock %}
 --DATA--
-return array()
+return []
 --EXCEPTION--
-Twig_Error_Runtime: Variable "nothing" does not exist in "index.twig" at line 5.
+Twig\Error\RuntimeError: Variable "nothing" does not exist in "index.twig" at line 5.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test
index da161e6d..9f7b52f1 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/multiple.test
@@ -28,7 +28,7 @@ B
 {% endblock %}
 C
 --DATA--
-return array()
+return []
 --EXPECT--
 FOO
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test
index 81563dce..9f337233 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/nested.test
@@ -24,7 +24,7 @@ B
 {% endblock %}
 C
 --DATA--
-return array()
+return []
 --EXPECT--
 A
             block1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test
index 2c1dd584..ce726ac0 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/embed/with_extends.test
@@ -39,7 +39,7 @@ B
 {% endblock %}
 C
 --DATA--
-return array()
+return []
 --EXPECT--
 A
         blockc1base
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.legacy.test
similarity index 54%
rename from vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test
rename to vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.legacy.test
index 82094f2f..28f12c1a 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/basic.legacy.test
@@ -1,10 +1,12 @@
 --TEST--
 "filter" tag applies a filter on its children
+--DEPRECATION--
+The "filter" tag in "index.twig" at line 2 is deprecated since Twig 2.9, use the "apply" tag instead.
 --TEMPLATE--
 {% filter upper %}
 Some text with a {{ var }}
 {% endfilter %}
 --DATA--
-return array('var' => 'var')
+return ['var' => 'var']
 --EXPECT--
 SOME TEXT WITH A VAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.legacy.test
similarity index 52%
rename from vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test
rename to vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.legacy.test
index 3e7148bf..1da38498 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/json_encode.legacy.test
@@ -1,8 +1,10 @@
 --TEST--
 "filter" tag applies a filter on its children
+--DEPRECATION--
+The "filter" tag in "index.twig" at line 2 is deprecated since Twig 2.9, use the "apply" tag instead.
 --TEMPLATE--
 {% filter json_encode|raw %}test{% endfilter %}
 --DATA--
-return array()
+return []
 --EXPECT--
 "test"
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.legacy.test
similarity index 51%
rename from vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test
rename to vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.legacy.test
index 75512ef9..f7aa54fb 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/multiple.legacy.test
@@ -1,10 +1,12 @@
 --TEST--
 "filter" tags accept multiple chained filters
+--DEPRECATION--
+The "filter" tag in "index.twig" at line 2 is deprecated since Twig 2.9, use the "apply" tag instead.
 --TEMPLATE--
 {% filter lower|title %}
   {{ var }}
 {% endfilter %}
 --DATA--
-return array('var' => 'VAR')
+return ['var' => 'VAR']
 --EXPECT--
     Var
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.legacy.test
new file mode 100644
index 00000000..a8c69066
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.legacy.test
@@ -0,0 +1,19 @@
+--TEST--
+"filter" tags can be nested at will
+--DEPRECATION--
+The "filter" tag in "index.twig" at line 2 is deprecated since Twig 2.9, use the "apply" tag instead.
+The "filter" tag in "index.twig" at line 4 is deprecated since Twig 2.9, use the "apply" tag instead.
+--TEMPLATE--
+{% filter lower|title %}
+  {{ var }}
+  {% filter upper %}
+    {{ var }}
+  {% endfilter %}
+  {{ var }}
+{% endfilter %}
+--DATA--
+return ['var' => 'var']
+--EXPECT--
+  Var
+      Var
+    Var
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test
deleted file mode 100644
index 7e4e4eb3..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/nested.test
+++ /dev/null
@@ -1,16 +0,0 @@
---TEST--
-"filter" tags can be nested at will
---TEMPLATE--
-{% filter lower|title %}
-  {{ var }}
-  {% filter upper %}
-    {{ var }}
-  {% endfilter %}
-  {{ var }}
-{% endfilter %}
---DATA--
-return array('var' => 'var')
---EXPECT--
-  Var
-      Var
-    Var
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/scope.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/scope.legacy.test
new file mode 100644
index 00000000..6ee1ac83
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/scope.legacy.test
@@ -0,0 +1,13 @@
+--TEST--
+"scope" tag creates a new scope
+--DEPRECATION--
+The "filter" tag in "index.twig" at line 2 is deprecated since Twig 2.9, use the "apply" tag instead.
+--TEMPLATE--
+{% filter spaceless %}
+{% set item = 'foo' %}
+{% endfilter %}
+{{ item }}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\RuntimeError: Variable "item" does not exist in "index.twig" at line 5.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.legacy.test
similarity index 54%
rename from vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test
rename to vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.legacy.test
index 22745ead..5f3ab7bc 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_for_tag.legacy.test
@@ -1,5 +1,7 @@
 --TEST--
 "filter" tag applies the filter on "for" tags
+--DEPRECATION--
+The "filter" tag in "index.twig" at line 2 is deprecated since Twig 2.9, use the "apply" tag instead.
 --TEMPLATE--
 {% filter upper %}
 {% for item in items %}
@@ -7,7 +9,7 @@
 {% endfor %}
 {% endfilter %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXPECT--
 A
 B
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.legacy.test
similarity index 69%
rename from vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test
rename to vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.legacy.test
index afd95b29..034caaa5 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/filter/with_if_tag.legacy.test
@@ -1,5 +1,7 @@
 --TEST--
 "filter" tag applies the filter on "if" tags
+--DEPRECATION--
+The "filter" tag in "index.twig" at line 2 is deprecated since Twig 2.9, use the "apply" tag instead.
 --TEMPLATE--
 {% filter upper %}
 {% if items %}
@@ -20,7 +22,7 @@ FOO
 
 {% endfilter %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXPECT--
 A, B
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.legacy.test
new file mode 100644
index 00000000..a35047c0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.legacy.test
@@ -0,0 +1,16 @@
+--TEST--
+"for" tag takes a condition
+--DEPRECATION--
+Using an "if" condition on "for" tag in "index.twig" at line 2 is deprecated since Twig 2.10.0, use a "filter" filter or an "if" condition inside the "for" body instead (if your condition depends on a variable updated inside the loop).
+--TEMPLATE--
+{% for i in 1..5 if i is odd -%}
+    {{ loop.index }}.{{ i }}{{ foo.bar }}
+{% endfor %}
+--DATA--
+return ['foo' => ['bar' => 'X']]
+--CONFIG--
+return ['strict_variables' => false]
+--EXPECT--
+1.1X
+2.3X
+3.5X
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test
deleted file mode 100644
index 380531f7..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/condition.test
+++ /dev/null
@@ -1,14 +0,0 @@
---TEST--
-"for" tag takes a condition
---TEMPLATE--
-{% for i in 1..5 if i is odd -%}
-    {{ loop.index }}.{{ i }}{{ foo.bar }}
-{% endfor %}
---DATA--
-return array('foo' => array('bar' => 'X'))
---CONFIG--
-return array('strict_variables' => false)
---EXPECT--
-1.1X
-2.3X
-3.5X
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test
index ddc69307..3cdd575c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/context.test
@@ -8,7 +8,7 @@
   * {{ item }}
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXPECT--
       * a
       * b
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test
index 20ccc880..86ec9c28 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/else.test
@@ -7,17 +7,17 @@
   no item
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXPECT--
   * a
   * b
 --DATA--
-return array('items' => array())
+return ['items' => []]
 --EXPECT--
   no item
 --DATA--
-return array()
+return []
 --CONFIG--
-return array('strict_variables' => false)
+return ['strict_variables' => false]
 --EXPECT--
   no item
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test
index 49fb9ca6..e1ad3c73 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/inner_variables.test
@@ -7,7 +7,7 @@
   {% endfor %}
 {% endfor %}
 --DATA--
-return array('k' => 0)
+return ['k' => 0]
 --EXPECT--
       0 1
       1 1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test
index 4e22cb47..92135575 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys.test
@@ -5,7 +5,7 @@
   * {{ key }}
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXPECT--
   * 0
   * 1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test
index 4c211689..ab39ddf2 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/keys_and_values.test
@@ -5,7 +5,7 @@
   * {{ key }}/{{ item }}
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXPECT--
   * 0/a
   * 1/b
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test
index 93bc76a1..56a60c2e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context.test
@@ -8,7 +8,7 @@
 
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXPECT--
   * 1/0
   * 2/1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test
index 58af2c32..58e5a9b3 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_context_local.test
@@ -5,6 +5,6 @@
 {% endfor %}
 {% if loop is not defined %}WORKS{% endif %}
 --DATA--
-return array('items' => array())
+return ['items' => []]
 --EXPECT--
 WORKS
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test
index 6a2af63b..2d8c0b87 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined.test
@@ -5,6 +5,6 @@
     {{ loop.last }}
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXCEPTION--
-Twig_Error_Syntax: The "loop.last" variable is not defined when looping with a condition in "index.twig" at line 3.
+Twig\Error\SyntaxError: The "loop.last" variable is not defined when looping with a condition in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test
index 1e819ca0..e90e96b4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/loop_not_defined_cond.test
@@ -4,6 +4,6 @@
 {% for i, item in items if loop.last > 0 %}
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXCEPTION--
-Twig_Error_Syntax: The "loop" variable cannot be used in a looping condition in "index.twig" at line 2.
+Twig\Error\SyntaxError: The "loop" variable cannot be used in a looping condition in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test
index f8b9f6bc..df1bb07a 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/nested_else.test
@@ -11,7 +11,7 @@
   no item1
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b'), 'items1' => array())
+return ['items' => ['a', 'b'], 'items1' => []]
 --EXPECT--
 no a
         no b
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test
index 50344379..134fe3fc 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects.test
@@ -16,16 +16,16 @@
   * {{ key }}
 {% endfor %}
 --DATA--
-class ItemsIterator implements Iterator
+class ItemsIterator implements \Iterator
 {
-  protected $values = array('foo' => 'bar', 'bar' => 'foo');
+  protected $values = ['foo' => 'bar', 'bar' => 'foo'];
   public function current() { return current($this->values); }
   public function key() { return key($this->values); }
   public function next() { return next($this->values); }
   public function rewind() { return reset($this->values); }
   public function valid() { return false !== current($this->values); }
 }
-return array('items' => new ItemsIterator())
+return ['items' => new ItemsIterator()]
 --EXPECT--
   * bar
   * 1/0
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test
index 4a1ff611..97f1db0c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/objects_countable.test
@@ -17,9 +17,9 @@
   * {{ key }}
 {% endfor %}
 --DATA--
-class ItemsIteratorCountable implements Iterator, Countable
+class ItemsIteratorCountable implements \Iterator, \Countable
 {
-  protected $values = array('foo' => 'bar', 'bar' => 'foo');
+  protected $values = ['foo' => 'bar', 'bar' => 'foo'];
   public function current() { return current($this->values); }
   public function key() { return key($this->values); }
   public function next() { return next($this->values); }
@@ -27,7 +27,7 @@ class ItemsIteratorCountable implements Iterator, Countable
   public function valid() { return false !== current($this->values); }
   public function count() { return count($this->values); }
 }
-return array('items' => new ItemsIteratorCountable())
+return ['items' => new ItemsIteratorCountable()]
 --EXPECT--
   * bar
   * 1/0
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test
index 17b2e222..3b677d60 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/recursive.test
@@ -8,7 +8,7 @@
 {% endfor %}
 {% endfor %}
 --DATA--
-return array('items' => array('a' => array('a1', 'a2', 'a3'), 'b' => array('b1')))
+return ['items' => ['a' => ['a1', 'a2', 'a3'], 'b' => ['b1']]]
 --EXPECT--
 * a (2):
   * a1 (3)
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test
index 82f2ae8a..384c41b2 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/for/values.test
@@ -5,7 +5,7 @@
   * {{ item }}
 {% endfor %}
 --DATA--
-return array('items' => array('a', 'b'))
+return ['items' => ['a', 'b']]
 --EXPECT--
   * a
   * b
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test
index 5f5da0ec..1d3c9e2b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/from.test
@@ -9,6 +9,6 @@ global variables
 called foobar
 {% endmacro %}
 --DATA--
-return array();
+return []
 --EXPECT--
 called foobar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test
index c1c3d276..a02165e5 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/basic.test
@@ -9,14 +9,14 @@
   NOTHING
 {% endif %}
 --DATA--
-return array('a' => 'a')
+return ['a' => 'a']
 --EXPECT--
   a
 --DATA--
-return array('b' => 'b')
+return ['b' => 'b']
 --EXPECT--
   b
 --DATA--
-return array()
+return []
 --EXPECT--
   NOTHING
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test
index edfb73df..eb65083c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/if/expression.test
@@ -9,14 +9,14 @@
   A3
 {% endif %}
 --DATA--
-return array('a' => 1)
+return ['a' => 1]
 --EXPECT--
   A1
 --DATA--
-return array('a' => 12)
+return ['a' => 12]
 --EXPECT--
   A2
 --DATA--
-return array('a' => 7)
+return ['a' => 7]
 --EXPECT--
   A3
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test
index 8fe1a6c1..9982b039 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/basic.test
@@ -8,7 +8,7 @@ BAR
 --TEMPLATE(foo.twig)--
 FOOBAR
 --DATA--
-return array()
+return []
 --EXPECT--
 FOO
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test
index eaeeb112..23db1812 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/expression.test
@@ -8,7 +8,7 @@ BAR
 --TEMPLATE(foo.twig)--
 FOOBAR
 --DATA--
-return array('foo' => 'foo.twig')
+return ['foo' => 'foo.twig']
 --EXPECT--
 FOO
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test
index 24aed06d..6c8bdb1e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing.test
@@ -6,5 +6,5 @@
 {% include "foo.twig" ignore missing with {} %}
 {% include "foo.twig" ignore missing with {} only %}
 --DATA--
-return array()
+return []
 --EXPECT--
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing_exists.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing_exists.test
new file mode 100644
index 00000000..1af01221
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/ignore_missing_exists.test
@@ -0,0 +1,11 @@
+--TEST--
+"include" tag
+--TEMPLATE--
+{% include "included.twig" ignore missing %}
+NOT DISPLAYED
+--TEMPLATE(included.twig)--
+{% include "DOES NOT EXIST" %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\LoaderError: Template "DOES NOT EXIST" is not defined in "included.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/include_missing_extends.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/include_missing_extends.test
new file mode 100644
index 00000000..d0d1bfe5
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/include_missing_extends.test
@@ -0,0 +1,13 @@
+--TEST--
+"include" tag
+--TEMPLATE--
+{% include ['bad.twig', 'good.twig'] ignore missing %}
+NOT DISPLAYED
+--TEMPLATE(bad.twig)--
+{% extends 'DOES NOT EXIST' %}
+--TEMPLATE(good.twig)--
+NOT DISPLAYED
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\LoaderError: Template "DOES NOT EXIST" is not defined in "bad.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test
index f25e8715..ac72838e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {% include "foo.twig" %}
 --DATA--
-return array();
+return []
 --EXCEPTION--
-Twig_Error_Loader: Template "foo.twig" is not defined in "index.twig" at line 2.
+Twig\Error\LoaderError: Template "foo.twig" is not defined in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test
index 86c18644..0ee51b78 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/missing_nested.test
@@ -11,6 +11,6 @@
     {% include "foo.twig" %}
 {% endblock %}
 --DATA--
-return array();
+return []
 --EXCEPTION--
-Twig_Error_Loader: Template "foo.twig" is not defined in "base.twig" at line 3.
+Twig\Error\LoaderError: Template "foo.twig" is not defined in "base.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test
index 77760a09..8da402f7 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/only.test
@@ -3,14 +3,18 @@
 --TEMPLATE--
 {% include "foo.twig" %}
 {% include "foo.twig" only %}
-{% include "foo.twig" with {'foo1': 'bar'} %}
-{% include "foo.twig" with {'foo1': 'bar'} only %}
+{% include "foo.twig" with vars1 %}
+{% include "foo.twig" with vars1 only %}
+{% include "foo.twig" with vars2 %}
+{% include "foo.twig" with vars2 only %}
 --TEMPLATE(foo.twig)--
 {% for k, v in _context %}{{ k }},{% endfor %}
 --DATA--
-return array('foo' => 'bar')
+return ['vars1' => ['foo1' => 'bar'], 'vars2' => new ArrayObject(['foo2' => 'bar'])]
 --EXPECT--
-foo,global,_parent,
+vars1,vars2,global,_parent,
 global,_parent,
-foo,global,foo1,_parent,
+vars1,vars2,global,foo1,_parent,
 foo1,global,_parent,
+vars1,vars2,global,foo2,_parent,
+foo2,global,_parent,
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test
index 6ba064a3..4fb862a1 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/template_instance.test
@@ -1,10 +1,10 @@
 --TEST--
-"include" tag accepts Twig_Template instance
+"include" tag accepts \Twig\TemplateWrapper instance
 --TEMPLATE--
 {% include foo %} FOO
 --TEMPLATE(foo.twig)--
 BAR
 --DATA--
-return array('foo' => $twig->loadTemplate('foo.twig'))
+return ['foo' => $twig->load('foo.twig')]
 --EXPECT--
 BAR FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test
index ab670ee0..38063952 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/templates_as_array.test
@@ -6,7 +6,7 @@
 --TEMPLATE(foo.twig)--
 foo
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test
index 41384ac7..45a05199 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/include/with_variables.test
@@ -2,11 +2,13 @@
 "include" tag accept variables
 --TEMPLATE--
 {% include "foo.twig" with {'foo': 'bar'} %}
-{% include "foo.twig" with vars %}
+{% include "foo.twig" with vars1 %}
+{% include "foo.twig" with vars2 %}
 --TEMPLATE(foo.twig)--
 {{ foo }}
 --DATA--
-return array('vars' => array('foo' => 'bar'))
+return ['vars1' => ['foo' => 'bar'], 'vars2' => new ArrayObject(['foo' => 'bar'])]
 --EXPECT--
 bar
 bar
+bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test
index 0778a4b4..703b61be 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/basic.test
@@ -9,6 +9,6 @@ FOO
 --TEMPLATE(foo.twig)--
 {% block content %}{% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr.test
index 9a81499a..0b82d4cf 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr.test
@@ -8,7 +8,6 @@ block_expr
     {{- parent() -}}
 {% endblock %}
 --TEMPLATE(base.twig)--
-{% spaceless %}
 {% block element -%}
     <div>
         {%- if item.children is defined %}
@@ -18,15 +17,14 @@ block_expr
         {%- endif -%}
     </div>
 {%- endblock %}
-{% endspaceless %}
 --DATA--
-return array(
-    'item' => array(
-        'children' => array(
+return [
+    'item' => [
+        'children' => [
             null,
             null,
-        )
-    )
-)
+        ]
+    ]
+]
 --EXPECT--
 Element:<div>Element:<div></div>Element:<div></div></div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr2.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr2.test
index 3e868c0d..18f66041 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr2.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/block_expr2.test
@@ -10,7 +10,6 @@ block_expr2
 --TEMPLATE(base2.twig)--
 {% extends "base.twig" %}
 --TEMPLATE(base.twig)--
-{% spaceless %}
 {% block element -%}
     <div>
         {%- if item.children is defined %}
@@ -20,15 +19,14 @@ block_expr2
         {%- endif -%}
     </div>
 {%- endblock %}
-{% endspaceless %}
 --DATA--
-return array(
-    'item' => array(
-        'children' => array(
+return [
+    'item' => [
+        'children' => [
             null,
             null,
-        )
-    )
-)
+        ]
+    ]
+]
 --EXPECT--
 Element:<div>Element:<div></div>Element:<div></div></div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/capturing_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/capturing_block.test
new file mode 100644
index 00000000..703e33fd
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/capturing_block.test
@@ -0,0 +1,17 @@
+--TEST--
+capturing "block" tag with "extends" tag
+--TEMPLATE--
+{% extends "layout.twig" %}
+
+{% set foo %}
+    {%- block content %}FOO{% endblock %}
+{% endset %}
+
+{% block content1 %}BAR{{ foo }}{% endblock %}
+--TEMPLATE(layout.twig)--
+{% block content %}{% endblock %}
+{% block content1 %}{% endblock %}
+--DATA--
+return array()
+--EXPECT--
+FOOBARFOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test
index 8576e773..bd28248d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional.test
@@ -9,6 +9,6 @@
 --TEMPLATE(bar.twig)--
 {% block content %}BAR{% endblock %}
 --DATA--
-return array('foo' => 'foo.twig', 'standalone' => true)
+return ['foo' => 'foo.twig', 'standalone' => true]
 --EXPECT--
 FOOFOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional_block.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional_block.legacy.test
new file mode 100644
index 00000000..fb1c9b53
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/conditional_block.legacy.test
@@ -0,0 +1,16 @@
+--TEST--
+conditional "block" tag with "extends" tag
+--DEPRECATION--
+Nesting a block definition under a non-capturing node in "index.twig" at line 5 is deprecated since Twig 2.5.0 and will become a syntax error in 3.0.
+--TEMPLATE--
+{% extends "layout.twig" %}
+
+{% if false %}
+    {% block content %}FOO{% endblock %}
+{% endif %}
+--TEMPLATE(layout.twig)--
+{% block content %}{% endblock %}
+--DATA--
+return array()
+--EXPECT--
+FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test
index ee06ddce..e6a0f017 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/dynamic.test
@@ -9,6 +9,6 @@ FOO
 --TEMPLATE(foo.twig)--
 {% block content %}{% endblock %}
 --DATA--
-return array('foo' => 'foo.twig')
+return ['foo' => 'foo.twig']
 --EXPECT--
 FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test
index 784f3571..ca11bf20 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/empty.test
@@ -5,6 +5,6 @@
 --TEMPLATE(foo.twig)--
 {% block content %}FOO{% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 FOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test
index a1cb1ce8..4d2cb6c6 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array.test
@@ -7,6 +7,6 @@
 foo
 {% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_empty_name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_empty_name.test
index acc74f6a..51086511 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_empty_name.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_empty_name.test
@@ -7,6 +7,6 @@
 foo
 {% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_null_name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_null_name.test
index cfa648d4..c5ee6f19 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_null_name.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_as_array_with_null_name.test
@@ -7,6 +7,6 @@
 foo
 {% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_in_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_in_block.test
new file mode 100644
index 00000000..a372ea1c
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_in_block.test
@@ -0,0 +1,10 @@
+--TEST--
+"extends" tag in a block
+--TEMPLATE--
+{% block foo %}
+    {% extends "foo.twig" %}
+{% endblock %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Cannot use "extend" in a block in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_in_macro.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_in_macro.test
new file mode 100644
index 00000000..dc87b2a8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/extends_in_macro.test
@@ -0,0 +1,10 @@
+--TEST--
+"extends" tag in a macro
+--TEMPLATE--
+{% macro foo() %}
+    {% extends "foo.twig" %}
+{% endmacro %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Cannot use "extend" in a macro in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test
index dfc2b6c4..fc25badd 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple.test
@@ -7,6 +7,6 @@
 --TEMPLATE(base.twig)--
 {% block content %}base {% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 base layout index
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple_dynamic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple_dynamic.test
index 1d3e639c..fa887177 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple_dynamic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/multiple_dynamic.test
@@ -13,7 +13,7 @@
 --TEMPLATE(2_parent.twig)--
 {% block content %}2{% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 1 parent
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test
index faca9259..abea2e9d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks.test
@@ -17,6 +17,6 @@
     {% endblock %}
 {% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 SUBSUBCONTENT
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test
index 0ad11d0c..20b7848f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_blocks_parent_only.test
@@ -10,6 +10,6 @@
 {% endblock %}
 --TEMPLATE(foo.twig)--
 --DATA--
-return array()
+return []
 --EXPECT--
 CONTENTSUBCONTENTENDCONTENT
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test
index 71e3cdfd..0b585b48 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/nested_inheritance.test
@@ -11,6 +11,6 @@
 --TEMPLATE(base.twig)--
 {% block body '' %}
 --DATA--
-return array()
+return []
 --EXPECT--
 INSIDE
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test
index 4f975db8..73f4c0ec 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent.test
@@ -7,6 +7,6 @@
 --TEMPLATE(foo.twig)--
 {% block content %}BAR{% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 BARFOOBAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_as_template_wrapper.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_as_template_wrapper.test
new file mode 100644
index 00000000..1aaed556
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_as_template_wrapper.test
@@ -0,0 +1,12 @@
+--TEST--
+"extends" tag with a parent as a Twig_TemplateWrapper instance
+--TEMPLATE--
+{% extends foo %}
+
+{% block content %}New{% endblock %}
+--TEMPLATE(foo.twig)--
+{% block content %}Default{% endblock %}
+--DATA--
+return ['foo' => $twig->load('foo.twig')]
+--EXPECT--
+New
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test
index a8bc90ce..01bd544f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_change.test
@@ -7,10 +7,10 @@ FOO
 --TEMPLATE(bar.twig)--
 BAR
 --DATA--
-return array('foo' => true)
+return ['foo' => true]
 --EXPECT--
 FOO
 --DATA--
-return array('foo' => false)
+return ['foo' => false]
 --EXPECT--
 BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test
deleted file mode 100644
index cca6dbc9..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_in_a_block.test
+++ /dev/null
@@ -1,8 +0,0 @@
---TEST--
-"extends" tag
---TEMPLATE--
-{% block content %}
-    {% extends "foo.twig" %}
-{% endblock %}
---EXCEPTION--
-Twig_Error_Syntax: Cannot extend from a block in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test
index 62816713..58a37bd9 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_isolation.test
@@ -13,7 +13,7 @@
 
 {% block footer %}Default Footer{% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 Included Content
 Default Footer
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test
index 71e7c208..d4347bac 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_nested.test
@@ -17,7 +17,7 @@
   BAR
 {% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 
 INSIDE OVERRIDDEN
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test
index e29b1ac4..6d988915 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends.test
@@ -5,4 +5,4 @@
     {{ parent() }}
 {% endblock %}
 --EXCEPTION--
-Twig_Error_Syntax: Calling "parent" on a template that does not extend nor "use" another template is forbidden in "index.twig" at line 3.
+Twig\Error\SyntaxError: Calling "parent" on a template that does not extend nor "use" another template is forbidden in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test
index 63c73055..39882b8b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/parent_without_extends_but_traits.test
@@ -9,6 +9,6 @@
 --TEMPLATE(foo.twig)--
 {% block content %}BAR{% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 BAR
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test
index d1876a52..a5a22388 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/template_instance.test
@@ -9,6 +9,6 @@
 --TEMPLATE(foo.twig)--
 {% block content %}BAR{% endblock %}
 --DATA--
-return array('foo' => $twig->loadTemplate('foo.twig'))
+return ['foo' => $twig->load('foo.twig')]
 --EXPECT--
 BARFOO
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test
index 8f9ece7c..4df32ee9 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/inheritance/use.test
@@ -35,7 +35,7 @@
 {% block content_use2 'content_use2' %}
 {% block content_use2_only 'content_use2_only' %}
 --DATA--
-return array()
+return []
 --EXPECT--
     content_parent
     content_use1
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/auto_import.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/auto_import.test
new file mode 100644
index 00000000..14e0afe0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/auto_import.test
@@ -0,0 +1,16 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{{ _self.hello('Fabien') }}
+
+{% macro hello(name) -%}
+    Hello {{ _self.up(name) }}
+{% endmacro %}
+
+{% macro up(name) -%}
+    {{ name|upper }}
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+Hello FABIEN
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/auto_import_blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/auto_import_blocks.test
new file mode 100644
index 00000000..59b73937
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/auto_import_blocks.test
@@ -0,0 +1,18 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% block content %}
+    {{ _self.hello('Fabien') }}
+{% endblock %}
+
+{% macro hello(name) -%}
+    Hello {{ _self.up(name) }}
+{% endmacro %}
+
+{% macro up(name) -%}
+    {{ name|upper }}
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+Hello FABIEN
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/auto_import_without_blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/auto_import_without_blocks.test
new file mode 100644
index 00000000..79aec5cf
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/auto_import_without_blocks.test
@@ -0,0 +1,18 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% import 'macros' as macro %}
+{{ macro.foo() }}
+--TEMPLATE(macros)--
+{% macro foo() %}
+    foo
+    {{- _self.bar() }}
+{% endmacro %}
+
+{% macro bar() -%}
+    bar
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+foobar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test
index eef0c10d..ae090f9a 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/basic.test
@@ -10,7 +10,7 @@
   <input type="{{ type|default("text") }}" name="{{ name }}" value="{{ value|e|default('') }}" size="{{ size|default(20) }}">
 {% endmacro %}
 --DATA--
-return array()
+return []
 --EXPECT--
   <input type="text" name="username" value="" size="20">
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test
index ae6203bb..3f3caf77 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/endmacro_name.test
@@ -9,7 +9,7 @@
 {% macro foo() %}foo{% endmacro %}
 {% macro bar() %}bar{% endmacro bar %}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
 bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test
index 5cd3dae6..b28ca19f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/external.test
@@ -10,7 +10,7 @@
   <input type="{{ type|default("text") }}" name="{{ name }}" value="{{ value|e|default('') }}" size="{{ size|default(20) }}">
 {% endmacro %}
 --DATA--
-return array()
+return []
 --EXPECT--
   <input type="text" name="username" value="" size="20">
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test
index 205f5918..8b9aae87 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from.test
@@ -11,7 +11,7 @@
 {% macro foo(name) %}foo{{ name }}{% endmacro %}
 {% macro bar(name) %}bar{{ name }}{% endmacro %}
 --DATA--
-return array()
+return []
 --EXPECT--
 foofoo
 foofoo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_embed_with_global_macro.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_embed_with_global_macro.test
new file mode 100644
index 00000000..f06c31c9
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_embed_with_global_macro.test
@@ -0,0 +1,21 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% from _self import input %}
+
+{% embed 'embed' %}
+    {% block foo %}
+        {{ input("username") }}
+    {% endblock %}
+{% endembed %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--TEMPLATE(embed)--
+    {% block foo %}
+    {% endblock %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Unknown "input" function in "index.twig" at line 6.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_in_block_is_local.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_in_block_is_local.test
new file mode 100644
index 00000000..0c89ce62
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_in_block_is_local.test
@@ -0,0 +1,18 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% block foo %}
+    {%- from _self import input as linput %}
+{% endblock %}
+
+{% block bar %}
+    {{- linput('username') }}
+{% endblock %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Unknown "linput" function in "index.twig" at line 7.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_local_override.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_local_override.test
new file mode 100644
index 00000000..27bfbaee
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_local_override.test
@@ -0,0 +1,28 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{%- from _self import input %}
+
+{% block foo %}
+    {%- from "macros" import input %}
+    {{- input('username') }}
+{% endblock %}
+
+{% block bar %}
+    {{- input('username') }}
+{% endblock %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--TEMPLATE(macros)--
+{% macro input(name) %}
+    <input name="{{ name }}" value="local">
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+<input name="username" value="local">
+
+
+<input name="username">
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_macro_in_a_macro.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_macro_in_a_macro.test
new file mode 100644
index 00000000..168c9b3a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_macro_in_a_macro.test
@@ -0,0 +1,18 @@
+--TEST--
+"from" tag with syntax error
+--TEMPLATE--
+{% from _self import another, foo %}
+
+{{ foo() }}
+
+{% macro foo() %}
+    {{ another() }}
+{% endmacro %}
+
+{% macro another() %}
+    OK
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_macros_in_parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_macros_in_parent.test
new file mode 100644
index 00000000..57cff7ab
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_macros_in_parent.test
@@ -0,0 +1,16 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% from "macros" import hello %}
+
+{{ hello() }}
+--TEMPLATE(macros)--
+{% extends "parent" %}
+--TEMPLATE(parent)--
+{% macro hello() %}
+    Test
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+Test
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_nested_blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_nested_blocks.test
new file mode 100644
index 00000000..8ede5db5
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_nested_blocks.test
@@ -0,0 +1,18 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% block foo %}
+    {%- from _self import input as linput %}
+
+    {% block bar %}
+        {{- linput('username') }}
+    {% endblock %}
+{% endblock %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Unknown "linput" function in "index.twig" at line 6.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_nested_blocks_with_global_macro.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_nested_blocks_with_global_macro.test
new file mode 100644
index 00000000..384b02d8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_nested_blocks_with_global_macro.test
@@ -0,0 +1,18 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{%- from _self import input %}
+
+{% block foo %}
+    {% block bar %}
+        {{- input('username') }}
+    {% endblock %}
+{% endblock %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+<input name="username">
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_recursive.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_recursive.test
new file mode 100644
index 00000000..09a29839
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_recursive.test
@@ -0,0 +1,27 @@
+--TEST--
+"import" tag
+--TEMPLATE--
+{% from _self import recursive_macro %}
+
+{{ recursive_macro(10) }}
+
+{% macro recursive_macro(n) %}
+    {% if n > 0 %}
+        {{- recursive_macro(n - 1) -}}
+    {% endif %}
+    {{- n }}
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+0
+1
+2
+3
+4
+5
+6
+7
+8
+9
+10
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_self_parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_self_parent.test
new file mode 100644
index 00000000..2a198711
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_self_parent.test
@@ -0,0 +1,20 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% extends "parent" %}
+
+{% block test %}
+    {{ _self.hello() }}
+{% endblock test %}
+--TEMPLATE(parent)--
+{% block test %}
+Hello
+{% endblock test %}
+
+{% macro hello() %}
+    Test
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+Test
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_syntax_error.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_syntax_error.test
new file mode 100644
index 00000000..6223cfe9
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_syntax_error.test
@@ -0,0 +1,8 @@
+--TEST--
+"from" tag with syntax error
+--TEMPLATE--
+{% from 'forms.twig' %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Unexpected token "end of statement block" ("name" expected with value "import") in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_with_reserved_name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_with_reserved_name.test
deleted file mode 100644
index 2de9765f..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/from_with_reserved_name.test
+++ /dev/null
@@ -1,9 +0,0 @@
---TEST--
-"from" tag with reserved name
---TEMPLATE--
-{% from 'forms.twig' import templateName %}
---TEMPLATE(forms.twig)--
---DATA--
-return array()
---EXCEPTION--
-Twig_Error_Syntax: "templateName" cannot be an imported macro as it is a reserved keyword in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test
index 6b371768..832740ea 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/global.test
@@ -8,7 +8,7 @@
 --TEMPLATE(forms.twig)--
 {% macro foo(name) %}{{ name|default('foo') }}{{ global }}{% endmacro %}
 --DATA--
-return array()
+return []
 --EXPECT--
 fooglobal
 fooglobal
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_and_blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_and_blocks.test
new file mode 100644
index 00000000..721f5506
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_and_blocks.test
@@ -0,0 +1,36 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% import _self as macros %}
+{% from _self import input %}
+
+{% block foo %}
+    {{- macros.input('username') }}
+    {{- input('username') }}
+
+    {%- import _self as lmacros %}
+    {%- from _self import input as linput %}
+
+    {{- lmacros.input('username') }}
+    {{- linput('username') }}
+{% endblock %}
+
+{% block bar %}
+    {{- macros.input('username') }}
+    {{- input('username') }}
+{% endblock %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+<input name="username">
+<input name="username">
+<input name="username">
+<input name="username">
+
+
+<input name="username">
+<input name="username">
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_embed_with_global_macro.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_embed_with_global_macro.test
new file mode 100644
index 00000000..3609881f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_embed_with_global_macro.test
@@ -0,0 +1,21 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% import _self as macros %}
+
+{% embed 'embed' %}
+    {% block foo %}
+        {{ macros.input("username") }}
+    {% endblock %}
+{% endembed %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--TEMPLATE(embed)--
+    {% block foo %}
+    {% endblock %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\RuntimeError: Variable "macros" does not exist in "index.twig" at line 6.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_from_string_template.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_from_string_template.test
new file mode 100644
index 00000000..6c1817be
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_from_string_template.test
@@ -0,0 +1,10 @@
+--TEST--
+"import" tag with a template as string
+--TEMPLATE--
+{% import template_from_string("{% macro test() %}ok{% endmacro %}") as m %}
+{{ m.test() }}
+--TEMPLATE(forms.twig)--
+--DATA--
+return []
+--EXPECT--
+ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_in_block_is_local.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_in_block_is_local.test
new file mode 100644
index 00000000..9443e122
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_in_block_is_local.test
@@ -0,0 +1,18 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% block foo %}
+    {%- import _self as lmacros %}
+{% endblock %}
+
+{% block bar %}
+    {{- lmacros.input('username') }}
+{% endblock %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\RuntimeError: Variable "lmacros" does not exist in "index.twig" at line 7.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_local_override.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_local_override.test
new file mode 100644
index 00000000..7cf0552f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_local_override.test
@@ -0,0 +1,28 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{%- import _self as macros %}
+
+{% block foo %}
+    {%- import "macros" as macros %}
+    {{- macros.input('username') }}
+{% endblock %}
+
+{% block bar %}
+    {{- macros.input('username') }}
+{% endblock %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--TEMPLATE(macros)--
+{% macro input(name) %}
+    <input name="{{ name }}" value="local">
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+<input name="username" value="local">
+
+
+<input name="username">
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_macro_in_a_macro.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_macro_in_a_macro.test
new file mode 100644
index 00000000..1851f097
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_macro_in_a_macro.test
@@ -0,0 +1,18 @@
+--TEST--
+"import" tag with syntax error
+--TEMPLATE--
+{% import _self as foo %}
+
+{{ foo.foo() }}
+
+{% macro foo() %}
+    {{ foo.another() }}
+{% endmacro %}
+
+{% macro another() %}
+    OK
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_macros_in_parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_macros_in_parent.test
new file mode 100644
index 00000000..d8d5d163
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_macros_in_parent.test
@@ -0,0 +1,16 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% import "macros" as m %}
+
+{{ m.hello() }}
+--TEMPLATE(macros)--
+{% extends "parent" %}
+--TEMPLATE(parent)--
+{% macro hello() %}
+    Test
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+Test
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_nested_blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_nested_blocks.test
new file mode 100644
index 00000000..821f64bf
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_nested_blocks.test
@@ -0,0 +1,18 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% block foo %}
+    {%- import _self as lmacros %}
+
+    {% block bar %}
+        {{- lmacros.input('username') }}
+    {% endblock %}
+{% endblock %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\RuntimeError: Variable "lmacros" does not exist in "index.twig" at line 6.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_nested_blocks_with_global_macro.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_nested_blocks_with_global_macro.test
new file mode 100644
index 00000000..697d665f
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_nested_blocks_with_global_macro.test
@@ -0,0 +1,18 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{%- import _self as macros %}
+
+{% block foo %}
+    {% block bar %}
+        {{- macros.input('username') }}
+    {% endblock %}
+{% endblock %}
+
+{% macro input(name) -%}
+    <input name="{{ name }}">
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+<input name="username">
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_same_parent_and_child.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_same_parent_and_child.test
new file mode 100644
index 00000000..8d9b3caa
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_same_parent_and_child.test
@@ -0,0 +1,30 @@
+--TEST--
+"import" tag
+--TEMPLATE--
+{% extends "parent" %}
+
+{% macro anotherThing() -%}
+    Do it too
+{% endmacro %}
+
+{% import _self as macros %}
+{% block content %}
+    {{ parent() }}
+    {{ macros.anotherThing() }}
+{% endblock %}
+--TEMPLATE(parent)--
+{% macro thing() %}
+    Do it
+{% endmacro %}
+
+{% import _self as macros %}
+{% block content %}
+    {{ macros.thing() }}
+{% endblock %}
+--DATA--
+return []
+--EXPECT--
+Do it
+
+
+    Do it too
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_self_parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_self_parent.test
new file mode 100644
index 00000000..24a8cdb5
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_self_parent.test
@@ -0,0 +1,23 @@
+--TEST--
+"macro" tag
+--TEMPLATE--
+{% extends "parent" %}
+{% import _self as me %}
+
+{% block test %}
+    {{ me.hello() }}
+{% endblock test %}
+--TEMPLATE(parent)--
+{% import _self as me %}
+
+{% block test %}
+Hello
+{% endblock test %}
+
+{% macro hello() %}
+    Test
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+Test
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_syntax_error.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_syntax_error.test
new file mode 100644
index 00000000..b9817f0e
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_syntax_error.test
@@ -0,0 +1,10 @@
+--TEST--
+"import" tag with reserved name
+--TEMPLATE--
+{% import 'forms.twig' %}
+
+{{ macros.parent() }}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: Unexpected token "end of statement block" ("name" expected with value "as") in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_with_reserved_nam.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_with_reserved_nam.test
deleted file mode 100644
index 7bd93c62..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/import_with_reserved_nam.test
+++ /dev/null
@@ -1,11 +0,0 @@
---TEST--
-"from" tag with reserved name
---TEMPLATE--
-{% import 'forms.twig' as macros %}
-
-{{ macros.parent() }}
---TEMPLATE(forms.twig)--
---DATA--
-return array()
---EXCEPTION--
-Twig_Error_Syntax: "parent" cannot be called as macro as it is a reserved keyword in "index.twig" at line 4.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/reserved_name.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/reserved_name.test
deleted file mode 100644
index f7c102f0..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/reserved_name.test
+++ /dev/null
@@ -1,10 +0,0 @@
---TEST--
-"macro" tag with reserved name
---TEMPLATE--
-{% macro parent(arg1, arg2) %}
-    parent
-{% endmacro %}
---DATA--
-return array()
---EXCEPTION--
-Twig_Error_Syntax: "parent" cannot be used as a macro name as it is a reserved keyword in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test
index 17756cb6..ca3157dd 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/self_import.test
@@ -10,7 +10,7 @@
   <input type="{{ type|default("text") }}" name="{{ name }}" value="{{ value|e|default('') }}" size="{{ size|default(20) }}">
 {% endmacro %}
 --DATA--
-return array()
+return []
 --EXPECT--
   <input type="text" name="username" value="" size="20">
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test
index 37217707..491e91e8 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/special_chars.test
@@ -9,6 +9,6 @@
   §{{ foo }}§
 {% endmacro %}
 --DATA--
-return array()
+return []
 --EXPECT--
 §foo§
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/super_globals.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/super_globals.test
index 56794628..643697ce 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/super_globals.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/macro/super_globals.test
@@ -9,6 +9,6 @@ Super globals as macro arguments
     {{ GET }}
 {% endmacro %}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.legacy.test
deleted file mode 100644
index 0445e853..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/basic.legacy.test
+++ /dev/null
@@ -1,10 +0,0 @@
---TEST--
-"raw" tag
---TEMPLATE--
-{% raw %}
-{{ foo }}
-{% endraw %}
---DATA--
-return array()
---EXPECT--
-{{ foo }}
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.legacy.test
deleted file mode 100644
index 99deefc3..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/mixed_usage_with_raw.legacy.test
+++ /dev/null
@@ -1,10 +0,0 @@
---TEST--
-"raw" tag
---TEMPLATE--
-{% raw %}
-{{ foo }}
-{% endverbatim %}
---DATA--
-return array()
---EXCEPTION--
-Twig_Error_Syntax: Unexpected end of file: Unclosed "raw" block in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.legacy.test
deleted file mode 100644
index 352bb187..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/raw/whitespace_control.legacy.test
+++ /dev/null
@@ -1,56 +0,0 @@
---TEST--
-"raw" tag
---TEMPLATE--
-1***
-
-{%- raw %}
-    {{ 'bla' }}
-{% endraw %}
-
-1***
-2***
-
-{%- raw -%}
-    {{ 'bla' }}
-{% endraw %}
-
-2***
-3***
-
-{%- raw -%}
-    {{ 'bla' }}
-{% endraw -%}
-
-3***
-4***
-
-{%- raw -%}
-    {{ 'bla' }}
-{%- endraw %}
-
-4***
-5***
-
-{%- raw -%}
-    {{ 'bla' }}
-{%- endraw -%}
-
-5***
---DATA--
-return array()
---EXPECT--
-1***
-    {{ 'bla' }}
-
-
-1***
-2***{{ 'bla' }}
-
-
-2***
-3***{{ 'bla' }}
-3***
-4***{{ 'bla' }}
-
-4***
-5***{{ 'bla' }}5***
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/array.test
new file mode 100644
index 00000000..b432427e
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/array.test
@@ -0,0 +1,16 @@
+--TEST--
+sandbox tag
+--TEMPLATE--
+{%- sandbox %}
+    {%- include "foo.twig" %}
+{%- endsandbox %}
+--TEMPLATE(foo.twig)--
+{{ [a][0] }}
+{{ dump([a][0]) }}
+--DATA--
+return ['a' => 'b']
+--CONFIG--
+return ['autoescape' => false, 'debug' => true]
+--EXPECT--
+b
+string(1) "b"
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test
index dfddc151..e26a78bc 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid1.test
@@ -8,4 +8,4 @@ sandbox tag
 --TEMPLATE(foo.twig)--
 foo
 --EXCEPTION--
-Twig_Error_Syntax: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 4.
+Twig\Error\SyntaxError: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 4.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test
index a33a13ee..bb2a3297 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/not_valid2.test
@@ -11,4 +11,4 @@ sandbox tag
 --TEMPLATE(foo.twig)--
 foo
 --EXCEPTION--
-Twig_Error_Syntax: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 5.
+Twig\Error\SyntaxError: Only "include" tags are allowed within a "sandbox" section in "index.twig" at line 5.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test
index de20f3db..4d232d8b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/sandbox/simple.test
@@ -14,7 +14,7 @@ sandbox tag
 --TEMPLATE(foo.twig)--
 foo
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test
index a5a9f830..aae1427e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/basic.test
@@ -11,7 +11,7 @@
 
 {{ foo }}{{ bar }}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
 foo&lt;br /&gt;
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test
index ec657f00..97fc43cc 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture-empty.test
@@ -5,5 +5,5 @@
 
 {% if foo %}FAIL{% endif %}
 --DATA--
-return array()
+return []
 --EXPECT--
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test
index f156a1a7..c3faf250 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture.test
@@ -5,6 +5,6 @@
 
 {{ foo }}
 --DATA--
-return array()
+return []
 --EXPECT--
 f<br />o<br />o
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture_scope.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture_scope.test
new file mode 100644
index 00000000..bb2bbeba
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/capture_scope.test
@@ -0,0 +1,10 @@
+--TEST--
+"set" tag block capture
+--TEMPLATE--
+{% set foo %}{{ foo }}{% endset %}
+
+{{ foo }}
+--DATA--
+return ['foo' => 'foo']
+--EXPECT--
+foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test
index 8ff434a0..bd472771 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/expression.test
@@ -6,7 +6,7 @@
 {{ foo }}
 {{ bar }}
 --DATA--
-return array()
+return []
 --EXPECT--
 foobar
 barfoo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/inheritance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/inheritance.test
new file mode 100644
index 00000000..79e89ce7
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/inheritance.test
@@ -0,0 +1,24 @@
+--TEST--
+"set" tag with inheritance
+--TEMPLATE--
+{% extends "layout.twig" %}
+
+{% set bar %}bar{% endset %}
+
+{% block var_from_child %}
+    {{- bar -}}
+{% endblock %}
+--TEMPLATE(layout.twig)--
+{% set foo %}foo{% endset %}
+
+{% block var_from_layout %}
+    {{- foo -}}
+{% endblock %}
+
+{% block var_from_child %}
+{% endblock %}
+--DATA--
+return []
+--EXPECT--
+foo
+bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/inheritance_overriding.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/inheritance_overriding.test
new file mode 100644
index 00000000..2d23c83a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/inheritance_overriding.test
@@ -0,0 +1,24 @@
+--TEST--
+"set" tag with inheritance
+--TEMPLATE--
+{% extends "layout.twig" %}
+
+{% set foo %}bar{% endset %}
+
+{% block var_from_child %}
+    {{- foo -}}
+{% endblock %}
+--TEMPLATE(layout.twig)--
+{% set foo %}foo{% endset %}
+
+{% block var_from_layout %}
+    {{- foo -}}
+{% endblock %}
+
+{% block var_from_child %}
+{% endblock %}
+--DATA--
+return []
+--EXPECT--
+foo
+foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/mutating.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/mutating.test
new file mode 100644
index 00000000..ae388bb8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/set/mutating.test
@@ -0,0 +1,17 @@
+--TEST--
+"set" tag
+--TEMPLATE--
+{% set foo = "foo" %}
+
+{% set bar %}
+    {%- set foo = "bar" -%}
+    bar
+{% endset %}
+
+{{ foo }}
+{{ bar }}
+--DATA--
+return []
+--EXPECT--
+bar
+bar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/root_level_in_child.legacy.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/root_level_in_child.legacy.test
new file mode 100644
index 00000000..9ed406e6
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/root_level_in_child.legacy.test
@@ -0,0 +1,23 @@
+--TEST--
+"spaceless" tag in the root level of a child template
+--DEPRECATION--
+The spaceless tag in "index.twig" at line 3 is deprecated since Twig 2.7, use the spaceless filter instead.
+Using the spaceless tag at the root level of a child template in "index.twig" at line 3 is deprecated since Twig 2.5.0 and will become a syntax error in 3.0.
+Nesting a block definition under a non-capturing node in "index.twig" at line 4 is deprecated since Twig 2.5.0 and will become a syntax error in 3.0.
+--TEMPLATE--
+{% extends "layout.twig" %}
+{% spaceless %}
+    {% block content %}
+        <h1>
+            <b>Title</b>
+        </h1>
+    {% endblock %}
+{% endspaceless %}
+--TEMPLATE(layout.twig)--
+{% block content %}FOO{% endblock %}
+--DATA--
+return array()
+--EXPECT--
+        <h1>
+            <b>Title</b>
+        </h1>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test
index dd06dec2..8dbe660e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/spaceless/simple.test
@@ -1,5 +1,7 @@
 --TEST--
 "spaceless" tag removes whites between HTML tags
+--DEPRECATION--
+The spaceless tag in "index.twig" at line 2 is deprecated since Twig 2.7, use the spaceless filter instead.
 --TEMPLATE--
 {% spaceless %}
 
@@ -7,6 +9,6 @@
 
 {% endspaceless %}
 --DATA--
-return array()
+return []
 --EXPECT--
 <div><div>   foo   </div></div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test
index 789b4ba8..64ffd1d7 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/special_chars.test
@@ -3,6 +3,6 @@
 --TEMPLATE--
 {% § %}
 --DATA--
-return array()
+return []
 --EXPECT--
 §
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test
index f887006f..b6b1d5c6 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/aliases.test
@@ -7,6 +7,6 @@
 --TEMPLATE(blocks.twig)--
 {% block content 'foo' %}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test
index 7364d76d..be622a10 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/basic.test
@@ -7,6 +7,6 @@
 --TEMPLATE(blocks.twig)--
 {% block content 'foo' %}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test
index b551a1e6..771ba642 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep.test
@@ -15,7 +15,7 @@
 {% block content 'bar' %}
 {% block bar 'bar' %}
 --DATA--
-return array()
+return []
 --EXPECT--
 foo
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test
index 05cca682..f14ce83d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/deep_empty.test
@@ -6,5 +6,5 @@
 {% use "bar.twig" %}
 --TEMPLATE(bar.twig)--
 --DATA--
-return array()
+return []
 --EXPECT--
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance.test
index 0d0d470e..1edeaa11 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance.test
@@ -19,7 +19,7 @@
     <div class="sub_container">sub_container</div>
 {% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 <div class="container">    <div class="overridden_sub_container">overridden sub_container</div>
 </div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance2.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance2.test
index df95599c..accec509 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance2.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/inheritance2.test
@@ -18,7 +18,7 @@
     <div class="sub_container">sub_container</div>
 {% endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 <div class="container">    <div class="overridden_sub_container">overridden sub_container</div>
 </div>
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test
index 198be0c5..85a63958 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple.test
@@ -14,7 +14,7 @@
 {% block content 'bar' %}
 {% block bar 'bar' %}
 --DATA--
-return array()
+return []
 --EXPECT--
 bar
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test
index 8de871a8..413bdfa4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/multiple_aliases.test
@@ -15,7 +15,7 @@
 {% block content 'bar' %}
 {% block bar 'bar' %}
 --DATA--
-return array()
+return []
 --EXPECT--
 bar
 foo
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test
index 59db23d9..49328f6e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block.test
@@ -17,7 +17,7 @@
     Content of block
 {% endblock foobar %}
 --DATA--
-return array()
+return []
 --EXPECT--
 Content of block
 Content of block (first override)
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test
index d3f302df..274baa82 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block2.test
@@ -17,7 +17,7 @@
     Content of block
 {% endblock foobar %}
 --DATA--
-return array()
+return []
 --EXPECT--
 Content of block
 Content of block (first override)
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test
index 95b55a46..f6f22127 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/parent_block3.test
@@ -29,7 +29,7 @@
     Content of bar
 {% endblock bar %}
 --DATA--
-return array()
+return []
 --EXPECT--
 Content of foo
 Content of foo (first override)
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/use_with_parent.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/use_with_parent.test
index 3fe2ad83..fad9a2d1 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/use_with_parent.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/use/use_with_parent.test
@@ -17,7 +17,7 @@
 --TEMPLATE(blocks.twig)--
 {% block content 'BLOCK' %}
 --DATA--
-return array()
+return []
 --EXPECT--
 PARENT
 CHILD
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test
index a95be557..9b60abc4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/basic.test
@@ -5,6 +5,6 @@
 {{ foo }}
 {% endverbatim %}
 --DATA--
-return array()
+return []
 --EXPECT--
 {{ foo }}
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test
deleted file mode 100644
index 28626a81..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/mixed_usage_with_raw.test
+++ /dev/null
@@ -1,10 +0,0 @@
---TEST--
-"verbatim" tag
---TEMPLATE--
-{% verbatim %}
-{{ foo }}
-{% endraw %}
---DATA--
-return array()
---EXCEPTION--
-Twig_Error_Syntax: Unexpected end of file: Unclosed "verbatim" block in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test
index eb610444..501922bd 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/verbatim/whitespace_control.test
@@ -37,7 +37,7 @@
 
 5***
 --DATA--
-return array()
+return []
 --EXPECT--
 1***
     {{ 'bla' }}
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/basic.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/basic.test
index 264ca5e7..7c2abd0f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/basic.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/basic.test
@@ -7,7 +7,7 @@
 {% endwith %}
 {{ foo }}{{ bar }}
 --DATA--
-return array('foo' => 'foo', 'bar' => 'bar')
+return ['foo' => 'foo', 'bar' => 'bar']
 --EXPECT--
 fooBAZ
 foobar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/expression.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/expression.test
index 32ed0916..e4433d44 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/expression.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/expression.test
@@ -5,6 +5,6 @@
     {{ foo }}{{ bar }}
 {% endwith %}
 --DATA--
-return array('foo' => 'baz')
+return ['foo' => 'baz']
 --EXPECT--
 fooBAZ
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/globals.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/globals.test
new file mode 100644
index 00000000..b030e7ef
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/globals.test
@@ -0,0 +1,10 @@
+--TEST--
+"with" tag
+--TEMPLATE--
+{% with [] only %}
+    {{ global }}
+{% endwith %}
+--DATA--
+return []
+--EXPECT--
+global
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/iterable.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/iterable.test
new file mode 100644
index 00000000..1b0cbc63
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/iterable.test
@@ -0,0 +1,10 @@
+--TEST--
+"with" tag with an iterable expression
+--TEMPLATE--
+{% with vars %}
+    {{ foo }}{{ bar }}
+{% endwith %}
+--DATA--
+return ['vars' => new ArrayObject(['foo' => 'baz', 'bar' => 'qux'])]
+--EXPECT--
+bazqux
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/nested.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/nested.test
index 98e3aef4..33ca390b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/nested.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/nested.test
@@ -9,7 +9,7 @@ nested "with" tags
 {% endwith %}
 {{ foo }}{{ bar }}
 --DATA--
-return array()
+return []
 --EXPECT--
 FOOBAZ
     foobar
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/with_no_hash.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/with_no_hash.test
index 93689f42..7083050b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/with_no_hash.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/with_no_hash.test
@@ -5,6 +5,6 @@
     {{ foo }}{{ bar }}
 {% endwith %}
 --DATA--
-return array('vars' => 'no-hash')
+return ['vars' => 'no-hash']
 --EXCEPTION--
-Twig_Error_Runtime: Variables passed to the "with" tag must be a hash in "index.twig" at line 2.
+Twig\Error\RuntimeError: Variables passed to the "with" tag must be a hash in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/with_only.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/with_only.test
index 6247617e..1aca34fc 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/with_only.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/with/with_only.test
@@ -5,6 +5,6 @@
     {{ foo }}{{ bar }}{{ baz }}
 {% endwith %}
 --DATA--
-return array('foo' => 'baz', 'baz' => 'baz')
+return ['foo' => 'baz', 'baz' => 'baz']
 --EXCEPTION--
-Twig_Error_Runtime: Variable "baz" does not exist in "index.twig" at line 3.
+Twig\Error\RuntimeError: Variable "baz" does not exist in "index.twig" at line 3.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test
index 1429d375..7c9a6c80 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/array.test
@@ -5,15 +5,15 @@ array index test
 {{ key }}
 {% endfor %}
 --DATA--
-return array('days' => array(
-    1  => array('money' => 9),
-    2  => array('money' => 21),
-    3  => array('money' => 38),
-    4  => array('money' => 6),
-    18 => array('money' => 6),
-    19 => array('money' => 3),
-    31 => array('money' => 11),
-));
+return ['days' => [
+    1  => ['money' => 9],
+    2  => ['money' => 21],
+    3  => ['money' => 38],
+    4  => ['money' => 6],
+    18 => ['money' => 6],
+    19 => ['money' => 3],
+    31 => ['money' => 11],
+]]
 --EXPECT--
 1
 2
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test
index 60218ac0..0fa4b370 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/constant.test
@@ -6,7 +6,7 @@
 {{ value is constant('TwigTestFoo::BAR_NAME') ? 'ok' : 'no' }}
 {{ 2 is constant('ARRAY_AS_PROPS', object) ? 'ok' : 'no' }}
 --DATA--
-return array('value' => 'bar', 'object' => new ArrayObject(array('hi')));
+return ['value' => 'bar', 'object' => new \ArrayObject(['hi'])]
 --EXPECT--
 ok
 ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test
index d4e204ef..879c651e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined.test
@@ -34,18 +34,18 @@
 {{ [1, 2]                         is     defined ? 'ok' : 'ko' }}
 {{ { foo: "bar" }                 is     defined ? 'ok' : 'ko' }}
 --DATA--
-return array(
+return [
     'definedVar' => 'defined',
     'zeroVar'    => 0,
     'nullVar'    => null,
-    'nested'      => array(
+    'nested'      => [
         'definedVar'   => 'defined',
         'zeroVar'      => 0,
         'nullVar'      => null,
-        'definedArray' => array(0),
-    ),
+        'definedArray' => [0],
+    ],
     'object' => new TwigTestFoo(),
-);
+]
 --EXPECT--
 ok
 ok
@@ -80,20 +80,20 @@ ok
 ok
 ok
 --DATA--
-return array(
+return [
     'definedVar' => 'defined',
     'zeroVar'    => 0,
     'nullVar'    => null,
-    'nested'      => array(
+    'nested'      => [
         'definedVar'   => 'defined',
         'zeroVar'      => 0,
         'nullVar'      => null,
-        'definedArray' => array(0),
-    ),
+        'definedArray' => [0],
+    ],
     'object' => new TwigTestFoo(),
-);
+]
 --CONFIG--
-return array('strict_variables' => false)
+return ['strict_variables' => false]
 --EXPECT--
 ok
 ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_attribute.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_attribute.test
index 4a5b8dcd..5fd2fe3f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_attribute.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_attribute.test
@@ -6,28 +6,28 @@
 {{ attribute(nested, definedVarName)   is     defined ? 'ok' : 'ko' }}
 {{ attribute(nested, undefinedVarName) is not defined ? 'ok' : 'ko' }}
 --DATA--
-return array(
-    'nested' => array(
+return [
+    'nested' => [
         'definedVar' => 'defined',
-    ),
+    ],
     'definedVarName' => 'definedVar',
     'undefinedVarName' => 'undefinedVar',
-);
+]
 --EXPECT--
 ok
 ok
 ok
 ok
 --DATA--
-return array(
-    'nested' => array(
+return [
+    'nested' => [
         'definedVar' => 'defined',
-    ),
+    ],
     'definedVarName' => 'definedVar',
     'undefinedVarName' => 'undefinedVar',
-);
+]
 --CONFIG--
-return array('strict_variables' => false)
+return ['strict_variables' => false]
 --EXPECT--
 ok
 ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks.test
index 64d7d043..c8b90f8c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks.test
@@ -26,7 +26,7 @@
 --TEMPLATE(blocks)--
 {% block block1 %}{%endblock %}
 --DATA--
-return array()
+return []
 --EXPECT--
 ok
     ko
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks_with_template.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks_with_template.test
index 2c651657..68540de7 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks_with_template.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_blocks_with_template.test
@@ -7,10 +7,10 @@
 --TEMPLATE(included.twig)--
 {% block foo %}FOO{% endblock %}
 --DATA--
-return array(
+return [
     'included_loaded' => $twig->load('included.twig'),
-    'included_loaded_internal' => $twig->loadTemplate('included.twig'),
-)
+    'included_loaded_internal' => $twig->load('included.twig'),
+]
 --EXPECT--
 ok
 ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_constants.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_constants.test
index 2fa9929d..62172e4f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_constants.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_constants.test
@@ -6,7 +6,7 @@
 {{ constant('FOOBAR') is not defined ? 'ok' : 'ko' }}
 {{ constant('FOOBAR', object) is not defined ? 'ok' : 'ko' }}
 --DATA--
-return array('expect' => DATE_W3C, 'object' => new ArrayObject(array('hi')));
+return ['expect' => DATE_W3C, 'object' => new \ArrayObject(['hi'])]
 --EXPECT--
 ok
 ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_macros.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_macros.test
new file mode 100644
index 00000000..1aa45fc8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_for_macros.test
@@ -0,0 +1,41 @@
+--TEST--
+"defined" support for macros
+--TEMPLATE--
+{% import _self as macros %}
+{% from _self import hello, bar %}
+
+{% if macros.hello is defined -%}
+    OK
+{% endif %}
+
+{% if macros.foo is not defined -%}
+    OK
+{% endif %}
+
+{% if hello is defined -%}
+    OK
+{% endif %}
+
+{% if bar is not defined -%}
+    OK
+{% endif %}
+
+{% if foo is not defined -%}
+    OK
+{% endif %}
+
+{% macro hello(name) %}
+    Hello {{ name }}
+{% endmacro %}
+--DATA--
+return []
+--EXPECT--
+OK
+
+OK
+
+OK
+
+OK
+
+OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_on_complex_expr.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_on_complex_expr.test
new file mode 100644
index 00000000..2d061583
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/defined_on_complex_expr.test
@@ -0,0 +1,8 @@
+--TEST--
+"defined" support for "complex" expressions
+--TEMPLATE--
+{{ (1 + 2) is defined ? 'ok' : 'ko' }}
+--DATA--
+return []
+--EXCEPTION--
+Twig\Error\SyntaxError: The "defined" test only works with simple variables in "index.twig" at line 2.
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/dynamic_test.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/dynamic_test.test
new file mode 100644
index 00000000..41625f6a
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/dynamic_test.test
@@ -0,0 +1,14 @@
+--TEST--
+dynamic test
+--TEMPLATE--
+{{ 'bar' is test_bar ? '1' :'0' }}
+{{ 'foo' is test_foo ? '1' :'0' }}
+{{ 'bar' is test_foo ? '1' :'0' }}
+{{ 'foo' is test_bar ? '1' :'0' }}
+--DATA--
+return []
+--EXPECT--
+1
+1
+0
+0
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test
index 807c0ed4..3e7fcf01 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/empty.test
@@ -16,15 +16,15 @@
 {{ markup_empty is empty ? 'ok' : 'ko' }}
 {{ markup_not_empty is empty ? 'ko' : 'ok' }}
 --DATA--
-return array(
+return [
     'string_empty' => '', 'string_zero' => '0',
     'value_null' => null, 'value_false' => false, 'value_int_zero' => 0,
-    'array_empty' => array(), 'array_not_empty' => array(1, 2),
+    'array_empty' => [], 'array_not_empty' => [1, 2],
     'magically_callable' => new MagicCallStub(),
-    'countable_empty' => new CountableStub(array()), 'countable_not_empty' => new CountableStub(array(1, 2)),
+    'countable_empty' => new CountableStub([]), 'countable_not_empty' => new CountableStub([1, 2]),
     'tostring_empty' => new ToStringStub(''), 'tostring_not_empty' => new ToStringStub('0' /* edge case of using "0" as the string */),
-    'markup_empty' => new Twig_Markup('', 'UTF-8'), 'markup_not_empty' => new Twig_Markup('test', 'UTF-8'),
-);
+    'markup_empty' => new \Twig\Markup('', 'UTF-8'), 'markup_not_empty' => new \Twig\Markup('test', 'UTF-8'),
+]
 --EXPECT--
 ok
 ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test
index 695b4c2f..5c73b01e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/even.test
@@ -6,7 +6,7 @@
 {{ 1 is not even ? 'ok' : 'ko' }}
 {{ 2 is not even ? 'ko' : 'ok' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 ok
 ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test
index 545f51f8..f84465ee 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in.test
@@ -1,128 +1,118 @@
 --TEST--
 Twig supports the in operator
 --TEMPLATE--
-{% if bar in foo %}
-TRUE
-{% endif %}
-{% if not (bar in foo) %}
-{% else %}
-TRUE
-{% endif %}
-{% if bar not in foo %}
-{% else %}
-TRUE
-{% endif %}
-{% if 'a' in bar %}
-TRUE
-{% endif %}
-{% if 'c' not in bar %}
-TRUE
-{% endif %}
-{% if '' in bar %}
-TRUE
-{% endif %}
-{% if '' in '' %}
-TRUE
-{% endif %}
-{% if '0' not in '' %}
-TRUE
-{% endif %}
-{% if 'a' not in '0' %}
-TRUE
-{% endif %}
-{% if '0' in '0' %}
-TRUE
-{% endif %}
-
-{{ false in [0, 1] ? 'TRUE' : 'FALSE' }}
-{{ true in [0, 1] ? 'TRUE' : 'FALSE' }}
-{{ '0' in [0, 1] ? 'TRUE' : 'FALSE' }}
-{{ '' in [0, 1] ? 'TRUE' : 'FALSE' }}
-{{ 0 in ['', 1] ? 'TRUE' : 'FALSE' }}
-
-{{ '' in 'foo' ? 'TRUE' : 'FALSE' }}
-{{ 0 in 'foo' ? 'TRUE' : 'FALSE' }}
-{{ false in 'foo' ? 'TRUE' : 'FALSE' }}
-{{ false in '100' ? 'TRUE' : 'FALSE' }}
-{{ true in '100' ? 'TRUE' : 'FALSE' }}
-
-{{ [] in [true, false] ? 'TRUE' : 'FALSE' }}
-{{ [] in [true, ''] ? 'TRUE' : 'FALSE' }}
-{{ [] in [true, []] ? 'TRUE' : 'FALSE' }}
-
-{{ resource ? 'TRUE' : 'FALSE' }}
-{{ resource in 'foo'~resource ? 'TRUE' : 'FALSE' }}
-{{ object in 'stdClass' ? 'TRUE' : 'FALSE' }}
-{{ [] in 'Array' ? 'TRUE' : 'FALSE' }}
-{{ dir_object in 'foo'~dir_object ? 'TRUE' : 'FALSE' }}
-
-{{ ''~resource in resource ? 'TRUE' : 'FALSE' }}
-{{ 'stdClass' in object ? 'TRUE' : 'FALSE' }}
-{{ 'Array' in [] ? 'TRUE' : 'FALSE' }}
-{{ ''~dir_object in dir_object ? 'TRUE' : 'FALSE' }}
-
-{{ resource in [''~resource] ? 'TRUE' : 'FALSE' }}
-{{ resource in [resource + 1 - 1] ? 'TRUE' : 'FALSE' }}
-{{ dir_object in [''~dir_object] ? 'TRUE' : 'FALSE' }}
-
-{{ 5 in 125 ? 'TRUE' : 'FALSE' }}
-{{ 5 in '125' ? 'TRUE' : 'FALSE' }}
-{{ '5' in 125 ? 'TRUE' : 'FALSE' }}
-{{ '5' in '125' ? 'TRUE' : 'FALSE' }}
-
-{{ 5.5 in 125.5 ? 'TRUE' : 'FALSE' }}
-{{ 5.5 in '125.5' ? 'TRUE' : 'FALSE' }}
-{{ '5.5' in 125.5 ? 'TRUE' : 'FALSE' }}
+{{ bar in foo ? 'OK' : 'KO' }}
+{{ not (bar in foo) ? 'KO' : 'OK' }}
+{{ bar not in foo ? 'KO' : 'OK' }}
+{{ 'a' in bar ? 'OK' : 'KO' }}
+{{ 'c' not in bar ? 'OK' : 'KO' }}
+{{ '' in bar ? 'OK' : 'KO' }}
+{{ '' in '' ? 'OK' : 'KO' }}
+{{ '0' not in '' ? 'OK' : 'KO' }}
+{{ 'a' not in '0' ? 'OK' : 'KO' }}
+{{ '0' in '0' ? 'OK' : 'KO' }}
+
+{{ false in [0, 1] ? 'OK' : 'KO' }}
+{{ true in [0, 1] ? 'OK' : 'KO' }}
+{{ '0' in [0, 1] ? 'OK' : 'KO' }}
+{{ '0' in [1, 0] ? 'OK' : 'KO' }}
+{{ '' in [0, 1] ? 'OK' : 'KO' }}
+{{ '' in [1, 0] ? 'OK' : 'KO' }}
+{{ 0 in ['', 1] ? 'OK' : 'KO' }}
+{{ 0 in [1, ''] ? 'OK' : 'KO' }}
+
+{{ '' in 'foo' ? 'OK' : 'KO' }}
+{{ 0 in 'foo' ? 'KO' : 'OK' }}
+{{ false in 'foo' ? 'KO' : 'OK' }}
+{{ false in '100' ? 'KO' : 'OK' }}
+{{ true in '100' ? 'KO' : 'OK' }}
+
+{{ [] in [true, false] ? 'OK' : 'KO' }}
+{{ [] in [true, ''] ? 'KO' : 'OK' }}
+{{ [] in [true, []] ? 'OK' : 'KO' }}
+
+{{ resource ? 'OK' : 'KO' }}
+{{ resource in 'foo'~resource ? 'KO' : 'OK' }}
+{{ object in 'stdClass' ? 'KO' : 'OK' }}
+{{ [] in 'Array' ? 'KO' : 'OK' }}
+{{ dir_object in 'foo'~dir_object ? 'KO' : 'OK' }}
+
+{{ ''~resource in resource ? 'KO' : 'OK' }}
+{{ 'stdClass' in object ? 'KO' : 'OK' }}
+{{ 'Array' in [] ? 'KO' : 'OK' }}
+{{ ''~dir_object in dir_object ? 'KO' : 'OK' }}
+
+{{ resource in [''~resource] ? 'KO' : 'OK' }}
+{{ resource in [resource + 1 - 1] ? 'KO' : 'OK' }}
+{{ dir_object in [''~dir_object] ? 'KO' : 'OK' }}
+
+{{ 5 in 125 ? 'KO' : 'OK' }}
+{{ 5 in '125' ? 'OK' : 'KO' }}
+{{ '5' in 125 ? 'KO' : 'OK' }}
+{{ '5' in '125' ? 'OK' : 'KO' }}
+
+{{ 5.5 in 125.5 ? 'KO' : 'OK' }}
+{{ 5.5 in '125.5' ? 'OK' : 'KO' }}
+{{ '5.5' in 125.5 ? 'KO' : 'OK' }}
+
+{{ safe in ['foo', 'bar'] ? 'OK' : 'KO' }}
+{{ 'fo' in safe ? 'OK' : 'KO' }}
 --DATA--
-return array('bar' => 'bar', 'foo' => array('bar' => 'bar'), 'dir_object' => new SplFileInfo(dirname(__FILE__)), 'object' => new stdClass(), 'resource' => opendir(dirname(__FILE__)))
+return ['bar' => 'bar', 'foo' => ['bar' => 'bar'], 'dir_object' => new \SplFileInfo(__DIR__), 'object' => new \stdClass(), 'resource' => opendir(__DIR__), 'safe' => new \Twig\Markup('foo', 'UTF-8')]
 --EXPECT--
-TRUE
-TRUE
-TRUE
-TRUE
-TRUE
-TRUE
-TRUE
-TRUE
-TRUE
-TRUE
-
-TRUE
-TRUE
-TRUE
-TRUE
-TRUE
-
-TRUE
-FALSE
-FALSE
-FALSE
-FALSE
-
-TRUE
-FALSE
-TRUE
-
-TRUE
-FALSE
-FALSE
-FALSE
-FALSE
-
-FALSE
-FALSE
-FALSE
-FALSE
-
-FALSE
-FALSE
-FALSE
-
-FALSE
-TRUE
-FALSE
-TRUE
-
-FALSE
-TRUE
-FALSE
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+OK
+
+OK
+OK
+OK
+OK
+OK
+
+OK
+OK
+OK
+
+OK
+OK
+OK
+OK
+OK
+
+OK
+OK
+OK
+OK
+
+OK
+OK
+OK
+
+OK
+OK
+OK
+OK
+
+OK
+OK
+OK
+
+OK
+OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test
index 8e08061b..b53eb067 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/in_with_objects.test
@@ -11,9 +11,9 @@ $foo1 = new TwigTestFoo();
 $foo->position = $foo1;
 $foo1->position = $foo;
 
-return array(
+return [
     'object'      => $foo,
-    'object_list' => array($foo1, $foo),
-);
+    'object_list' => [$foo1, $foo],
+]
 --EXPECT--
 TRUE
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test
index ec525501..75b5756e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/iterable.test
@@ -6,12 +6,12 @@
 {{ obj is iterable ? 'ok' : 'ko' }}
 {{ val is iterable ? 'ok' : 'ko' }}
 --DATA--
-return array(
-    'foo' => array(),
-    'traversable' => new ArrayIterator(array()),
-    'obj' => new stdClass(),
+return [
+    'foo' => [],
+    'traversable' => new \ArrayIterator([]),
+    'obj' => new \stdClass(),
     'val' => 'test',
-);
+]
 --EXPECT--
 ok
 ok
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/null_coalesce.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/null_coalesce.test
index 3d148c89..7af3255d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/null_coalesce.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/null_coalesce.test
@@ -14,7 +14,7 @@ Twig supports the ?? operator
 {{ 1 + nope ?? nada ?? 2 }}
 {{ 1 + nope ?? 3 + nada ?? 2 }}
 --DATA--
-return array('bar' => 'OK', 'foo' => array('bar' => 'OK'))
+return ['bar' => 'OK', 'foo' => ['bar' => 'OK']]
 --EXPECT--
 OK
 OK
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test
index 1b8311e3..ec88bb51 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/tests/odd.test
@@ -4,7 +4,7 @@
 {{ 1 is odd ? 'ok' : 'ko' }}
 {{ 2 is odd ? 'ko' : 'ok' }}
 --DATA--
-return array()
+return []
 --EXPECT--
 ok
 ok
\ No newline at end of file
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_block.test
similarity index 83%
rename from vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test
rename to vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_block.test
index 1d2273f8..346a1107 100644
--- a/vendor/twig/twig/test/Twig/Tests/Fixtures/tags/trim_block.test
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_block.test
@@ -1,9 +1,6 @@
 --TEST--
 Whitespace trimming on tags.
 --TEMPLATE--
-{{ 5 * '{#-'|length }}
-{{ '{{-'|length * 5 + '{%-'|length }}
-
 Trim on control tag:
 {% for i in range(1, 9) -%}
 	{{ i }}
@@ -51,11 +48,8 @@ Combined:
 
 end
 --DATA--
-return array('leading' => 'leading space', 'trailing' => 'trailing space', 'both' => 'both')
+return ['leading' => 'leading space', 'trailing' => 'trailing space', 'both' => 'both']
 --EXPECT--
-15
-18
-
 Trim on control tag:
 123456789
 
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_delimiter_as_strings.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_delimiter_as_strings.test
new file mode 100644
index 00000000..a58818dd
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_delimiter_as_strings.test
@@ -0,0 +1,10 @@
+--TEST--
+Whitespace trimming as strings.
+--TEMPLATE--
+{{ 5 * '{#-'|length }}
+{{ '{{-'|length * 5 + '{%-'|length }}
+--DATA--
+return []
+--EXPECT--
+15
+18
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_left.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_left.test
new file mode 100644
index 00000000..75d0f803
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_left.test
@@ -0,0 +1,32 @@
+--TEST--
+Whitespace trimming on tags (left side).
+--TEMPLATE--
+**{% if true %}
+foo
+    
+    	    {%- endif %}**
+
+**
+
+	    {{- 'foo' }}**
+
+**
+    
+	
+{#- comment #}**
+
+**{% verbatim %}
+foo
+    
+    	    {%- endverbatim %}**
+--DATA--
+return []
+--EXPECT--
+**foo**
+
+**foo**
+
+****
+
+**
+foo**
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_line_left.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_line_left.test
new file mode 100644
index 00000000..e5e845f0
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_line_left.test
@@ -0,0 +1,33 @@
+--TEST--
+Line whitespace trimming on tags (left side).
+--TEMPLATE--
+**{% if true %}
+foo
+    	    {%~ endif %}**
+
+**
+	    {{~ 'foo' }}**
+
+**
+	{#~ comment #}**
+
+**{% verbatim %}
+foo
+    
+    	    {%~ endverbatim %}**
+--DATA--
+return []
+--EXPECT--
+**foo
+**
+
+**
+foo**
+
+**
+**
+
+**
+foo
+    
+**
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_line_right.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_line_right.test
new file mode 100644
index 00000000..e7b510c8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_line_right.test
@@ -0,0 +1,32 @@
+--TEST--
+Line whitespace trimming on tags (right side).
+--TEMPLATE--
+**{% if true ~%}    	    
+foo{% endif %}**
+
+**{{ 'foo' ~}}    	    
+foo
+**
+
+**{# comment ~#}	    
+	foo
+**
+
+**{% verbatim ~%}	    
+    foo{% endverbatim %}**
+--DATA--
+return []
+--EXPECT--
+**
+foo**
+
+**foo
+foo
+**
+
+**
+	foo
+**
+
+**
+    foo**
diff --git a/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_right.test b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_right.test
new file mode 100644
index 00000000..0ec3b0ce
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Fixtures/whitespace/trim_right.test
@@ -0,0 +1,28 @@
+--TEST--
+Whitespace trimming on tags (right side).
+--TEMPLATE--
+**{% if true -%}
+    
+    	    foo{% endif %}**
+
+**{{ 'foo' -}}
+	    
+**
+
+**{# comment -#}    
+	
+**
+
+**{% verbatim -%}    
+    	    
+foo{% endverbatim %}**
+--DATA--
+return []
+--EXPECT--
+**foo**
+
+**foo**
+
+****
+
+**foo**
diff --git a/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php b/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php
index 5d20112d..6bd727b1 100644
--- a/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/IntegrationTest.php
@@ -9,6 +9,20 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Extension\AbstractExtension;
+use Twig\Extension\DebugExtension;
+use Twig\Extension\SandboxExtension;
+use Twig\Extension\StringLoaderExtension;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\PrintNode;
+use Twig\Sandbox\SecurityPolicy;
+use Twig\Test\IntegrationTestCase;
+use Twig\Token;
+use Twig\TokenParser\AbstractTokenParser;
+use Twig\TwigFilter;
+use Twig\TwigFunction;
+use Twig\TwigTest;
+
 // This function is defined to check that escaping strategies
 // like html works even if a function with the same name is defined.
 function html()
@@ -16,23 +30,23 @@ function html()
     return 'foo';
 }
 
-class Twig_Tests_IntegrationTest extends Twig_Test_IntegrationTestCase
+class Twig_Tests_IntegrationTest extends IntegrationTestCase
 {
     public function getExtensions()
     {
-        $policy = new Twig_Sandbox_SecurityPolicy(array(), array(), array(), array(), array());
+        $policy = new SecurityPolicy([], [], [], [], ['dump']);
 
-        return array(
-            new Twig_Extension_Debug(),
-            new Twig_Extension_Sandbox($policy, false),
-            new Twig_Extension_StringLoader(),
+        return [
+            new DebugExtension(),
+            new SandboxExtension($policy, false),
+            new StringLoaderExtension(),
             new TwigTestExtension(),
-        );
+        ];
     }
 
     public function getFixturesDir()
     {
-        return dirname(__FILE__).'/Fixtures/';
+        return __DIR__.'/Fixtures/';
     }
 }
 
@@ -41,12 +55,12 @@ function test_foo($value = 'foo')
     return $value;
 }
 
-class TwigTestFoo implements Iterator
+class TwigTestFoo implements \Iterator
 {
     const BAR_NAME = 'bar';
 
     public $position = 0;
-    public $array = array(1, 2);
+    public $array = [1, 2];
 
     public function bar($param1 = null, $param2 = null)
     {
@@ -109,13 +123,13 @@ class TwigTestFoo implements Iterator
     }
 }
 
-class TwigTestTokenParser_§ extends Twig_TokenParser
+class TwigTestTokenParser_§ extends AbstractTokenParser
 {
-    public function parse(Twig_Token $token)
+    public function parse(Token $token)
     {
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+        $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
 
-        return new Twig_Node_Print(new Twig_Node_Expression_Constant('§', -1), -1);
+        return new PrintNode(new ConstantExpression('§', -1), -1);
     }
 
     public function getTag()
@@ -124,51 +138,54 @@ class TwigTestTokenParser_§ extends Twig_TokenParser
     }
 }
 
-class TwigTestExtension extends Twig_Extension
+class TwigTestExtension extends AbstractExtension
 {
     public function getTokenParsers()
     {
-        return array(
+        return [
             new TwigTestTokenParser_§(),
-        );
+        ];
     }
 
     public function getFilters()
     {
-        return array(
-            new Twig_SimpleFilter('§', array($this, '§Filter')),
-            new Twig_SimpleFilter('escape_and_nl2br', array($this, 'escape_and_nl2br'), array('needs_environment' => true, 'is_safe' => array('html'))),
-            new Twig_SimpleFilter('nl2br', array($this, 'nl2br'), array('pre_escape' => 'html', 'is_safe' => array('html'))),
-            new Twig_SimpleFilter('escape_something', array($this, 'escape_something'), array('is_safe' => array('something'))),
-            new Twig_SimpleFilter('preserves_safety', array($this, 'preserves_safety'), array('preserves_safety' => array('html'))),
-            new Twig_SimpleFilter('static_call_string', 'TwigTestExtension::staticCall'),
-            new Twig_SimpleFilter('static_call_array', array('TwigTestExtension', 'staticCall')),
-            new Twig_SimpleFilter('magic_call', array($this, 'magicCall')),
-            new Twig_SimpleFilter('magic_call_string', 'TwigTestExtension::magicStaticCall'),
-            new Twig_SimpleFilter('magic_call_array', array('TwigTestExtension', 'magicStaticCall')),
-            new Twig_SimpleFilter('*_path', array($this, 'dynamic_path')),
-            new Twig_SimpleFilter('*_foo_*_bar', array($this, 'dynamic_foo')),
-        );
+        return [
+            new TwigFilter('§', [$this, '§Filter']),
+            new TwigFilter('escape_and_nl2br', [$this, 'escape_and_nl2br'], ['needs_environment' => true, 'is_safe' => ['html']]),
+            new TwigFilter('nl2br', [$this, 'nl2br'], ['pre_escape' => 'html', 'is_safe' => ['html']]),
+            new TwigFilter('escape_something', [$this, 'escape_something'], ['is_safe' => ['something']]),
+            new TwigFilter('preserves_safety', [$this, 'preserves_safety'], ['preserves_safety' => ['html']]),
+            new TwigFilter('static_call_string', 'TwigTestExtension::staticCall'),
+            new TwigFilter('static_call_array', ['TwigTestExtension', 'staticCall']),
+            new TwigFilter('magic_call', [$this, 'magicCall']),
+            new TwigFilter('magic_call_string', 'TwigTestExtension::magicStaticCall'),
+            new TwigFilter('magic_call_array', ['TwigTestExtension', 'magicStaticCall']),
+            new TwigFilter('*_path', [$this, 'dynamic_path']),
+            new TwigFilter('*_foo_*_bar', [$this, 'dynamic_foo']),
+            new TwigFilter('anon_foo', function ($name) { return '*'.$name.'*'; }),
+        ];
     }
 
     public function getFunctions()
     {
-        return array(
-            new Twig_SimpleFunction('§', array($this, '§Function')),
-            new Twig_SimpleFunction('safe_br', array($this, 'br'), array('is_safe' => array('html'))),
-            new Twig_SimpleFunction('unsafe_br', array($this, 'br')),
-            new Twig_SimpleFunction('static_call_string', 'TwigTestExtension::staticCall'),
-            new Twig_SimpleFunction('static_call_array', array('TwigTestExtension', 'staticCall')),
-            new Twig_SimpleFunction('*_path', array($this, 'dynamic_path')),
-            new Twig_SimpleFunction('*_foo_*_bar', array($this, 'dynamic_foo')),
-        );
+        return [
+            new TwigFunction('§', [$this, '§Function']),
+            new TwigFunction('safe_br', [$this, 'br'], ['is_safe' => ['html']]),
+            new TwigFunction('unsafe_br', [$this, 'br']),
+            new TwigFunction('static_call_string', 'TwigTestExtension::staticCall'),
+            new TwigFunction('static_call_array', ['TwigTestExtension', 'staticCall']),
+            new TwigFunction('*_path', [$this, 'dynamic_path']),
+            new TwigFunction('*_foo_*_bar', [$this, 'dynamic_foo']),
+            new TwigFunction('anon_foo', function ($name) { return '*'.$name.'*'; }),
+        ];
     }
 
     public function getTests()
     {
-        return array(
-            new Twig_SimpleTest('multi word', array($this, 'is_multi_word')),
-        );
+        return [
+            new TwigTest('multi word', [$this, 'is_multi_word']),
+            new TwigTest('test_*', [$this, 'dynamic_test']),
+        ];
     }
 
     public function §Filter($value)
@@ -209,6 +226,11 @@ class TwigTestExtension extends Twig_Extension
         return $foo.'/'.$bar.'/'.$item;
     }
 
+    public function dynamic_test($element, $item)
+    {
+        return $element === $item;
+    }
+
     public function escape_something($value)
     {
         return strtoupper($value);
@@ -237,7 +259,7 @@ class TwigTestExtension extends Twig_Extension
     public function __call($method, $arguments)
     {
         if ('magicCall' !== $method) {
-            throw new BadMethodCallException('Unexpected call to __call');
+            throw new \BadMethodCallException('Unexpected call to __call');
         }
 
         return 'magic_'.$arguments[0];
@@ -246,7 +268,7 @@ class TwigTestExtension extends Twig_Extension
     public static function __callStatic($method, $arguments)
     {
         if ('magicStaticCall' !== $method) {
-            throw new BadMethodCallException('Unexpected call to __callStatic');
+            throw new \BadMethodCallException('Unexpected call to __callStatic');
         }
 
         return 'static_magic_'.$arguments[0];
@@ -261,7 +283,7 @@ class MagicCallStub
 {
     public function __call($name, $args)
     {
-        throw new Exception('__call shall not be called');
+        throw new \Exception('__call shall not be called');
     }
 }
 
@@ -304,6 +326,61 @@ class CountableStub implements \Countable
 
     public function __toString()
     {
-        throw new Exception('__toString shall not be called on \Countables');
+        throw new \Exception('__toString shall not be called on \Countables');
+    }
+}
+
+/**
+ * This class is used in tests for the length filter.
+ */
+class IteratorAggregateStub implements \IteratorAggregate
+{
+    private $data;
+
+    public function __construct(array $data)
+    {
+        $this->data = $data;
+    }
+
+    public function getIterator()
+    {
+        return new \ArrayIterator($this->data);
+    }
+}
+
+class SimpleIteratorForTesting implements Iterator
+{
+    private $data = [1, 2, 3, 4, 5, 6, 7];
+    private $key = 0;
+
+    public function current()
+    {
+        return $this->key;
+    }
+
+    public function next()
+    {
+        ++$this->key;
+    }
+
+    public function key()
+    {
+        return $this->key;
+    }
+
+    public function valid()
+    {
+        return isset($this->data[$this->key]);
+    }
+
+    public function rewind()
+    {
+        $this->key = 0;
+    }
+
+    public function __toString()
+    {
+        // for testing, make sure string length returned is not the same as the `iterator_count`
+        return str_repeat('X', iterator_count($this) + 10);
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/autoescape/filename.legacy.test b/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/autoescape/filename.legacy.test
deleted file mode 100644
index b091ad34..00000000
--- a/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/autoescape/filename.legacy.test
+++ /dev/null
@@ -1,18 +0,0 @@
---TEST--
-"filename" autoescape strategy
---TEMPLATE--
-{{ br -}}
-{{ include('index.html.twig') -}}
-{{ include('index.txt.twig') -}}
---TEMPLATE(index.html.twig)--
-{{ br -}}
---TEMPLATE(index.txt.twig)--
-{{ br -}}
---DATA--
-return array('br' => '<br />')
---CONFIG--
-return array('autoescape' => 'filename')
---EXPECT--
-&lt;br /&gt;
-&lt;br /&gt;
-<br />
diff --git a/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/functions/undefined_block.legacy.test b/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/functions/undefined_block.legacy.test
deleted file mode 100644
index 62e24f0f..00000000
--- a/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/functions/undefined_block.legacy.test
+++ /dev/null
@@ -1,12 +0,0 @@
---TEST--
-"block" function with undefined block
---TEMPLATE--
-{% extends "base.twig" %}
-{% block foo %}{{ parent() }}{{ block('unknown') }}{{ block('bar') }}{% endblock %}
---TEMPLATE(base.twig)--
-{% block foo %}Foo{% endblock %}
-{% block bar %}Bar{% endblock %}
---DATA--
-return array()
---EXPECT--
-FooBarBar
diff --git a/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/test.legacy.test b/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/test.legacy.test
deleted file mode 100644
index d9c1d508..00000000
--- a/vendor/twig/twig/test/Twig/Tests/LegacyFixtures/test.legacy.test
+++ /dev/null
@@ -1,8 +0,0 @@
---TEST--
-Old test classes usage
---TEMPLATE--
-{{ 'foo' is multi word ? 'yes' : 'no' }}
---DATA--
-return array()
---EXPECT--
-no
diff --git a/vendor/twig/twig/test/Twig/Tests/LegacyIntegrationTest.php b/vendor/twig/twig/test/Twig/Tests/LegacyIntegrationTest.php
deleted file mode 100644
index 2ed75803..00000000
--- a/vendor/twig/twig/test/Twig/Tests/LegacyIntegrationTest.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-class Twig_Tests_LegacyIntegrationTest extends Twig_Test_IntegrationTestCase
-{
-    public function getExtensions()
-    {
-        return array(
-            new LegacyTwigTestExtension(),
-        );
-    }
-
-    public function getFixturesDir()
-    {
-        return dirname(__FILE__).'/LegacyFixtures/';
-    }
-
-    public function getTests($name, $legacyTests = false)
-    {
-        if (!$legacyTests) {
-            return array(array('', '', '', array(), '', array()));
-        }
-
-        return parent::getTests($name, true);
-    }
-}
-
-class LegacyTwigTestExtension extends Twig_Extension
-{
-    public function getTests()
-    {
-        return array(
-            'multi word' => new Twig_Test_Method($this, 'is_multi_word'),
-        );
-    }
-
-    public function is_multi_word($value)
-    {
-        return false !== strpos($value, ' ');
-    }
-
-    public function getName()
-    {
-        return 'legacy_integration_test';
-    }
-}
diff --git a/vendor/twig/twig/test/Twig/Tests/LexerTest.php b/vendor/twig/twig/test/Twig/Tests/LexerTest.php
index ffe9a235..9aff5658 100644
--- a/vendor/twig/twig/test/Twig/Tests/LexerTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/LexerTest.php
@@ -8,53 +8,49 @@
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
+
+use Twig\Environment;
+use Twig\Lexer;
+use Twig\Loader\LoaderInterface;
+use Twig\Source;
+use Twig\Token;
+
 class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
 {
-    /**
-     * @group legacy
-     */
-    public function testLegacyConstructorSignature()
-    {
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize('{{ foo }}', 'foo');
-        $this->assertEquals('foo', $stream->getFilename());
-        $this->assertEquals('{{ foo }}', $stream->getSource());
-    }
-
     public function testNameLabelForTag()
     {
         $template = '{% § %}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
 
-        $stream->expect(Twig_Token::BLOCK_START_TYPE);
-        $this->assertSame('§', $stream->expect(Twig_Token::NAME_TYPE)->getValue());
+        $stream->expect(Token::BLOCK_START_TYPE);
+        $this->assertSame('§', $stream->expect(Token::NAME_TYPE)->getValue());
     }
 
     public function testNameLabelForFunction()
     {
         $template = '{{ §() }}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
 
-        $stream->expect(Twig_Token::VAR_START_TYPE);
-        $this->assertSame('§', $stream->expect(Twig_Token::NAME_TYPE)->getValue());
+        $stream->expect(Token::VAR_START_TYPE);
+        $this->assertSame('§', $stream->expect(Token::NAME_TYPE)->getValue());
     }
 
     public function testBracketsNesting()
     {
         $template = '{{ {"a":{"b":"c"}} }}';
 
-        $this->assertEquals(2, $this->countToken($template, Twig_Token::PUNCTUATION_TYPE, '{'));
-        $this->assertEquals(2, $this->countToken($template, Twig_Token::PUNCTUATION_TYPE, '}'));
+        $this->assertEquals(2, $this->countToken($template, Token::PUNCTUATION_TYPE, '{'));
+        $this->assertEquals(2, $this->countToken($template, Token::PUNCTUATION_TYPE, '}'));
     }
 
     protected function countToken($template, $type, $value = null)
     {
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
 
         $count = 0;
         while (!$stream->isEOF()) {
@@ -78,17 +74,17 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
             ."baz\n"
             ."}}\n";
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
 
         // foo\nbar\n
-        $this->assertSame(1, $stream->expect(Twig_Token::TEXT_TYPE)->getLine());
+        $this->assertSame(1, $stream->expect(Token::TEXT_TYPE)->getLine());
         // \n (after {% line %})
-        $this->assertSame(10, $stream->expect(Twig_Token::TEXT_TYPE)->getLine());
+        $this->assertSame(10, $stream->expect(Token::TEXT_TYPE)->getLine());
         // {{
-        $this->assertSame(11, $stream->expect(Twig_Token::VAR_START_TYPE)->getLine());
+        $this->assertSame(11, $stream->expect(Token::VAR_START_TYPE)->getLine());
         // baz
-        $this->assertSame(12, $stream->expect(Twig_Token::NAME_TYPE)->getLine());
+        $this->assertSame(12, $stream->expect(Token::NAME_TYPE)->getLine());
     }
 
     public function testLineDirectiveInline()
@@ -98,23 +94,23 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
             ."baz\n"
             ."}}\n";
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
 
         // foo\nbar
-        $this->assertSame(1, $stream->expect(Twig_Token::TEXT_TYPE)->getLine());
+        $this->assertSame(1, $stream->expect(Token::TEXT_TYPE)->getLine());
         // {{
-        $this->assertSame(10, $stream->expect(Twig_Token::VAR_START_TYPE)->getLine());
+        $this->assertSame(10, $stream->expect(Token::VAR_START_TYPE)->getLine());
         // baz
-        $this->assertSame(11, $stream->expect(Twig_Token::NAME_TYPE)->getLine());
+        $this->assertSame(11, $stream->expect(Token::NAME_TYPE)->getLine());
     }
 
     public function testLongComments()
     {
         $template = '{# '.str_repeat('*', 100000).' #}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $lexer->tokenize(new Source($template, 'index'));
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -125,8 +121,8 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     {
         $template = '{% verbatim %}'.str_repeat('*', 100000).'{% endverbatim %}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $lexer->tokenize(new Source($template, 'index'));
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -137,8 +133,8 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     {
         $template = '{{ '.str_repeat('x', 100000).' }}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $lexer->tokenize(new Source($template, 'index'));
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -149,8 +145,8 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     {
         $template = '{% '.str_repeat('x', 100000).' %}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $lexer->tokenize(new Source($template, 'index'));
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -161,8 +157,8 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     {
         $template = '{{ 922337203685477580700 }}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
         $stream->next();
         $node = $stream->next();
         $this->assertEquals('922337203685477580700', $node->getValue());
@@ -170,15 +166,16 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
 
     public function testStringWithEscapedDelimiter()
     {
-        $tests = array(
+        $tests = [
             "{{ 'foo \' bar' }}" => 'foo \' bar',
             '{{ "foo \" bar" }}' => 'foo " bar',
-        );
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
+        ];
+
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
         foreach ($tests as $template => $expected) {
-            $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
-            $stream->expect(Twig_Token::VAR_START_TYPE);
-            $stream->expect(Twig_Token::STRING_TYPE, $expected);
+            $stream = $lexer->tokenize(new Source($template, 'index'));
+            $stream->expect(Token::VAR_START_TYPE);
+            $stream->expect(Token::STRING_TYPE, $expected);
 
             // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
             // can be executed without throwing any exceptions
@@ -190,17 +187,17 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     {
         $template = 'foo {{ "bar #{ baz + 1 }" }}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
-        $stream->expect(Twig_Token::TEXT_TYPE, 'foo ');
-        $stream->expect(Twig_Token::VAR_START_TYPE);
-        $stream->expect(Twig_Token::STRING_TYPE, 'bar ');
-        $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
-        $stream->expect(Twig_Token::NAME_TYPE, 'baz');
-        $stream->expect(Twig_Token::OPERATOR_TYPE, '+');
-        $stream->expect(Twig_Token::NUMBER_TYPE, '1');
-        $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
-        $stream->expect(Twig_Token::VAR_END_TYPE);
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
+        $stream->expect(Token::TEXT_TYPE, 'foo ');
+        $stream->expect(Token::VAR_START_TYPE);
+        $stream->expect(Token::STRING_TYPE, 'bar ');
+        $stream->expect(Token::INTERPOLATION_START_TYPE);
+        $stream->expect(Token::NAME_TYPE, 'baz');
+        $stream->expect(Token::OPERATOR_TYPE, '+');
+        $stream->expect(Token::NUMBER_TYPE, '1');
+        $stream->expect(Token::INTERPOLATION_END_TYPE);
+        $stream->expect(Token::VAR_END_TYPE);
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -211,11 +208,11 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     {
         $template = '{{ "bar \#{baz+1}" }}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
-        $stream->expect(Twig_Token::VAR_START_TYPE);
-        $stream->expect(Twig_Token::STRING_TYPE, 'bar #{baz+1}');
-        $stream->expect(Twig_Token::VAR_END_TYPE);
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
+        $stream->expect(Token::VAR_START_TYPE);
+        $stream->expect(Token::STRING_TYPE, 'bar #{baz+1}');
+        $stream->expect(Token::VAR_END_TYPE);
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -226,11 +223,11 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     {
         $template = '{{ "bar # baz" }}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
-        $stream->expect(Twig_Token::VAR_START_TYPE);
-        $stream->expect(Twig_Token::STRING_TYPE, 'bar # baz');
-        $stream->expect(Twig_Token::VAR_END_TYPE);
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
+        $stream->expect(Token::VAR_START_TYPE);
+        $stream->expect(Token::STRING_TYPE, 'bar # baz');
+        $stream->expect(Token::VAR_END_TYPE);
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -238,32 +235,32 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * @expectedException Twig_Error_Syntax
+     * @expectedException \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unclosed """
      */
     public function testStringWithUnterminatedInterpolation()
     {
         $template = '{{ "bar #{x" }}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $lexer->tokenize(new Source($template, 'index'));
     }
 
     public function testStringWithNestedInterpolations()
     {
         $template = '{{ "bar #{ "foo#{bar}" }" }}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
-        $stream->expect(Twig_Token::VAR_START_TYPE);
-        $stream->expect(Twig_Token::STRING_TYPE, 'bar ');
-        $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
-        $stream->expect(Twig_Token::STRING_TYPE, 'foo');
-        $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
-        $stream->expect(Twig_Token::NAME_TYPE, 'bar');
-        $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
-        $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
-        $stream->expect(Twig_Token::VAR_END_TYPE);
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
+        $stream->expect(Token::VAR_START_TYPE);
+        $stream->expect(Token::STRING_TYPE, 'bar ');
+        $stream->expect(Token::INTERPOLATION_START_TYPE);
+        $stream->expect(Token::STRING_TYPE, 'foo');
+        $stream->expect(Token::INTERPOLATION_START_TYPE);
+        $stream->expect(Token::NAME_TYPE, 'bar');
+        $stream->expect(Token::INTERPOLATION_END_TYPE);
+        $stream->expect(Token::INTERPOLATION_END_TYPE);
+        $stream->expect(Token::VAR_END_TYPE);
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -274,18 +271,18 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     {
         $template = '{% foo "bar #{ "foo#{bar}" }" %}';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
-        $stream->expect(Twig_Token::BLOCK_START_TYPE);
-        $stream->expect(Twig_Token::NAME_TYPE, 'foo');
-        $stream->expect(Twig_Token::STRING_TYPE, 'bar ');
-        $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
-        $stream->expect(Twig_Token::STRING_TYPE, 'foo');
-        $stream->expect(Twig_Token::INTERPOLATION_START_TYPE);
-        $stream->expect(Twig_Token::NAME_TYPE, 'bar');
-        $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
-        $stream->expect(Twig_Token::INTERPOLATION_END_TYPE);
-        $stream->expect(Twig_Token::BLOCK_END_TYPE);
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
+        $stream->expect(Token::BLOCK_START_TYPE);
+        $stream->expect(Token::NAME_TYPE, 'foo');
+        $stream->expect(Token::STRING_TYPE, 'bar ');
+        $stream->expect(Token::INTERPOLATION_START_TYPE);
+        $stream->expect(Token::STRING_TYPE, 'foo');
+        $stream->expect(Token::INTERPOLATION_START_TYPE);
+        $stream->expect(Token::NAME_TYPE, 'bar');
+        $stream->expect(Token::INTERPOLATION_END_TYPE);
+        $stream->expect(Token::INTERPOLATION_END_TYPE);
+        $stream->expect(Token::BLOCK_END_TYPE);
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -296,11 +293,11 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     {
         $template = "{{ 1 and\n0}}";
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $stream = $lexer->tokenize(new Twig_Source($template, 'index'));
-        $stream->expect(Twig_Token::VAR_START_TYPE);
-        $stream->expect(Twig_Token::NUMBER_TYPE, 1);
-        $stream->expect(Twig_Token::OPERATOR_TYPE, 'and');
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $stream = $lexer->tokenize(new Source($template, 'index'));
+        $stream->expect(Token::VAR_START_TYPE);
+        $stream->expect(Token::NUMBER_TYPE, 1);
+        $stream->expect(Token::OPERATOR_TYPE, 'and');
 
         // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
         // can be executed without throwing any exceptions
@@ -308,7 +305,7 @@ class Twig_Tests_LexerTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * @expectedException Twig_Error_Syntax
+     * @expectedException \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unclosed "variable" in "index" at line 3
      */
     public function testUnterminatedVariable()
@@ -322,12 +319,12 @@ bar
 
 ';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $lexer->tokenize(new Source($template, 'index'));
     }
 
     /**
-     * @expectedException Twig_Error_Syntax
+     * @expectedException \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unclosed "block" in "index" at line 3
      */
     public function testUnterminatedBlock()
@@ -341,7 +338,33 @@ bar
 
 ';
 
-        $lexer = new Twig_Lexer(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $lexer->tokenize(new Twig_Source($template, 'index'));
+        $lexer = new Lexer(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $lexer->tokenize(new Source($template, 'index'));
+    }
+
+    public function testOverridingSyntax()
+    {
+        $template = '[# comment #]{# variable #}/# if true #/true/# endif #/';
+        $lexer = new Lexer(new Environment($this->getMockBuilder('\Twig\Loader\LoaderInterface')->getMock()), [
+            'tag_comment' => ['[#', '#]'],
+            'tag_block' => ['/#', '#/'],
+            'tag_variable' => ['{#', '#}'],
+        ]);
+        $stream = $lexer->tokenize(new Source($template, 'index'));
+        $stream->expect(Token::VAR_START_TYPE);
+        $stream->expect(Token::NAME_TYPE, 'variable');
+        $stream->expect(Token::VAR_END_TYPE);
+        $stream->expect(Token::BLOCK_START_TYPE);
+        $stream->expect(Token::NAME_TYPE, 'if');
+        $stream->expect(Token::NAME_TYPE, 'true');
+        $stream->expect(Token::BLOCK_END_TYPE);
+        $stream->expect(Token::TEXT_TYPE, 'true');
+        $stream->expect(Token::BLOCK_START_TYPE);
+        $stream->expect(Token::NAME_TYPE, 'endif');
+        $stream->expect(Token::BLOCK_END_TYPE);
+
+        // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
+        // can be executed without throwing any exceptions
+        $this->addToAssertionCount(1);
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php b/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php
index 59306393..8adfbe67 100644
--- a/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/ArrayTest.php
@@ -9,52 +9,33 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Loader\ArrayLoader;
+
 class Twig_Tests_Loader_ArrayTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @group legacy
-     */
-    public function testGetSource()
-    {
-        $loader = new Twig_Loader_Array(array('foo' => 'bar'));
-
-        $this->assertEquals('bar', $loader->getSource('foo'));
-    }
-
-    /**
-     * @group legacy
-     * @expectedException Twig_Error_Loader
-     */
-    public function testGetSourceWhenTemplateDoesNotExist()
-    {
-        $loader = new Twig_Loader_Array(array());
-
-        $loader->getSource('foo');
-    }
-
-    /**
-     * @expectedException Twig_Error_Loader
+     * @expectedException \Twig\Error\LoaderError
      */
     public function testGetSourceContextWhenTemplateDoesNotExist()
     {
-        $loader = new Twig_Loader_Array(array());
+        $loader = new ArrayLoader([]);
 
         $loader->getSourceContext('foo');
     }
 
     public function testGetCacheKey()
     {
-        $loader = new Twig_Loader_Array(array('foo' => 'bar'));
+        $loader = new ArrayLoader(['foo' => 'bar']);
 
         $this->assertEquals('foo:bar', $loader->getCacheKey('foo'));
     }
 
     public function testGetCacheKeyWhenTemplateHasDuplicateContent()
     {
-        $loader = new Twig_Loader_Array(array(
+        $loader = new ArrayLoader([
             'foo' => 'bar',
             'baz' => 'bar',
-        ));
+        ]);
 
         $this->assertEquals('foo:bar', $loader->getCacheKey('foo'));
         $this->assertEquals('baz:bar', $loader->getCacheKey('baz'));
@@ -62,28 +43,28 @@ class Twig_Tests_Loader_ArrayTest extends \PHPUnit\Framework\TestCase
 
     public function testGetCacheKeyIsProtectedFromEdgeCollisions()
     {
-        $loader = new Twig_Loader_Array(array(
+        $loader = new ArrayLoader([
             'foo__' => 'bar',
             'foo' => '__bar',
-        ));
+        ]);
 
         $this->assertEquals('foo__:bar', $loader->getCacheKey('foo__'));
         $this->assertEquals('foo:__bar', $loader->getCacheKey('foo'));
     }
 
     /**
-     * @expectedException Twig_Error_Loader
+     * @expectedException \Twig\Error\LoaderError
      */
     public function testGetCacheKeyWhenTemplateDoesNotExist()
     {
-        $loader = new Twig_Loader_Array(array());
+        $loader = new ArrayLoader([]);
 
         $loader->getCacheKey('foo');
     }
 
     public function testSetTemplate()
     {
-        $loader = new Twig_Loader_Array(array());
+        $loader = new ArrayLoader([]);
         $loader->setTemplate('foo', 'bar');
 
         $this->assertEquals('bar', $loader->getSourceContext('foo')->getCode());
@@ -91,47 +72,17 @@ class Twig_Tests_Loader_ArrayTest extends \PHPUnit\Framework\TestCase
 
     public function testIsFresh()
     {
-        $loader = new Twig_Loader_Array(array('foo' => 'bar'));
+        $loader = new ArrayLoader(['foo' => 'bar']);
         $this->assertTrue($loader->isFresh('foo', time()));
     }
 
     /**
-     * @expectedException Twig_Error_Loader
+     * @expectedException \Twig\Error\LoaderError
      */
     public function testIsFreshWhenTemplateDoesNotExist()
     {
-        $loader = new Twig_Loader_Array(array());
+        $loader = new ArrayLoader([]);
 
         $loader->isFresh('foo', time());
     }
-
-    public function testTemplateReference()
-    {
-        $name = new Twig_Test_Loader_TemplateReference('foo');
-        $loader = new Twig_Loader_Array(array('foo' => 'bar'));
-
-        $loader->getCacheKey($name);
-        $loader->getSourceContext($name);
-        $loader->isFresh($name, time());
-        $loader->setTemplate($name, 'foo:bar');
-
-        // add a dummy assertion here to satisfy PHPUnit, the only thing we want to test is that the code above
-        // can be executed without crashing PHP
-        $this->addToAssertionCount(1);
-    }
-}
-
-class Twig_Test_Loader_TemplateReference
-{
-    private $name;
-
-    public function __construct($name)
-    {
-        $this->name = $name;
-    }
-
-    public function __toString()
-    {
-        return $this->name;
-    }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php b/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php
index 8a8a84a5..a71cc96d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/ChainTest.php
@@ -9,30 +9,21 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Loader\ArrayLoader;
+use Twig\Loader\ChainLoader;
+use Twig\Loader\FilesystemLoader;
+use Twig\Loader\LoaderInterface;
+
 class Twig_Tests_Loader_ChainTest extends \PHPUnit\Framework\TestCase
 {
-    /**
-     * @group legacy
-     */
-    public function testGetSource()
-    {
-        $loader = new Twig_Loader_Chain(array(
-            new Twig_Loader_Array(array('foo' => 'bar')),
-            new Twig_Loader_Array(array('foo' => 'foobar', 'bar' => 'foo')),
-        ));
-
-        $this->assertEquals('bar', $loader->getSource('foo'));
-        $this->assertEquals('foo', $loader->getSource('bar'));
-    }
-
     public function testGetSourceContext()
     {
-        $path = dirname(__FILE__).'/../Fixtures';
-        $loader = new Twig_Loader_Chain(array(
-            new Twig_Loader_Array(array('foo' => 'bar')),
-            new Twig_Loader_Array(array('errors/index.html' => 'baz')),
-            new Twig_Loader_Filesystem(array($path)),
-        ));
+        $path = __DIR__.'/../Fixtures';
+        $loader = new ChainLoader([
+            new ArrayLoader(['foo' => 'bar']),
+            new ArrayLoader(['errors/index.html' => 'baz']),
+            new FilesystemLoader([$path]),
+        ]);
 
         $this->assertEquals('foo', $loader->getSourceContext('foo')->getName());
         $this->assertSame('', $loader->getSourceContext('foo')->getPath());
@@ -47,78 +38,58 @@ class Twig_Tests_Loader_ChainTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * @expectedException Twig_Error_Loader
+     * @expectedException \Twig\Error\LoaderError
      */
     public function testGetSourceContextWhenTemplateDoesNotExist()
     {
-        $loader = new Twig_Loader_Chain(array());
+        $loader = new ChainLoader([]);
 
         $loader->getSourceContext('foo');
     }
 
-    /**
-     * @group legacy
-     * @expectedException Twig_Error_Loader
-     */
-    public function testGetSourceWhenTemplateDoesNotExist()
-    {
-        $loader = new Twig_Loader_Chain(array());
-
-        $loader->getSource('foo');
-    }
-
     public function testGetCacheKey()
     {
-        $loader = new Twig_Loader_Chain(array(
-            new Twig_Loader_Array(array('foo' => 'bar')),
-            new Twig_Loader_Array(array('foo' => 'foobar', 'bar' => 'foo')),
-        ));
+        $loader = new ChainLoader([
+            new ArrayLoader(['foo' => 'bar']),
+            new ArrayLoader(['foo' => 'foobar', 'bar' => 'foo']),
+        ]);
 
         $this->assertEquals('foo:bar', $loader->getCacheKey('foo'));
         $this->assertEquals('bar:foo', $loader->getCacheKey('bar'));
     }
 
     /**
-     * @expectedException Twig_Error_Loader
+     * @expectedException \Twig\Error\LoaderError
      */
     public function testGetCacheKeyWhenTemplateDoesNotExist()
     {
-        $loader = new Twig_Loader_Chain(array());
+        $loader = new ChainLoader([]);
 
         $loader->getCacheKey('foo');
     }
 
     public function testAddLoader()
     {
-        $loader = new Twig_Loader_Chain();
-        $loader->addLoader(new Twig_Loader_Array(array('foo' => 'bar')));
+        $loader = new ChainLoader();
+        $loader->addLoader(new ArrayLoader(['foo' => 'bar']));
 
         $this->assertEquals('bar', $loader->getSourceContext('foo')->getCode());
     }
 
     public function testExists()
     {
-        $loader1 = $this->getMockBuilder('Twig_ChainTestLoaderWithExistsInterface')->getMock();
-        $loader1->expects($this->once())->method('exists')->will($this->returnValue(false));
+        $loader1 = $this->getMockBuilder(LoaderInterface::class)->getMock();
+        $loader1->expects($this->once())->method('exists')->willReturn(false);
         $loader1->expects($this->never())->method('getSourceContext');
 
-        // can be removed in 2.0
-        $loader2 = $this->getMockBuilder('Twig_ChainTestLoaderInterface')->getMock();
-        //$loader2 = $this->getMockBuilder(array('Twig_LoaderInterface', 'Twig_SourceContextLoaderInterface'))->getMock();
-        $loader2->expects($this->once())->method('getSourceContext')->will($this->returnValue(new Twig_Source('content', 'index')));
+        $loader2 = $this->getMockBuilder(LoaderInterface::class)->getMock();
+        $loader2->expects($this->once())->method('exists')->willReturn(true);
+        $loader2->expects($this->never())->method('getSourceContext');
 
-        $loader = new Twig_Loader_Chain();
+        $loader = new ChainLoader();
         $loader->addLoader($loader1);
         $loader->addLoader($loader2);
 
         $this->assertTrue($loader->exists('foo'));
     }
 }
-
-interface Twig_ChainTestLoaderInterface extends Twig_LoaderInterface, Twig_SourceContextLoaderInterface
-{
-}
-
-interface Twig_ChainTestLoaderWithExistsInterface extends Twig_LoaderInterface, Twig_ExistsLoaderInterface, Twig_SourceContextLoaderInterface
-{
-}
diff --git a/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php b/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php
index bd2acbd7..92fea82b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Loader/FilesystemTest.php
@@ -9,12 +9,16 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Environment;
+use Twig\Error\LoaderError;
+use Twig\Loader\FilesystemLoader;
+
 class Twig_Tests_Loader_FilesystemTest extends \PHPUnit\Framework\TestCase
 {
     public function testGetSourceContext()
     {
-        $path = dirname(__FILE__).'/../Fixtures';
-        $loader = new Twig_Loader_Filesystem(array($path));
+        $path = __DIR__.'/../Fixtures';
+        $loader = new FilesystemLoader([$path]);
         $this->assertEquals('errors/index.html', $loader->getSourceContext('errors/index.html')->getName());
         $this->assertEquals(realpath($path.'/errors/index.html'), realpath($loader->getSourceContext('errors/index.html')->getPath()));
     }
@@ -24,39 +28,39 @@ class Twig_Tests_Loader_FilesystemTest extends \PHPUnit\Framework\TestCase
      */
     public function testSecurity($template)
     {
-        $loader = new Twig_Loader_Filesystem(array(dirname(__FILE__).'/../Fixtures'));
+        $loader = new FilesystemLoader([__DIR__.'/../Fixtures']);
 
         try {
             $loader->getCacheKey($template);
             $this->fail();
-        } catch (Twig_Error_Loader $e) {
+        } catch (LoaderError $e) {
             $this->assertNotContains('Unable to find template', $e->getMessage());
         }
     }
 
     public function getSecurityTests()
     {
-        return array(
-            array("AutoloaderTest\0.php"),
-            array('..\\AutoloaderTest.php'),
-            array('..\\\\\\AutoloaderTest.php'),
-            array('../AutoloaderTest.php'),
-            array('..////AutoloaderTest.php'),
-            array('./../AutoloaderTest.php'),
-            array('.\\..\\AutoloaderTest.php'),
-            array('././././././../AutoloaderTest.php'),
-            array('.\\./.\\./.\\./../AutoloaderTest.php'),
-            array('foo/../../AutoloaderTest.php'),
-            array('foo\\..\\..\\AutoloaderTest.php'),
-            array('foo/../bar/../../AutoloaderTest.php'),
-            array('foo/bar/../../../AutoloaderTest.php'),
-            array('filters/../../AutoloaderTest.php'),
-            array('filters//..//..//AutoloaderTest.php'),
-            array('filters\\..\\..\\AutoloaderTest.php'),
-            array('filters\\\\..\\\\..\\\\AutoloaderTest.php'),
-            array('filters\\//../\\/\\..\\AutoloaderTest.php'),
-            array('/../AutoloaderTest.php'),
-        );
+        return [
+            ["AutoloaderTest\0.php"],
+            ['..\\AutoloaderTest.php'],
+            ['..\\\\\\AutoloaderTest.php'],
+            ['../AutoloaderTest.php'],
+            ['..////AutoloaderTest.php'],
+            ['./../AutoloaderTest.php'],
+            ['.\\..\\AutoloaderTest.php'],
+            ['././././././../AutoloaderTest.php'],
+            ['.\\./.\\./.\\./../AutoloaderTest.php'],
+            ['foo/../../AutoloaderTest.php'],
+            ['foo\\..\\..\\AutoloaderTest.php'],
+            ['foo/../bar/../../AutoloaderTest.php'],
+            ['foo/bar/../../../AutoloaderTest.php'],
+            ['filters/../../AutoloaderTest.php'],
+            ['filters//..//..//AutoloaderTest.php'],
+            ['filters\\..\\..\\AutoloaderTest.php'],
+            ['filters\\\\..\\\\..\\\\AutoloaderTest.php'],
+            ['filters\\//../\\/\\..\\AutoloaderTest.php'],
+            ['/../AutoloaderTest.php'],
+        ];
     }
 
     /**
@@ -64,27 +68,27 @@ class Twig_Tests_Loader_FilesystemTest extends \PHPUnit\Framework\TestCase
      */
     public function testPaths($basePath, $cacheKey, $rootPath)
     {
-        $loader = new Twig_Loader_Filesystem(array($basePath.'/normal', $basePath.'/normal_bis'), $rootPath);
-        $loader->setPaths(array($basePath.'/named', $basePath.'/named_bis'), 'named');
+        $loader = new FilesystemLoader([$basePath.'/normal', $basePath.'/normal_bis'], $rootPath);
+        $loader->setPaths([$basePath.'/named', $basePath.'/named_bis'], 'named');
         $loader->addPath($basePath.'/named_ter', 'named');
         $loader->addPath($basePath.'/normal_ter');
         $loader->prependPath($basePath.'/normal_final');
         $loader->prependPath($basePath.'/named/../named_quater', 'named');
         $loader->prependPath($basePath.'/named_final', 'named');
 
-        $this->assertEquals(array(
+        $this->assertEquals([
             $basePath.'/normal_final',
             $basePath.'/normal',
             $basePath.'/normal_bis',
             $basePath.'/normal_ter',
-        ), $loader->getPaths());
-        $this->assertEquals(array(
+        ], $loader->getPaths());
+        $this->assertEquals([
             $basePath.'/named_final',
             $basePath.'/named/../named_quater',
             $basePath.'/named',
             $basePath.'/named_bis',
             $basePath.'/named_ter',
-        ), $loader->getPaths('named'));
+        ], $loader->getPaths('named'));
 
         // do not use realpath here as it would make the test unuseful
         $this->assertEquals($cacheKey, str_replace('\\', '/', $loader->getCacheKey('@named/named_absolute.html')));
@@ -95,70 +99,70 @@ class Twig_Tests_Loader_FilesystemTest extends \PHPUnit\Framework\TestCase
 
     public function getBasePaths()
     {
-        return array(
-            array(
-                dirname(__FILE__).'/Fixtures',
+        return [
+            [
+                __DIR__.'/Fixtures',
                 'test/Twig/Tests/Loader/Fixtures/named_quater/named_absolute.html',
                 null,
-            ),
-            array(
-                dirname(__FILE__).'/Fixtures/../Fixtures',
+            ],
+            [
+                __DIR__.'/Fixtures/../Fixtures',
                 'test/Twig/Tests/Loader/Fixtures/named_quater/named_absolute.html',
                 null,
-            ),
-            array(
+            ],
+            [
                 'test/Twig/Tests/Loader/Fixtures',
                 'test/Twig/Tests/Loader/Fixtures/named_quater/named_absolute.html',
                 getcwd(),
-            ),
-            array(
+            ],
+            [
                 'Fixtures',
                 'Fixtures/named_quater/named_absolute.html',
                 getcwd().'/test/Twig/Tests/Loader',
-            ),
-            array(
+            ],
+            [
                 'Fixtures',
                 'Fixtures/named_quater/named_absolute.html',
                 getcwd().'/test/../test/Twig/Tests/Loader',
-            ),
-        );
+            ],
+        ];
     }
 
     public function testEmptyConstructor()
     {
-        $loader = new Twig_Loader_Filesystem();
-        $this->assertEquals(array(), $loader->getPaths());
+        $loader = new FilesystemLoader();
+        $this->assertEquals([], $loader->getPaths());
     }
 
     public function testGetNamespaces()
     {
-        $loader = new Twig_Loader_Filesystem(sys_get_temp_dir());
-        $this->assertEquals(array(Twig_Loader_Filesystem::MAIN_NAMESPACE), $loader->getNamespaces());
+        $loader = new FilesystemLoader(sys_get_temp_dir());
+        $this->assertEquals([FilesystemLoader::MAIN_NAMESPACE], $loader->getNamespaces());
 
         $loader->addPath(sys_get_temp_dir(), 'named');
-        $this->assertEquals(array(Twig_Loader_Filesystem::MAIN_NAMESPACE, 'named'), $loader->getNamespaces());
+        $this->assertEquals([FilesystemLoader::MAIN_NAMESPACE, 'named'], $loader->getNamespaces());
     }
 
     public function testFindTemplateExceptionNamespace()
     {
-        $basePath = dirname(__FILE__).'/Fixtures';
+        $basePath = __DIR__.'/Fixtures';
 
-        $loader = new Twig_Loader_Filesystem(array($basePath.'/normal'));
+        $loader = new FilesystemLoader([$basePath.'/normal']);
         $loader->addPath($basePath.'/named', 'named');
 
         try {
             $loader->getSourceContext('@named/nowhere.html');
-        } catch (Exception $e) {
-            $this->assertInstanceof('Twig_Error_Loader', $e);
+        } catch (\Exception $e) {
+            $this->assertInstanceOf(LoaderError::class, $e);
             $this->assertContains('Unable to find template "@named/nowhere.html"', $e->getMessage());
         }
     }
 
     public function testFindTemplateWithCache()
     {
-        $basePath = dirname(__FILE__).'/Fixtures';
+        $basePath = __DIR__.'/Fixtures';
 
-        $loader = new Twig_Loader_Filesystem(array($basePath.'/normal'));
+        $loader = new FilesystemLoader([$basePath.'/normal']);
         $loader->addPath($basePath.'/named', 'named');
 
         // prime the cache for index.html in the named namespace
@@ -171,28 +175,28 @@ class Twig_Tests_Loader_FilesystemTest extends \PHPUnit\Framework\TestCase
 
     public function testLoadTemplateAndRenderBlockWithCache()
     {
-        $loader = new Twig_Loader_Filesystem(array());
-        $loader->addPath(dirname(__FILE__).'/Fixtures/themes/theme2');
-        $loader->addPath(dirname(__FILE__).'/Fixtures/themes/theme1');
-        $loader->addPath(dirname(__FILE__).'/Fixtures/themes/theme1', 'default_theme');
+        $loader = new FilesystemLoader([]);
+        $loader->addPath(__DIR__.'/Fixtures/themes/theme2');
+        $loader->addPath(__DIR__.'/Fixtures/themes/theme1');
+        $loader->addPath(__DIR__.'/Fixtures/themes/theme1', 'default_theme');
 
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
 
-        $template = $twig->loadTemplate('blocks.html.twig');
-        $this->assertSame('block from theme 1', $template->renderBlock('b1', array()));
+        $template = $twig->load('blocks.html.twig');
+        $this->assertSame('block from theme 1', $template->renderBlock('b1', []));
 
-        $template = $twig->loadTemplate('blocks.html.twig');
-        $this->assertSame('block from theme 2', $template->renderBlock('b2', array()));
+        $template = $twig->load('blocks.html.twig');
+        $this->assertSame('block from theme 2', $template->renderBlock('b2', []));
     }
 
     public function getArrayInheritanceTests()
     {
-        return array(
-            'valid array inheritance' => array('array_inheritance_valid_parent.html.twig'),
-            'array inheritance with null first template' => array('array_inheritance_null_parent.html.twig'),
-            'array inheritance with empty first template' => array('array_inheritance_empty_parent.html.twig'),
-            'array inheritance with non-existent first template' => array('array_inheritance_nonexistent_parent.html.twig'),
-        );
+        return [
+            'valid array inheritance' => ['array_inheritance_valid_parent.html.twig'],
+            'array inheritance with null first template' => ['array_inheritance_null_parent.html.twig'],
+            'array inheritance with empty first template' => ['array_inheritance_empty_parent.html.twig'],
+            'array inheritance with non-existent first template' => ['array_inheritance_nonexistent_parent.html.twig'],
+        ];
     }
 
     /**
@@ -202,25 +206,37 @@ class Twig_Tests_Loader_FilesystemTest extends \PHPUnit\Framework\TestCase
      */
     public function testArrayInheritance($templateName)
     {
-        $loader = new Twig_Loader_Filesystem(array());
-        $loader->addPath(dirname(__FILE__).'/Fixtures/inheritance');
+        $loader = new FilesystemLoader([]);
+        $loader->addPath(__DIR__.'/Fixtures/inheritance');
 
-        $twig = new Twig_Environment($loader);
+        $twig = new Environment($loader);
 
-        $template = $twig->loadTemplate($templateName);
-        $this->assertSame('VALID Child', $template->renderBlock('body', array()));
+        $template = $twig->load($templateName);
+        $this->assertSame('VALID Child', $template->renderBlock('body', []));
     }
 
-    /**
-     * @requires PHP 5.3
-     */
     public function testLoadTemplateFromPhar()
     {
-        $loader = new Twig_Loader_Filesystem(array());
+        $loader = new FilesystemLoader([]);
         // phar-sample.phar was created with the following script:
         // $f = new Phar('phar-test.phar');
         // $f->addFromString('hello.twig', 'hello from phar');
-        $loader->addPath('phar://'.dirname(__FILE__).'/Fixtures/phar/phar-sample.phar');
+        $loader->addPath('phar://'.__DIR__.'/Fixtures/phar/phar-sample.phar');
         $this->assertSame('hello from phar', $loader->getSourceContext('hello.twig')->getCode());
     }
+
+    public function testTemplateExistsAlwaysReturnsBool()
+    {
+        $loader = new FilesystemLoader([]);
+        $this->assertFalse($loader->exists("foo\0.twig"));
+        $this->assertFalse($loader->exists('../foo.twig'));
+        $this->assertFalse($loader->exists('@foo'));
+        $this->assertFalse($loader->exists('foo'));
+        $this->assertFalse($loader->exists('@foo/bar.twig'));
+
+        $loader->addPath(__DIR__.'/Fixtures/normal');
+        $this->assertTrue($loader->exists('index.html'));
+        $loader->addPath(__DIR__.'/Fixtures/normal', 'foo');
+        $this->assertTrue($loader->exists('@foo/index.html'));
+    }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php b/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php
deleted file mode 100644
index 50736dc2..00000000
--- a/vendor/twig/twig/test/Twig/Tests/NativeExtensionTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-class Twig_Tests_NativeExtensionTest extends \PHPUnit\Framework\TestCase
-{
-    /**
-     * @requires PHP 5.3
-     */
-    public function testGetProperties()
-    {
-        $twig = new Twig_Environment(new Twig_Loader_Array(array('index' => '{{ d1.date }}{{ d2.date }}')), array(
-            'debug' => true,
-            'cache' => false,
-            'autoescape' => false,
-        ));
-
-        $d1 = new DateTime();
-        $d2 = new DateTime();
-        $output = $twig->render('index', compact('d1', 'd2'));
-
-        // If it fails, PHP will crash.
-        $this->assertEquals($output, $d1->date.$d2->date);
-    }
-}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php b/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php
index 25d16023..1633e060 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/AutoEscapeTest.php
@@ -9,12 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_AutoEscapeTest extends Twig_Test_NodeTestCase
+use Twig\Node\AutoEscapeNode;
+use Twig\Node\Node;
+use Twig\Node\TextNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_AutoEscapeTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $body = new Twig_Node(array(new Twig_Node_Text('foo', 1)));
-        $node = new Twig_Node_AutoEscape(true, $body, 1);
+        $body = new Node([new TextNode('foo', 1)]);
+        $node = new AutoEscapeNode(true, $body, 1);
 
         $this->assertEquals($body, $node->getNode('body'));
         $this->assertTrue($node->getAttribute('value'));
@@ -22,11 +27,11 @@ class Twig_Tests_Node_AutoEscapeTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $body = new Twig_Node(array(new Twig_Node_Text('foo', 1)));
-        $node = new Twig_Node_AutoEscape(true, $body, 1);
+        $body = new Node([new TextNode('foo', 1)]);
+        $node = new AutoEscapeNode(true, $body, 1);
 
-        return array(
-            array($node, "// line 1\necho \"foo\";"),
-        );
+        return [
+            [$node, "// line 1\necho \"foo\";"],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php b/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php
index 84dac9bf..ff021ff7 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/BlockReferenceTest.php
@@ -9,23 +9,26 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_BlockReferenceTest extends Twig_Test_NodeTestCase
+use Twig\Node\BlockReferenceNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_BlockReferenceTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $node = new Twig_Node_BlockReference('foo', 1);
+        $node = new BlockReferenceNode('foo', 1);
 
         $this->assertEquals('foo', $node->getAttribute('name'));
     }
 
     public function getTests()
     {
-        return array(
-            array(new Twig_Node_BlockReference('foo', 1), <<<EOF
+        return [
+            [new BlockReferenceNode('foo', 1), <<<EOF
 // line 1
 \$this->displayBlock('foo', \$context, \$blocks);
 EOF
-            ),
-        );
+            ],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php b/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php
index e7246dcc..c91a4d0f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/BlockTest.php
@@ -9,12 +9,16 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_BlockTest extends Twig_Test_NodeTestCase
+use Twig\Node\BlockNode;
+use Twig\Node\TextNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_BlockTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $body = new Twig_Node_Text('foo', 1);
-        $node = new Twig_Node_Block('foo', $body, 1);
+        $body = new TextNode('foo', 1);
+        $node = new BlockNode('foo', $body, 1);
 
         $this->assertEquals($body, $node->getNode('body'));
         $this->assertEquals('foo', $node->getAttribute('name'));
@@ -22,18 +26,19 @@ class Twig_Tests_Node_BlockTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $body = new Twig_Node_Text('foo', 1);
-        $node = new Twig_Node_Block('foo', $body, 1);
+        $body = new TextNode('foo', 1);
+        $node = new BlockNode('foo', $body, 1);
 
-        return array(
-            array($node, <<<EOF
+        return [
+            [$node, <<<EOF
 // line 1
-public function block_foo(\$context, array \$blocks = array())
+public function block_foo(\$context, array \$blocks = [])
 {
+    \$macros = \$this->macros;
     echo "foo";
 }
 EOF
-            ),
-        );
+            ],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/DeprecatedTest.php b/vendor/twig/twig/test/Twig/Tests/Node/DeprecatedTest.php
new file mode 100644
index 00000000..71457fe8
--- /dev/null
+++ b/vendor/twig/twig/test/Twig/Tests/Node/DeprecatedTest.php
@@ -0,0 +1,82 @@
+<?php
+
+/*
+ * This file is part of Twig.
+ *
+ * (c) Fabien Potencier
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use Twig\Environment;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\DeprecatedNode;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\FunctionExpression;
+use Twig\Node\IfNode;
+use Twig\Node\Node;
+use Twig\Source;
+use Twig\Test\NodeTestCase;
+use Twig\TwigFunction;
+
+class Twig_Tests_Node_DeprecatedTest extends NodeTestCase
+{
+    public function testConstructor()
+    {
+        $expr = new ConstantExpression('foo', 1);
+        $node = new DeprecatedNode($expr, 1);
+
+        $this->assertEquals($expr, $node->getNode('expr'));
+    }
+
+    public function getTests()
+    {
+        $tests = [];
+
+        $expr = new ConstantExpression('This section is deprecated', 1);
+        $node = new DeprecatedNode($expr, 1, 'deprecated');
+        $node->setSourceContext(new Source('', 'foo.twig'));
+
+        $tests[] = [$node, <<<EOF
+// line 1
+@trigger_error("This section is deprecated"." (\"foo.twig\" at line 1).", E_USER_DEPRECATED);
+EOF
+        ];
+
+        $t = new Node([
+            new ConstantExpression(true, 1),
+            new DeprecatedNode($expr, 2, 'deprecated'),
+        ], [], 1);
+        $node = new IfNode($t, null, 1);
+        $node->setSourceContext(new Source('', 'foo.twig'));
+
+        $tests[] = [$node, <<<EOF
+// line 1
+if (true) {
+    // line 2
+    @trigger_error("This section is deprecated"." (\"foo.twig\" at line 2).", E_USER_DEPRECATED);
+}
+EOF
+        ];
+
+        $environment = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $environment->addFunction(new TwigFunction('foo', 'foo', []));
+
+        $expr = new FunctionExpression('foo', new Node(), 1);
+        $node = new DeprecatedNode($expr, 1, 'deprecated');
+        $node->setSourceContext(new Source('', 'foo.twig'));
+
+        $compiler = $this->getCompiler($environment);
+        $varName = $compiler->getVarName();
+
+        $tests[] = [$node, <<<EOF
+// line 1
+\$$varName = foo();
+@trigger_error(\$$varName." (\"foo.twig\" at line 1).", E_USER_DEPRECATED);
+EOF
+        , $environment];
+
+        return $tests;
+    }
+}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php b/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php
index aa33d1a2..ffddda48 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/DoTest.php
@@ -9,23 +9,27 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_DoTest extends Twig_Test_NodeTestCase
+use Twig\Node\DoNode;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_DoTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Constant('foo', 1);
-        $node = new Twig_Node_Do($expr, 1);
+        $expr = new ConstantExpression('foo', 1);
+        $node = new DoNode($expr, 1);
 
         $this->assertEquals($expr, $node->getNode('expr'));
     }
 
     public function getTests()
     {
-        $tests = array();
+        $tests = [];
 
-        $expr = new Twig_Node_Expression_Constant('foo', 1);
-        $node = new Twig_Node_Do($expr, 1);
-        $tests[] = array($node, "// line 1\n\"foo\";");
+        $expr = new ConstantExpression('foo', 1);
+        $node = new DoNode($expr, 1);
+        $tests[] = [$node, "// line 1\n\"foo\";"];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php
index 4f83ab17..842dac40 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ArrayTest.php
@@ -9,29 +9,33 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_ArrayTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ArrayExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_ArrayTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $elements = array(new Twig_Node_Expression_Constant('foo', 1), $foo = new Twig_Node_Expression_Constant('bar', 1));
-        $node = new Twig_Node_Expression_Array($elements, 1);
+        $elements = [new ConstantExpression('foo', 1), $foo = new ConstantExpression('bar', 1)];
+        $node = new ArrayExpression($elements, 1);
 
         $this->assertEquals($foo, $node->getNode(1));
     }
 
     public function getTests()
     {
-        $elements = array(
-            new Twig_Node_Expression_Constant('foo', 1),
-            new Twig_Node_Expression_Constant('bar', 1),
+        $elements = [
+            new ConstantExpression('foo', 1),
+            new ConstantExpression('bar', 1),
 
-            new Twig_Node_Expression_Constant('bar', 1),
-            new Twig_Node_Expression_Constant('foo', 1),
-        );
-        $node = new Twig_Node_Expression_Array($elements, 1);
+            new ConstantExpression('bar', 1),
+            new ConstantExpression('foo', 1),
+        ];
+        $node = new ArrayExpression($elements, 1);
 
-        return array(
-            array($node, 'array("foo" => "bar", "bar" => "foo")'),
-        );
+        return [
+            [$node, '["foo" => "bar", "bar" => "foo"]'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php
index bf365de4..47fddcae 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/AssignNameTest.php
@@ -9,21 +9,24 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_AssignNameTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_AssignNameTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $node = new Twig_Node_Expression_AssignName('foo', 1);
+        $node = new AssignNameExpression('foo', 1);
 
         $this->assertEquals('foo', $node->getAttribute('name'));
     }
 
     public function getTests()
     {
-        $node = new Twig_Node_Expression_AssignName('foo', 1);
+        $node = new AssignNameExpression('foo', 1);
 
-        return array(
-            array($node, '$context["foo"]'),
-        );
+        return [
+            [$node, '$context["foo"]'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php
index 02310a1b..d91ee8e5 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AddTest.php
@@ -9,13 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Binary_AddTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\Binary\AddBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Binary_AddTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Add($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new AddBinary($left, $right, 1);
 
         $this->assertEquals($left, $node->getNode('left'));
         $this->assertEquals($right, $node->getNode('right'));
@@ -23,12 +27,12 @@ class Twig_Tests_Node_Expression_Binary_AddTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Add($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new AddBinary($left, $right, 1);
 
-        return array(
-            array($node, '(1 + 2)'),
-        );
+        return [
+            [$node, '(1 + 2)'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php
index 2df3c8e4..61cc1c93 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/AndTest.php
@@ -9,13 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Binary_AndTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\Binary\AndBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Binary_AndTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_And($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new AndBinary($left, $right, 1);
 
         $this->assertEquals($left, $node->getNode('left'));
         $this->assertEquals($right, $node->getNode('right'));
@@ -23,12 +27,12 @@ class Twig_Tests_Node_Expression_Binary_AndTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_And($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new AndBinary($left, $right, 1);
 
-        return array(
-            array($node, '(1 && 2)'),
-        );
+        return [
+            [$node, '(1 && 2)'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php
index 759e4828..f8d4c6e6 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ConcatTest.php
@@ -9,13 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Binary_ConcatTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\Binary\ConcatBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Binary_ConcatTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Concat($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new ConcatBinary($left, $right, 1);
 
         $this->assertEquals($left, $node->getNode('left'));
         $this->assertEquals($right, $node->getNode('right'));
@@ -23,12 +27,12 @@ class Twig_Tests_Node_Expression_Binary_ConcatTest extends Twig_Test_NodeTestCas
 
     public function getTests()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Concat($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new ConcatBinary($left, $right, 1);
 
-        return array(
-            array($node, '(1 . 2)'),
-        );
+        return [
+            [$node, '(1 . 2)'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php
index 0e54b10a..b6054239 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/DivTest.php
@@ -9,13 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Binary_DivTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\Binary\DivBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Binary_DivTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Div($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new DivBinary($left, $right, 1);
 
         $this->assertEquals($left, $node->getNode('left'));
         $this->assertEquals($right, $node->getNode('right'));
@@ -23,12 +27,12 @@ class Twig_Tests_Node_Expression_Binary_DivTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Div($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new DivBinary($left, $right, 1);
 
-        return array(
-            array($node, '(1 / 2)'),
-        );
+        return [
+            [$node, '(1 / 2)'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php
index 5813dce6..cb27e007 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/FloorDivTest.php
@@ -9,13 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Binary_FloorDivTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\Binary\FloorDivBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Binary_FloorDivTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_FloorDiv($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new FloorDivBinary($left, $right, 1);
 
         $this->assertEquals($left, $node->getNode('left'));
         $this->assertEquals($right, $node->getNode('right'));
@@ -23,12 +27,12 @@ class Twig_Tests_Node_Expression_Binary_FloorDivTest extends Twig_Test_NodeTestC
 
     public function getTests()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_FloorDiv($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new FloorDivBinary($left, $right, 1);
 
-        return array(
-            array($node, '(int) floor((1 / 2))'),
-        );
+        return [
+            [$node, '(int) floor((1 / 2))'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php
index 4c663c78..c5497cd6 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/ModTest.php
@@ -9,13 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Binary_ModTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\Binary\ModBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Binary_ModTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Mod($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new ModBinary($left, $right, 1);
 
         $this->assertEquals($left, $node->getNode('left'));
         $this->assertEquals($right, $node->getNode('right'));
@@ -23,12 +27,12 @@ class Twig_Tests_Node_Expression_Binary_ModTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Mod($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new ModBinary($left, $right, 1);
 
-        return array(
-            array($node, '(1 % 2)'),
-        );
+        return [
+            [$node, '(1 % 2)'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php
index e92c95e6..3b19b058 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/MulTest.php
@@ -9,13 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Binary_MulTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\Binary\MulBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Binary_MulTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Mul($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new MulBinary($left, $right, 1);
 
         $this->assertEquals($left, $node->getNode('left'));
         $this->assertEquals($right, $node->getNode('right'));
@@ -23,12 +27,12 @@ class Twig_Tests_Node_Expression_Binary_MulTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Mul($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new MulBinary($left, $right, 1);
 
-        return array(
-            array($node, '(1 * 2)'),
-        );
+        return [
+            [$node, '(1 * 2)'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php
index ec37c83e..0f1c3bf4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/OrTest.php
@@ -9,13 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Binary_OrTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\Binary\OrBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Binary_OrTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Or($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new OrBinary($left, $right, 1);
 
         $this->assertEquals($left, $node->getNode('left'));
         $this->assertEquals($right, $node->getNode('right'));
@@ -23,12 +27,12 @@ class Twig_Tests_Node_Expression_Binary_OrTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Or($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new OrBinary($left, $right, 1);
 
-        return array(
-            array($node, '(1 || 2)'),
-        );
+        return [
+            [$node, '(1 || 2)'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php
index 061cb270..9955c4be 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Binary/SubTest.php
@@ -9,13 +9,17 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Binary_SubTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\Binary\SubBinary;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Binary_SubTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Sub($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new SubBinary($left, $right, 1);
 
         $this->assertEquals($left, $node->getNode('left'));
         $this->assertEquals($right, $node->getNode('right'));
@@ -23,12 +27,12 @@ class Twig_Tests_Node_Expression_Binary_SubTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $left = new Twig_Node_Expression_Constant(1, 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_Binary_Sub($left, $right, 1);
+        $left = new ConstantExpression(1, 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new SubBinary($left, $right, 1);
 
-        return array(
-            array($node, '(1 - 2)'),
-        );
+        return [
+            [$node, '(1 - 2)'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php
index 883bb612..15d28048 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/CallTest.php
@@ -9,123 +9,133 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Node\Expression\CallExpression;
+
 class Twig_Tests_Node_Expression_CallTest extends \PHPUnit\Framework\TestCase
 {
     public function testGetArguments()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
-        $this->assertEquals(array('U', null), $node->getArguments('date', array('format' => 'U', 'timestamp' => null)));
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'date']);
+        $this->assertEquals(['U', null], $this->getArguments($node, ['date', ['format' => 'U', 'timestamp' => null]]));
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Positional arguments cannot be used after named arguments for function "date".
      */
     public function testGetArgumentsWhenPositionalArgumentsAfterNamedArguments()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
-        $node->getArguments('date', array('timestamp' => 123456, 'Y-m-d'));
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'date']);
+        $this->getArguments($node, ['date', ['timestamp' => 123456, 'Y-m-d']]);
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Argument "format" is defined twice for function "date".
      */
     public function testGetArgumentsWhenArgumentIsDefinedTwice()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
-        $node->getArguments('date', array('Y-m-d', 'format' => 'U'));
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'date']);
+        $this->getArguments($node, ['date', ['Y-m-d', 'format' => 'U']]);
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown argument "unknown" for function "date(format, timestamp)".
      */
     public function testGetArgumentsWithWrongNamedArgumentName()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
-        $node->getArguments('date', array('Y-m-d', 'timestamp' => null, 'unknown' => ''));
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'date']);
+        $this->getArguments($node, ['date', ['Y-m-d', 'timestamp' => null, 'unknown' => '']]);
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown arguments "unknown1", "unknown2" for function "date(format, timestamp)".
      */
     public function testGetArgumentsWithWrongNamedArgumentNames()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'date'));
-        $node->getArguments('date', array('Y-m-d', 'timestamp' => null, 'unknown1' => '', 'unknown2' => ''));
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'date']);
+        $this->getArguments($node, ['date', ['Y-m-d', 'timestamp' => null, 'unknown1' => '', 'unknown2' => '']]);
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Argument "case_sensitivity" could not be assigned for function "substr_compare(main_str, str, offset, length, case_sensitivity)" because it is mapped to an internal PHP function which cannot determine default value for optional argument "length".
      */
     public function testResolveArgumentsWithMissingValueForOptionalArgument()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'substr_compare'));
-        $node->getArguments('substr_compare', array('abcd', 'bc', 'offset' => 1, 'case_sensitivity' => true));
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'substr_compare']);
+        $this->getArguments($node, ['substr_compare', ['abcd', 'bc', 'offset' => 1, 'case_sensitivity' => true]]);
     }
 
     public function testResolveArgumentsOnlyNecessaryArgumentsForCustomFunction()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'custom_function'));
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'custom_function']);
 
-        $this->assertEquals(array('arg1'), $node->getArguments(array($this, 'customFunction'), array('arg1' => 'arg1')));
+        $this->assertEquals(['arg1'], $this->getArguments($node, [[$this, 'customFunction'], ['arg1' => 'arg1']]));
     }
 
     public function testGetArgumentsForStaticMethod()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'custom_static_function'));
-        $this->assertEquals(array('arg1'), $node->getArguments(__CLASS__.'::customStaticFunction', array('arg1' => 'arg1')));
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'custom_static_function']);
+        $this->assertEquals(['arg1'], $this->getArguments($node, [__CLASS__.'::customStaticFunction', ['arg1' => 'arg1']]));
     }
 
     /**
-     * @expectedException        LogicException
-     * @expectedExceptionMessage The last parameter of "Twig_Tests_Node_Expression_CallTest::customFunctionWithArbitraryArguments" for function "foo" must be an array with default value, eg. "array $arg = array()".
+     * @expectedException        \LogicException
+     * @expectedExceptionMessage The last parameter of "Twig_Tests_Node_Expression_CallTest::customFunctionWithArbitraryArguments" for function "foo" must be an array with default value, eg. "array $arg = []".
      */
     public function testResolveArgumentsWithMissingParameterForArbitraryArguments()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'foo', 'is_variadic' => true));
-        $node->getArguments(array($this, 'customFunctionWithArbitraryArguments'), array());
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'foo', 'is_variadic' => true]);
+        $this->getArguments($node, [[$this, 'customFunctionWithArbitraryArguments'], []]);
     }
 
-    public static function customStaticFunction($arg1, $arg2 = 'default', $arg3 = array())
+    public static function customStaticFunction($arg1, $arg2 = 'default', $arg3 = [])
     {
     }
 
-    public function customFunction($arg1, $arg2 = 'default', $arg3 = array())
+    public function customFunction($arg1, $arg2 = 'default', $arg3 = [])
     {
     }
 
+    private function getArguments($call, $args)
+    {
+        $m = new \ReflectionMethod($call, 'getArguments');
+        $m->setAccessible(true);
+
+        return $m->invokeArgs($call, $args);
+    }
+
     public function customFunctionWithArbitraryArguments()
     {
     }
 
     /**
-     * @expectedException              LogicException
-     * @expectedExceptionMessageRegExp #^The last parameter of "custom_Twig_Tests_Node_Expression_CallTest_function" for function "foo" must be an array with default value, eg\. "array \$arg \= array\(\)"\.$#
+     * @expectedException              \LogicException
+     * @expectedExceptionMessageRegExp #^The last parameter of "custom_Twig_Tests_Node_Expression_CallTest_function" for function "foo" must be an array with default value, eg\. "array \$arg \= \[\]"\.$#
      */
     public function testResolveArgumentsWithMissingParameterForArbitraryArgumentsOnFunction()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'foo', 'is_variadic' => true));
-        $node->getArguments('custom_Twig_Tests_Node_Expression_CallTest_function', array());
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'foo', 'is_variadic' => true]);
+        $node->getArguments('custom_Twig_Tests_Node_Expression_CallTest_function', []);
     }
 
     /**
-     * @expectedException              LogicException
-     * @expectedExceptionMessageRegExp #^The last parameter of "CallableTestClass\:\:__invoke" for function "foo" must be an array with default value, eg\. "array \$arg \= array\(\)"\.$#
+     * @expectedException              \LogicException
+     * @expectedExceptionMessageRegExp #^The last parameter of "CallableTestClass\:\:__invoke" for function "foo" must be an array with default value, eg\. "array \$arg \= \[\]"\.$#
      */
     public function testResolveArgumentsWithMissingParameterForArbitraryArgumentsOnObject()
     {
-        $node = new Twig_Tests_Node_Expression_Call(array(), array('type' => 'function', 'name' => 'foo', 'is_variadic' => true));
-        $node->getArguments(new CallableTestClass(), array());
+        $node = new Twig_Tests_Node_Expression_Call([], ['type' => 'function', 'name' => 'foo', 'is_variadic' => true]);
+        $node->getArguments(new CallableTestClass(), []);
     }
 }
 
-class Twig_Tests_Node_Expression_Call extends Twig_Node_Expression_Call
+class Twig_Tests_Node_Expression_Call extends CallExpression
 {
-    public function getArguments($callable, $arguments)
+    public function getArguments($callable = null, $arguments)
     {
         return parent::getArguments($callable, $arguments);
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php
index a3e8badf..32be4d0e 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConditionalTest.php
@@ -9,14 +9,18 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_ConditionalTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ConditionalExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_ConditionalTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr1 = new Twig_Node_Expression_Constant(1, 1);
-        $expr2 = new Twig_Node_Expression_Constant(2, 1);
-        $expr3 = new Twig_Node_Expression_Constant(3, 1);
-        $node = new Twig_Node_Expression_Conditional($expr1, $expr2, $expr3, 1);
+        $expr1 = new ConstantExpression(1, 1);
+        $expr2 = new ConstantExpression(2, 1);
+        $expr3 = new ConstantExpression(3, 1);
+        $node = new ConditionalExpression($expr1, $expr2, $expr3, 1);
 
         $this->assertEquals($expr1, $node->getNode('expr1'));
         $this->assertEquals($expr2, $node->getNode('expr2'));
@@ -25,13 +29,13 @@ class Twig_Tests_Node_Expression_ConditionalTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $tests = array();
+        $tests = [];
 
-        $expr1 = new Twig_Node_Expression_Constant(1, 1);
-        $expr2 = new Twig_Node_Expression_Constant(2, 1);
-        $expr3 = new Twig_Node_Expression_Constant(3, 1);
-        $node = new Twig_Node_Expression_Conditional($expr1, $expr2, $expr3, 1);
-        $tests[] = array($node, '((1) ? (2) : (3))');
+        $expr1 = new ConstantExpression(1, 1);
+        $expr2 = new ConstantExpression(2, 1);
+        $expr3 = new ConstantExpression(3, 1);
+        $node = new ConditionalExpression($expr1, $expr2, $expr3, 1);
+        $tests[] = [$node, '((1) ? (2) : (3))'];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php
index 2ff93182..ae38101b 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ConstantTest.php
@@ -9,21 +9,24 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_ConstantTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_ConstantTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $node = new Twig_Node_Expression_Constant('foo', 1);
+        $node = new ConstantExpression('foo', 1);
 
         $this->assertEquals('foo', $node->getAttribute('value'));
     }
 
     public function getTests()
     {
-        $tests = array();
+        $tests = [];
 
-        $node = new Twig_Node_Expression_Constant('foo', 1);
-        $tests[] = array($node, '"foo"');
+        $node = new ConstantExpression('foo', 1);
+        $tests[] = [$node, '"foo"'];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
index 773375c9..ce1f45f0 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/FilterTest.php
@@ -9,14 +9,23 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_FilterTest extends Twig_Test_NodeTestCase
+use Twig\Environment;
+use Twig\Loader\ArrayLoader;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\FilterExpression;
+use Twig\Node\Node;
+use Twig\Test\NodeTestCase;
+use Twig\TwigFilter;
+
+class Twig_Tests_Node_Expression_FilterTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Constant('foo', 1);
-        $name = new Twig_Node_Expression_Constant('upper', 1);
-        $args = new Twig_Node();
-        $node = new Twig_Node_Expression_Filter($expr, $name, $args, 1);
+        $expr = new ConstantExpression('foo', 1);
+        $name = new ConstantExpression('upper', 1);
+        $args = new Node();
+        $node = new FilterExpression($expr, $name, $args, 1);
 
         $this->assertEquals($expr, $node->getNode('node'));
         $this->assertEquals($name, $node->getNode('filter'));
@@ -25,130 +34,127 @@ class Twig_Tests_Node_Expression_FilterTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $environment = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $environment->addFilter(new Twig_SimpleFilter('bar', 'bar', array('needs_environment' => true)));
-        $environment->addFilter(new Twig_SimpleFilter('barbar', 'twig_tests_filter_barbar', array('needs_context' => true, 'is_variadic' => true)));
+        $environment = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $environment->addFilter(new TwigFilter('bar', 'twig_tests_filter_dummy', ['needs_environment' => true]));
+        $environment->addFilter(new TwigFilter('barbar', 'twig_tests_filter_barbar', ['needs_context' => true, 'is_variadic' => true]));
 
-        $tests = array();
+        $tests = [];
 
-        $expr = new Twig_Node_Expression_Constant('foo', 1);
+        $expr = new ConstantExpression('foo', 1);
         $node = $this->createFilter($expr, 'upper');
-        $node = $this->createFilter($node, 'number_format', array(new Twig_Node_Expression_Constant(2, 1), new Twig_Node_Expression_Constant('.', 1), new Twig_Node_Expression_Constant(',', 1)));
+        $node = $this->createFilter($node, 'number_format', [new ConstantExpression(2, 1), new ConstantExpression('.', 1), new ConstantExpression(',', 1)]);
 
-        if (function_exists('mb_get_info')) {
-            $tests[] = array($node, 'twig_number_format_filter($this->env, twig_upper_filter($this->env, "foo"), 2, ".", ",")');
-        } else {
-            $tests[] = array($node, 'twig_number_format_filter($this->env, strtoupper("foo"), 2, ".", ",")');
-        }
+        $tests[] = [$node, 'twig_number_format_filter($this->env, twig_upper_filter($this->env, "foo"), 2, ".", ",")'];
 
         // named arguments
-        $date = new Twig_Node_Expression_Constant(0, 1);
-        $node = $this->createFilter($date, 'date', array(
-            'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1),
-            'format' => new Twig_Node_Expression_Constant('d/m/Y H:i:s P', 1),
-        ));
-        $tests[] = array($node, 'twig_date_format_filter($this->env, 0, "d/m/Y H:i:s P", "America/Chicago")');
+        $date = new ConstantExpression(0, 1);
+        $node = $this->createFilter($date, 'date', [
+            'timezone' => new ConstantExpression('America/Chicago', 1),
+            'format' => new ConstantExpression('d/m/Y H:i:s P', 1),
+        ]);
+        $tests[] = [$node, 'twig_date_format_filter($this->env, 0, "d/m/Y H:i:s P", "America/Chicago")'];
 
         // skip an optional argument
-        $date = new Twig_Node_Expression_Constant(0, 1);
-        $node = $this->createFilter($date, 'date', array(
-            'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1),
-        ));
-        $tests[] = array($node, 'twig_date_format_filter($this->env, 0, null, "America/Chicago")');
+        $date = new ConstantExpression(0, 1);
+        $node = $this->createFilter($date, 'date', [
+            'timezone' => new ConstantExpression('America/Chicago', 1),
+        ]);
+        $tests[] = [$node, 'twig_date_format_filter($this->env, 0, null, "America/Chicago")'];
 
         // underscores vs camelCase for named arguments
-        $string = new Twig_Node_Expression_Constant('abc', 1);
-        $node = $this->createFilter($string, 'reverse', array(
-            'preserve_keys' => new Twig_Node_Expression_Constant(true, 1),
-        ));
-        $tests[] = array($node, 'twig_reverse_filter($this->env, "abc", true)');
-        $node = $this->createFilter($string, 'reverse', array(
-            'preserveKeys' => new Twig_Node_Expression_Constant(true, 1),
-        ));
-        $tests[] = array($node, 'twig_reverse_filter($this->env, "abc", true)');
+        $string = new ConstantExpression('abc', 1);
+        $node = $this->createFilter($string, 'reverse', [
+            'preserve_keys' => new ConstantExpression(true, 1),
+        ]);
+        $tests[] = [$node, 'twig_reverse_filter($this->env, "abc", true)'];
+        $node = $this->createFilter($string, 'reverse', [
+            'preserveKeys' => new ConstantExpression(true, 1),
+        ]);
+        $tests[] = [$node, 'twig_reverse_filter($this->env, "abc", true)'];
 
         // filter as an anonymous function
-        if (PHP_VERSION_ID >= 50300) {
-            $node = $this->createFilter(new Twig_Node_Expression_Constant('foo', 1), 'anonymous');
-            $tests[] = array($node, 'call_user_func_array($this->env->getFilter(\'anonymous\')->getCallable(), array("foo"))');
-        }
+        $node = $this->createFilter(new ConstantExpression('foo', 1), 'anonymous');
+        $tests[] = [$node, 'call_user_func_array($this->env->getFilter(\'anonymous\')->getCallable(), ["foo"])'];
 
         // needs environment
         $node = $this->createFilter($string, 'bar');
-        $tests[] = array($node, 'bar($this->env, "abc")', $environment);
+        $tests[] = [$node, 'twig_tests_filter_dummy($this->env, "abc")', $environment];
 
-        $node = $this->createFilter($string, 'bar', array(new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'bar($this->env, "abc", "bar")', $environment);
+        $node = $this->createFilter($string, 'bar', [new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_filter_dummy($this->env, "abc", "bar")', $environment];
 
         // arbitrary named arguments
         $node = $this->createFilter($string, 'barbar');
-        $tests[] = array($node, 'twig_tests_filter_barbar($context, "abc")', $environment);
+        $tests[] = [$node, 'twig_tests_filter_barbar($context, "abc")', $environment];
 
-        $node = $this->createFilter($string, 'barbar', array('foo' => new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'twig_tests_filter_barbar($context, "abc", null, null, array("foo" => "bar"))', $environment);
+        $node = $this->createFilter($string, 'barbar', ['foo' => new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_filter_barbar($context, "abc", null, null, ["foo" => "bar"])', $environment];
 
-        $node = $this->createFilter($string, 'barbar', array('arg2' => new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'twig_tests_filter_barbar($context, "abc", null, "bar")', $environment);
+        $node = $this->createFilter($string, 'barbar', ['arg2' => new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_filter_barbar($context, "abc", null, "bar")', $environment];
 
-        $node = $this->createFilter($string, 'barbar', array(
-            new Twig_Node_Expression_Constant('1', 1),
-            new Twig_Node_Expression_Constant('2', 1),
-            new Twig_Node_Expression_Constant('3', 1),
-            'foo' => new Twig_Node_Expression_Constant('bar', 1),
-        ));
-        $tests[] = array($node, 'twig_tests_filter_barbar($context, "abc", "1", "2", array(0 => "3", "foo" => "bar"))', $environment);
+        $node = $this->createFilter($string, 'barbar', [
+            new ConstantExpression('1', 1),
+            new ConstantExpression('2', 1),
+            new ConstantExpression('3', 1),
+            'foo' => new ConstantExpression('bar', 1),
+        ]);
+        $tests[] = [$node, 'twig_tests_filter_barbar($context, "abc", "1", "2", [0 => "3", "foo" => "bar"])', $environment];
 
         return $tests;
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown argument "foobar" for filter "date(format, timezone)" at line 1.
      */
     public function testCompileWithWrongNamedArgumentName()
     {
-        $date = new Twig_Node_Expression_Constant(0, 1);
-        $node = $this->createFilter($date, 'date', array(
-            'foobar' => new Twig_Node_Expression_Constant('America/Chicago', 1),
-        ));
+        $date = new ConstantExpression(0, 1);
+        $node = $this->createFilter($date, 'date', [
+            'foobar' => new ConstantExpression('America/Chicago', 1),
+        ]);
 
         $compiler = $this->getCompiler();
         $compiler->compile($node);
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
-     * @expectedExceptionMessage Value for argument "from" is required for filter "replace".
+     * @expectedException        \Twig\Error\SyntaxError
+     * @expectedExceptionMessage Value for argument "from" is required for filter "replace" at line 1.
      */
     public function testCompileWithMissingNamedArgument()
     {
-        $value = new Twig_Node_Expression_Constant(0, 1);
-        $node = $this->createFilter($value, 'replace', array(
-            'to' => new Twig_Node_Expression_Constant('foo', 1),
-        ));
+        $value = new ConstantExpression(0, 1);
+        $node = $this->createFilter($value, 'replace', [
+            'to' => new ConstantExpression('foo', 1),
+        ]);
 
         $compiler = $this->getCompiler();
         $compiler->compile($node);
     }
 
-    protected function createFilter($node, $name, array $arguments = array())
+    protected function createFilter($node, $name, array $arguments = [])
     {
-        $name = new Twig_Node_Expression_Constant($name, 1);
-        $arguments = new Twig_Node($arguments);
+        $name = new ConstantExpression($name, 1);
+        $arguments = new Node($arguments);
 
-        return new Twig_Node_Expression_Filter($node, $name, $arguments, 1);
+        return new FilterExpression($node, $name, $arguments, 1);
     }
 
     protected function getEnvironment()
     {
-        if (PHP_VERSION_ID >= 50300) {
-            return include 'PHP53/FilterInclude.php';
-        }
+        $env = new Environment(new ArrayLoader([]));
+        $env->addFilter(new TwigFilter('anonymous', function () {}));
 
-        return parent::getEnvironment();
+        return $env;
     }
 }
 
-function twig_tests_filter_barbar($context, $string, $arg1 = null, $arg2 = null, array $args = array())
+function twig_tests_filter_dummy()
+{
+}
+
+function twig_tests_filter_barbar($context, $string, $arg1 = null, $arg2 = null, array $args = [])
 {
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
index 2e82e2f1..a747481d 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/FunctionTest.php
@@ -9,13 +9,22 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_FunctionTest extends Twig_Test_NodeTestCase
+use Twig\Environment;
+use Twig\Loader\ArrayLoader;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\FunctionExpression;
+use Twig\Node\Node;
+use Twig\Test\NodeTestCase;
+use Twig\TwigFunction;
+
+class Twig_Tests_Node_Expression_FunctionTest extends NodeTestCase
 {
     public function testConstructor()
     {
         $name = 'function';
-        $args = new Twig_Node();
-        $node = new Twig_Node_Expression_Function($name, $args, 1);
+        $args = new Node();
+        $node = new FunctionExpression($name, $args, 1);
 
         $this->assertEquals($name, $node->getAttribute('name'));
         $this->assertEquals($args, $node->getNode('arguments'));
@@ -23,88 +32,89 @@ class Twig_Tests_Node_Expression_FunctionTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $environment = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $environment->addFunction(new Twig_SimpleFunction('foo', 'foo', array()));
-        $environment->addFunction(new Twig_SimpleFunction('bar', 'bar', array('needs_environment' => true)));
-        $environment->addFunction(new Twig_SimpleFunction('foofoo', 'foofoo', array('needs_context' => true)));
-        $environment->addFunction(new Twig_SimpleFunction('foobar', 'foobar', array('needs_environment' => true, 'needs_context' => true)));
-        $environment->addFunction(new Twig_SimpleFunction('barbar', 'twig_tests_function_barbar', array('is_variadic' => true)));
+        $environment = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $environment->addFunction(new TwigFunction('foo', 'twig_tests_function_dummy', []));
+        $environment->addFunction(new TwigFunction('bar', 'twig_tests_function_dummy', ['needs_environment' => true]));
+        $environment->addFunction(new TwigFunction('foofoo', 'twig_tests_function_dummy', ['needs_context' => true]));
+        $environment->addFunction(new TwigFunction('foobar', 'twig_tests_function_dummy', ['needs_environment' => true, 'needs_context' => true]));
+        $environment->addFunction(new TwigFunction('barbar', 'twig_tests_function_barbar', ['is_variadic' => true]));
 
-        $tests = array();
+        $tests = [];
 
         $node = $this->createFunction('foo');
-        $tests[] = array($node, 'foo()', $environment);
+        $tests[] = [$node, 'twig_tests_function_dummy()', $environment];
 
-        $node = $this->createFunction('foo', array(new Twig_Node_Expression_Constant('bar', 1), new Twig_Node_Expression_Constant('foobar', 1)));
-        $tests[] = array($node, 'foo("bar", "foobar")', $environment);
+        $node = $this->createFunction('foo', [new ConstantExpression('bar', 1), new ConstantExpression('foobar', 1)]);
+        $tests[] = [$node, 'twig_tests_function_dummy("bar", "foobar")', $environment];
 
         $node = $this->createFunction('bar');
-        $tests[] = array($node, 'bar($this->env)', $environment);
+        $tests[] = [$node, 'twig_tests_function_dummy($this->env)', $environment];
 
-        $node = $this->createFunction('bar', array(new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'bar($this->env, "bar")', $environment);
+        $node = $this->createFunction('bar', [new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_function_dummy($this->env, "bar")', $environment];
 
         $node = $this->createFunction('foofoo');
-        $tests[] = array($node, 'foofoo($context)', $environment);
+        $tests[] = [$node, 'twig_tests_function_dummy($context)', $environment];
 
-        $node = $this->createFunction('foofoo', array(new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'foofoo($context, "bar")', $environment);
+        $node = $this->createFunction('foofoo', [new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_function_dummy($context, "bar")', $environment];
 
         $node = $this->createFunction('foobar');
-        $tests[] = array($node, 'foobar($this->env, $context)', $environment);
+        $tests[] = [$node, 'twig_tests_function_dummy($this->env, $context)', $environment];
 
-        $node = $this->createFunction('foobar', array(new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'foobar($this->env, $context, "bar")', $environment);
+        $node = $this->createFunction('foobar', [new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_function_dummy($this->env, $context, "bar")', $environment];
 
         // named arguments
-        $node = $this->createFunction('date', array(
-            'timezone' => new Twig_Node_Expression_Constant('America/Chicago', 1),
-            'date' => new Twig_Node_Expression_Constant(0, 1),
-        ));
-        $tests[] = array($node, 'twig_date_converter($this->env, 0, "America/Chicago")');
+        $node = $this->createFunction('date', [
+            'timezone' => new ConstantExpression('America/Chicago', 1),
+            'date' => new ConstantExpression(0, 1),
+        ]);
+        $tests[] = [$node, 'twig_date_converter($this->env, 0, "America/Chicago")'];
 
         // arbitrary named arguments
         $node = $this->createFunction('barbar');
-        $tests[] = array($node, 'twig_tests_function_barbar()', $environment);
+        $tests[] = [$node, 'twig_tests_function_barbar()', $environment];
 
-        $node = $this->createFunction('barbar', array('foo' => new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'twig_tests_function_barbar(null, null, array("foo" => "bar"))', $environment);
+        $node = $this->createFunction('barbar', ['foo' => new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_function_barbar(null, null, ["foo" => "bar"])', $environment];
 
-        $node = $this->createFunction('barbar', array('arg2' => new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'twig_tests_function_barbar(null, "bar")', $environment);
+        $node = $this->createFunction('barbar', ['arg2' => new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_function_barbar(null, "bar")', $environment];
 
-        $node = $this->createFunction('barbar', array(
-            new Twig_Node_Expression_Constant('1', 1),
-            new Twig_Node_Expression_Constant('2', 1),
-            new Twig_Node_Expression_Constant('3', 1),
-            'foo' => new Twig_Node_Expression_Constant('bar', 1),
-        ));
-        $tests[] = array($node, 'twig_tests_function_barbar("1", "2", array(0 => "3", "foo" => "bar"))', $environment);
+        $node = $this->createFunction('barbar', [
+            new ConstantExpression('1', 1),
+            new ConstantExpression('2', 1),
+            new ConstantExpression('3', 1),
+            'foo' => new ConstantExpression('bar', 1),
+        ]);
+        $tests[] = [$node, 'twig_tests_function_barbar("1", "2", [0 => "3", "foo" => "bar"])', $environment];
 
         // function as an anonymous function
-        if (PHP_VERSION_ID >= 50300) {
-            $node = $this->createFunction('anonymous', array(new Twig_Node_Expression_Constant('foo', 1)));
-            $tests[] = array($node, 'call_user_func_array($this->env->getFunction(\'anonymous\')->getCallable(), array("foo"))');
-        }
+        $node = $this->createFunction('anonymous', [new ConstantExpression('foo', 1)]);
+        $tests[] = [$node, 'call_user_func_array($this->env->getFunction(\'anonymous\')->getCallable(), ["foo"])'];
 
         return $tests;
     }
 
-    protected function createFunction($name, array $arguments = array())
+    protected function createFunction($name, array $arguments = [])
     {
-        return new Twig_Node_Expression_Function($name, new Twig_Node($arguments), 1);
+        return new FunctionExpression($name, new Node($arguments), 1);
     }
 
     protected function getEnvironment()
     {
-        if (PHP_VERSION_ID >= 50300) {
-            return include 'PHP53/FunctionInclude.php';
-        }
+        $env = new Environment(new ArrayLoader([]));
+        $env->addFunction(new TwigFunction('anonymous', function () {}));
 
-        return parent::getEnvironment();
+        return $env;
     }
 }
 
-function twig_tests_function_barbar($arg1 = null, $arg2 = null, array $args = array())
+function twig_tests_function_dummy()
+{
+}
+
+function twig_tests_function_barbar($arg1 = null, $arg2 = null, array $args = [])
 {
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php
index 2764478c..e02d25b4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/GetAttrTest.php
@@ -9,41 +9,49 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_GetAttrTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ArrayExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\GetAttrExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Template;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_GetAttrTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Name('foo', 1);
-        $attr = new Twig_Node_Expression_Constant('bar', 1);
-        $args = new Twig_Node_Expression_Array(array(), 1);
-        $args->addElement(new Twig_Node_Expression_Name('foo', 1));
-        $args->addElement(new Twig_Node_Expression_Constant('bar', 1));
-        $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_Template::ARRAY_CALL, 1);
+        $expr = new NameExpression('foo', 1);
+        $attr = new ConstantExpression('bar', 1);
+        $args = new ArrayExpression([], 1);
+        $args->addElement(new NameExpression('foo', 1));
+        $args->addElement(new ConstantExpression('bar', 1));
+        $node = new GetAttrExpression($expr, $attr, $args, Template::ARRAY_CALL, 1);
 
         $this->assertEquals($expr, $node->getNode('node'));
         $this->assertEquals($attr, $node->getNode('attribute'));
         $this->assertEquals($args, $node->getNode('arguments'));
-        $this->assertEquals(Twig_Template::ARRAY_CALL, $node->getAttribute('type'));
+        $this->assertEquals(Template::ARRAY_CALL, $node->getAttribute('type'));
     }
 
     public function getTests()
     {
-        $tests = array();
-
-        $expr = new Twig_Node_Expression_Name('foo', 1);
-        $attr = new Twig_Node_Expression_Constant('bar', 1);
-        $args = new Twig_Node_Expression_Array(array(), 1);
-        $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_Template::ANY_CALL, 1);
-        $tests[] = array($node, sprintf('%s%s, "bar", array())', $this->getAttributeGetter(), $this->getVariableGetter('foo', 1)));
-
-        $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_Template::ARRAY_CALL, 1);
-        $tests[] = array($node, sprintf('%s%s, "bar", array(), "array")', $this->getAttributeGetter(), $this->getVariableGetter('foo', 1)));
-
-        $args = new Twig_Node_Expression_Array(array(), 1);
-        $args->addElement(new Twig_Node_Expression_Name('foo', 1));
-        $args->addElement(new Twig_Node_Expression_Constant('bar', 1));
-        $node = new Twig_Node_Expression_GetAttr($expr, $attr, $args, Twig_Template::METHOD_CALL, 1);
-        $tests[] = array($node, sprintf('%s%s, "bar", array(0 => %s, 1 => "bar"), "method")', $this->getAttributeGetter(), $this->getVariableGetter('foo', 1), $this->getVariableGetter('foo')));
+        $tests = [];
+
+        $expr = new NameExpression('foo', 1);
+        $attr = new ConstantExpression('bar', 1);
+        $args = new ArrayExpression([], 1);
+        $node = new GetAttrExpression($expr, $attr, $args, Template::ANY_CALL, 1);
+        $tests[] = [$node, sprintf('%s%s, "bar", [], "any", false, false, false, 1)', $this->getAttributeGetter(), $this->getVariableGetter('foo', 1))];
+
+        $node = new GetAttrExpression($expr, $attr, $args, Template::ARRAY_CALL, 1);
+        $tests[] = [$node, '(($__internal_%s = // line 1'."\n".
+            '($context["foo"] ?? null)) && is_array($__internal_%s) || $__internal_%s instanceof ArrayAccess ? ($__internal_%s["bar"] ?? null) : null)', null, true, ];
+
+        $args = new ArrayExpression([], 1);
+        $args->addElement(new NameExpression('foo', 1));
+        $args->addElement(new ConstantExpression('bar', 1));
+        $node = new GetAttrExpression($expr, $attr, $args, Template::METHOD_CALL, 1);
+        $tests[] = [$node, sprintf('%s%s, "bar", [0 => %s, 1 => "bar"], "method", false, false, false, 1)', $this->getAttributeGetter(), $this->getVariableGetter('foo', 1), $this->getVariableGetter('foo'))];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php
index 70721a8b..fc41a766 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/NameTest.php
@@ -9,35 +9,36 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_NameTest extends Twig_Test_NodeTestCase
+use Twig\Environment;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\Expression\NameExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_NameTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $node = new Twig_Node_Expression_Name('foo', 1);
+        $node = new NameExpression('foo', 1);
 
         $this->assertEquals('foo', $node->getAttribute('name'));
     }
 
     public function getTests()
     {
-        $node = new Twig_Node_Expression_Name('foo', 1);
-        $context = new Twig_Node_Expression_Name('_context', 1);
-
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('strict_variables' => true));
-        $env1 = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('strict_variables' => false));
-
-        if (PHP_VERSION_ID >= 70000) {
-            $output = '($context["foo"] ?? $this->getContext($context, "foo"))';
-        } elseif (PHP_VERSION_ID >= 50400) {
-            $output = '(isset($context["foo"]) ? $context["foo"] : $this->getContext($context, "foo"))';
-        } else {
-            $output = '$this->getContext($context, "foo")';
-        }
-
-        return array(
-            array($node, "// line 1\n".$output, $env),
-            array($node, $this->getVariableGetter('foo', 1), $env1),
-            array($context, "// line 1\n\$context"),
-        );
+        $node = new NameExpression('foo', 1);
+        $self = new NameExpression('_self', 1);
+        $context = new NameExpression('_context', 1);
+
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['strict_variables' => true]);
+        $env1 = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['strict_variables' => false]);
+
+        $output = '(isset($context["foo"]) || array_key_exists("foo", $context) ? $context["foo"] : (function () { throw new RuntimeError(\'Variable "foo" does not exist.\', 1, $this->source); })())';
+
+        return [
+            [$node, "// line 1\n".$output, $env],
+            [$node, $this->getVariableGetter('foo', 1), $env1],
+            [$self, "// line 1\n\$this->getTemplateName()"],
+            [$context, "// line 1\n\$context"],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/NullCoalesceTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/NullCoalesceTest.php
index a37490ba..8574d109 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/NullCoalesceTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/NullCoalesceTest.php
@@ -9,23 +9,19 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_NullCoalesceTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\Expression\NullCoalesceExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_NullCoalesceTest extends NodeTestCase
 {
     public function getTests()
     {
-        $tests = array();
-
-        $left = new Twig_Node_Expression_Name('foo', 1);
-        $right = new Twig_Node_Expression_Constant(2, 1);
-        $node = new Twig_Node_Expression_NullCoalesce($left, $right, 1);
-        if (PHP_VERSION_ID >= 70000) {
-            $tests[] = array($node, "((// line 1\n\$context[\"foo\"]) ?? (2))");
-        } elseif (PHP_VERSION_ID >= 50400) {
-            $tests[] = array($node, "(((// line 1\narray_key_exists(\"foo\", \$context) &&  !(null === (isset(\$context[\"foo\"]) ? \$context[\"foo\"] : null)))) ? ((isset(\$context[\"foo\"]) ? \$context[\"foo\"] : null)) : (2))");
-        } else {
-            $tests[] = array($node, "(((// line 1\narray_key_exists(\"foo\", \$context) &&  !(null === \$this->getContext(\$context, \"foo\")))) ? (\$this->getContext(\$context, \"foo\")) : (2))");
-        }
+        $left = new NameExpression('foo', 1);
+        $right = new ConstantExpression(2, 1);
+        $node = new NullCoalesceExpression($left, $right, 1);
 
-        return $tests;
+        return [[$node, "((// line 1\n\$context[\"foo\"]) ?? (2))"]];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php
deleted file mode 100644
index b5394bcf..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FilterInclude.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-$env = new Twig_Environment(new Twig_Loader_Array(array()));
-$env->addFilter(new Twig_SimpleFilter('anonymous', function () {}));
-
-return $env;
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php
deleted file mode 100644
index e8f68c72..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/FunctionInclude.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-$env = new Twig_Environment(new Twig_Loader_Array(array()));
-$env->addFunction(new Twig_SimpleFunction('anonymous', function () {}));
-
-return $env;
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php
deleted file mode 100644
index 9f818bc4..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/PHP53/TestInclude.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-
-$env = new Twig_Environment(new Twig_Loader_Array(array()));
-$env->addTest(new Twig_SimpleTest('anonymous', function () {}));
-
-return $env;
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php
index ab2bbe07..0c3a9aaf 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/ParentTest.php
@@ -9,19 +9,22 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_ParentTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ParentExpression;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_ParentTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $node = new Twig_Node_Expression_Parent('foo', 1);
+        $node = new ParentExpression('foo', 1);
 
         $this->assertEquals('foo', $node->getAttribute('name'));
     }
 
     public function getTests()
     {
-        $tests = array();
-        $tests[] = array(new Twig_Node_Expression_Parent('foo', 1), '$this->renderParentBlock("foo", $context, $blocks)');
+        $tests = [];
+        $tests[] = [new ParentExpression('foo', 1), '$this->renderParentBlock("foo", $context, $blocks)'];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
index a5f96d24..6e761c05 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/TestTest.php
@@ -9,14 +9,24 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_TestTest extends Twig_Test_NodeTestCase
+use Twig\Environment;
+use Twig\Loader\ArrayLoader;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\Test\NullTest;
+use Twig\Node\Expression\TestExpression;
+use Twig\Node\Node;
+use Twig\Test\NodeTestCase;
+use Twig\TwigTest;
+
+class Twig_Tests_Node_Expression_TestTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Constant('foo', 1);
-        $name = new Twig_Node_Expression_Constant('null', 1);
-        $args = new Twig_Node();
-        $node = new Twig_Node_Expression_Test($expr, $name, $args, 1);
+        $expr = new ConstantExpression('foo', 1);
+        $name = new ConstantExpression('null', 1);
+        $args = new Node();
+        $node = new TestExpression($expr, $name, $args, 1);
 
         $this->assertEquals($expr, $node->getNode('node'));
         $this->assertEquals($args, $node->getNode('arguments'));
@@ -25,58 +35,55 @@ class Twig_Tests_Node_Expression_TestTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $environment = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $environment->addTest(new Twig_SimpleTest('barbar', 'twig_tests_test_barbar', array('is_variadic' => true, 'need_context' => true)));
+        $environment = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $environment->addTest(new TwigTest('barbar', 'twig_tests_test_barbar', ['is_variadic' => true, 'need_context' => true]));
 
-        $tests = array();
+        $tests = [];
 
-        $expr = new Twig_Node_Expression_Constant('foo', 1);
-        $node = new Twig_Node_Expression_Test_Null($expr, 'null', new Twig_Node(array()), 1);
-        $tests[] = array($node, '(null === "foo")');
+        $expr = new ConstantExpression('foo', 1);
+        $node = new NullTest($expr, 'null', new Node([]), 1);
+        $tests[] = [$node, '(null === "foo")'];
 
         // test as an anonymous function
-        if (PHP_VERSION_ID >= 50300) {
-            $node = $this->createTest(new Twig_Node_Expression_Constant('foo', 1), 'anonymous', array(new Twig_Node_Expression_Constant('foo', 1)));
-            $tests[] = array($node, 'call_user_func_array($this->env->getTest(\'anonymous\')->getCallable(), array("foo", "foo"))');
-        }
+        $node = $this->createTest(new ConstantExpression('foo', 1), 'anonymous', [new ConstantExpression('foo', 1)]);
+        $tests[] = [$node, 'call_user_func_array($this->env->getTest(\'anonymous\')->getCallable(), ["foo", "foo"])'];
 
         // arbitrary named arguments
-        $string = new Twig_Node_Expression_Constant('abc', 1);
+        $string = new ConstantExpression('abc', 1);
         $node = $this->createTest($string, 'barbar');
-        $tests[] = array($node, 'twig_tests_test_barbar("abc")', $environment);
+        $tests[] = [$node, 'twig_tests_test_barbar("abc")', $environment];
 
-        $node = $this->createTest($string, 'barbar', array('foo' => new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'twig_tests_test_barbar("abc", null, null, array("foo" => "bar"))', $environment);
+        $node = $this->createTest($string, 'barbar', ['foo' => new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_test_barbar("abc", null, null, ["foo" => "bar"])', $environment];
 
-        $node = $this->createTest($string, 'barbar', array('arg2' => new Twig_Node_Expression_Constant('bar', 1)));
-        $tests[] = array($node, 'twig_tests_test_barbar("abc", null, "bar")', $environment);
+        $node = $this->createTest($string, 'barbar', ['arg2' => new ConstantExpression('bar', 1)]);
+        $tests[] = [$node, 'twig_tests_test_barbar("abc", null, "bar")', $environment];
 
-        $node = $this->createTest($string, 'barbar', array(
-            new Twig_Node_Expression_Constant('1', 1),
-            new Twig_Node_Expression_Constant('2', 1),
-            new Twig_Node_Expression_Constant('3', 1),
-            'foo' => new Twig_Node_Expression_Constant('bar', 1),
-        ));
-        $tests[] = array($node, 'twig_tests_test_barbar("abc", "1", "2", array(0 => "3", "foo" => "bar"))', $environment);
+        $node = $this->createTest($string, 'barbar', [
+            new ConstantExpression('1', 1),
+            new ConstantExpression('2', 1),
+            new ConstantExpression('3', 1),
+            'foo' => new ConstantExpression('bar', 1),
+        ]);
+        $tests[] = [$node, 'twig_tests_test_barbar("abc", "1", "2", [0 => "3", "foo" => "bar"])', $environment];
 
         return $tests;
     }
 
-    protected function createTest($node, $name, array $arguments = array())
+    protected function createTest($node, $name, array $arguments = [])
     {
-        return new Twig_Node_Expression_Test($node, $name, new Twig_Node($arguments), 1);
+        return new TestExpression($node, $name, new Node($arguments), 1);
     }
 
     protected function getEnvironment()
     {
-        if (PHP_VERSION_ID >= 50300) {
-            return include 'PHP53/TestInclude.php';
-        }
+        $env = new Environment(new ArrayLoader([]));
+        $env->addTest(new TwigTest('anonymous', function () {}));
 
-        return parent::getEnvironment();
+        return $env;
     }
 }
 
-function twig_tests_test_barbar($string, $arg1 = null, $arg2 = null, array $args = array())
+function twig_tests_test_barbar($string, $arg1 = null, $arg2 = null, array $args = [])
 {
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php
index b6333711..6c976ad4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NegTest.php
@@ -9,24 +9,28 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Unary_NegTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\Unary\NegUnary;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Unary_NegTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Constant(1, 1);
-        $node = new Twig_Node_Expression_Unary_Neg($expr, 1);
+        $expr = new ConstantExpression(1, 1);
+        $node = new NegUnary($expr, 1);
 
         $this->assertEquals($expr, $node->getNode('node'));
     }
 
     public function getTests()
     {
-        $node = new Twig_Node_Expression_Constant(1, 1);
-        $node = new Twig_Node_Expression_Unary_Neg($node, 1);
+        $node = new ConstantExpression(1, 1);
+        $node = new NegUnary($node, 1);
 
-        return array(
-            array($node, '-1'),
-            array(new Twig_Node_Expression_Unary_Neg($node, 1), '- -1'),
-        );
+        return [
+            [$node, '-1'],
+            [new NegUnary($node, 1), '- -1'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php
index d7c6f85e..493a37e5 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/NotTest.php
@@ -9,23 +9,27 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Unary_NotTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\Unary\NotUnary;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Unary_NotTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Constant(1, 1);
-        $node = new Twig_Node_Expression_Unary_Not($expr, 1);
+        $expr = new ConstantExpression(1, 1);
+        $node = new NotUnary($expr, 1);
 
         $this->assertEquals($expr, $node->getNode('node'));
     }
 
     public function getTests()
     {
-        $node = new Twig_Node_Expression_Constant(1, 1);
-        $node = new Twig_Node_Expression_Unary_Not($node, 1);
+        $node = new ConstantExpression(1, 1);
+        $node = new NotUnary($node, 1);
 
-        return array(
-            array($node, '!1'),
-        );
+        return [
+            [$node, '!1'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php
index 057250f3..015446d4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/Expression/Unary/PosTest.php
@@ -9,23 +9,27 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_Expression_Unary_PosTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\Unary\PosUnary;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_Expression_Unary_PosTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Constant(1, 1);
-        $node = new Twig_Node_Expression_Unary_Pos($expr, 1);
+        $expr = new ConstantExpression(1, 1);
+        $node = new PosUnary($expr, 1);
 
         $this->assertEquals($expr, $node->getNode('node'));
     }
 
     public function getTests()
     {
-        $node = new Twig_Node_Expression_Constant(1, 1);
-        $node = new Twig_Node_Expression_Unary_Pos($node, 1);
+        $node = new ConstantExpression(1, 1);
+        $node = new PosUnary($node, 1);
 
-        return array(
-            array($node, '+1'),
-        );
+        return [
+            [$node, '+1'],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php b/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php
index 2bf4c7b4..47aefac4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/ForTest.php
@@ -9,47 +9,56 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_ForTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\ForNode;
+use Twig\Node\IfNode;
+use Twig\Node\Node;
+use Twig\Node\PrintNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_ForTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $keyTarget = new Twig_Node_Expression_AssignName('key', 1);
-        $valueTarget = new Twig_Node_Expression_AssignName('item', 1);
-        $seq = new Twig_Node_Expression_Name('items', 1);
-        $ifexpr = new Twig_Node_Expression_Constant(true, 1);
-        $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
+        $keyTarget = new AssignNameExpression('key', 1);
+        $valueTarget = new AssignNameExpression('item', 1);
+        $seq = new NameExpression('items', 1);
+        $ifexpr = new ConstantExpression(true, 1);
+        $body = new Node([new PrintNode(new NameExpression('foo', 1), 1)], [], 1);
         $else = null;
-        $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
+        $node = new ForNode($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
         $node->setAttribute('with_loop', false);
 
         $this->assertEquals($keyTarget, $node->getNode('key_target'));
         $this->assertEquals($valueTarget, $node->getNode('value_target'));
         $this->assertEquals($seq, $node->getNode('seq'));
         $this->assertTrue($node->getAttribute('ifexpr'));
-        $this->assertEquals('Twig_Node_If', get_class($node->getNode('body')));
+        $this->assertInstanceOf(IfNode::class, $node->getNode('body'));
         $this->assertEquals($body, $node->getNode('body')->getNode('tests')->getNode(1)->getNode(0));
         $this->assertFalse($node->hasNode('else'));
 
-        $else = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1);
-        $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
+        $else = new PrintNode(new NameExpression('foo', 1), 1);
+        $node = new ForNode($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
         $node->setAttribute('with_loop', false);
         $this->assertEquals($else, $node->getNode('else'));
     }
 
     public function getTests()
     {
-        $tests = array();
+        $tests = [];
 
-        $keyTarget = new Twig_Node_Expression_AssignName('key', 1);
-        $valueTarget = new Twig_Node_Expression_AssignName('item', 1);
-        $seq = new Twig_Node_Expression_Name('items', 1);
+        $keyTarget = new AssignNameExpression('key', 1);
+        $valueTarget = new AssignNameExpression('item', 1);
+        $seq = new NameExpression('items', 1);
         $ifexpr = null;
-        $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
+        $body = new Node([new PrintNode(new NameExpression('foo', 1), 1)], [], 1);
         $else = null;
-        $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
+        $node = new ForNode($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
         $node->setAttribute('with_loop', false);
 
-        $tests[] = array($node, <<<EOF
+        $tests[] = [$node, <<<EOF
 // line 1
 \$context['_parent'] = \$context;
 \$context['_seq'] = twig_ensure_traversable({$this->getVariableGetter('items')});
@@ -60,28 +69,28 @@ foreach (\$context['_seq'] as \$context["key"] => \$context["item"]) {
 unset(\$context['_seq'], \$context['_iterated'], \$context['key'], \$context['item'], \$context['_parent'], \$context['loop']);
 \$context = array_intersect_key(\$context, \$_parent) + \$_parent;
 EOF
-        );
+        ];
 
-        $keyTarget = new Twig_Node_Expression_AssignName('k', 1);
-        $valueTarget = new Twig_Node_Expression_AssignName('v', 1);
-        $seq = new Twig_Node_Expression_Name('values', 1);
+        $keyTarget = new AssignNameExpression('k', 1);
+        $valueTarget = new AssignNameExpression('v', 1);
+        $seq = new NameExpression('values', 1);
         $ifexpr = null;
-        $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
+        $body = new Node([new PrintNode(new NameExpression('foo', 1), 1)], [], 1);
         $else = null;
-        $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
+        $node = new ForNode($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
         $node->setAttribute('with_loop', true);
 
-        $tests[] = array($node, <<<EOF
+        $tests[] = [$node, <<<EOF
 // line 1
 \$context['_parent'] = \$context;
 \$context['_seq'] = twig_ensure_traversable({$this->getVariableGetter('values')});
-\$context['loop'] = array(
+\$context['loop'] = [
   'parent' => \$context['_parent'],
   'index0' => 0,
   'index'  => 1,
   'first'  => true,
-);
-if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {
+];
+if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof \Countable)) {
     \$length = count(\$context['_seq']);
     \$context['loop']['revindex0'] = \$length - 1;
     \$context['loop']['revindex'] = \$length;
@@ -103,27 +112,27 @@ foreach (\$context['_seq'] as \$context["k"] => \$context["v"]) {
 unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']);
 \$context = array_intersect_key(\$context, \$_parent) + \$_parent;
 EOF
-        );
+        ];
 
-        $keyTarget = new Twig_Node_Expression_AssignName('k', 1);
-        $valueTarget = new Twig_Node_Expression_AssignName('v', 1);
-        $seq = new Twig_Node_Expression_Name('values', 1);
-        $ifexpr = new Twig_Node_Expression_Constant(true, 1);
-        $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
+        $keyTarget = new AssignNameExpression('k', 1);
+        $valueTarget = new AssignNameExpression('v', 1);
+        $seq = new NameExpression('values', 1);
+        $ifexpr = new ConstantExpression(true, 1);
+        $body = new Node([new PrintNode(new NameExpression('foo', 1), 1)], [], 1);
         $else = null;
-        $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
+        $node = new ForNode($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
         $node->setAttribute('with_loop', true);
 
-        $tests[] = array($node, <<<EOF
+        $tests[] = [$node, <<<EOF
 // line 1
 \$context['_parent'] = \$context;
 \$context['_seq'] = twig_ensure_traversable({$this->getVariableGetter('values')});
-\$context['loop'] = array(
+\$context['loop'] = [
   'parent' => \$context['_parent'],
   'index0' => 0,
   'index'  => 1,
   'first'  => true,
-);
+];
 foreach (\$context['_seq'] as \$context["k"] => \$context["v"]) {
     if (true) {
         echo {$this->getVariableGetter('foo')};
@@ -136,29 +145,29 @@ foreach (\$context['_seq'] as \$context["k"] => \$context["v"]) {
 unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']);
 \$context = array_intersect_key(\$context, \$_parent) + \$_parent;
 EOF
-        );
+        ];
 
-        $keyTarget = new Twig_Node_Expression_AssignName('k', 1);
-        $valueTarget = new Twig_Node_Expression_AssignName('v', 1);
-        $seq = new Twig_Node_Expression_Name('values', 1);
+        $keyTarget = new AssignNameExpression('k', 1);
+        $valueTarget = new AssignNameExpression('v', 1);
+        $seq = new NameExpression('values', 1);
         $ifexpr = null;
-        $body = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1)), array(), 1);
-        $else = new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1);
-        $node = new Twig_Node_For($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
+        $body = new Node([new PrintNode(new NameExpression('foo', 1), 1)], [], 1);
+        $else = new PrintNode(new NameExpression('foo', 1), 1);
+        $node = new ForNode($keyTarget, $valueTarget, $seq, $ifexpr, $body, $else, 1);
         $node->setAttribute('with_loop', true);
 
-        $tests[] = array($node, <<<EOF
+        $tests[] = [$node, <<<EOF
 // line 1
 \$context['_parent'] = \$context;
 \$context['_seq'] = twig_ensure_traversable({$this->getVariableGetter('values')});
 \$context['_iterated'] = false;
-\$context['loop'] = array(
+\$context['loop'] = [
   'parent' => \$context['_parent'],
   'index0' => 0,
   'index'  => 1,
   'first'  => true,
-);
-if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof Countable)) {
+];
+if (is_array(\$context['_seq']) || (is_object(\$context['_seq']) && \$context['_seq'] instanceof \Countable)) {
     \$length = count(\$context['_seq']);
     \$context['loop']['revindex0'] = \$length - 1;
     \$context['loop']['revindex'] = \$length;
@@ -184,7 +193,7 @@ if (!\$context['_iterated']) {
 unset(\$context['_seq'], \$context['_iterated'], \$context['k'], \$context['v'], \$context['_parent'], \$context['loop']);
 \$context = array_intersect_key(\$context, \$_parent) + \$_parent;
 EOF
-        );
+        ];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php b/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php
index 4ab0e4cc..82a69593 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/IfTest.php
@@ -9,54 +9,61 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_IfTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\IfNode;
+use Twig\Node\Node;
+use Twig\Node\PrintNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_IfTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $t = new Twig_Node(array(
-            new Twig_Node_Expression_Constant(true, 1),
-            new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1),
-        ), array(), 1);
+        $t = new Node([
+            new ConstantExpression(true, 1),
+            new PrintNode(new NameExpression('foo', 1), 1),
+        ], [], 1);
         $else = null;
-        $node = new Twig_Node_If($t, $else, 1);
+        $node = new IfNode($t, $else, 1);
 
         $this->assertEquals($t, $node->getNode('tests'));
         $this->assertFalse($node->hasNode('else'));
 
-        $else = new Twig_Node_Print(new Twig_Node_Expression_Name('bar', 1), 1);
-        $node = new Twig_Node_If($t, $else, 1);
+        $else = new PrintNode(new NameExpression('bar', 1), 1);
+        $node = new IfNode($t, $else, 1);
         $this->assertEquals($else, $node->getNode('else'));
     }
 
     public function getTests()
     {
-        $tests = array();
+        $tests = [];
 
-        $t = new Twig_Node(array(
-            new Twig_Node_Expression_Constant(true, 1),
-            new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1),
-        ), array(), 1);
+        $t = new Node([
+            new ConstantExpression(true, 1),
+            new PrintNode(new NameExpression('foo', 1), 1),
+        ], [], 1);
         $else = null;
-        $node = new Twig_Node_If($t, $else, 1);
+        $node = new IfNode($t, $else, 1);
 
-        $tests[] = array($node, <<<EOF
+        $tests[] = [$node, <<<EOF
 // line 1
 if (true) {
     echo {$this->getVariableGetter('foo')};
 }
 EOF
-        );
+        ];
 
-        $t = new Twig_Node(array(
-            new Twig_Node_Expression_Constant(true, 1),
-            new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1),
-            new Twig_Node_Expression_Constant(false, 1),
-            new Twig_Node_Print(new Twig_Node_Expression_Name('bar', 1), 1),
-        ), array(), 1);
+        $t = new Node([
+            new ConstantExpression(true, 1),
+            new PrintNode(new NameExpression('foo', 1), 1),
+            new ConstantExpression(false, 1),
+            new PrintNode(new NameExpression('bar', 1), 1),
+        ], [], 1);
         $else = null;
-        $node = new Twig_Node_If($t, $else, 1);
+        $node = new IfNode($t, $else, 1);
 
-        $tests[] = array($node, <<<EOF
+        $tests[] = [$node, <<<EOF
 // line 1
 if (true) {
     echo {$this->getVariableGetter('foo')};
@@ -64,16 +71,16 @@ if (true) {
     echo {$this->getVariableGetter('bar')};
 }
 EOF
-        );
+        ];
 
-        $t = new Twig_Node(array(
-            new Twig_Node_Expression_Constant(true, 1),
-            new Twig_Node_Print(new Twig_Node_Expression_Name('foo', 1), 1),
-        ), array(), 1);
-        $else = new Twig_Node_Print(new Twig_Node_Expression_Name('bar', 1), 1);
-        $node = new Twig_Node_If($t, $else, 1);
+        $t = new Node([
+            new ConstantExpression(true, 1),
+            new PrintNode(new NameExpression('foo', 1), 1),
+        ], [], 1);
+        $else = new PrintNode(new NameExpression('bar', 1), 1);
+        $node = new IfNode($t, $else, 1);
 
-        $tests[] = array($node, <<<EOF
+        $tests[] = [$node, <<<EOF
 // line 1
 if (true) {
     echo {$this->getVariableGetter('foo')};
@@ -81,7 +88,7 @@ if (true) {
     echo {$this->getVariableGetter('bar')};
 }
 EOF
-        );
+        ];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php b/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php
index 36525b25..f811bfb4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/ImportTest.php
@@ -9,13 +9,18 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_ImportTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\ImportNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_ImportTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $macro = new Twig_Node_Expression_Constant('foo.twig', 1);
-        $var = new Twig_Node_Expression_AssignName('macro', 1);
-        $node = new Twig_Node_Import($macro, $var, 1);
+        $macro = new ConstantExpression('foo.twig', 1);
+        $var = new AssignNameExpression('macro', 1);
+        $node = new ImportNode($macro, $var, 1);
 
         $this->assertEquals($macro, $node->getNode('expr'));
         $this->assertEquals($var, $node->getNode('var'));
@@ -23,17 +28,17 @@ class Twig_Tests_Node_ImportTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $tests = array();
+        $tests = [];
 
-        $macro = new Twig_Node_Expression_Constant('foo.twig', 1);
-        $var = new Twig_Node_Expression_AssignName('macro', 1);
-        $node = new Twig_Node_Import($macro, $var, 1);
+        $macro = new ConstantExpression('foo.twig', 1);
+        $var = new AssignNameExpression('macro', 1);
+        $node = new ImportNode($macro, $var, 1);
 
-        $tests[] = array($node, <<<EOF
+        $tests[] = [$node, <<<EOF
 // line 1
-\$context["macro"] = \$this->loadTemplate("foo.twig", null, 1);
+\$macros["macro"] = \$this->macros["macro"] = \$this->loadTemplate("foo.twig", null, 1)->unwrap();
 EOF
-        );
+        ];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php b/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php
index d801f338..ae8ff074 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/IncludeTest.php
@@ -9,74 +9,84 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_IncludeTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ArrayExpression;
+use Twig\Node\Expression\ConditionalExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\IncludeNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_IncludeTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Constant('foo.twig', 1);
-        $node = new Twig_Node_Include($expr, null, false, false, 1);
+        $expr = new ConstantExpression('foo.twig', 1);
+        $node = new IncludeNode($expr, null, false, false, 1);
 
         $this->assertFalse($node->hasNode('variables'));
         $this->assertEquals($expr, $node->getNode('expr'));
         $this->assertFalse($node->getAttribute('only'));
 
-        $vars = new Twig_Node_Expression_Array(array(new Twig_Node_Expression_Constant('foo', 1), new Twig_Node_Expression_Constant(true, 1)), 1);
-        $node = new Twig_Node_Include($expr, $vars, true, false, 1);
+        $vars = new ArrayExpression([new ConstantExpression('foo', 1), new ConstantExpression(true, 1)], 1);
+        $node = new IncludeNode($expr, $vars, true, false, 1);
         $this->assertEquals($vars, $node->getNode('variables'));
         $this->assertTrue($node->getAttribute('only'));
     }
 
     public function getTests()
     {
-        $tests = array();
+        $tests = [];
 
-        $expr = new Twig_Node_Expression_Constant('foo.twig', 1);
-        $node = new Twig_Node_Include($expr, null, false, false, 1);
-        $tests[] = array($node, <<<EOF
+        $expr = new ConstantExpression('foo.twig', 1);
+        $node = new IncludeNode($expr, null, false, false, 1);
+        $tests[] = [$node, <<<EOF
 // line 1
 \$this->loadTemplate("foo.twig", null, 1)->display(\$context);
 EOF
-        );
+        ];
 
-        $expr = new Twig_Node_Expression_Conditional(
-                        new Twig_Node_Expression_Constant(true, 1),
-                        new Twig_Node_Expression_Constant('foo', 1),
-                        new Twig_Node_Expression_Constant('foo', 1),
+        $expr = new ConditionalExpression(
+                        new ConstantExpression(true, 1),
+                        new ConstantExpression('foo', 1),
+                        new ConstantExpression('foo', 1),
                         0
                     );
-        $node = new Twig_Node_Include($expr, null, false, false, 1);
-        $tests[] = array($node, <<<EOF
+        $node = new IncludeNode($expr, null, false, false, 1);
+        $tests[] = [$node, <<<EOF
 // line 1
 \$this->loadTemplate(((true) ? ("foo") : ("foo")), null, 1)->display(\$context);
 EOF
-        );
+        ];
 
-        $expr = new Twig_Node_Expression_Constant('foo.twig', 1);
-        $vars = new Twig_Node_Expression_Array(array(new Twig_Node_Expression_Constant('foo', 1), new Twig_Node_Expression_Constant(true, 1)), 1);
-        $node = new Twig_Node_Include($expr, $vars, false, false, 1);
-        $tests[] = array($node, <<<EOF
+        $expr = new ConstantExpression('foo.twig', 1);
+        $vars = new ArrayExpression([new ConstantExpression('foo', 1), new ConstantExpression(true, 1)], 1);
+        $node = new IncludeNode($expr, $vars, false, false, 1);
+        $tests[] = [$node, <<<EOF
 // line 1
-\$this->loadTemplate("foo.twig", null, 1)->display(array_merge(\$context, array("foo" => true)));
+\$this->loadTemplate("foo.twig", null, 1)->display(twig_array_merge(\$context, ["foo" => true]));
 EOF
-        );
+        ];
 
-        $node = new Twig_Node_Include($expr, $vars, true, false, 1);
-        $tests[] = array($node, <<<EOF
+        $node = new IncludeNode($expr, $vars, true, false, 1);
+        $tests[] = [$node, <<<EOF
 // line 1
-\$this->loadTemplate("foo.twig", null, 1)->display(array("foo" => true));
+\$this->loadTemplate("foo.twig", null, 1)->display(twig_to_array(["foo" => true]));
 EOF
-        );
+        ];
 
-        $node = new Twig_Node_Include($expr, $vars, true, true, 1);
-        $tests[] = array($node, <<<EOF
+        $node = new IncludeNode($expr, $vars, true, true, 1);
+        $tests[] = [$node, <<<EOF
 // line 1
+\$__internal_%s = null;
 try {
-    \$this->loadTemplate("foo.twig", null, 1)->display(array("foo" => true));
-} catch (Twig_Error_Loader \$e) {
+    \$__internal_%s =     \$this->loadTemplate("foo.twig", null, 1);
+} catch (LoaderError \$e) {
     // ignore missing template
 }
+if (\$__internal_%s) {
+    \$__internal_%s->display(twig_to_array(["foo" => true]));
+}
 EOF
-        );
+        , null, true];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php b/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
index c7edfa25..afa68adf 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/MacroTest.php
@@ -9,13 +9,20 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_MacroTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\MacroNode;
+use Twig\Node\Node;
+use Twig\Node\TextNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_MacroTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $body = new Twig_Node_Text('foo', 1);
-        $arguments = new Twig_Node(array(new Twig_Node_Expression_Name('foo', 1)), array(), 1);
-        $node = new Twig_Node_Macro('foo', $body, $arguments, 1);
+        $body = new TextNode('foo', 1);
+        $arguments = new Node([new NameExpression('foo', 1)], [], 1);
+        $node = new MacroNode('foo', $body, $arguments, 1);
 
         $this->assertEquals($body, $node->getNode('body'));
         $this->assertEquals($arguments, $node->getNode('arguments'));
@@ -24,51 +31,38 @@ class Twig_Tests_Node_MacroTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $body = new Twig_Node_Text('foo', 1);
-        $arguments = new Twig_Node(array(
-            'foo' => new Twig_Node_Expression_Constant(null, 1),
-            'bar' => new Twig_Node_Expression_Constant('Foo', 1),
-        ), array(), 1);
-        $node = new Twig_Node_Macro('foo', $body, $arguments, 1);
-
-        if (PHP_VERSION_ID >= 50600) {
-            $declaration = ', ...$__varargs__';
-            $varargs = '$__varargs__';
-        } else {
-            $declaration = '';
-            $varargs = 'func_num_args() > 2 ? array_slice(func_get_args(), 2) : array()';
-        }
+        $body = new TextNode('foo', 1);
+        $arguments = new Node([
+            'foo' => new ConstantExpression(null, 1),
+            'bar' => new ConstantExpression('Foo', 1),
+        ], [], 1);
+        $node = new MacroNode('foo', $body, $arguments, 1);
 
-        return array(
-            array($node, <<<EOF
+        return [
+            [$node, <<<EOF
 // line 1
-public function getfoo(\$__foo__ = null, \$__bar__ = "Foo"$declaration)
+public function macro_foo(\$__foo__ = null, \$__bar__ = "Foo", ...\$__varargs__)
 {
-    \$context = \$this->env->mergeGlobals(array(
+    \$macros = \$this->macros;
+    \$context = \$this->env->mergeGlobals([
         "foo" => \$__foo__,
         "bar" => \$__bar__,
-        "varargs" => $varargs,
-    ));
+        "varargs" => \$__varargs__,
+    ]);
 
-    \$blocks = array();
+    \$blocks = [];
 
-    ob_start();
+    ob_start(function () { return ''; });
     try {
         echo "foo";
-    } catch (Exception \$e) {
-        ob_end_clean();
 
-        throw \$e;
-    } catch (Throwable \$e) {
+        return ('' === \$tmp = ob_get_contents()) ? '' : new Markup(\$tmp, \$this->env->getCharset());
+    } finally {
         ob_end_clean();
-
-        throw \$e;
     }
-
-    return ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());
 }
 EOF
-            ),
-        );
+            ],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php b/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php
index 54a8989c..812b1ef0 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/ModuleTest.php
@@ -9,17 +9,30 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_ModuleTest extends Twig_Test_NodeTestCase
+use Twig\Environment;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Node\Expression\ConditionalExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\ImportNode;
+use Twig\Node\ModuleNode;
+use Twig\Node\Node;
+use Twig\Node\SetNode;
+use Twig\Node\TextNode;
+use Twig\Source;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_ModuleTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $body = new Twig_Node_Text('foo', 1);
-        $parent = new Twig_Node_Expression_Constant('layout.twig', 1);
-        $blocks = new Twig_Node();
-        $macros = new Twig_Node();
-        $traits = new Twig_Node();
-        $source = new Twig_Source('{{ foo }}', 'foo.twig');
-        $node = new Twig_Node_Module($body, $parent, $blocks, $macros, $traits, new Twig_Node(array()), $source);
+        $body = new TextNode('foo', 1);
+        $parent = new ConstantExpression('layout.twig', 1);
+        $blocks = new Node();
+        $macros = new Node();
+        $traits = new Node();
+        $source = new Source('{{ foo }}', 'foo.twig');
+        $node = new ModuleNode($body, $parent, $blocks, $macros, $traits, new Node([]), $source);
 
         $this->assertEquals($body, $node->getNode('body'));
         $this->assertEquals($blocks, $node->getNode('blocks'));
@@ -30,36 +43,54 @@ class Twig_Tests_Node_ModuleTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
 
-        $tests = array();
+        $tests = [];
 
-        $body = new Twig_Node_Text('foo', 1);
+        $body = new TextNode('foo', 1);
         $extends = null;
-        $blocks = new Twig_Node();
-        $macros = new Twig_Node();
-        $traits = new Twig_Node();
-        $source = new Twig_Source('{{ foo }}', 'foo.twig');
+        $blocks = new Node();
+        $macros = new Node();
+        $traits = new Node();
+        $source = new Source('{{ foo }}', 'foo.twig');
 
-        $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $source);
-        $tests[] = array($node, <<<EOF
+        $node = new ModuleNode($body, $extends, $blocks, $macros, $traits, new Node([]), $source);
+        $tests[] = [$node, <<<EOF
 <?php
 
+use Twig\Environment;
+use Twig\Error\LoaderError;
+use Twig\Error\RuntimeError;
+use Twig\Extension\SandboxExtension;
+use Twig\Markup;
+use Twig\Sandbox\SecurityError;
+use Twig\Sandbox\SecurityNotAllowedTagError;
+use Twig\Sandbox\SecurityNotAllowedFilterError;
+use Twig\Sandbox\SecurityNotAllowedFunctionError;
+use Twig\Source;
+use Twig\Template;
+
 /* foo.twig */
-class __TwigTemplate_%x extends Twig_Template
+class __TwigTemplate_%x extends \Twig\Template
 {
-    public function __construct(Twig_Environment \$env)
+    private \$source;
+    private \$macros = [];
+
+    public function __construct(Environment \$env)
     {
         parent::__construct(\$env);
 
+        \$this->source = \$this->getSourceContext();
+
         \$this->parent = false;
 
-        \$this->blocks = array(
-        );
+        \$this->blocks = [
+        ];
     }
 
-    protected function doDisplay(array \$context, array \$blocks = array())
+    protected function doDisplay(array \$context, array \$blocks = [])
     {
+        \$macros = \$this->macros;
         // line 1
         echo "foo";
     }
@@ -71,57 +102,67 @@ class __TwigTemplate_%x extends Twig_Template
 
     public function getDebugInfo()
     {
-        return array (  19 => 1,);
-    }
-
-    /** @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead */
-    public function getSource()
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', E_USER_DEPRECATED);
-
-        return \$this->getSourceContext()->getCode();
+        return array (  37 => 1,);
     }
 
     public function getSourceContext()
     {
-        return new Twig_Source("", "foo.twig", "");
+        return new Source("", "foo.twig", "");
     }
 }
 EOF
-        , $twig, true);
+        , $twig, true];
 
-        $import = new Twig_Node_Import(new Twig_Node_Expression_Constant('foo.twig', 1), new Twig_Node_Expression_AssignName('macro', 1), 2);
+        $import = new ImportNode(new ConstantExpression('foo.twig', 1), new AssignNameExpression('macro', 1), 2);
 
-        $body = new Twig_Node(array($import));
-        $extends = new Twig_Node_Expression_Constant('layout.twig', 1);
+        $body = new Node([$import]);
+        $extends = new ConstantExpression('layout.twig', 1);
 
-        $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $source);
-        $tests[] = array($node, <<<EOF
+        $node = new ModuleNode($body, $extends, $blocks, $macros, $traits, new Node([]), $source);
+        $tests[] = [$node, <<<EOF
 <?php
 
+use Twig\Environment;
+use Twig\Error\LoaderError;
+use Twig\Error\RuntimeError;
+use Twig\Extension\SandboxExtension;
+use Twig\Markup;
+use Twig\Sandbox\SecurityError;
+use Twig\Sandbox\SecurityNotAllowedTagError;
+use Twig\Sandbox\SecurityNotAllowedFilterError;
+use Twig\Sandbox\SecurityNotAllowedFunctionError;
+use Twig\Source;
+use Twig\Template;
+
 /* foo.twig */
-class __TwigTemplate_%x extends Twig_Template
+class __TwigTemplate_%x extends \Twig\Template
 {
-    public function __construct(Twig_Environment \$env)
+    private \$source;
+    private \$macros = [];
+
+    public function __construct(Environment \$env)
     {
         parent::__construct(\$env);
 
-        // line 1
-        \$this->parent = \$this->loadTemplate("layout.twig", "foo.twig", 1);
-        \$this->blocks = array(
-        );
+        \$this->source = \$this->getSourceContext();
+
+        \$this->blocks = [
+        ];
     }
 
     protected function doGetParent(array \$context)
     {
+        // line 1
         return "layout.twig";
     }
 
-    protected function doDisplay(array \$context, array \$blocks = array())
+    protected function doDisplay(array \$context, array \$blocks = [])
     {
+        \$macros = \$this->macros;
         // line 2
-        \$context["macro"] = \$this->loadTemplate("foo.twig", "foo.twig", 2);
+        \$macros["macro"] = \$this->macros["macro"] = \$this->loadTemplate("foo.twig", "foo.twig", 2)->unwrap();
         // line 1
+        \$this->parent = \$this->loadTemplate("layout.twig", "foo.twig", 1);
         \$this->parent->display(\$context, array_merge(\$this->blocks, \$blocks));
     }
 
@@ -137,50 +178,68 @@ class __TwigTemplate_%x extends Twig_Template
 
     public function getDebugInfo()
     {
-        return array (  26 => 1,  24 => 2,  11 => 1,);
-    }
-
-    /** @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead */
-    public function getSource()
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', E_USER_DEPRECATED);
-
-        return \$this->getSourceContext()->getCode();
+        return array (  43 => 1,  41 => 2,  34 => 1,);
     }
 
     public function getSourceContext()
     {
-        return new Twig_Source("", "foo.twig", "");
+        return new Source("", "foo.twig", "");
     }
 }
 EOF
-        , $twig, true);
-
-        $set = new Twig_Node_Set(false, new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 4))), new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 4))), 4);
-        $body = new Twig_Node(array($set));
-        $extends = new Twig_Node_Expression_Conditional(
-                        new Twig_Node_Expression_Constant(true, 2),
-                        new Twig_Node_Expression_Constant('foo', 2),
-                        new Twig_Node_Expression_Constant('foo', 2),
+        , $twig, true];
+
+        $set = new SetNode(false, new Node([new AssignNameExpression('foo', 4)]), new Node([new ConstantExpression('foo', 4)]), 4);
+        $body = new Node([$set]);
+        $extends = new ConditionalExpression(
+                        new ConstantExpression(true, 2),
+                        new ConstantExpression('foo', 2),
+                        new ConstantExpression('foo', 2),
                         2
                     );
 
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('debug' => true));
-        $node = new Twig_Node_Module($body, $extends, $blocks, $macros, $traits, new Twig_Node(array()), $source);
-        $tests[] = array($node, <<<EOF
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['debug' => true]);
+        $node = new ModuleNode($body, $extends, $blocks, $macros, $traits, new Node([]), $source);
+        $tests[] = [$node, <<<EOF
 <?php
 
+use Twig\Environment;
+use Twig\Error\LoaderError;
+use Twig\Error\RuntimeError;
+use Twig\Extension\SandboxExtension;
+use Twig\Markup;
+use Twig\Sandbox\SecurityError;
+use Twig\Sandbox\SecurityNotAllowedTagError;
+use Twig\Sandbox\SecurityNotAllowedFilterError;
+use Twig\Sandbox\SecurityNotAllowedFunctionError;
+use Twig\Source;
+use Twig\Template;
+
 /* foo.twig */
-class __TwigTemplate_%x extends Twig_Template
+class __TwigTemplate_%x extends \Twig\Template
 {
+    private \$source;
+    private \$macros = [];
+
+    public function __construct(Environment \$env)
+    {
+        parent::__construct(\$env);
+
+        \$this->source = \$this->getSourceContext();
+
+        \$this->blocks = [
+        ];
+    }
+
     protected function doGetParent(array \$context)
     {
         // line 2
         return \$this->loadTemplate(((true) ? ("foo") : ("foo")), "foo.twig", 2);
     }
 
-    protected function doDisplay(array \$context, array \$blocks = array())
+    protected function doDisplay(array \$context, array \$blocks = [])
     {
+        \$macros = \$this->macros;
         // line 4
         \$context["foo"] = "foo";
         // line 2
@@ -199,24 +258,16 @@ class __TwigTemplate_%x extends Twig_Template
 
     public function getDebugInfo()
     {
-        return array (  17 => 2,  15 => 4,  9 => 2,);
-    }
-
-    /** @deprecated since 1.27 (to be removed in 2.0). Use getSourceContext() instead */
-    public function getSource()
-    {
-        @trigger_error('The '.__METHOD__.' method is deprecated since version 1.27 and will be removed in 2.0. Use getSourceContext() instead.', E_USER_DEPRECATED);
-
-        return \$this->getSourceContext()->getCode();
+        return array (  43 => 2,  41 => 4,  34 => 2,);
     }
 
     public function getSourceContext()
     {
-        return new Twig_Source("{{ foo }}", "foo.twig", "");
+        return new Source("{{ foo }}", "foo.twig", "");
     }
 }
 EOF
-        , $twig, true);
+        , $twig, true];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php b/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php
index 4e0990fa..efb5ebaf 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/PrintTest.php
@@ -9,20 +9,24 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_PrintTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\PrintNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_PrintTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $expr = new Twig_Node_Expression_Constant('foo', 1);
-        $node = new Twig_Node_Print($expr, 1);
+        $expr = new ConstantExpression('foo', 1);
+        $node = new PrintNode($expr, 1);
 
         $this->assertEquals($expr, $node->getNode('expr'));
     }
 
     public function getTests()
     {
-        $tests = array();
-        $tests[] = array(new Twig_Node_Print(new Twig_Node_Expression_Constant('foo', 1), 1), "// line 1\necho \"foo\";");
+        $tests = [];
+        $tests[] = [new PrintNode(new ConstantExpression('foo', 1), 1), "// line 1\necho \"foo\";"];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php b/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php
index 56f48773..7dd3e08f 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/SandboxTest.php
@@ -9,35 +9,38 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_SandboxTest extends Twig_Test_NodeTestCase
+use Twig\Node\SandboxNode;
+use Twig\Node\TextNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_SandboxTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $body = new Twig_Node_Text('foo', 1);
-        $node = new Twig_Node_Sandbox($body, 1);
+        $body = new TextNode('foo', 1);
+        $node = new SandboxNode($body, 1);
 
         $this->assertEquals($body, $node->getNode('body'));
     }
 
     public function getTests()
     {
-        $tests = array();
+        $tests = [];
 
-        $body = new Twig_Node_Text('foo', 1);
-        $node = new Twig_Node_Sandbox($body, 1);
+        $body = new TextNode('foo', 1);
+        $node = new SandboxNode($body, 1);
 
-        $tests[] = array($node, <<<EOF
+        $tests[] = [$node, <<<EOF
 // line 1
-\$sandbox = \$this->env->getExtension('Twig_Extension_Sandbox');
-if (!\$alreadySandboxed = \$sandbox->isSandboxed()) {
-    \$sandbox->enableSandbox();
+if (!\$alreadySandboxed = \$this->sandbox->isSandboxed()) {
+    \$this->sandbox->enableSandbox();
 }
 echo "foo";
 if (!\$alreadySandboxed) {
-    \$sandbox->disableSandbox();
+    \$this->sandbox->disableSandbox();
 }
 EOF
-        );
+        ];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php b/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php
deleted file mode 100644
index 8bc8a755..00000000
--- a/vendor/twig/twig/test/Twig/Tests/Node/SandboxedPrintTest.php
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-class Twig_Tests_Node_SandboxedPrintTest extends Twig_Test_NodeTestCase
-{
-    public function testConstructor()
-    {
-        $node = new Twig_Node_SandboxedPrint($expr = new Twig_Node_Expression_Constant('foo', 1), 1);
-
-        $this->assertEquals($expr, $node->getNode('expr'));
-    }
-
-    public function getTests()
-    {
-        $tests = array();
-
-        $tests[] = array(new Twig_Node_SandboxedPrint(new Twig_Node_Expression_Constant('foo', 1), 1), <<<EOF
-// line 1
-echo \$this->env->getExtension('Twig_Extension_Sandbox')->ensureToStringAllowed("foo");
-EOF
-        );
-
-        return $tests;
-    }
-}
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php b/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php
index 62ad2803..ff4e43e4 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/SetTest.php
@@ -9,13 +9,22 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_SetTest extends Twig_Test_NodeTestCase
+use Twig\Node\Expression\AssignNameExpression;
+use Twig\Node\Expression\ConstantExpression;
+use Twig\Node\Expression\NameExpression;
+use Twig\Node\Node;
+use Twig\Node\PrintNode;
+use Twig\Node\SetNode;
+use Twig\Node\TextNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_SetTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1);
-        $values = new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 1)), array(), 1);
-        $node = new Twig_Node_Set(false, $names, $values, 1);
+        $names = new Node([new AssignNameExpression('foo', 1)], [], 1);
+        $values = new Node([new ConstantExpression('foo', 1)], [], 1);
+        $node = new SetNode(false, $names, $values, 1);
 
         $this->assertEquals($names, $node->getNode('names'));
         $this->assertEquals($values, $node->getNode('values'));
@@ -24,45 +33,45 @@ class Twig_Tests_Node_SetTest extends Twig_Test_NodeTestCase
 
     public function getTests()
     {
-        $tests = array();
+        $tests = [];
 
-        $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1);
-        $values = new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 1)), array(), 1);
-        $node = new Twig_Node_Set(false, $names, $values, 1);
-        $tests[] = array($node, <<<EOF
+        $names = new Node([new AssignNameExpression('foo', 1)], [], 1);
+        $values = new Node([new ConstantExpression('foo', 1)], [], 1);
+        $node = new SetNode(false, $names, $values, 1);
+        $tests[] = [$node, <<<EOF
 // line 1
 \$context["foo"] = "foo";
 EOF
-        );
+        ];
 
-        $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1);
-        $values = new Twig_Node(array(new Twig_Node_Print(new Twig_Node_Expression_Constant('foo', 1), 1)), array(), 1);
-        $node = new Twig_Node_Set(true, $names, $values, 1);
-        $tests[] = array($node, <<<EOF
+        $names = new Node([new AssignNameExpression('foo', 1)], [], 1);
+        $values = new Node([new PrintNode(new ConstantExpression('foo', 1), 1)], [], 1);
+        $node = new SetNode(true, $names, $values, 1);
+        $tests[] = [$node, <<<EOF
 // line 1
-ob_start();
+ob_start(function () { return ''; });
 echo "foo";
-\$context["foo"] = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());
+\$context["foo"] = ('' === \$tmp = ob_get_clean()) ? '' : new Markup(\$tmp, \$this->env->getCharset());
 EOF
-        );
+        ];
 
-        $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1)), array(), 1);
-        $values = new Twig_Node_Text('foo', 1);
-        $node = new Twig_Node_Set(true, $names, $values, 1);
-        $tests[] = array($node, <<<EOF
+        $names = new Node([new AssignNameExpression('foo', 1)], [], 1);
+        $values = new TextNode('foo', 1);
+        $node = new SetNode(true, $names, $values, 1);
+        $tests[] = [$node, <<<EOF
 // line 1
-\$context["foo"] = ('' === \$tmp = "foo") ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());
+\$context["foo"] = ('' === \$tmp = "foo") ? '' : new Markup(\$tmp, \$this->env->getCharset());
 EOF
-        );
+        ];
 
-        $names = new Twig_Node(array(new Twig_Node_Expression_AssignName('foo', 1), new Twig_Node_Expression_AssignName('bar', 1)), array(), 1);
-        $values = new Twig_Node(array(new Twig_Node_Expression_Constant('foo', 1), new Twig_Node_Expression_Name('bar', 1)), array(), 1);
-        $node = new Twig_Node_Set(false, $names, $values, 1);
-        $tests[] = array($node, <<<EOF
+        $names = new Node([new AssignNameExpression('foo', 1), new AssignNameExpression('bar', 1)], [], 1);
+        $values = new Node([new ConstantExpression('foo', 1), new NameExpression('bar', 1)], [], 1);
+        $node = new SetNode(false, $names, $values, 1);
+        $tests[] = [$node, <<<EOF
 // line 1
-list(\$context["foo"], \$context["bar"]) = array("foo", {$this->getVariableGetter('bar')});
+list(\$context["foo"], \$context["bar"]) = ["foo", {$this->getVariableGetter('bar')}];
 EOF
-        );
+        ];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php b/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php
index 222ca092..13f400fd 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/SpacelessTest.php
@@ -9,29 +9,34 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_SpacelessTest extends Twig_Test_NodeTestCase
+use Twig\Node\Node;
+use Twig\Node\SpacelessNode;
+use Twig\Node\TextNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_SpacelessTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $body = new Twig_Node(array(new Twig_Node_Text('<div>   <div>   foo   </div>   </div>', 1)));
-        $node = new Twig_Node_Spaceless($body, 1);
+        $body = new Node([new TextNode('<div>   <div>   foo   </div>   </div>', 1)]);
+        $node = new SpacelessNode($body, 1);
 
         $this->assertEquals($body, $node->getNode('body'));
     }
 
     public function getTests()
     {
-        $body = new Twig_Node(array(new Twig_Node_Text('<div>   <div>   foo   </div>   </div>', 1)));
-        $node = new Twig_Node_Spaceless($body, 1);
+        $body = new Node([new TextNode('<div>   <div>   foo   </div>   </div>', 1)]);
+        $node = new SpacelessNode($body, 1);
 
-        return array(
-            array($node, <<<EOF
+        return [
+            [$node, <<<EOF
 // line 1
-ob_start();
+ob_start(function () { return ''; });
 echo "<div>   <div>   foo   </div>   </div>";
 echo trim(preg_replace('/>\s+</', '><', ob_get_clean()));
 EOF
-            ),
-        );
+            ],
+        ];
     }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php b/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php
index ceaf67f4..6735083c 100644
--- a/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Node/TextTest.php
@@ -9,19 +9,22 @@
  * file that was distributed with this source code.
  */
 
-class Twig_Tests_Node_TextTest extends Twig_Test_NodeTestCase
+use Twig\Node\TextNode;
+use Twig\Test\NodeTestCase;
+
+class Twig_Tests_Node_TextTest extends NodeTestCase
 {
     public function testConstructor()
     {
-        $node = new Twig_Node_Text('foo', 1);
+        $node = new TextNode('foo', 1);
 
         $this->assertEquals('foo', $node->getAttribute('data'));
     }
 
     public function getTests()
     {
-        $tests = array();
-        $tests[] = array(new Twig_Node_Text('foo', 1), "// line 1\necho \"foo\";");
+        $tests = [];
+        $tests[] = [new TextNode('foo', 1), "// line 1\necho \"foo\";"];
 
         return $tests;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php b/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
index 92c0ecac..6f8fd5c1 100644
--- a/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/NodeVisitor/OptimizerTest.php
@@ -8,44 +8,38 @@
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
+
+use Twig\Environment;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\Expression\BlockReferenceExpression;
+use Twig\Node\Expression\ParentExpression;
+use Twig\Node\ForNode;
+use Twig\Node\Node;
+use Twig\Source;
+
 class Twig_Tests_NodeVisitor_OptimizerTest extends \PHPUnit\Framework\TestCase
 {
     public function testRenderBlockOptimizer()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
 
-        $stream = $env->parse($env->tokenize(new Twig_Source('{{ block("foo") }}', 'index')));
+        $stream = $env->parse($env->tokenize(new Source('{{ block("foo") }}', 'index')));
 
         $node = $stream->getNode('body')->getNode(0);
 
-        $this->assertEquals('Twig_Node_Expression_BlockReference', get_class($node));
+        $this->assertInstanceOf(BlockReferenceExpression::class, $node);
         $this->assertTrue($node->getAttribute('output'));
     }
 
     public function testRenderParentBlockOptimizer()
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false, 'autoescape' => false]);
 
-        $stream = $env->parse($env->tokenize(new Twig_Source('{% extends "foo" %}{% block content %}{{ parent() }}{% endblock %}', 'index')));
+        $stream = $env->parse($env->tokenize(new Source('{% extends "foo" %}{% block content %}{{ parent() }}{% endblock %}', 'index')));
 
         $node = $stream->getNode('blocks')->getNode('content')->getNode(0)->getNode('body');
 
-        $this->assertEquals('Twig_Node_Expression_Parent', get_class($node));
-        $this->assertTrue($node->getAttribute('output'));
-    }
-
-    public function testRenderVariableBlockOptimizer()
-    {
-        if (PHP_VERSION_ID >= 50400) {
-            $this->markTestSkipped('not needed on PHP >= 5.4');
-        }
-
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false, 'autoescape' => false));
-        $stream = $env->parse($env->tokenize(new Twig_Source('{{ block(name|lower) }}', 'index')));
-
-        $node = $stream->getNode('body')->getNode(0)->getNode(1);
-
-        $this->assertEquals('Twig_Node_Expression_BlockReference', get_class($node));
+        $this->assertInstanceOf(ParentExpression::class, $node);
         $this->assertTrue($node->getAttribute('output'));
     }
 
@@ -54,9 +48,9 @@ class Twig_Tests_NodeVisitor_OptimizerTest extends \PHPUnit\Framework\TestCase
      */
     public function testForOptimizer($template, $expected)
     {
-        $env = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('cache' => false));
+        $env = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['cache' => false]);
 
-        $stream = $env->parse($env->tokenize(new Twig_Source($template, 'index')));
+        $stream = $env->parse($env->tokenize(new Source($template, 'index')));
 
         foreach ($expected as $target => $withLoop) {
             $this->assertTrue($this->checkForConfiguration($stream, $target, $withLoop), sprintf('variable %s is %soptimized', $target, $withLoop ? 'not ' : ''));
@@ -65,51 +59,47 @@ class Twig_Tests_NodeVisitor_OptimizerTest extends \PHPUnit\Framework\TestCase
 
     public function getTestsForForOptimizer()
     {
-        return array(
-            array('{% for i in foo %}{% endfor %}', array('i' => false)),
+        return [
+            ['{% for i in foo %}{% endfor %}', ['i' => false]],
 
-            array('{% for i in foo %}{{ loop.index }}{% endfor %}', array('i' => true)),
+            ['{% for i in foo %}{{ loop.index }}{% endfor %}', ['i' => true]],
 
-            array('{% for i in foo %}{% for j in foo %}{% endfor %}{% endfor %}', array('i' => false, 'j' => false)),
+            ['{% for i in foo %}{% for j in foo %}{% endfor %}{% endfor %}', ['i' => false, 'j' => false]],
 
-            array('{% for i in foo %}{% include "foo" %}{% endfor %}', array('i' => true)),
+            ['{% for i in foo %}{% include "foo" %}{% endfor %}', ['i' => true]],
 
-            array('{% for i in foo %}{% include "foo" only %}{% endfor %}', array('i' => false)),
+            ['{% for i in foo %}{% include "foo" only %}{% endfor %}', ['i' => false]],
 
-            array('{% for i in foo %}{% include "foo" with { "foo": "bar" } only %}{% endfor %}', array('i' => false)),
+            ['{% for i in foo %}{% include "foo" with { "foo": "bar" } only %}{% endfor %}', ['i' => false]],
 
-            array('{% for i in foo %}{% include "foo" with { "foo": loop.index } only %}{% endfor %}', array('i' => true)),
+            ['{% for i in foo %}{% include "foo" with { "foo": loop.index } only %}{% endfor %}', ['i' => true]],
 
-            array('{% for i in foo %}{% for j in foo %}{{ loop.index }}{% endfor %}{% endfor %}', array('i' => false, 'j' => true)),
+            ['{% for i in foo %}{% for j in foo %}{{ loop.index }}{% endfor %}{% endfor %}', ['i' => false, 'j' => true]],
 
-            array('{% for i in foo %}{% for j in foo %}{{ loop.parent.loop.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => true)),
+            ['{% for i in foo %}{% for j in foo %}{{ loop.parent.loop.index }}{% endfor %}{% endfor %}', ['i' => true, 'j' => true]],
 
-            array('{% for i in foo %}{% set l = loop %}{% for j in foo %}{{ l.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => false)),
+            ['{% for i in foo %}{% set l = loop %}{% for j in foo %}{{ l.index }}{% endfor %}{% endfor %}', ['i' => true, 'j' => false]],
 
-            array('{% for i in foo %}{% for j in foo %}{{ foo.parent.loop.index }}{% endfor %}{% endfor %}', array('i' => false, 'j' => false)),
+            ['{% for i in foo %}{% for j in foo %}{{ foo.parent.loop.index }}{% endfor %}{% endfor %}', ['i' => false, 'j' => false]],
 
-            array('{% for i in foo %}{% for j in foo %}{{ loop["parent"].loop.index }}{% endfor %}{% endfor %}', array('i' => true, 'j' => true)),
+            ['{% for i in foo %}{% for j in foo %}{{ loop["parent"].loop.index }}{% endfor %}{% endfor %}', ['i' => true, 'j' => true]],
 
-            array('{% for i in foo %}{{ include("foo") }}{% endfor %}', array('i' => true)),
+            ['{% for i in foo %}{{ include("foo") }}{% endfor %}', ['i' => true]],
 
-            array('{% for i in foo %}{{ include("foo", with_context = false) }}{% endfor %}', array('i' => false)),
+            ['{% for i in foo %}{{ include("foo", with_context = false) }}{% endfor %}', ['i' => false]],
 
-            array('{% for i in foo %}{{ include("foo", with_context = true) }}{% endfor %}', array('i' => true)),
+            ['{% for i in foo %}{{ include("foo", with_context = true) }}{% endfor %}', ['i' => true]],
 
-            array('{% for i in foo %}{{ include("foo", { "foo": "bar" }, with_context = false) }}{% endfor %}', array('i' => false)),
+            ['{% for i in foo %}{{ include("foo", { "foo": "bar" }, with_context = false) }}{% endfor %}', ['i' => false]],
 
-            array('{% for i in foo %}{{ include("foo", { "foo": loop.index }, with_context = false) }}{% endfor %}', array('i' => true)),
-        );
+            ['{% for i in foo %}{{ include("foo", { "foo": loop.index }, with_context = false) }}{% endfor %}', ['i' => true]],
+        ];
     }
 
-    public function checkForConfiguration(Twig_NodeInterface $node = null, $target, $withLoop)
+    public function checkForConfiguration(Node $node, $target, $withLoop)
     {
-        if (null === $node) {
-            return;
-        }
-
         foreach ($node as $n) {
-            if ($n instanceof Twig_Node_For) {
+            if ($n instanceof ForNode) {
                 if ($target === $n->getNode('value_target')->getAttribute('name')) {
                     return $withLoop == $n->getAttribute('with_loop');
                 }
diff --git a/vendor/twig/twig/test/Twig/Tests/ParserTest.php b/vendor/twig/twig/test/Twig/Tests/ParserTest.php
index 342fb7ba..81bbeea5 100644
--- a/vendor/twig/twig/test/Twig/Tests/ParserTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/ParserTest.php
@@ -8,46 +8,49 @@
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
+
+use Twig\Environment;
+use Twig\Loader\LoaderInterface;
+use Twig\Node\Node;
+use Twig\Node\SetNode;
+use Twig\Node\TextNode;
+use Twig\Parser;
+use Twig\Source;
+use Twig\Token;
+use Twig\TokenParser\AbstractTokenParser;
+use Twig\TokenStream;
+
 class Twig_Tests_ParserTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @expectedException Twig_Error_Syntax
-     */
-    public function testSetMacroThrowsExceptionOnReservedMethods()
-    {
-        $parser = $this->getParser();
-        $parser->setMacro('parent', $this->getMockBuilder('Twig_Node_Macro')->disableOriginalConstructor()->getMock());
-    }
-
-    /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown "foo" tag. Did you mean "for" at line 1?
      */
     public function testUnknownTag()
     {
-        $stream = new Twig_TokenStream(array(
-            new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
-            new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 1),
-            new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
-            new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
-        ));
-        $parser = new Twig_Parser(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
+        $stream = new TokenStream([
+            new Token(Token::BLOCK_START_TYPE, '', 1),
+            new Token(Token::NAME_TYPE, 'foo', 1),
+            new Token(Token::BLOCK_END_TYPE, '', 1),
+            new Token(Token::EOF_TYPE, '', 1),
+        ]);
+        $parser = new Parser(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
         $parser->parse($stream);
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unknown "foobar" tag at line 1.
      */
     public function testUnknownTagWithoutSuggestions()
     {
-        $stream = new Twig_TokenStream(array(
-            new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
-            new Twig_Token(Twig_Token::NAME_TYPE, 'foobar', 1),
-            new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
-            new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
-        ));
-        $parser = new Twig_Parser(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
+        $stream = new TokenStream([
+            new Token(Token::BLOCK_START_TYPE, '', 1),
+            new Token(Token::NAME_TYPE, 'foobar', 1),
+            new Token(Token::BLOCK_END_TYPE, '', 1),
+            new Token(Token::EOF_TYPE, '', 1),
+        ]);
+        $parser = new Parser(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
         $parser->parse($stream);
     }
 
@@ -57,88 +60,105 @@ class Twig_Tests_ParserTest extends \PHPUnit\Framework\TestCase
     public function testFilterBodyNodes($input, $expected)
     {
         $parser = $this->getParser();
+        $m = new \ReflectionMethod($parser, 'filterBodyNodes');
+        $m->setAccessible(true);
 
-        $this->assertEquals($expected, $parser->filterBodyNodes($input));
+        $this->assertEquals($expected, $m->invoke($parser, $input));
     }
 
     public function getFilterBodyNodesData()
     {
-        return array(
-            array(
-                new Twig_Node(array(new Twig_Node_Text('   ', 1))),
-                new Twig_Node(array()),
-            ),
-            array(
-                $input = new Twig_Node(array(new Twig_Node_Set(false, new Twig_Node(), new Twig_Node(), 1))),
+        return [
+            [
+                new Node([new TextNode('   ', 1)]),
+                new Node([]),
+            ],
+            [
+                $input = new Node([new SetNode(false, new Node(), new Node(), 1)]),
                 $input,
-            ),
-            array(
-                $input = new Twig_Node(array(new Twig_Node_Set(true, new Twig_Node(), new Twig_Node(array(new Twig_Node(array(new Twig_Node_Text('foo', 1))))), 1))),
+            ],
+            [
+                $input = new Node([new SetNode(true, new Node(), new Node([new Node([new TextNode('foo', 1)])]), 1)]),
                 $input,
-            ),
-        );
+            ],
+        ];
     }
 
     /**
      * @dataProvider getFilterBodyNodesDataThrowsException
-     * @expectedException Twig_Error_Syntax
+     * @expectedException \Twig\Error\SyntaxError
      */
     public function testFilterBodyNodesThrowsException($input)
     {
         $parser = $this->getParser();
 
-        $parser->filterBodyNodes($input);
+        $m = new \ReflectionMethod($parser, 'filterBodyNodes');
+        $m->setAccessible(true);
+
+        $m->invoke($parser, $input);
     }
 
     public function getFilterBodyNodesDataThrowsException()
     {
-        return array(
-            array(new Twig_Node_Text('foo', 1)),
-            array(new Twig_Node(array(new Twig_Node(array(new Twig_Node_Text('foo', 1)))))),
-        );
+        return [
+            [new TextNode('foo', 1)],
+            [new Node([new Node([new TextNode('foo', 1)])])],
+        ];
     }
 
     /**
-     * @expectedException Twig_Error_Syntax
-     * @expectedExceptionMessage A template that extends another one cannot start with a byte order mark (BOM); it must be removed at line 1
+     * @dataProvider getFilterBodyNodesWithBOMData
      */
-    public function testFilterBodyNodesWithBOM()
+    public function testFilterBodyNodesWithBOM($emptyNode)
     {
         $parser = $this->getParser();
-        $parser->filterBodyNodes(new Twig_Node_Text(chr(0xEF).chr(0xBB).chr(0xBF), 1));
+
+        $m = new \ReflectionMethod($parser, 'filterBodyNodes');
+        $m->setAccessible(true);
+        $this->assertNull($m->invoke($parser, new TextNode(\chr(0xEF).\chr(0xBB).\chr(0xBF).$emptyNode, 1)));
+    }
+
+    public function getFilterBodyNodesWithBOMData()
+    {
+        return [
+            [' '],
+            ["\t"],
+            ["\n"],
+            ["\n\t\n   "],
+        ];
     }
 
     public function testParseIsReentrant()
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array(
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), [
             'autoescape' => false,
             'optimizations' => 0,
-        ));
+        ]);
         $twig->addTokenParser(new TestTokenParser());
 
-        $parser = new Twig_Parser($twig);
+        $parser = new Parser($twig);
 
-        $parser->parse(new Twig_TokenStream(array(
-            new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
-            new Twig_Token(Twig_Token::NAME_TYPE, 'test', 1),
-            new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
-            new Twig_Token(Twig_Token::VAR_START_TYPE, '', 1),
-            new Twig_Token(Twig_Token::NAME_TYPE, 'foo', 1),
-            new Twig_Token(Twig_Token::VAR_END_TYPE, '', 1),
-            new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
-        )));
+        $parser->parse(new TokenStream([
+            new Token(Token::BLOCK_START_TYPE, '', 1),
+            new Token(Token::NAME_TYPE, 'test', 1),
+            new Token(Token::BLOCK_END_TYPE, '', 1),
+            new Token(Token::VAR_START_TYPE, '', 1),
+            new Token(Token::NAME_TYPE, 'foo', 1),
+            new Token(Token::VAR_END_TYPE, '', 1),
+            new Token(Token::EOF_TYPE, '', 1),
+        ]));
 
         $this->assertNull($parser->getParent());
     }
 
     public function testGetVarName()
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array(
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), [
             'autoescape' => false,
             'optimizations' => 0,
-        ));
+        ]);
 
-        $twig->parse($twig->tokenize(new Twig_Source(<<<EOF
+        $twig->parse($twig->tokenize(new Source(<<<EOF
 {% from _self import foo %}
 
 {% macro foo() %}
@@ -155,40 +175,33 @@ EOF
 
     protected function getParser()
     {
-        $parser = new TestParser(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
-        $parser->setParent(new Twig_Node());
-        $parser->stream = new Twig_TokenStream(array());
-
-        return $parser;
-    }
-}
+        $parser = new Parser(new Environment($this->getMockBuilder(LoaderInterface::class)->getMock()));
+        $parser->setParent(new Node());
 
-class TestParser extends Twig_Parser
-{
-    public $stream;
+        $p = new \ReflectionProperty($parser, 'stream');
+        $p->setAccessible(true);
+        $p->setValue($parser, new TokenStream([]));
 
-    public function filterBodyNodes(Twig_NodeInterface $node)
-    {
-        return parent::filterBodyNodes($node);
+        return $parser;
     }
 }
 
-class TestTokenParser extends Twig_TokenParser
+class TestTokenParser extends AbstractTokenParser
 {
-    public function parse(Twig_Token $token)
+    public function parse(Token $token)
     {
         // simulate the parsing of another template right in the middle of the parsing of the current template
-        $this->parser->parse(new Twig_TokenStream(array(
-            new Twig_Token(Twig_Token::BLOCK_START_TYPE, '', 1),
-            new Twig_Token(Twig_Token::NAME_TYPE, 'extends', 1),
-            new Twig_Token(Twig_Token::STRING_TYPE, 'base', 1),
-            new Twig_Token(Twig_Token::BLOCK_END_TYPE, '', 1),
-            new Twig_Token(Twig_Token::EOF_TYPE, '', 1),
-        )));
+        $this->parser->parse(new TokenStream([
+            new Token(Token::BLOCK_START_TYPE, '', 1),
+            new Token(Token::NAME_TYPE, 'extends', 1),
+            new Token(Token::STRING_TYPE, 'base', 1),
+            new Token(Token::BLOCK_END_TYPE, '', 1),
+            new Token(Token::EOF_TYPE, '', 1),
+        ]));
 
-        $this->parser->getStream()->expect(Twig_Token::BLOCK_END_TYPE);
+        $this->parser->getStream()->expect(Token::BLOCK_END_TYPE);
 
-        return new Twig_Node(array());
+        return new Node([]);
     }
 
     public function getTag()
diff --git a/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php b/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php
index a71b97b9..508f79ca 100644
--- a/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/AbstractTest.php
@@ -9,66 +9,62 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Profiler\Profile;
+
 abstract class Twig_Tests_Profiler_Dumper_AbstractTest extends \PHPUnit\Framework\TestCase
 {
     protected function getProfile()
     {
-        $profile = $this->getMockBuilder('Twig_Profiler_Profile')->disableOriginalConstructor()->getMock();
-
-        $profile->expects($this->any())->method('isRoot')->will($this->returnValue(true));
-        $profile->expects($this->any())->method('getName')->will($this->returnValue('main'));
-        $profile->expects($this->any())->method('getDuration')->will($this->returnValue(1));
-        $profile->expects($this->any())->method('getMemoryUsage')->will($this->returnValue(0));
-        $profile->expects($this->any())->method('getPeakMemoryUsage')->will($this->returnValue(0));
-
-        $subProfiles = array(
+        $profile = new Profile('main');
+        $subProfiles = [
             $this->getIndexProfile(
-                array(
+                [
                     $this->getEmbeddedBlockProfile(),
                     $this->getEmbeddedTemplateProfile(
-                        array(
+                        [
                             $this->getIncludedTemplateProfile(),
-                        )
+                        ]
                     ),
                     $this->getMacroProfile(),
                     $this->getEmbeddedTemplateProfile(
-                        array(
+                        [
                             $this->getIncludedTemplateProfile(),
-                        )
+                        ]
                     ),
-                )
+                ]
             ),
-        );
+        ];
 
-        $profile->expects($this->any())->method('getProfiles')->will($this->returnValue($subProfiles));
-        $profile->expects($this->any())->method('getIterator')->will($this->returnValue(new ArrayIterator($subProfiles)));
+        $p = new \ReflectionProperty($profile, 'profiles');
+        $p->setAccessible(true);
+        $p->setValue($profile, $subProfiles);
 
         return $profile;
     }
 
-    private function getIndexProfile(array $subProfiles = array())
+    private function getIndexProfile(array $subProfiles = [])
     {
-        return $this->generateProfile('main', 1, true, 'template', 'index.twig', $subProfiles);
+        return $this->generateProfile('main', 1, 'template', 'index.twig', $subProfiles);
     }
 
-    private function getEmbeddedBlockProfile(array $subProfiles = array())
+    private function getEmbeddedBlockProfile(array $subProfiles = [])
     {
-        return $this->generateProfile('body', 0.0001, false, 'block', 'embedded.twig', $subProfiles);
+        return $this->generateProfile('body', 0.0001, 'block', 'embedded.twig', $subProfiles);
     }
 
-    private function getEmbeddedTemplateProfile(array $subProfiles = array())
+    private function getEmbeddedTemplateProfile(array $subProfiles = [])
     {
-        return $this->generateProfile('main', 0.0001, true, 'template', 'embedded.twig', $subProfiles);
+        return $this->generateProfile('main', 0.0001, 'template', 'embedded.twig', $subProfiles);
     }
 
-    private function getIncludedTemplateProfile(array $subProfiles = array())
+    private function getIncludedTemplateProfile(array $subProfiles = [])
     {
-        return $this->generateProfile('main', 0.0001, true, 'template', 'included.twig', $subProfiles);
+        return $this->generateProfile('main', 0.0001, 'template', 'included.twig', $subProfiles);
     }
 
-    private function getMacroProfile(array $subProfiles = array())
+    private function getMacroProfile(array $subProfiles = [])
     {
-        return $this->generateProfile('foo', 0.0001, false, 'macro', 'index.twig', $subProfiles);
+        return $this->generateProfile('foo', 0.0001, 'macro', 'index.twig', $subProfiles);
     }
 
     /**
@@ -79,22 +75,30 @@ abstract class Twig_Tests_Profiler_Dumper_AbstractTest extends \PHPUnit\Framewor
      * @param string $templateName
      * @param array  $subProfiles
      *
-     * @return Twig_Profiler_Profile
+     * @return Profile
      */
-    private function generateProfile($name, $duration, $isTemplate, $type, $templateName, array $subProfiles = array())
+    private function generateProfile($name, $duration, $type, $templateName, array $subProfiles = [])
     {
-        $profile = $this->getMockBuilder('Twig_Profiler_Profile')->disableOriginalConstructor()->getMock();
+        $profile = new Profile($templateName, $type, $name);
+
+        $p = new \ReflectionProperty($profile, 'profiles');
+        $p->setAccessible(true);
+        $p->setValue($profile, $subProfiles);
 
-        $profile->expects($this->any())->method('isRoot')->will($this->returnValue(false));
-        $profile->expects($this->any())->method('getName')->will($this->returnValue($name));
-        $profile->expects($this->any())->method('getDuration')->will($this->returnValue($duration));
-        $profile->expects($this->any())->method('getMemoryUsage')->will($this->returnValue(0));
-        $profile->expects($this->any())->method('getPeakMemoryUsage')->will($this->returnValue(0));
-        $profile->expects($this->any())->method('isTemplate')->will($this->returnValue($isTemplate));
-        $profile->expects($this->any())->method('getType')->will($this->returnValue($type));
-        $profile->expects($this->any())->method('getTemplate')->will($this->returnValue($templateName));
-        $profile->expects($this->any())->method('getProfiles')->will($this->returnValue($subProfiles));
-        $profile->expects($this->any())->method('getIterator')->will($this->returnValue(new ArrayIterator($subProfiles)));
+        $starts = new \ReflectionProperty($profile, 'starts');
+        $starts->setAccessible(true);
+        $starts->setValue($profile, [
+            'wt' => 0,
+            'mu' => 0,
+            'pmu' => 0,
+        ]);
+        $ends = new \ReflectionProperty($profile, 'ends');
+        $ends->setAccessible(true);
+        $ends->setValue($profile, [
+            'wt' => $duration,
+            'mu' => 0,
+            'pmu' => 0,
+        ]);
 
         return $profile;
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php b/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php
index 1a1b9d29..26ef2dad 100644
--- a/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/BlackfireTest.php
@@ -9,11 +9,13 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Profiler\Dumper\BlackfireDumper;
+
 class Twig_Tests_Profiler_Dumper_BlackfireTest extends Twig_Tests_Profiler_Dumper_AbstractTest
 {
     public function testDump()
     {
-        $dumper = new Twig_Profiler_Dumper_Blackfire();
+        $dumper = new BlackfireDumper();
 
         $this->assertStringMatchesFormat(<<<EOF
 file-format: BlackfireProbe
diff --git a/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php b/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php
index 66a68c4b..e04bbcf2 100644
--- a/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/HtmlTest.php
@@ -9,11 +9,13 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Profiler\Dumper\HtmlDumper;
+
 class Twig_Tests_Profiler_Dumper_HtmlTest extends Twig_Tests_Profiler_Dumper_AbstractTest
 {
     public function testDump()
     {
-        $dumper = new Twig_Profiler_Dumper_Html();
+        $dumper = new HtmlDumper();
         $this->assertStringMatchesFormat(<<<EOF
 <pre>main <span style="color: #d44">%d.%dms/%d%</span>
 â?? <span style="background-color: #ffd">index.twig</span> <span style="color: #d44">%d.%dms/%d%</span>
diff --git a/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php b/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php
index e2ea165a..e36d0ad6 100644
--- a/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Profiler/Dumper/TextTest.php
@@ -9,11 +9,13 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Profiler\Dumper\TextDumper;
+
 class Twig_Tests_Profiler_Dumper_TextTest extends Twig_Tests_Profiler_Dumper_AbstractTest
 {
     public function testDump()
     {
-        $dumper = new Twig_Profiler_Dumper_Text();
+        $dumper = new TextDumper();
         $this->assertStringMatchesFormat(<<<EOF
 main %d.%dms/%d%
 â?? index.twig %d.%dms/%d%
diff --git a/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php b/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php
index 08db96a9..18e2a5b5 100644
--- a/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Profiler/ProfileTest.php
@@ -9,11 +9,13 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Profiler\Profile;
+
 class Twig_Tests_Profiler_ProfileTest extends \PHPUnit\Framework\TestCase
 {
     public function testConstructor()
     {
-        $profile = new Twig_Profiler_Profile('template', 'type', 'name');
+        $profile = new Profile('template', 'type', 'name');
 
         $this->assertEquals('template', $profile->getTemplate());
         $this->assertEquals('type', $profile->getType());
@@ -22,53 +24,53 @@ class Twig_Tests_Profiler_ProfileTest extends \PHPUnit\Framework\TestCase
 
     public function testIsRoot()
     {
-        $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT);
+        $profile = new Profile('template', Profile::ROOT);
         $this->assertTrue($profile->isRoot());
 
-        $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::TEMPLATE);
+        $profile = new Profile('template', Profile::TEMPLATE);
         $this->assertFalse($profile->isRoot());
     }
 
     public function testIsTemplate()
     {
-        $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::TEMPLATE);
+        $profile = new Profile('template', Profile::TEMPLATE);
         $this->assertTrue($profile->isTemplate());
 
-        $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT);
+        $profile = new Profile('template', Profile::ROOT);
         $this->assertFalse($profile->isTemplate());
     }
 
     public function testIsBlock()
     {
-        $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::BLOCK);
+        $profile = new Profile('template', Profile::BLOCK);
         $this->assertTrue($profile->isBlock());
 
-        $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT);
+        $profile = new Profile('template', Profile::ROOT);
         $this->assertFalse($profile->isBlock());
     }
 
     public function testIsMacro()
     {
-        $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::MACRO);
+        $profile = new Profile('template', Profile::MACRO);
         $this->assertTrue($profile->isMacro());
 
-        $profile = new Twig_Profiler_Profile('template', Twig_Profiler_Profile::ROOT);
+        $profile = new Profile('template', Profile::ROOT);
         $this->assertFalse($profile->isMacro());
     }
 
     public function testGetAddProfile()
     {
-        $profile = new Twig_Profiler_Profile();
-        $profile->addProfile($a = new Twig_Profiler_Profile());
-        $profile->addProfile($b = new Twig_Profiler_Profile());
+        $profile = new Profile();
+        $profile->addProfile($a = new Profile());
+        $profile->addProfile($b = new Profile());
 
-        $this->assertSame(array($a, $b), $profile->getProfiles());
-        $this->assertSame(array($a, $b), iterator_to_array($profile));
+        $this->assertSame([$a, $b], $profile->getProfiles());
+        $this->assertSame([$a, $b], iterator_to_array($profile));
     }
 
     public function testGetDuration()
     {
-        $profile = new Twig_Profiler_Profile();
+        $profile = new Profile();
         usleep(1);
         $profile->leave();
 
@@ -77,8 +79,8 @@ class Twig_Tests_Profiler_ProfileTest extends \PHPUnit\Framework\TestCase
 
     public function testSerialize()
     {
-        $profile = new Twig_Profiler_Profile('template', 'type', 'name');
-        $profile1 = new Twig_Profiler_Profile('template1', 'type1', 'name1');
+        $profile = new Profile('template', 'type', 'name');
+        $profile1 = new Profile('template1', 'type1', 'name1');
         $profile->addProfile($profile1);
         $profile->leave();
         $profile1->leave();
@@ -100,7 +102,7 @@ class Twig_Tests_Profiler_ProfileTest extends \PHPUnit\Framework\TestCase
 
     public function testReset()
     {
-        $profile = new Twig_Profiler_Profile();
+        $profile = new Profile();
         usleep(1);
         $profile->leave();
         $profile->reset();
diff --git a/vendor/twig/twig/test/Twig/Tests/RuntimeFactoryLoaderTest.php b/vendor/twig/twig/test/Twig/Tests/RuntimeFactoryLoaderTest.php
deleted file mode 100644
index f418edf7..00000000
--- a/vendor/twig/twig/test/Twig/Tests/RuntimeFactoryLoaderTest.php
+++ /dev/null
@@ -1,32 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-class Twig_Tests_FactoryRuntimeLoaderTest extends PHPUnit_Framework_TestCase
-{
-    public function testLoad()
-    {
-        $loader = new Twig_FactoryRuntimeLoader(array('stdClass' => 'getRuntime'));
-
-        $this->assertInstanceOf('stdClass', $loader->load('stdClass'));
-    }
-
-    public function testLoadReturnsNullForUnmappedRuntime()
-    {
-        $loader = new Twig_FactoryRuntimeLoader();
-
-        $this->assertNull($loader->load('stdClass'));
-    }
-}
-
-function getRuntime()
-{
-    return new stdClass();
-}
diff --git a/vendor/twig/twig/test/Twig/Tests/TemplateTest.php b/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
index c22a4333..3427da63 100644
--- a/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/TemplateTest.php
@@ -8,15 +8,25 @@
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
+
+use Twig\Environment;
+use Twig\Error\RuntimeError;
+use Twig\Extension\SandboxExtension;
+use Twig\Loader\ArrayLoader;
+use Twig\Loader\LoaderInterface;
+use Twig\Sandbox\SecurityError;
+use Twig\Sandbox\SecurityPolicy;
+use Twig\Template;
+
 class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
 {
     /**
-     * @expectedException LogicException
+     * @expectedException \LogicException
      */
     public function testDisplayBlocksAcceptTemplateOnlyAsBlocks()
     {
-        $template = $this->getMockForAbstractClass('Twig_Template', array(), '', false);
-        $template->displayBlock('foo', array(), array('foo' => array(new stdClass(), 'foo')));
+        $template = $this->getMockForAbstractClass(Template::class, [], '', false);
+        $template->displayBlock('foo', [], ['foo' => [new \stdClass(), 'foo']]);
     }
 
     /**
@@ -24,48 +34,49 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetAttributeExceptions($template, $message)
     {
-        $templates = array('index' => $template);
-        $env = new Twig_Environment(new Twig_Loader_Array($templates), array('strict_variables' => true));
-        $template = $env->loadTemplate('index');
+        $templates = ['index' => $template];
+        $env = new Environment(new ArrayLoader($templates), ['strict_variables' => true]);
+        $template = $env->load('index');
 
-        $context = array(
+        $context = [
             'string' => 'foo',
             'null' => null,
-            'empty_array' => array(),
-            'array' => array('foo' => 'foo'),
+            'empty_array' => [],
+            'array' => ['foo' => 'foo'],
             'array_access' => new Twig_TemplateArrayAccessObject(),
             'magic_exception' => new Twig_TemplateMagicPropertyObjectWithException(),
-            'object' => new stdClass(),
-        );
+            'object' => new \stdClass(),
+        ];
 
         try {
             $template->render($context);
             $this->fail('Accessing an invalid attribute should throw an exception.');
-        } catch (Twig_Error_Runtime $e) {
+        } catch (RuntimeError $e) {
             $this->assertSame(sprintf($message, 'index'), $e->getMessage());
         }
     }
 
     public function getAttributeExceptions()
     {
-        return array(
-            array('{{ string["a"] }}', 'Impossible to access a key ("a") on a string variable ("foo") in "%s" at line 1.'),
-            array('{{ null["a"] }}', 'Impossible to access a key ("a") on a null variable in "%s" at line 1.'),
-            array('{{ empty_array["a"] }}', 'Key "a" does not exist as the array is empty in "%s" at line 1.'),
-            array('{{ array["a"] }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1.'),
-            array('{{ array_access["a"] }}', 'Key "a" in object with ArrayAccess of class "Twig_TemplateArrayAccessObject" does not exist in "%s" at line 1.'),
-            array('{{ string.a }}', 'Impossible to access an attribute ("a") on a string variable ("foo") in "%s" at line 1.'),
-            array('{{ string.a() }}', 'Impossible to invoke a method ("a") on a string variable ("foo") in "%s" at line 1.'),
-            array('{{ null.a }}', 'Impossible to access an attribute ("a") on a null variable in "%s" at line 1.'),
-            array('{{ null.a() }}', 'Impossible to invoke a method ("a") on a null variable in "%s" at line 1.'),
-            array('{{ empty_array.a }}', 'Key "a" does not exist as the array is empty in "%s" at line 1.'),
-            array('{{ array.a }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1.'),
-            array('{{ attribute(array, -10) }}', 'Key "-10" for array with keys "foo" does not exist in "%s" at line 1.'),
-            array('{{ array_access.a }}', 'Neither the property "a" nor one of the methods "a()", "geta()"/"isa()" or "__call()" exist and have public access in class "Twig_TemplateArrayAccessObject" in "%s" at line 1.'),
-            array('{% from _self import foo %}{% macro foo(obj) %}{{ obj.missing_method() }}{% endmacro %}{{ foo(array_access) }}', 'Neither the property "missing_method" nor one of the methods "missing_method()", "getmissing_method()"/"ismissing_method()" or "__call()" exist and have public access in class "Twig_TemplateArrayAccessObject" in "%s" at line 1.'),
-            array('{{ magic_exception.test }}', 'An exception has been thrown during the rendering of a template ("Hey! Don\'t try to isset me!") in "%s" at line 1.'),
-            array('{{ object["a"] }}', 'Impossible to access a key "a" on an object of class "stdClass" that does not implement ArrayAccess interface in "%s" at line 1.'),
-        );
+        return [
+            ['{{ string["a"] }}', 'Impossible to access a key ("a") on a string variable ("foo") in "%s" at line 1.'],
+            ['{{ null["a"] }}', 'Impossible to access a key ("a") on a null variable in "%s" at line 1.'],
+            ['{{ empty_array["a"] }}', 'Key "a" does not exist as the array is empty in "%s" at line 1.'],
+            ['{{ array["a"] }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1.'],
+            ['{{ array_access["a"] }}', 'Key "a" in object with ArrayAccess of class "Twig_TemplateArrayAccessObject" does not exist in "%s" at line 1.'],
+            ['{{ string.a }}', 'Impossible to access an attribute ("a") on a string variable ("foo") in "%s" at line 1.'],
+            ['{{ string.a() }}', 'Impossible to invoke a method ("a") on a string variable ("foo") in "%s" at line 1.'],
+            ['{{ null.a }}', 'Impossible to access an attribute ("a") on a null variable in "%s" at line 1.'],
+            ['{{ null.a() }}', 'Impossible to invoke a method ("a") on a null variable in "%s" at line 1.'],
+            ['{{ array.a() }}', 'Impossible to invoke a method ("a") on an array in "%s" at line 1.'],
+            ['{{ empty_array.a }}', 'Key "a" does not exist as the array is empty in "%s" at line 1.'],
+            ['{{ array.a }}', 'Key "a" for array with keys "foo" does not exist in "%s" at line 1.'],
+            ['{{ attribute(array, -10) }}', 'Key "-10" for array with keys "foo" does not exist in "%s" at line 1.'],
+            ['{{ array_access.a }}', 'Neither the property "a" nor one of the methods "a()", "geta()"/"isa()"/"hasa()" or "__call()" exist and have public access in class "Twig_TemplateArrayAccessObject" in "%s" at line 1.'],
+            ['{% from _self import foo %}{% macro foo(obj) %}{{ obj.missing_method() }}{% endmacro %}{{ foo(array_access) }}', 'Neither the property "missing_method" nor one of the methods "missing_method()", "getmissing_method()"/"ismissing_method()"/"hasmissing_method()" or "__call()" exist and have public access in class "Twig_TemplateArrayAccessObject" in "%s" at line 1.'],
+            ['{{ magic_exception.test }}', 'An exception has been thrown during the rendering of a template ("Hey! Don\'t try to isset me!") in "%s" at line 1.'],
+            ['{{ object["a"] }}', 'Impossible to access a key "a" on an object of class "stdClass" that does not implement ArrayAccess interface in "%s" at line 1.'],
+        ];
     }
 
     /**
@@ -73,20 +84,20 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetAttributeWithSandbox($object, $item, $allowed)
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $policy = new Twig_Sandbox_SecurityPolicy(array(), array(), array(/*method*/), array(/*prop*/), array());
-        $twig->addExtension(new Twig_Extension_Sandbox($policy, !$allowed));
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $policy = new SecurityPolicy([], [], [/*method*/], [/*prop*/], []);
+        $twig->addExtension(new SandboxExtension($policy, !$allowed));
         $template = new Twig_TemplateTest($twig);
 
         try {
-            $template->getAttribute($object, $item, array(), 'any');
+            twig_get_attribute($twig, $template->getSourceContext(), $object, $item, [], 'any', false, false, true);
 
             if (!$allowed) {
                 $this->fail();
             } else {
                 $this->addToAssertionCount(1);
             }
-        } catch (Twig_Sandbox_SecurityError $e) {
+        } catch (SecurityError $e) {
             if ($allowed) {
                 $this->fail();
             } else {
@@ -99,126 +110,59 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
 
     public function getGetAttributeWithSandbox()
     {
-        return array(
-            array(new Twig_TemplatePropertyObject(), 'defined', false),
-            array(new Twig_TemplatePropertyObject(), 'defined', true),
-            array(new Twig_TemplateMethodObject(), 'defined', false),
-            array(new Twig_TemplateMethodObject(), 'defined', true),
-        );
+        return [
+            [new Twig_TemplatePropertyObject(), 'defined', false],
+            [new Twig_TemplatePropertyObject(), 'defined', true],
+            [new Twig_TemplateMethodObject(), 'defined', false],
+            [new Twig_TemplateMethodObject(), 'defined', true],
+        ];
     }
 
     /**
-     * @group legacy
+     * @expectedException \Twig\Error\RuntimeError
+     * @expectedExceptionMessage Block "unknown" on template "index.twig" does not exist in "index.twig".
      */
-    public function testGetAttributeWithTemplateAsObject()
+    public function testRenderBlockWithUndefinedBlock()
     {
-        // to be removed in 2.0
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_TemplateTestLoaderInterface')->getMock());
-        //$twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface', 'Twig_SourceContextLoaderInterface')->getMock());
-
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $template = new Twig_TemplateTest($twig, 'index.twig');
-        $template1 = new Twig_TemplateTest($twig, 'index1.twig');
-
-        $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'string'));
-        $this->assertEquals('some_string', $template->getAttribute($template1, 'string'));
-
-        $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'true'));
-        $this->assertEquals('1', $template->getAttribute($template1, 'true'));
-
-        $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'zero'));
-        $this->assertEquals('0', $template->getAttribute($template1, 'zero'));
-
-        $this->assertNotInstanceof('Twig_Markup', $template->getAttribute($template1, 'empty'));
-        $this->assertSame('', $template->getAttribute($template1, 'empty'));
+        try {
+            $template->renderBlock('unknown', []);
+        } catch (\Exception $e) {
+            ob_end_clean();
 
-        $this->assertFalse($template->getAttribute($template1, 'env', array(), Twig_Template::ANY_CALL, true));
-        $this->assertFalse($template->getAttribute($template1, 'environment', array(), Twig_Template::ANY_CALL, true));
-        $this->assertFalse($template->getAttribute($template1, 'getEnvironment', array(), Twig_Template::METHOD_CALL, true));
-        $this->assertFalse($template->getAttribute($template1, 'displayWithErrorHandling', array(), Twig_Template::METHOD_CALL, true));
+            throw $e;
+        }
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Calling "string" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0.
-     * @expectedDeprecation Calling "string" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0.
-     * @expectedDeprecation Calling "true" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0.
-     * @expectedDeprecation Calling "true" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0.
-     * @expectedDeprecation Calling "zero" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0.
-     * @expectedDeprecation Calling "zero" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0.
-     * @expectedDeprecation Calling "empty" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0.
-     * @expectedDeprecation Calling "empty" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0.
-     * @expectedDeprecation Calling "renderBlock" on template "index.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use block("name") instead).
-     * @expectedDeprecation Calling "displayBlock" on template "index.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use block("name") instead).
-     * @expectedDeprecation Calling "hasBlock" on template "index.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use "block("name") is defined" instead).
-     * @expectedDeprecation Calling "render" on template "index.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use include("index.twig") instead).
-     * @expectedDeprecation Calling "display" on template "index.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use include("index.twig") instead).
-     * @expectedDeprecation Calling "renderBlock" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use block("name", template) instead).
-     * @expectedDeprecation Calling "displayBlock" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use block("name", template) instead).
-     * @expectedDeprecation Calling "hasBlock" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use "block("name", template) is defined" instead).
-     * @expectedDeprecation Calling "render" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use include("index1.twig") instead).
-     * @expectedDeprecation Calling "display" on template "index1.twig" from template "index.twig" is deprecated since version 1.28 and won't be supported anymore in 2.0. Use include("index1.twig") instead).
+     * @expectedException \Twig\Error\RuntimeError
+     * @expectedExceptionMessage Block "unknown" on template "index.twig" does not exist in "index.twig".
      */
-    public function testGetAttributeWithTemplateAsObjectForDeprecations()
+    public function testDisplayBlockWithUndefinedBlock()
     {
-        // to be removed in 2.0
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_TemplateTestLoaderInterface')->getMock());
-        //$twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface', 'Twig_SourceContextLoaderInterface')->getMock());
-
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
         $template = new Twig_TemplateTest($twig, 'index.twig');
-        $template1 = new Twig_TemplateTest($twig, 'index1.twig');
-
-        $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'string'));
-        $this->assertEquals('some_string', $template->getAttribute($template1, 'string'));
-
-        $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'true'));
-        $this->assertEquals('1', $template->getAttribute($template1, 'true'));
-
-        $this->assertInstanceof('Twig_Markup', $template->getAttribute($template1, 'zero'));
-        $this->assertEquals('0', $template->getAttribute($template1, 'zero'));
-
-        $this->assertNotInstanceof('Twig_Markup', $template->getAttribute($template1, 'empty'));
-        $this->assertSame('', $template->getAttribute($template1, 'empty'));
-
-        $blocks = array('name' => array($template1, 'block_name'));
-
-        // trigger some deprecation notice messages to check them with @expectedDeprecation
-        $template->getAttribute($template, 'renderBlock', array('name', array(), $blocks));
-        $template->getAttribute($template, 'displayBlock', array('name', array(), $blocks));
-        $template->getAttribute($template, 'hasBlock', array('name', array()));
-        $template->getAttribute($template, 'render', array(array()));
-        $template->getAttribute($template, 'display', array(array()));
-
-        $template->getAttribute($template1, 'renderBlock', array('name', array(), $blocks));
-        $template->getAttribute($template1, 'displayBlock', array('name', array(), $blocks));
-        $template->getAttribute($template1, 'hasBlock', array('name', array()));
-        $template->getAttribute($template1, 'render', array(array()));
-        $template->getAttribute($template1, 'display', array(array()));
-
-        $this->assertFalse($template->getAttribute($template1, 'env', array(), Twig_Template::ANY_CALL, true));
-        $this->assertFalse($template->getAttribute($template1, 'environment', array(), Twig_Template::ANY_CALL, true));
-        $this->assertFalse($template->getAttribute($template1, 'getEnvironment', array(), Twig_Template::METHOD_CALL, true));
-        $this->assertFalse($template->getAttribute($template1, 'displayWithErrorHandling', array(), Twig_Template::METHOD_CALL, true));
+        $template->displayBlock('unknown', []);
     }
 
     /**
-     * @group legacy
-     * @expectedDeprecation Silent display of undefined block "unknown" in template "index.twig" is deprecated since version 1.29 and will throw an exception in 2.0. Use the "block('unknown') is defined" expression to test for block existence.
-     * @expectedDeprecation Silent display of undefined block "unknown" in template "index.twig" is deprecated since version 1.29 and will throw an exception in 2.0. Use the "block('unknown') is defined" expression to test for block existence.
+     * @expectedException \Twig\Error\RuntimeError
+     * @expectedExceptionMessage Block "foo" should not call parent() in "index.twig" as the block does not exist in the parent template "parent.twig"
      */
-    public function testRenderBlockWithUndefinedBlock()
+    public function testDisplayBlockWithUndefinedParentBlock()
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_TemplateTestLoaderInterface')->getMock());
-
-        $template = new Twig_TemplateTest($twig, 'index.twig');
-        $template->renderBlock('unknown', array());
-        $template->displayBlock('unknown', array());
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $template = new Twig_TemplateTest($twig, 'parent.twig');
+        $template->displayBlock('foo', [], ['foo' => [new Twig_TemplateTest($twig, 'index.twig'), 'block_foo']], false);
     }
 
     public function testGetAttributeOnArrayWithConfusableKey()
     {
-        $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $template = new Twig_TemplateTest($twig);
 
-        $array = array('Zero', 'One', -1 => 'MinusOne', '' => 'EmptyString', '1.5' => 'FloatButString', '01' => 'IntegerButStringWithLeadingZeros');
+        $array = ['Zero', 'One', -1 => 'MinusOne', '' => 'EmptyString', '1.5' => 'FloatButString', '01' => 'IntegerButStringWithLeadingZeros'];
 
         $this->assertSame('Zero', $array[false]);
         $this->assertSame('One', $array[true]);
@@ -229,14 +173,14 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
         $this->assertSame('IntegerButStringWithLeadingZeros', $array['01']);
         $this->assertSame('EmptyString', $array[null]);
 
-        $this->assertSame('Zero', $template->getAttribute($array, false), 'false is treated as 0 when accessing an array (equals PHP behavior)');
-        $this->assertSame('One', $template->getAttribute($array, true), 'true is treated as 1 when accessing an array (equals PHP behavior)');
-        $this->assertSame('One', $template->getAttribute($array, 1.5), 'float is casted to int when accessing an array (equals PHP behavior)');
-        $this->assertSame('One', $template->getAttribute($array, '1'), '"1" is treated as integer 1 when accessing an array (equals PHP behavior)');
-        $this->assertSame('MinusOne', $template->getAttribute($array, -1.5), 'negative float is casted to int when accessing an array (equals PHP behavior)');
-        $this->assertSame('FloatButString', $template->getAttribute($array, '1.5'), '"1.5" is treated as-is when accessing an array (equals PHP behavior)');
-        $this->assertSame('IntegerButStringWithLeadingZeros', $template->getAttribute($array, '01'), '"01" is treated as-is when accessing an array (equals PHP behavior)');
-        $this->assertSame('EmptyString', $template->getAttribute($array, null), 'null is treated as "" when accessing an array (equals PHP behavior)');
+        $this->assertSame('Zero', twig_get_attribute($twig, $template->getSourceContext(), $array, false), 'false is treated as 0 when accessing an array (equals PHP behavior)');
+        $this->assertSame('One', twig_get_attribute($twig, $template->getSourceContext(), $array, true), 'true is treated as 1 when accessing an array (equals PHP behavior)');
+        $this->assertSame('One', twig_get_attribute($twig, $template->getSourceContext(), $array, 1.5), 'float is casted to int when accessing an array (equals PHP behavior)');
+        $this->assertSame('One', twig_get_attribute($twig, $template->getSourceContext(), $array, '1'), '"1" is treated as integer 1 when accessing an array (equals PHP behavior)');
+        $this->assertSame('MinusOne', twig_get_attribute($twig, $template->getSourceContext(), $array, -1.5), 'negative float is casted to int when accessing an array (equals PHP behavior)');
+        $this->assertSame('FloatButString', twig_get_attribute($twig, $template->getSourceContext(), $array, '1.5'), '"1.5" is treated as-is when accessing an array (equals PHP behavior)');
+        $this->assertSame('IntegerButStringWithLeadingZeros', twig_get_attribute($twig, $template->getSourceContext(), $array, '01'), '"01" is treated as-is when accessing an array (equals PHP behavior)');
+        $this->assertSame('EmptyString', twig_get_attribute($twig, $template->getSourceContext(), $array, null), 'null is treated as "" when accessing an array (equals PHP behavior)');
     }
 
     /**
@@ -244,9 +188,10 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetAttribute($defined, $value, $object, $item, $arguments, $type)
     {
-        $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $template = new Twig_TemplateTest($twig);
 
-        $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type));
+        $this->assertEquals($value, twig_get_attribute($twig, $template->getSourceContext(), $object, $item, $arguments, $type));
     }
 
     /**
@@ -254,20 +199,21 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetAttributeStrict($defined, $value, $object, $item, $arguments, $type, $exceptionMessage = null)
     {
-        $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('strict_variables' => true)));
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['strict_variables' => true]);
+        $template = new Twig_TemplateTest($twig);
 
         if ($defined) {
-            $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type));
+            $this->assertEquals($value, twig_get_attribute($twig, $template->getSourceContext(), $object, $item, $arguments, $type));
         } else {
             if (method_exists($this, 'expectException')) {
-                $this->expectException('Twig_Error_Runtime');
+                $this->expectException(RuntimeError::class);
                 if (null !== $exceptionMessage) {
                     $this->expectExceptionMessage($exceptionMessage);
                 }
             } else {
-                $this->setExpectedException('Twig_Error_Runtime', $exceptionMessage);
+                $this->setExpectedException(RuntimeError::class, $exceptionMessage);
             }
-            $this->assertEquals($value, $template->getAttribute($object, $item, $arguments, $type));
+            $this->assertEquals($value, twig_get_attribute($twig, $template->getSourceContext(), $object, $item, $arguments, $type));
         }
     }
 
@@ -276,9 +222,10 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetAttributeDefined($defined, $value, $object, $item, $arguments, $type)
     {
-        $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $template = new Twig_TemplateTest($twig);
 
-        $this->assertEquals($defined, $template->getAttribute($object, $item, $arguments, $type, true));
+        $this->assertEquals($defined, twig_get_attribute($twig, $template->getSourceContext(), $object, $item, $arguments, $type, true));
     }
 
     /**
@@ -286,34 +233,39 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
      */
     public function testGetAttributeDefinedStrict($defined, $value, $object, $item, $arguments, $type)
     {
-        $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('strict_variables' => true)));
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['strict_variables' => true]);
+        $template = new Twig_TemplateTest($twig);
 
-        $this->assertEquals($defined, $template->getAttribute($object, $item, $arguments, $type, true));
+        $this->assertEquals($defined, twig_get_attribute($twig, $template->getSourceContext(), $object, $item, $arguments, $type, true));
     }
 
     public function testGetAttributeCallExceptions()
     {
-        $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock()));
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $template = new Twig_TemplateTest($twig);
 
         $object = new Twig_TemplateMagicMethodExceptionObject();
 
-        $this->assertNull($template->getAttribute($object, 'foo'));
+        $this->assertNull(twig_get_attribute($twig, $template->getSourceContext(), $object, 'foo'));
     }
 
     public function getGetAttributeTests()
     {
-        $array = array(
+        $array = [
             'defined' => 'defined',
             'zero' => 0,
             'null' => null,
             '1' => 1,
             'bar' => true,
+            'foo' => true,
             'baz' => 'baz',
+            'baf' => 'baf',
             '09' => '09',
             '+4' => '+4',
-        );
+        ];
 
         $objectArray = new Twig_TemplateArrayAccessObject();
+        $arrayObject = new \ArrayObject($array);
         $stdObject = (object) $array;
         $magicPropertyObject = new Twig_TemplateMagicPropertyObject();
         $propertyObject = new Twig_TemplatePropertyObject();
@@ -323,42 +275,45 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
         $methodObject = new Twig_TemplateMethodObject();
         $magicMethodObject = new Twig_TemplateMagicMethodObject();
 
-        $anyType = Twig_Template::ANY_CALL;
-        $methodType = Twig_Template::METHOD_CALL;
-        $arrayType = Twig_Template::ARRAY_CALL;
+        $anyType = Template::ANY_CALL;
+        $methodType = Template::METHOD_CALL;
+        $arrayType = Template::ARRAY_CALL;
 
-        $basicTests = array(
+        $basicTests = [
             // array(defined, value, property to fetch)
-            array(true,  'defined', 'defined'),
-            array(false, null,      'undefined'),
-            array(false, null,      'protected'),
-            array(true,  0,         'zero'),
-            array(true,  1,         1),
-            array(true,  1,         1.0),
-            array(true,  null,      'null'),
-            array(true,  true,      'bar'),
-            array(true,  'baz',     'baz'),
-            array(true,  '09',      '09'),
-            array(true,  '+4',      '+4'),
-        );
-        $testObjects = array(
+            [true,  'defined', 'defined'],
+            [false, null,      'undefined'],
+            [false, null,      'protected'],
+            [true,  0,         'zero'],
+            [true,  1,         1],
+            [true,  1,         1.0],
+            [true,  null,      'null'],
+            [true,  true,      'bar'],
+            [true,  true,      'foo'],
+            [true,  'baz',     'baz'],
+            [true,  'baf',     'baf'],
+            [true,  '09',      '09'],
+            [true,  '+4',      '+4'],
+        ];
+        $testObjects = [
             // array(object, type of fetch)
-            array($array,               $arrayType),
-            array($objectArray,         $arrayType),
-            array($stdObject,           $anyType),
-            array($magicPropertyObject, $anyType),
-            array($methodObject,        $methodType),
-            array($methodObject,        $anyType),
-            array($propertyObject,      $anyType),
-            array($propertyObject1,     $anyType),
-            array($propertyObject2,     $anyType),
-        );
-
-        $tests = array();
+            [$array,               $arrayType],
+            [$objectArray,         $arrayType],
+            [$arrayObject,         $anyType],
+            [$stdObject,           $anyType],
+            [$magicPropertyObject, $anyType],
+            [$methodObject,        $methodType],
+            [$methodObject,        $anyType],
+            [$propertyObject,      $anyType],
+            [$propertyObject1,     $anyType],
+            [$propertyObject2,     $anyType],
+        ];
+
+        $tests = [];
         foreach ($testObjects as $testObject) {
             foreach ($basicTests as $test) {
                 // properties cannot be numbers
-                if (($testObject[0] instanceof stdClass || $testObject[0] instanceof Twig_TemplatePropertyObject) && is_numeric($test[2])) {
+                if (($testObject[0] instanceof \stdClass || $testObject[0] instanceof Twig_TemplatePropertyObject) && is_numeric($test[2])) {
                     continue;
                 }
 
@@ -366,27 +321,27 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
                     continue;
                 }
 
-                $tests[] = array($test[0], $test[1], $testObject[0], $test[2], array(), $testObject[1]);
+                $tests[] = [$test[0], $test[1], $testObject[0], $test[2], [], $testObject[1]];
             }
         }
 
         // additional properties tests
-        $tests = array_merge($tests, array(
-            array(true, null, $propertyObject3, 'foo', array(), $anyType),
-        ));
+        $tests = array_merge($tests, [
+            [true, null, $propertyObject3, 'foo', [], $anyType],
+        ]);
 
         // additional method tests
-        $tests = array_merge($tests, array(
-            array(true, 'defined', $methodObject, 'defined',    array(), $methodType),
-            array(true, 'defined', $methodObject, 'DEFINED',    array(), $methodType),
-            array(true, 'defined', $methodObject, 'getDefined', array(), $methodType),
-            array(true, 'defined', $methodObject, 'GETDEFINED', array(), $methodType),
-            array(true, 'static',  $methodObject, 'static',     array(), $methodType),
-            array(true, 'static',  $methodObject, 'getStatic',  array(), $methodType),
-
-            array(true, '__call_undefined', $magicMethodObject, 'undefined', array(), $methodType),
-            array(true, '__call_UNDEFINED', $magicMethodObject, 'UNDEFINED', array(), $methodType),
-        ));
+        $tests = array_merge($tests, [
+            [true, 'defined', $methodObject, 'defined',    [], $methodType],
+            [true, 'defined', $methodObject, 'DEFINED',    [], $methodType],
+            [true, 'defined', $methodObject, 'getDefined', [], $methodType],
+            [true, 'defined', $methodObject, 'GETDEFINED', [], $methodType],
+            [true, 'static',  $methodObject, 'static',     [], $methodType],
+            [true, 'static',  $methodObject, 'getStatic',  [], $methodType],
+
+            [true, '__call_undefined', $magicMethodObject, 'undefined', [], $methodType],
+            [true, '__call_UNDEFINED', $magicMethodObject, 'UNDEFINED', [], $methodType],
+        ]);
 
         // add the same tests for the any type
         foreach ($tests as $test) {
@@ -399,54 +354,59 @@ class Twig_Tests_TemplateTest extends \PHPUnit\Framework\TestCase
         $methodAndPropObject = new Twig_TemplateMethodAndPropObject();
 
         // additional method tests
-        $tests = array_merge($tests, array(
-            array(true, 'a', $methodAndPropObject, 'a', array(), $anyType),
-            array(true, 'a', $methodAndPropObject, 'a', array(), $methodType),
-            array(false, null, $methodAndPropObject, 'a', array(), $arrayType),
-
-            array(true, 'b_prop', $methodAndPropObject, 'b', array(), $anyType),
-            array(true, 'b', $methodAndPropObject, 'B', array(), $anyType),
-            array(true, 'b', $methodAndPropObject, 'b', array(), $methodType),
-            array(true, 'b', $methodAndPropObject, 'B', array(), $methodType),
-            array(false, null, $methodAndPropObject, 'b', array(), $arrayType),
-
-            array(false, null, $methodAndPropObject, 'c', array(), $anyType),
-            array(false, null, $methodAndPropObject, 'c', array(), $methodType),
-            array(false, null, $methodAndPropObject, 'c', array(), $arrayType),
-        ));
+        $tests = array_merge($tests, [
+            [true, 'a', $methodAndPropObject, 'a', [], $anyType],
+            [true, 'a', $methodAndPropObject, 'a', [], $methodType],
+            [false, null, $methodAndPropObject, 'a', [], $arrayType],
+
+            [true, 'b_prop', $methodAndPropObject, 'b', [], $anyType],
+            [true, 'b', $methodAndPropObject, 'B', [], $anyType],
+            [true, 'b', $methodAndPropObject, 'b', [], $methodType],
+            [true, 'b', $methodAndPropObject, 'B', [], $methodType],
+            [false, null, $methodAndPropObject, 'b', [], $arrayType],
+
+            [false, null, $methodAndPropObject, 'c', [], $anyType],
+            [false, null, $methodAndPropObject, 'c', [], $methodType],
+            [false, null, $methodAndPropObject, 'c', [], $arrayType],
+        ]);
+
+        $arrayAccess = new Twig_TemplateArrayAccess();
+        $tests = array_merge($tests, [
+            [true, ['foo' => 'bar'], $arrayAccess, 'vars', [], $anyType],
+        ]);
 
         // tests when input is not an array or object
-        $tests = array_merge($tests, array(
-            array(false, null, 42, 'a', array(), $anyType, 'Impossible to access an attribute ("a") on a integer variable ("42") in "index.twig".'),
-            array(false, null, 'string', 'a', array(), $anyType, 'Impossible to access an attribute ("a") on a string variable ("string") in "index.twig".'),
-            array(false, null, array(), 'a', array(), $anyType, 'Key "a" does not exist as the array is empty in "index.twig".'),
-        ));
+        $tests = array_merge($tests, [
+            [false, null, 42, 'a', [], $anyType, 'Impossible to access an attribute ("a") on a integer variable ("42") in "index.twig".'],
+            [false, null, 'string', 'a', [], $anyType, 'Impossible to access an attribute ("a") on a string variable ("string") in "index.twig".'],
+            [false, null, [], 'a', [], $anyType, 'Key "a" does not exist as the array is empty in "index.twig".'],
+        ]);
 
         return $tests;
     }
 
     /**
-     * @expectedException Twig_Error_Runtime
+     * @expectedException \Twig\Error\RuntimeError
      */
     public function testGetIsMethods()
     {
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock(), ['strict_variables' => true]);
         $getIsObject = new Twig_TemplateGetIsMethods();
-        $template = new Twig_TemplateTest(new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock(), array('strict_variables' => true)));
+        $template = new Twig_TemplateTest($twig, 'index.twig');
         // first time should not create a cache for "get"
-        $this->assertNull($template->getAttribute($getIsObject, 'get'));
+        $this->assertNull(twig_get_attribute($twig, $template->getSourceContext(), $getIsObject, 'get'));
         // 0 should be in the method cache now, so this should fail
-        $this->assertNull($template->getAttribute($getIsObject, 0));
+        $this->assertNull(twig_get_attribute($twig, $template->getSourceContext(), $getIsObject, 0));
     }
 }
 
-class Twig_TemplateTest extends Twig_Template
+class Twig_TemplateTest extends Template
 {
     private $name;
 
-    public function __construct(Twig_Environment $env, $name = 'index.twig')
+    public function __construct(Environment $env, $name = 'index.twig')
     {
         parent::__construct($env);
-        self::$cache = array();
         $this->name = $name;
     }
 
@@ -477,7 +437,7 @@ class Twig_TemplateTest extends Twig_Template
 
     public function getDebugInfo()
     {
-        return array();
+        return [];
     }
 
     protected function doGetParent(array $context)
@@ -485,47 +445,40 @@ class Twig_TemplateTest extends Twig_Template
         return false;
     }
 
-    protected function doDisplay(array $context, array $blocks = array())
+    protected function doDisplay(array $context, array $blocks = [])
     {
     }
 
-    public function getAttribute($object, $item, array $arguments = array(), $type = Twig_Template::ANY_CALL, $isDefinedTest = false, $ignoreStrictCheck = false)
-    {
-        if (function_exists('twig_template_get_attributes')) {
-            return twig_template_get_attributes($this, $object, $item, $arguments, $type, $isDefinedTest, $ignoreStrictCheck);
-        } else {
-            return parent::getAttribute($object, $item, $arguments, $type, $isDefinedTest, $ignoreStrictCheck);
-        }
-    }
-
-    public function block_name($context, array $blocks = array())
+    public function block_name($context, array $blocks = [])
     {
     }
 }
 
-class Twig_TemplateArrayAccessObject implements ArrayAccess
+class Twig_TemplateArrayAccessObject implements \ArrayAccess
 {
     protected $protected = 'protected';
 
-    public $attributes = array(
+    public $attributes = [
         'defined' => 'defined',
         'zero' => 0,
         'null' => null,
         '1' => 1,
         'bar' => true,
+        'foo' => true,
         'baz' => 'baz',
+        'baf' => 'baf',
         '09' => '09',
         '+4' => '+4',
-    );
+    ];
 
     public function offsetExists($name)
     {
-        return array_key_exists($name, $this->attributes);
+        return \array_key_exists($name, $this->attributes);
     }
 
     public function offsetGet($name)
     {
-        return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null;
+        return \array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null;
     }
 
     public function offsetSet($name, $value)
@@ -541,26 +494,28 @@ class Twig_TemplateMagicPropertyObject
 {
     public $defined = 'defined';
 
-    public $attributes = array(
+    public $attributes = [
         'zero' => 0,
         'null' => null,
         '1' => 1,
         'bar' => true,
+        'foo' => true,
         'baz' => 'baz',
+        'baf' => 'baf',
         '09' => '09',
         '+4' => '+4',
-    );
+    ];
 
     protected $protected = 'protected';
 
     public function __isset($name)
     {
-        return array_key_exists($name, $this->attributes);
+        return \array_key_exists($name, $this->attributes);
     }
 
     public function __get($name)
     {
-        return array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null;
+        return \array_key_exists($name, $this->attributes) ? $this->attributes[$name] : null;
     }
 }
 
@@ -568,7 +523,7 @@ class Twig_TemplateMagicPropertyObjectWithException
 {
     public function __isset($key)
     {
-        throw new Exception('Hey! Don\'t try to isset me!');
+        throw new \Exception('Hey! Don\'t try to isset me!');
     }
 }
 
@@ -578,32 +533,36 @@ class Twig_TemplatePropertyObject
     public $zero = 0;
     public $null = null;
     public $bar = true;
+    public $foo = true;
     public $baz = 'baz';
+    public $baf = 'baf';
 
     protected $protected = 'protected';
 }
 
-class Twig_TemplatePropertyObjectAndIterator extends Twig_TemplatePropertyObject implements IteratorAggregate
+class Twig_TemplatePropertyObjectAndIterator extends Twig_TemplatePropertyObject implements \IteratorAggregate
 {
     public function getIterator()
     {
-        return new ArrayIterator(array('foo', 'bar'));
+        return new \ArrayIterator(['foo', 'bar']);
     }
 }
 
-class Twig_TemplatePropertyObjectAndArrayAccess extends Twig_TemplatePropertyObject implements ArrayAccess
+class Twig_TemplatePropertyObjectAndArrayAccess extends Twig_TemplatePropertyObject implements \ArrayAccess
 {
-    private $data = array(
+    private $data = [
         'defined' => 'defined',
         'zero' => 0,
         'null' => null,
         'bar' => true,
+        'foo' => true,
         'baz' => 'baz',
-    );
+        'baf' => 'baf',
+    ];
 
     public function offsetExists($offset)
     {
-        return array_key_exists($offset, $this->data);
+        return \array_key_exists($offset, $this->data);
     }
 
     public function offsetGet($offset)
@@ -661,16 +620,41 @@ class Twig_TemplateMethodObject
         return true;
     }
 
+    public function hasFoo()
+    {
+        return true;
+    }
+
+    public function hasBaz()
+    {
+        return 'should never be returned (has)';
+    }
+
     public function isBaz()
     {
-        return 'should never be returned';
+        return 'should never be returned (is)';
     }
 
     public function getBaz()
     {
+        return 'Baz';
+    }
+
+    public function baz()
+    {
         return 'baz';
     }
 
+    public function hasBaf()
+    {
+        return 'should never be returned (has)';
+    }
+
+    public function isBaf()
+    {
+        return 'baf';
+    }
+
     protected function getProtected()
     {
         return 'protected';
@@ -717,45 +701,46 @@ class Twig_TemplateMethodAndPropObject
     }
 }
 
-class Twig_TemplateMagicMethodObject
+class Twig_TemplateArrayAccess implements \ArrayAccess
 {
-    public function __call($method, $arguments)
+    public $vars = [
+        'foo' => 'bar',
+    ];
+    private $children = [];
+
+    public function offsetExists($offset)
     {
-        return '__call_'.$method;
+        return \array_key_exists($offset, $this->children);
     }
-}
 
-class Twig_TemplateMagicMethodExceptionObject
-{
-    public function __call($method, $arguments)
+    public function offsetGet($offset)
     {
-        throw new BadMethodCallException(sprintf('Unknown method "%s".', $method));
+        return $this->children[$offset];
     }
-}
 
-class CExtDisablingNodeVisitor implements Twig_NodeVisitorInterface
-{
-    public function enterNode(Twig_NodeInterface $node, Twig_Environment $env)
+    public function offsetSet($offset, $value)
     {
-        if ($node instanceof Twig_Node_Expression_GetAttr) {
-            $node->setAttribute('disable_c_ext', true);
-        }
-
-        return $node;
+        $this->children[$offset] = $value;
     }
 
-    public function leaveNode(Twig_NodeInterface $node, Twig_Environment $env)
+    public function offsetUnset($offset)
     {
-        return $node;
+        unset($this->children[$offset]);
     }
+}
 
-    public function getPriority()
+class Twig_TemplateMagicMethodObject
+{
+    public function __call($method, $arguments)
     {
-        return 0;
+        return '__call_'.$method;
     }
 }
 
-// to be removed in 2.0
-interface Twig_TemplateTestLoaderInterface extends Twig_LoaderInterface, Twig_SourceContextLoaderInterface
+class Twig_TemplateMagicMethodExceptionObject
 {
+    public function __call($method, $arguments)
+    {
+        throw new \BadMethodCallException(sprintf('Unknown method "%s".', $method));
+    }
 }
diff --git a/vendor/twig/twig/test/Twig/Tests/TemplateWrapperTest.php b/vendor/twig/twig/test/Twig/Tests/TemplateWrapperTest.php
index cc71052c..74618406 100644
--- a/vendor/twig/twig/test/Twig/Tests/TemplateWrapperTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/TemplateWrapperTest.php
@@ -8,56 +8,60 @@
  * For the full copyright and license information, please view the LICENSE
  * file that was distributed with this source code.
  */
+
+use Twig\Environment;
+use Twig\Loader\ArrayLoader;
+
 class Twig_Tests_TemplateWrapperTest extends \PHPUnit\Framework\TestCase
 {
     public function testHasGetBlocks()
     {
-        $twig = new Twig_Environment(new Twig_Loader_Array(array(
+        $twig = new Environment(new ArrayLoader([
             'index' => '{% block foo %}{% endblock %}',
             'index_with_use' => '{% use "imported" %}{% block foo %}{% endblock %}',
             'index_with_extends' => '{% extends "extended" %}{% block foo %}{% endblock %}',
             'imported' => '{% block imported %}{% endblock %}',
             'extended' => '{% block extended %}{% endblock %}',
-        )));
+        ]));
 
-        $wrapper = new Twig_TemplateWrapper($twig, $twig->loadTemplate('index'));
+        $wrapper = $twig->load('index');
         $this->assertTrue($wrapper->hasBlock('foo'));
         $this->assertFalse($wrapper->hasBlock('bar'));
-        $this->assertEquals(array('foo'), $wrapper->getBlockNames());
+        $this->assertEquals(['foo'], $wrapper->getBlockNames());
 
-        $wrapper = new Twig_TemplateWrapper($twig, $twig->loadTemplate('index_with_use'));
+        $wrapper = $twig->load('index_with_use');
         $this->assertTrue($wrapper->hasBlock('foo'));
         $this->assertTrue($wrapper->hasBlock('imported'));
-        $this->assertEquals(array('imported', 'foo'), $wrapper->getBlockNames());
+        $this->assertEquals(['imported', 'foo'], $wrapper->getBlockNames());
 
-        $wrapper = new Twig_TemplateWrapper($twig, $twig->loadTemplate('index_with_extends'));
+        $wrapper = $twig->load('index_with_extends');
         $this->assertTrue($wrapper->hasBlock('foo'));
         $this->assertTrue($wrapper->hasBlock('extended'));
-        $this->assertEquals(array('foo', 'extended'), $wrapper->getBlockNames());
+        $this->assertEquals(['foo', 'extended'], $wrapper->getBlockNames());
     }
 
     public function testRenderBlock()
     {
-        $twig = new Twig_Environment(new Twig_Loader_Array(array(
+        $twig = new Environment(new ArrayLoader([
             'index' => '{% block foo %}{{ foo }}{{ bar }}{% endblock %}',
-        )));
+        ]));
         $twig->addGlobal('bar', 'BAR');
 
-        $wrapper = new Twig_TemplateWrapper($twig, $twig->loadTemplate('index'));
-        $this->assertEquals('FOOBAR', $wrapper->renderBlock('foo', array('foo' => 'FOO')));
+        $wrapper = $twig->load('index');
+        $this->assertEquals('FOOBAR', $wrapper->renderBlock('foo', ['foo' => 'FOO']));
     }
 
     public function testDisplayBlock()
     {
-        $twig = new Twig_Environment(new Twig_Loader_Array(array(
+        $twig = new Environment(new ArrayLoader([
             'index' => '{% block foo %}{{ foo }}{{ bar }}{% endblock %}',
-        )));
+        ]));
         $twig->addGlobal('bar', 'BAR');
 
-        $wrapper = new Twig_TemplateWrapper($twig, $twig->loadTemplate('index'));
+        $wrapper = $twig->load('index');
 
         ob_start();
-        $wrapper->displayBlock('foo', array('foo' => 'FOO'));
+        $wrapper->displayBlock('foo', ['foo' => 'FOO']);
 
         $this->assertEquals('FOOBAR', ob_get_clean());
     }
diff --git a/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php b/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
index f219c955..c8052b21 100644
--- a/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/TokenStreamTest.php
@@ -9,40 +9,31 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Token;
+use Twig\TokenStream;
+
 class Twig_Tests_TokenStreamTest extends \PHPUnit\Framework\TestCase
 {
     protected static $tokens;
 
     protected function setUp()
     {
-        self::$tokens = array(
-            new Twig_Token(Twig_Token::TEXT_TYPE, 1, 1),
-            new Twig_Token(Twig_Token::TEXT_TYPE, 2, 1),
-            new Twig_Token(Twig_Token::TEXT_TYPE, 3, 1),
-            new Twig_Token(Twig_Token::TEXT_TYPE, 4, 1),
-            new Twig_Token(Twig_Token::TEXT_TYPE, 5, 1),
-            new Twig_Token(Twig_Token::TEXT_TYPE, 6, 1),
-            new Twig_Token(Twig_Token::TEXT_TYPE, 7, 1),
-            new Twig_Token(Twig_Token::EOF_TYPE, 0, 1),
-        );
-    }
-
-    /**
-     * @group legacy
-     */
-    public function testLegacyConstructorSignature()
-    {
-        $stream = new Twig_TokenStream(array(), 'foo', '{{ foo }}');
-        $this->assertEquals('foo', $stream->getFilename());
-        $this->assertEquals('{{ foo }}', $stream->getSource());
-        $this->assertEquals('foo', $stream->getSourceContext()->getName());
-        $this->assertEquals('{{ foo }}', $stream->getSourceContext()->getCode());
+        self::$tokens = [
+            new Token(Token::TEXT_TYPE, 1, 1),
+            new Token(Token::TEXT_TYPE, 2, 1),
+            new Token(Token::TEXT_TYPE, 3, 1),
+            new Token(Token::TEXT_TYPE, 4, 1),
+            new Token(Token::TEXT_TYPE, 5, 1),
+            new Token(Token::TEXT_TYPE, 6, 1),
+            new Token(Token::TEXT_TYPE, 7, 1),
+            new Token(Token::EOF_TYPE, 0, 1),
+        ];
     }
 
     public function testNext()
     {
-        $stream = new Twig_TokenStream(self::$tokens);
-        $repr = array();
+        $stream = new TokenStream(self::$tokens);
+        $repr = [];
         while (!$stream->isEOF()) {
             $token = $stream->next();
 
@@ -52,28 +43,28 @@ class Twig_Tests_TokenStreamTest extends \PHPUnit\Framework\TestCase
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unexpected end of template
      */
     public function testEndOfTemplateNext()
     {
-        $stream = new Twig_TokenStream(array(
-            new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1),
-        ));
+        $stream = new TokenStream([
+            new Token(Token::BLOCK_START_TYPE, 1, 1),
+        ]);
         while (!$stream->isEOF()) {
             $stream->next();
         }
     }
 
     /**
-     * @expectedException        Twig_Error_Syntax
+     * @expectedException        \Twig\Error\SyntaxError
      * @expectedExceptionMessage Unexpected end of template
      */
     public function testEndOfTemplateLook()
     {
-        $stream = new Twig_TokenStream(array(
-            new Twig_Token(Twig_Token::BLOCK_START_TYPE, 1, 1),
-        ));
+        $stream = new TokenStream([
+            new Token(Token::BLOCK_START_TYPE, 1, 1),
+        ]);
         while (!$stream->isEOF()) {
             $stream->look();
             $stream->next();
diff --git a/vendor/twig/twig/test/Twig/Tests/Util/DeprecationCollectorTest.php b/vendor/twig/twig/test/Twig/Tests/Util/DeprecationCollectorTest.php
index 887a90af..46b778ae 100644
--- a/vendor/twig/twig/test/Twig/Tests/Util/DeprecationCollectorTest.php
+++ b/vendor/twig/twig/test/Twig/Tests/Util/DeprecationCollectorTest.php
@@ -9,6 +9,11 @@
  * file that was distributed with this source code.
  */
 
+use Twig\Environment;
+use Twig\Loader\LoaderInterface;
+use Twig\TwigFunction;
+use Twig\Util\DeprecationCollector;
+
 class Twig_Tests_Util_DeprecationCollectorTest extends \PHPUnit\Framework\TestCase
 {
     /**
@@ -16,13 +21,13 @@ class Twig_Tests_Util_DeprecationCollectorTest extends \PHPUnit\Framework\TestCa
      */
     public function testCollect()
     {
-        $twig = new Twig_Environment($this->getMockBuilder('Twig_LoaderInterface')->getMock());
-        $twig->addFunction(new Twig_SimpleFunction('deprec', array($this, 'deprec'), array('deprecated' => true)));
+        $twig = new Environment($this->getMockBuilder(LoaderInterface::class)->getMock());
+        $twig->addFunction(new TwigFunction('deprec', [$this, 'deprec'], ['deprecated' => true]));
 
-        $collector = new Twig_Util_DeprecationCollector($twig);
+        $collector = new DeprecationCollector($twig);
         $deprecations = $collector->collect(new Twig_Tests_Util_Iterator());
 
-        $this->assertEquals(array('Twig Function "deprec" is deprecated in deprec.twig at line 1.'), $deprecations);
+        $this->assertEquals(['Twig Function "deprec" is deprecated in deprec.twig at line 1.'], $deprecations);
     }
 
     public function deprec()
@@ -30,13 +35,13 @@ class Twig_Tests_Util_DeprecationCollectorTest extends \PHPUnit\Framework\TestCa
     }
 }
 
-class Twig_Tests_Util_Iterator implements IteratorAggregate
+class Twig_Tests_Util_Iterator implements \IteratorAggregate
 {
     public function getIterator()
     {
-        return new ArrayIterator(array(
+        return new \ArrayIterator([
             'ok.twig' => '{{ foo }}',
             'deprec.twig' => '{{ deprec("foo") }}',
-        ));
+        ]);
     }
 }
diff --git a/vendor/twig/twig/test/bootstrap.php b/vendor/twig/twig/test/bootstrap.php
deleted file mode 100644
index aecb976f..00000000
--- a/vendor/twig/twig/test/bootstrap.php
+++ /dev/null
@@ -1,13 +0,0 @@
-<?php
-
-/*
- * This file is part of Twig.
- *
- * (c) Fabien Potencier
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-require_once dirname(__FILE__).'/../lib/Twig/Autoloader.php';
-Twig_Autoloader::register(true);
diff --git a/vendor/webmozart/assert/.composer-auth.json b/vendor/webmozart/assert/.composer-auth.json
deleted file mode 100644
index eea80018..00000000
--- a/vendor/webmozart/assert/.composer-auth.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
-    "github-oauth": {
-        "github.com": "PLEASE DO NOT USE THIS TOKEN IN YOUR OWN PROJECTS/FORKS",
-        "github.com": "This token is reserved for testing the webmozart/* repositories",
-        "github.com": "a9debbffdd953ee9b3b82dbc3b807cde2086bb86"
-    }
-}
diff --git a/vendor/webmozart/assert/.gitignore b/vendor/webmozart/assert/.gitignore
deleted file mode 100644
index 3a9875b4..00000000
--- a/vendor/webmozart/assert/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/vendor/
-composer.lock
diff --git a/vendor/webmozart/assert/.styleci.yml b/vendor/webmozart/assert/.styleci.yml
deleted file mode 100644
index 92da20f4..00000000
--- a/vendor/webmozart/assert/.styleci.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-preset: symfony
-
-enabled:
-    - ordered_use
-
-disabled:
-    - empty_return
-    - phpdoc_annotation_without_dot # This is still buggy: https://github.com/symfony/symfony/pull/19198
diff --git a/vendor/webmozart/assert/.travis.yml b/vendor/webmozart/assert/.travis.yml
deleted file mode 100644
index 12651965..00000000
--- a/vendor/webmozart/assert/.travis.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-language: php
-
-sudo: false
-
-branches:
-  only:
-    - master
-
-cache:
-  directories:
-    - $HOME/.composer/cache/files
-
-matrix:
-  include:
-    - php: 5.3
-    - php: 5.4
-    - php: 5.5
-    - php: 5.6
-    - php: hhvm
-    - php: nightly
-    - php: 7.0
-      env: COVERAGE=yes
-    - php: 7.0
-      env: COMPOSER_FLAGS='--prefer-lowest --prefer-stable'
-  allow_failures:
-    - php: hhvm
-    - php: nightly
-  fast_finish: true
-
-before_install:
-  - if [[ $TRAVIS_PHP_VERSION != hhvm && $COVERAGE != yes ]]; then phpenv config-rm xdebug.ini; fi;
-  - if [[ $TRAVIS_REPO_SLUG = webmozart/assert ]]; then cp .composer-auth.json ~/.composer/auth.json; fi;
-  - composer self-update
-
-install: composer update $COMPOSER_FLAGS --prefer-dist --no-interaction
-
-script: if [[ $COVERAGE = yes ]]; then vendor/bin/phpunit --verbose --coverage-clover=coverage.clover; else vendor/bin/phpunit --verbose; fi
-
-after_script: if [[ $COVERAGE = yes ]]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
diff --git a/vendor/webmozart/assert/CHANGELOG.md b/vendor/webmozart/assert/CHANGELOG.md
index 32983611..da4fb3fe 100644
--- a/vendor/webmozart/assert/CHANGELOG.md
+++ b/vendor/webmozart/assert/CHANGELOG.md
@@ -1,13 +1,55 @@
 Changelog
 =========
 
-* 1.2.0 (2016-11-23)
+## UNRELEASED
+
+## 1.4.0 (2018-12-25)
+
+### Added
+
+* added `Assert::ip()`
+* added `Assert::ipv4()`
+* added `Assert::ipv6()`
+* added `Assert::notRegex()`
+* added `Assert::interfaceExists()`
+* added `Assert::isList()`
+* added `Assert::isMap()`
+* added polyfill for ctype
+
+### Fixed
+
+* Special case when comparing objects implementing `__toString()`
+
+## 1.3.0 (2018-01-29)
+
+### Added 
+
+* added `Assert::minCount()`
+* added `Assert::maxCount()`
+* added `Assert::countBetween()`
+* added `Assert::isCountable()`
+* added `Assert::notWhitespaceOnly()`
+* added `Assert::natural()`
+* added `Assert::notContains()`
+* added `Assert::isArrayAccessible()`
+* added `Assert::isInstanceOfAny()`
+* added `Assert::isIterable()`
+
+### Fixed
+
+* `stringNotEmpty` will no longer report "0" is an empty string
+
+### Deprecation
+
+* deprecated `Assert::isTraversable()` in favor of `Assert::isIterable()`
+
+## 1.2.0 (2016-11-23)
 
  * added `Assert::throws()`
  * added `Assert::count()`
  * added extension point `Assert::reportInvalidArgument()` for custom subclasses
 
-* 1.1.0 (2016-08-09)
+## 1.1.0 (2016-08-09)
 
  * added `Assert::object()`
  * added `Assert::propertyExists()`
@@ -16,19 +58,19 @@ Changelog
  * added `Assert::methodNotExists()`
  * added `Assert::uuid()`
 
-* 1.0.2 (2015-08-24)
+## 1.0.2 (2015-08-24)
 
  * integrated Style CI
  * add tests for minimum package dependencies on Travis CI
 
-* 1.0.1 (2015-05-12)
+## 1.0.1 (2015-05-12)
 
  * added support for PHP 5.3.3
 
-* 1.0.0 (2015-05-12)
+## 1.0.0 (2015-05-12)
 
  * first stable release
 
-* 1.0.0-beta (2015-03-19)
+## 1.0.0-beta (2015-03-19)
 
  * first beta release
diff --git a/vendor/webmozart/assert/README.md b/vendor/webmozart/assert/README.md
index d1768600..ce7ba59d 100644
--- a/vendor/webmozart/assert/README.md
+++ b/vendor/webmozart/assert/README.md
@@ -1,11 +1,10 @@
 Webmozart Assert
 ================
 
-[![Build Status](https://travis-ci.org/webmozart/assert.svg?branch=1.2.0)](https://travis-ci.org/webmozart/assert)
+[![Build Status](https://travis-ci.org/webmozart/assert.svg?branch=master)](https://travis-ci.org/webmozart/assert)
 [![Build status](https://ci.appveyor.com/api/projects/status/lyg83bcsisrr94se/branch/master?svg=true)](https://ci.appveyor.com/project/webmozart/assert/branch/master)
 [![Latest Stable Version](https://poser.pugx.org/webmozart/assert/v/stable.svg)](https://packagist.org/packages/webmozart/assert)
 [![Total Downloads](https://poser.pugx.org/webmozart/assert/downloads.svg)](https://packagist.org/packages/webmozart/assert)
-[![Dependency Status](https://www.versioneye.com/php/webmozart:assert/1.2.0/badge.svg)](https://www.versioneye.com/php/webmozart:assert/1.2.0)
 
 Latest release: [1.2.0](https://packagist.org/packages/webmozart/assert#1.2.0)
 
@@ -89,23 +88,28 @@ The [`Assert`] class provides the following assertions:
 
 ### Type Assertions
 
-Method                                          | Description
------------------------------------------------ | --------------------------------------------------
-`string($value, $message = '')`                 | Check that a value is a string
-`stringNotEmpty($value, $message = '')`         | Check that a value is a non-empty string
-`integer($value, $message = '')`                | Check that a value is an integer
-`integerish($value, $message = '')`             | Check that a value casts to an integer
-`float($value, $message = '')`                  | Check that a value is a float
-`numeric($value, $message = '')`                | Check that a value is numeric
-`boolean($value, $message = '')`                | Check that a value is a boolean
-`scalar($value, $message = '')`                 | Check that a value is a scalar
-`object($value, $message = '')`                 | Check that a value is an object
-`resource($value, $type = null, $message = '')` | Check that a value is a resource
-`isCallable($value, $message = '')`             | Check that a value is a callable
-`isArray($value, $message = '')`                | Check that a value is an array
-`isTraversable($value, $message = '')`          | Check that a value is an array or a `\Traversable`
-`isInstanceOf($value, $class, $message = '')`   | Check that a value is an `instanceof` a class
-`notInstanceOf($value, $class, $message = '')`  | Check that a value is not an `instanceof` a class
+Method                                                   | Description
+-------------------------------------------------------- | --------------------------------------------------
+`string($value, $message = '')`                          | Check that a value is a string
+`stringNotEmpty($value, $message = '')`                  | Check that a value is a non-empty string
+`integer($value, $message = '')`                         | Check that a value is an integer
+`integerish($value, $message = '')`                      | Check that a value casts to an integer
+`float($value, $message = '')`                           | Check that a value is a float
+`numeric($value, $message = '')`                         | Check that a value is numeric
+`natural($value, $message= ''')`                         | Check that a value is a non-negative integer
+`boolean($value, $message = '')`                         | Check that a value is a boolean
+`scalar($value, $message = '')`                          | Check that a value is a scalar
+`object($value, $message = '')`                          | Check that a value is an object
+`resource($value, $type = null, $message = '')`          | Check that a value is a resource
+`isCallable($value, $message = '')`                      | Check that a value is a callable
+`isArray($value, $message = '')`                         | Check that a value is an array
+`isTraversable($value, $message = '')`  (deprecated)     | Check that a value is an array or a `\Traversable`
+`isIterable($value, $message = '')`                      | Check that a value is an array or a `\Traversable`
+`isCountable($value, $message = '')`                     | Check that a value is an array or a `\Countable`
+`isInstanceOf($value, $class, $message = '')`            | Check that a value is an `instanceof` a class
+`isInstanceOfAny($value, array $classes, $message = '')` | Check that a value is an `instanceof` a at least one class on the array of classes
+`notInstanceOf($value, $class, $message = '')`           | Check that a value is not an `instanceof` a class
+`isArrayAccessible($value, $message = '')`               | Check that a value can be accessed as an array
 
 ### Comparison Assertions
 
@@ -134,12 +138,14 @@ You should check that a value is a string with `Assert::string()` before making
 any of the following assertions.
 
 Method                                              | Description
---------------------------------------------------- | --------------------------------------------------
+--------------------------------------------------- | -----------------------------------------------------------------
 `contains($value, $subString, $message = '')`       | Check that a string contains a substring
+`notContains($value, $subString, $message = '')`    | Check that a string does not contains a substring
 `startsWith($value, $prefix, $message = '')`        | Check that a string has a prefix
 `startsWithLetter($value, $message = '')`           | Check that a string starts with a letter
 `endsWith($value, $suffix, $message = '')`          | Check that a string has a suffix
 `regex($value, $pattern, $message = '')`            | Check that a string matches a regular expression
+`notRegex($value, $pattern, $message = '')`         | Check that a string does not match a regular expression
 `alpha($value, $message = '')`                      | Check that a string contains letters only
 `digits($value, $message = '')`                     | Check that a string contains digits only
 `alnum($value, $message = '')`                      | Check that a string contains letters and digits only
@@ -150,6 +156,10 @@ Method                                              | Description
 `maxLength($value, $max, $message = '')`            | Check that a string has at most a certain number of characters
 `lengthBetween($value, $min, $max, $message = '')`  | Check that a string has a length in the given range
 `uuid($value, $message = '')`                       | Check that a string is a valid UUID
+`ip($value, $message = '')`                         | Check that a string is a valid IP (either IPv4 or IPv6)
+`ipv4($value, $message = '')`                       | Check that a string is a valid IPv4
+`ipv6($value, $message = '')`                       | Check that a string is a valid IPv6
+`notWhitespaceOnly($value, $message = '')`          | Check that a string contains at least one non-whitespace character
 
 ### File Assertions
 
@@ -167,6 +177,7 @@ Method                                                | Description
 ----------------------------------------------------- | --------------------------------------------------
 `classExists($value, $message = '')`                  | Check that a value is an existing class name
 `subclassOf($value, $class, $message = '')`           | Check that a class is a subclass of another
+`interfaceExists($value, $message = '')`              | Check that a value is an existing interface name
 `implementsInterface($value, $class, $message = '')`  | Check that a class implements an interface
 `propertyExists($value, $property, $message = '')`    | Check that a property exists in a class/object
 `propertyNotExists($value, $property, $message = '')` | Check that a property does not exist in a class/object
@@ -175,11 +186,16 @@ Method                                                | Description
 
 ### Array Assertions
 
-Method                                      | Description
-------------------------------------------- | --------------------------------------------------
-`keyExists($array, $key, $message = '')`    | Check that a key exists in an array
-`keyNotExists($array, $key, $message = '')` | Check that a key does not exist in an array
-`count($array, $number, $message = '')`     | Check that an array contains a specific number of elements
+Method                                             | Description
+-------------------------------------------------- | ------------------------------------------------------------------
+`keyExists($array, $key, $message = '')`           | Check that a key exists in an array
+`keyNotExists($array, $key, $message = '')`        | Check that a key does not exist in an array
+`count($array, $number, $message = '')`            | Check that an array contains a specific number of elements
+`minCount($array, $min, $message = '')`            | Check that an array contains at least a certain number of elements
+`maxCount($array, $max, $message = '')`            | Check that an array contains at most a certain number of elements
+`countBetween($array, $min, $max, $message = '')`  | Check that an array has a count in the given range
+`isList($array, $message = '')`                    | Check that an array is a non-associative list
+`isMap($array, $message = '')`                     | Check that an array is associative and has strings as keys
 
 ### Function Assertions
 
@@ -235,7 +251,7 @@ All contents of this package are licensed under the [MIT license].
 [Composer]: https://getcomposer.org
 [Bernhard Schussek]: http://webmozarts.com
 [The Community Contributors]: https://github.com/webmozart/assert/graphs/contributors
-[issue tracker]: https://github.com/webmozart/assert
+[issue tracker]: https://github.com/webmozart/assert/issues
 [Git repository]: https://github.com/webmozart/assert
 [@webmozart]: https://twitter.com/webmozart
 [MIT license]: LICENSE
diff --git a/vendor/webmozart/assert/appveyor.yml b/vendor/webmozart/assert/appveyor.yml
deleted file mode 100644
index 3a413bc1..00000000
--- a/vendor/webmozart/assert/appveyor.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-build: false
-platform: x86
-clone_folder: c:\projects\webmozart\assert
-
-branches:
-  only:
-    - master
-
-cache:
-  - c:\php -> appveyor.yml
-
-init:
-  - SET PATH=c:\php;%PATH%
-  - SET COMPOSER_NO_INTERACTION=1
-  - SET PHP=1
-
-install:
-  - IF EXIST c:\php (SET PHP=0) ELSE (mkdir c:\php)
-  - cd c:\php
-  - IF %PHP%==1 appveyor DownloadFile http://windows.php.net/downloads/releases/archives/php-7.0.0-nts-Win32-VC14-x86.zip
-  - IF %PHP%==1 7z x php-7.0.0-nts-Win32-VC14-x86.zip -y >nul
-  - IF %PHP%==1 del /Q *.zip
-  - IF %PHP%==1 echo @php %%~dp0composer.phar %%* > composer.bat
-  - IF %PHP%==1 copy /Y php.ini-development php.ini
-  - IF %PHP%==1 echo max_execution_time=1200 >> php.ini
-  - IF %PHP%==1 echo date.timezone="UTC" >> php.ini
-  - IF %PHP%==1 echo extension_dir=ext >> php.ini
-  - IF %PHP%==1 echo extension=php_curl.dll >> php.ini
-  - IF %PHP%==1 echo extension=php_openssl.dll >> php.ini
-  - IF %PHP%==1 echo extension=php_mbstring.dll >> php.ini
-  - IF %PHP%==1 echo extension=php_fileinfo.dll >> php.ini
-  - appveyor DownloadFile https://getcomposer.org/composer.phar
-  - cd c:\projects\webmozart\assert
-  - mkdir %APPDATA%\Composer
-  - IF %APPVEYOR_REPO_NAME%==webmozart/assert copy /Y .composer-auth.json %APPDATA%\Composer\auth.json
-  - composer update --prefer-dist --no-progress --ansi
-
-test_script:
-  - cd c:\projects\webmozart\assert
-  - vendor\bin\phpunit.bat --verbose
diff --git a/vendor/webmozart/assert/composer.json b/vendor/webmozart/assert/composer.json
index c49e623a..b6002ef3 100644
--- a/vendor/webmozart/assert/composer.json
+++ b/vendor/webmozart/assert/composer.json
@@ -1,7 +1,11 @@
 {
     "name": "webmozart/assert",
     "description": "Assertions to validate method input/output with nice error messages.",
-    "keywords": ["assert", "check", "validate"],
+    "keywords": [
+        "assert",
+        "check",
+        "validate"
+    ],
     "license": "MIT",
     "authors": [
         {
@@ -10,12 +14,18 @@
         }
     ],
     "require": {
-        "php": "^5.3.3 || ^7.0"
+        "php": "^5.3.3 || ^7.0",
+        "symfony/polyfill-ctype": "^1.8"
     },
     "require-dev": {
         "phpunit/phpunit": "^4.6",
         "sebastian/version": "^1.0.1"
     },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.3-dev"
+        }
+    },
     "autoload": {
         "psr-4": {
             "Webmozart\\Assert\\": "src/"
@@ -25,10 +35,5 @@
         "psr-4": {
             "Webmozart\\Assert\\Tests\\": "tests/"
         }
-    },
-    "extra": {
-        "branch-alias": {
-            "dev-master": "1.3-dev"
-        }
     }
 }
diff --git a/vendor/webmozart/assert/phpunit.xml.dist b/vendor/webmozart/assert/phpunit.xml.dist
deleted file mode 100644
index db20e9b4..00000000
--- a/vendor/webmozart/assert/phpunit.xml.dist
+++ /dev/null
@@ -1,16 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<phpunit bootstrap="vendor/autoload.php" colors="true">
-    <testsuites>
-        <testsuite name="Webmozart Assert Test Suite">
-            <directory suffix="Test.php">./tests/</directory>
-        </testsuite>
-    </testsuites>
-
-    <!-- Whitelist for code coverage -->
-    <filter>
-        <whitelist>
-            <directory suffix=".php">./src/</directory>
-        </whitelist>
-    </filter>
-</phpunit>
diff --git a/vendor/webmozart/assert/src/Assert.php b/vendor/webmozart/assert/src/Assert.php
index 083ad20d..db04bfbe 100644
--- a/vendor/webmozart/assert/src/Assert.php
+++ b/vendor/webmozart/assert/src/Assert.php
@@ -11,12 +11,14 @@
 
 namespace Webmozart\Assert;
 
+use ArrayAccess;
 use BadMethodCallException;
-use InvalidArgumentException;
-use Traversable;
+use Closure;
+use Countable;
 use Exception;
+use InvalidArgumentException;
 use Throwable;
-use Closure;
+use Traversable;
 
 /**
  * Efficient assertions to validate the input/output of your methods.
@@ -27,6 +29,7 @@ use Closure;
  * @method static void nullOrIntegerish($value, $message = '')
  * @method static void nullOrFloat($value, $message = '')
  * @method static void nullOrNumeric($value, $message = '')
+ * @method static void nullOrNatural($value, $message = '')
  * @method static void nullOrBoolean($value, $message = '')
  * @method static void nullOrScalar($value, $message = '')
  * @method static void nullOrObject($value, $message = '')
@@ -34,12 +37,19 @@ use Closure;
  * @method static void nullOrIsCallable($value, $message = '')
  * @method static void nullOrIsArray($value, $message = '')
  * @method static void nullOrIsTraversable($value, $message = '')
+ * @method static void nullOrIsArrayAccessible($value, $message = '')
+ * @method static void nullOrIsCountable($value, $message = '')
+ * @method static void nullOrIsIterable($value, $message = '')
  * @method static void nullOrIsInstanceOf($value, $class, $message = '')
  * @method static void nullOrNotInstanceOf($value, $class, $message = '')
+ * @method static void nullOrIsInstanceOfAny($value, $classes, $message = '')
  * @method static void nullOrIsEmpty($value, $message = '')
  * @method static void nullOrNotEmpty($value, $message = '')
  * @method static void nullOrTrue($value, $message = '')
  * @method static void nullOrFalse($value, $message = '')
+ * @method static void nullOrIp($value, $message = '')
+ * @method static void nullOrIpv4($value, $message = '')
+ * @method static void nullOrIpv6($value, $message = '')
  * @method static void nullOrEq($value, $value2, $message = '')
  * @method static void nullOrNotEq($value,$value2,  $message = '')
  * @method static void nullOrSame($value, $value2, $message = '')
@@ -51,10 +61,13 @@ use Closure;
  * @method static void nullOrRange($value, $min, $max, $message = '')
  * @method static void nullOrOneOf($value, $values, $message = '')
  * @method static void nullOrContains($value, $subString, $message = '')
+ * @method static void nullOrNotContains($value, $subString, $message = '')
+ * @method static void nullOrNotWhitespaceOnly($value, $message = '')
  * @method static void nullOrStartsWith($value, $prefix, $message = '')
  * @method static void nullOrStartsWithLetter($value, $message = '')
  * @method static void nullOrEndsWith($value, $suffix, $message = '')
  * @method static void nullOrRegex($value, $pattern, $message = '')
+ * @method static void nullOrNotRegex($value, $pattern, $message = '')
  * @method static void nullOrAlpha($value, $message = '')
  * @method static void nullOrDigits($value, $message = '')
  * @method static void nullOrAlnum($value, $message = '')
@@ -71,6 +84,7 @@ use Closure;
  * @method static void nullOrWritable($value, $message = '')
  * @method static void nullOrClassExists($value, $message = '')
  * @method static void nullOrSubclassOf($value, $class, $message = '')
+ * @method static void nullOrInterfaceExists($value, $message = '')
  * @method static void nullOrImplementsInterface($value, $interface, $message = '')
  * @method static void nullOrPropertyExists($value, $property, $message = '')
  * @method static void nullOrPropertyNotExists($value, $property, $message = '')
@@ -79,13 +93,20 @@ use Closure;
  * @method static void nullOrKeyExists($value, $key, $message = '')
  * @method static void nullOrKeyNotExists($value, $key, $message = '')
  * @method static void nullOrCount($value, $key, $message = '')
+ * @method static void nullOrMinCount($value, $min, $message = '')
+ * @method static void nullOrMaxCount($value, $max, $message = '')
+ * @method static void nullOrIsList($value, $message = '')
+ * @method static void nullOrIsMap($value, $message = '')
+ * @method static void nullOrCountBetween($value, $min, $max, $message = '')
  * @method static void nullOrUuid($values, $message = '')
+ * @method static void nullOrThrows($expression, $class = 'Exception', $message = '')
  * @method static void allString($values, $message = '')
  * @method static void allStringNotEmpty($values, $message = '')
  * @method static void allInteger($values, $message = '')
  * @method static void allIntegerish($values, $message = '')
  * @method static void allFloat($values, $message = '')
  * @method static void allNumeric($values, $message = '')
+ * @method static void allNatural($values, $message = '')
  * @method static void allBoolean($values, $message = '')
  * @method static void allScalar($values, $message = '')
  * @method static void allObject($values, $message = '')
@@ -93,14 +114,21 @@ use Closure;
  * @method static void allIsCallable($values, $message = '')
  * @method static void allIsArray($values, $message = '')
  * @method static void allIsTraversable($values, $message = '')
+ * @method static void allIsArrayAccessible($values, $message = '')
+ * @method static void allIsCountable($values, $message = '')
+ * @method static void allIsIterable($values, $message = '')
  * @method static void allIsInstanceOf($values, $class, $message = '')
  * @method static void allNotInstanceOf($values, $class, $message = '')
+ * @method static void allIsInstanceOfAny($values, $classes, $message = '')
  * @method static void allNull($values, $message = '')
  * @method static void allNotNull($values, $message = '')
  * @method static void allIsEmpty($values, $message = '')
  * @method static void allNotEmpty($values, $message = '')
  * @method static void allTrue($values, $message = '')
  * @method static void allFalse($values, $message = '')
+ * @method static void allIp($values, $message = '')
+ * @method static void allIpv4($values, $message = '')
+ * @method static void allIpv6($values, $message = '')
  * @method static void allEq($values, $value2, $message = '')
  * @method static void allNotEq($values,$value2,  $message = '')
  * @method static void allSame($values, $value2, $message = '')
@@ -112,10 +140,13 @@ use Closure;
  * @method static void allRange($values, $min, $max, $message = '')
  * @method static void allOneOf($values, $values, $message = '')
  * @method static void allContains($values, $subString, $message = '')
+ * @method static void allNotContains($values, $subString, $message = '')
+ * @method static void allNotWhitespaceOnly($values, $message = '')
  * @method static void allStartsWith($values, $prefix, $message = '')
  * @method static void allStartsWithLetter($values, $message = '')
  * @method static void allEndsWith($values, $suffix, $message = '')
  * @method static void allRegex($values, $pattern, $message = '')
+ * @method static void allNotRegex($values, $pattern, $message = '')
  * @method static void allAlpha($values, $message = '')
  * @method static void allDigits($values, $message = '')
  * @method static void allAlnum($values, $message = '')
@@ -132,6 +163,7 @@ use Closure;
  * @method static void allWritable($values, $message = '')
  * @method static void allClassExists($values, $message = '')
  * @method static void allSubclassOf($values, $class, $message = '')
+ * @method static void allInterfaceExists($values, $message = '')
  * @method static void allImplementsInterface($values, $interface, $message = '')
  * @method static void allPropertyExists($values, $property, $message = '')
  * @method static void allPropertyNotExists($values, $property, $message = '')
@@ -140,7 +172,13 @@ use Closure;
  * @method static void allKeyExists($values, $key, $message = '')
  * @method static void allKeyNotExists($values, $key, $message = '')
  * @method static void allCount($values, $key, $message = '')
+ * @method static void allMinCount($values, $min, $message = '')
+ * @method static void allMaxCount($values, $max, $message = '')
+ * @method static void allCountBetween($values, $min, $max, $message = '')
+ * @method static void allIsList($values, $message = '')
+ * @method static void allIsMap($values, $message = '')
  * @method static void allUuid($values, $message = '')
+ * @method static void allThrows($expressions, $class = 'Exception', $message = '')
  *
  * @since  1.0
  *
@@ -161,7 +199,7 @@ class Assert
     public static function stringNotEmpty($value, $message = '')
     {
         static::string($value, $message);
-        static::notEmpty($value, $message);
+        static::notEq($value, '', $message);
     }
 
     public static function integer($value, $message = '')
@@ -204,6 +242,16 @@ class Assert
         }
     }
 
+    public static function natural($value, $message = '')
+    {
+        if (!is_int($value) || $value < 0) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected a non-negative integer. Got %s',
+                static::valueToString($value)
+            ));
+        }
+    }
+
     public static function boolean($value, $message = '')
     {
         if (!is_bool($value)) {
@@ -274,6 +322,14 @@ class Assert
 
     public static function isTraversable($value, $message = '')
     {
+        @trigger_error(
+            sprintf(
+                'The "%s" assertion is deprecated. You should stop using it, as it will soon be removed in 2.0 version. Use "isIterable" or "isInstanceOf" instead.',
+                __METHOD__
+            ),
+            E_USER_DEPRECATED
+        );
+
         if (!is_array($value) && !($value instanceof Traversable)) {
             static::reportInvalidArgument(sprintf(
                 $message ?: 'Expected a traversable. Got: %s',
@@ -282,6 +338,36 @@ class Assert
         }
     }
 
+    public static function isArrayAccessible($value, $message = '')
+    {
+        if (!is_array($value) && !($value instanceof ArrayAccess)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected an array accessible. Got: %s',
+                static::typeToString($value)
+            ));
+        }
+    }
+
+    public static function isCountable($value, $message = '')
+    {
+        if (!is_array($value) && !($value instanceof Countable)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected a countable. Got: %s',
+                static::typeToString($value)
+            ));
+        }
+    }
+
+    public static function isIterable($value, $message = '')
+    {
+        if (!is_array($value) && !($value instanceof Traversable)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected an iterable. Got: %s',
+                static::typeToString($value)
+            ));
+        }
+    }
+
     public static function isInstanceOf($value, $class, $message = '')
     {
         if (!($value instanceof $class)) {
@@ -304,6 +390,21 @@ class Assert
         }
     }
 
+    public static function isInstanceOfAny($value, array $classes, $message = '')
+    {
+        foreach ($classes as $class) {
+            if ($value instanceof $class) {
+                return;
+            }
+        }
+
+        static::reportInvalidArgument(sprintf(
+            $message ?: 'Expected an instance of any of %2$s. Got: %s',
+            static::typeToString($value),
+            implode(', ', array_map(array('static', 'valueToString'), $classes))
+        ));
+    }
+
     public static function isEmpty($value, $message = '')
     {
         if (!empty($value)) {
@@ -363,6 +464,36 @@ class Assert
         }
     }
 
+    public static function ip($value, $message = '')
+    {
+        if (false === filter_var($value, FILTER_VALIDATE_IP)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected a value to be an IP. Got: %s',
+                static::valueToString($value)
+            ));
+        }
+    }
+
+    public static function ipv4($value, $message = '')
+    {
+        if (false === filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected a value to be an IPv4. Got: %s',
+                static::valueToString($value)
+            ));
+        }
+    }
+
+    public static function ipv6($value, $message = '')
+    {
+        if (false === filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected a value to be an IPv6. Got %s',
+                static::valueToString($value)
+            ));
+        }
+    }
+
     public static function eq($value, $value2, $message = '')
     {
         if ($value2 != $value) {
@@ -483,6 +614,27 @@ class Assert
         }
     }
 
+    public static function notContains($value, $subString, $message = '')
+    {
+        if (false !== strpos($value, $subString)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: '%2$s was not expected to be contained in a value. Got: %s',
+                static::valueToString($value),
+                static::valueToString($subString)
+            ));
+        }
+    }
+
+    public static function notWhitespaceOnly($value, $message = '')
+    {
+        if (preg_match('/^\s*$/', $value)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected a non-whitespace string. Got: %s',
+                static::valueToString($value)
+            ));
+        }
+    }
+
     public static function startsWith($value, $prefix, $message = '')
     {
         if (0 !== strpos($value, $prefix)) {
@@ -534,6 +686,18 @@ class Assert
         }
     }
 
+    public static function notRegex($value, $pattern, $message = '')
+    {
+        if (preg_match($pattern, $value, $matches, PREG_OFFSET_CAPTURE)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'The value %s matches the pattern %s (at offset %d).',
+                static::valueToString($value),
+                static::valueToString($pattern),
+                $matches[0][1]
+            ));
+        }
+    }
+
     public static function alpha($value, $message = '')
     {
         $locale = setlocale(LC_CTYPE, 0);
@@ -733,6 +897,16 @@ class Assert
         }
     }
 
+    public static function interfaceExists($value, $message = '')
+    {
+        if (!interface_exists($value)) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected an existing interface name. got %s',
+                static::valueToString($value)
+            ));
+        }
+    }
+
     public static function implementsInterface($value, $interface, $message = '')
     {
         if (!in_array($interface, class_implements($value))) {
@@ -786,7 +960,7 @@ class Assert
 
     public static function keyExists($array, $key, $message = '')
     {
-        if (!array_key_exists($key, $array)) {
+        if (!(isset($array[$key]) || array_key_exists($key, $array))) {
             static::reportInvalidArgument(sprintf(
                 $message ?: 'Expected the key %s to exist.',
                 static::valueToString($key)
@@ -796,7 +970,7 @@ class Assert
 
     public static function keyNotExists($array, $key, $message = '')
     {
-        if (array_key_exists($key, $array)) {
+        if (isset($array[$key]) || array_key_exists($key, $array)) {
             static::reportInvalidArgument(sprintf(
                 $message ?: 'Expected the key %s to not exist.',
                 static::valueToString($key)
@@ -813,6 +987,66 @@ class Assert
         );
     }
 
+    public static function minCount($array, $min, $message = '')
+    {
+        if (count($array) < $min) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected an array to contain at least %2$d elements. Got: %d',
+                count($array),
+                $min
+            ));
+        }
+    }
+
+    public static function maxCount($array, $max, $message = '')
+    {
+        if (count($array) > $max) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected an array to contain at most %2$d elements. Got: %d',
+                count($array),
+                $max
+            ));
+        }
+    }
+
+    public static function countBetween($array, $min, $max, $message = '')
+    {
+        $count = count($array);
+
+        if ($count < $min || $count > $max) {
+            static::reportInvalidArgument(sprintf(
+                $message ?: 'Expected an array to contain between %2$d and %3$d elements. Got: %d',
+                $count,
+                $min,
+                $max
+            ));
+        }
+    }
+
+    public static function isList($array, $message = '')
+    {
+        if (!is_array($array) || !$array || array_keys($array) !== range(0, count($array) - 1)) {
+            static::reportInvalidArgument(
+                $message ?: 'Expected list - non-associative array.'
+            );
+        }
+    }
+
+    public static function isMap($array, $message = '')
+    {
+        if (
+            !is_array($array) ||
+            !$array ||
+            array_keys($array) !== array_filter(array_keys($array), function ($key) {
+                return is_string($key);
+            })
+        ) {
+            static::reportInvalidArgument(
+                $message ?: 'Expected map - associative array with string keys.'
+            );
+        }
+    }
+
     public static function uuid($value, $message = '')
     {
         $value = str_replace(array('urn:', 'uuid:', '{', '}'), '', $value);
@@ -836,6 +1070,7 @@ class Assert
         static::string($class);
 
         $actual = 'none';
+
         try {
             $expression();
         } catch (Exception $e) {
@@ -869,7 +1104,7 @@ class Assert
         }
 
         if ('all' === substr($name, 0, 3)) {
-            static::isTraversable($arguments[0]);
+            static::isIterable($arguments[0]);
 
             $method = lcfirst(substr($name, 3));
             $args = $arguments;
@@ -905,6 +1140,10 @@ class Assert
         }
 
         if (is_object($value)) {
+            if (method_exists($value, '__toString')) {
+                return get_class($value).': '.self::valueToString($value->__toString());
+            }
+
             return get_class($value);
         }
 
diff --git a/vendor/webmozart/assert/tests/AssertTest.php b/vendor/webmozart/assert/tests/AssertTest.php
deleted file mode 100644
index e9ed505f..00000000
--- a/vendor/webmozart/assert/tests/AssertTest.php
+++ /dev/null
@@ -1,451 +0,0 @@
-<?php
-
-/*
- * This file is part of the webmozart/assert package.
- *
- * (c) Bernhard Schussek <bschussek@xxxxxxxxx>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Webmozart\Assert\Tests;
-
-use ArrayIterator;
-use Exception;
-use Error;
-use LogicException;
-use PHPUnit_Framework_TestCase;
-use RuntimeException;
-use stdClass;
-use Webmozart\Assert\Assert;
-
-/**
- * @since  1.0
- *
- * @author Bernhard Schussek <bschussek@xxxxxxxxx>
- */
-class AssertTest extends PHPUnit_Framework_TestCase
-{
-    private static $resource;
-
-    public static function getResource()
-    {
-        if (!static::$resource) {
-            static::$resource = fopen(__FILE__, 'r');
-        }
-
-        return static::$resource;
-    }
-
-    public static function tearDownAfterClass()
-    {
-        @fclose(self::$resource);
-    }
-
-    public function getTests()
-    {
-        $resource = self::getResource();
-
-        return array(
-            array('string', array('value'), true),
-            array('string', array(''), true),
-            array('string', array(1234), false),
-            array('stringNotEmpty', array('value'), true),
-            array('stringNotEmpty', array(''), false),
-            array('stringNotEmpty', array(1234), false),
-            array('integer', array(123), true),
-            array('integer', array('123'), false),
-            array('integer', array(1.0), false),
-            array('integer', array(1.23), false),
-            array('integerish', array(1.0), true),
-            array('integerish', array(1.23), false),
-            array('integerish', array(123), true),
-            array('integerish', array('123'), true),
-            array('float', array(1.0), true),
-            array('float', array(1.23), true),
-            array('float', array(123), false),
-            array('float', array('123'), false),
-            array('numeric', array(1.0), true),
-            array('numeric', array(1.23), true),
-            array('numeric', array(123), true),
-            array('numeric', array('123'), true),
-            array('numeric', array('foo'), false),
-            array('boolean', array(true), true),
-            array('boolean', array(false), true),
-            array('boolean', array(1), false),
-            array('boolean', array('1'), false),
-            array('scalar', array('1'), true),
-            array('scalar', array(123), true),
-            array('scalar', array(true), true),
-            array('scalar', array(null), false),
-            array('scalar', array(array()), false),
-            array('scalar', array(new stdClass()), false),
-            array('object', array(new stdClass()), true),
-            array('object', array(new RuntimeException()), true),
-            array('object', array(null), false),
-            array('object', array(true), false),
-            array('object', array(1), false),
-            array('object', array(array()), false),
-            array('resource', array($resource), true),
-            array('resource', array($resource, 'stream'), true),
-            array('resource', array($resource, 'other'), false),
-            array('resource', array(1), false),
-            array('isCallable', array('strlen'), true),
-            array('isCallable', array(array($this, 'getTests')), true),
-            array('isCallable', array(function () {}), true),
-            array('isCallable', array(1234), false),
-            array('isCallable', array('foobar'), false),
-            array('isArray', array(array()), true),
-            array('isArray', array(array(1, 2, 3)), true),
-            array('isArray', array(new ArrayIterator(array())), false),
-            array('isArray', array(123), false),
-            array('isArray', array(new stdClass()), false),
-            array('isTraversable', array(array()), true),
-            array('isTraversable', array(array(1, 2, 3)), true),
-            array('isTraversable', array(new ArrayIterator(array())), true),
-            array('isTraversable', array(123), false),
-            array('isTraversable', array(new stdClass()), false),
-            array('isInstanceOf', array(new stdClass(), 'stdClass'), true),
-            array('isInstanceOf', array(new Exception(), 'stdClass'), false),
-            array('isInstanceOf', array(123, 'stdClass'), false),
-            array('isInstanceOf', array(array(), 'stdClass'), false),
-            array('notInstanceOf', array(new stdClass(), 'stdClass'), false),
-            array('notInstanceOf', array(new Exception(), 'stdClass'), true),
-            array('notInstanceOf', array(123, 'stdClass'), true),
-            array('notInstanceOf', array(array(), 'stdClass'), true),
-            array('true', array(true), true),
-            array('true', array(false), false),
-            array('true', array(1), false),
-            array('true', array(null), false),
-            array('false', array(false), true),
-            array('false', array(true), false),
-            array('false', array(1), false),
-            array('false', array(0), false),
-            array('false', array(null), false),
-            array('null', array(null), true),
-            array('null', array(false), false),
-            array('null', array(0), false),
-            array('notNull', array(false), true),
-            array('notNull', array(0), true),
-            array('notNull', array(null), false),
-            array('isEmpty', array(null), true),
-            array('isEmpty', array(false), true),
-            array('isEmpty', array(0), true),
-            array('isEmpty', array(''), true),
-            array('isEmpty', array(1), false),
-            array('isEmpty', array('a'), false),
-            array('notEmpty', array(1), true),
-            array('notEmpty', array('a'), true),
-            array('notEmpty', array(null), false),
-            array('notEmpty', array(false), false),
-            array('notEmpty', array(0), false),
-            array('notEmpty', array(''), false),
-            array('eq', array(1, 1), true),
-            array('eq', array(1, '1'), true),
-            array('eq', array(1, true), true),
-            array('eq', array(1, 0), false),
-            array('notEq', array(1, 0), true),
-            array('notEq', array(1, 1), false),
-            array('notEq', array(1, '1'), false),
-            array('notEq', array(1, true), false),
-            array('same', array(1, 1), true),
-            array('same', array(1, '1'), false),
-            array('same', array(1, true), false),
-            array('same', array(1, 0), false),
-            array('notSame', array(1, 0), true),
-            array('notSame', array(1, 1), false),
-            array('notSame', array(1, '1'), true),
-            array('notSame', array(1, true), true),
-            array('greaterThan', array(1, 0), true),
-            array('greaterThan', array(0, 0), false),
-            array('greaterThanEq', array(2, 1), true),
-            array('greaterThanEq', array(1, 1), true),
-            array('greaterThanEq', array(0, 1), false),
-            array('lessThan', array(0, 1), true),
-            array('lessThan', array(1, 1), false),
-            array('lessThanEq', array(0, 1), true),
-            array('lessThanEq', array(1, 1), true),
-            array('lessThanEq', array(2, 1), false),
-            array('range', array(1, 1, 2), true),
-            array('range', array(2, 1, 2), true),
-            array('range', array(0, 1, 2), false),
-            array('range', array(3, 1, 2), false),
-            array('oneOf', array(1, array(1, 2, 3)), true),
-            array('oneOf', array(1, array('1', '2', '3')), false),
-            array('contains', array('abcd', 'ab'), true),
-            array('contains', array('abcd', 'bc'), true),
-            array('contains', array('abcd', 'cd'), true),
-            array('contains', array('abcd', 'de'), false),
-            array('contains', array('', 'de'), false),
-            array('startsWith', array('abcd', 'ab'), true),
-            array('startsWith', array('abcd', 'bc'), false),
-            array('startsWith', array('', 'bc'), false),
-            array('startsWithLetter', array('abcd'), true),
-            array('startsWithLetter', array('1abcd'), false),
-            array('startsWithLetter', array(''), false),
-            array('endsWith', array('abcd', 'cd'), true),
-            array('endsWith', array('abcd', 'bc'), false),
-            array('endsWith', array('', 'bc'), false),
-            array('regex', array('abcd', '~^ab~'), true),
-            array('regex', array('abcd', '~^bc~'), false),
-            array('regex', array('', '~^bc~'), false),
-            array('alpha', array('abcd'), true),
-            array('alpha', array('ab1cd'), false),
-            array('alpha', array(''), false),
-            array('digits', array('1234'), true),
-            array('digits', array('12a34'), false),
-            array('digits', array(''), false),
-            array('alnum', array('ab12'), true),
-            array('alnum', array('ab12$'), false),
-            array('alnum', array(''), false),
-            array('lower', array('abcd'), true),
-            array('lower', array('abCd'), false),
-            array('lower', array('ab_d'), false),
-            array('lower', array(''), false),
-            array('upper', array('ABCD'), true),
-            array('upper', array('ABcD'), false),
-            array('upper', array('AB_D'), false),
-            array('upper', array(''), false),
-            array('length', array('abcd', 4), true),
-            array('length', array('abc', 4), false),
-            array('length', array('abcde', 4), false),
-            array('length', array('äbcd', 4), true, true),
-            array('length', array('äbc', 4), false, true),
-            array('length', array('äbcde', 4), false, true),
-            array('minLength', array('abcd', 4), true),
-            array('minLength', array('abcde', 4), true),
-            array('minLength', array('abc', 4), false),
-            array('minLength', array('äbcd', 4), true, true),
-            array('minLength', array('äbcde', 4), true, true),
-            array('minLength', array('äbc', 4), false, true),
-            array('maxLength', array('abcd', 4), true),
-            array('maxLength', array('abc', 4), true),
-            array('maxLength', array('abcde', 4), false),
-            array('maxLength', array('äbcd', 4), true, true),
-            array('maxLength', array('äbc', 4), true, true),
-            array('maxLength', array('äbcde', 4), false, true),
-            array('lengthBetween', array('abcd', 3, 5), true),
-            array('lengthBetween', array('abc', 3, 5), true),
-            array('lengthBetween', array('abcde', 3, 5), true),
-            array('lengthBetween', array('ab', 3, 5), false),
-            array('lengthBetween', array('abcdef', 3, 5), false),
-            array('lengthBetween', array('äbcd', 3, 5), true, true),
-            array('lengthBetween', array('äbc', 3, 5), true, true),
-            array('lengthBetween', array('äbcde', 3, 5), true, true),
-            array('lengthBetween', array('äb', 3, 5), false, true),
-            array('lengthBetween', array('äbcdef', 3, 5), false, true),
-            array('fileExists', array(__FILE__), true),
-            array('fileExists', array(__DIR__), true),
-            array('fileExists', array(__DIR__.'/foobar'), false),
-            array('file', array(__FILE__), true),
-            array('file', array(__DIR__), false),
-            array('file', array(__DIR__.'/foobar'), false),
-            array('directory', array(__DIR__), true),
-            array('directory', array(__FILE__), false),
-            array('directory', array(__DIR__.'/foobar'), false),
-            // no tests for readable()/writable() for now
-            array('classExists', array(__CLASS__), true),
-            array('classExists', array(__NAMESPACE__.'\Foobar'), false),
-            array('subclassOf', array(__CLASS__, 'PHPUnit_Framework_TestCase'), true),
-            array('subclassOf', array(__CLASS__, 'stdClass'), false),
-            array('implementsInterface', array('ArrayIterator', 'Traversable'), true),
-            array('implementsInterface', array(__CLASS__, 'Traversable'), false),
-            array('propertyExists', array((object) array('property' => 0), 'property'), true),
-            array('propertyExists', array((object) array('property' => null), 'property'), true),
-            array('propertyExists', array((object) array('property' => null), 'foo'), false),
-            array('propertyNotExists', array((object) array('property' => 0), 'property'), false),
-            array('propertyNotExists', array((object) array('property' => null), 'property'), false),
-            array('propertyNotExists', array((object) array('property' => null), 'foo'), true),
-            array('methodExists', array('RuntimeException', 'getMessage'), true),
-            array('methodExists', array(new RuntimeException(), 'getMessage'), true),
-            array('methodExists', array('stdClass', 'getMessage'), false),
-            array('methodExists', array(new stdClass(), 'getMessage'), false),
-            array('methodExists', array(null, 'getMessage'), false),
-            array('methodExists', array(true, 'getMessage'), false),
-            array('methodExists', array(1, 'getMessage'), false),
-            array('methodNotExists', array('RuntimeException', 'getMessage'), false),
-            array('methodNotExists', array(new RuntimeException(), 'getMessage'), false),
-            array('methodNotExists', array('stdClass', 'getMessage'), true),
-            array('methodNotExists', array(new stdClass(), 'getMessage'), true),
-            array('methodNotExists', array(null, 'getMessage'), true),
-            array('methodNotExists', array(true, 'getMessage'), true),
-            array('methodNotExists', array(1, 'getMessage'), true),
-            array('keyExists', array(array('key' => 0), 'key'), true),
-            array('keyExists', array(array('key' => null), 'key'), true),
-            array('keyExists', array(array('key' => null), 'foo'), false),
-            array('keyNotExists', array(array('key' => 0), 'key'), false),
-            array('keyNotExists', array(array('key' => null), 'key'), false),
-            array('keyNotExists', array(array('key' => null), 'foo'), true),
-            array('count', array(array(0, 1, 2), 3), true),
-            array('count', array(array(0, 1, 2), 2), false),
-            array('uuid', array('00000000-0000-0000-0000-000000000000'), true),
-            array('uuid', array('ff6f8cb0-c57d-21e1-9b21-0800200c9a66'), true),
-            array('uuid', array('ff6f8cb0-c57d-11e1-9b21-0800200c9a66'), true),
-            array('uuid', array('ff6f8cb0-c57d-31e1-9b21-0800200c9a66'), true),
-            array('uuid', array('ff6f8cb0-c57d-41e1-9b21-0800200c9a66'), true),
-            array('uuid', array('ff6f8cb0-c57d-51e1-9b21-0800200c9a66'), true),
-            array('uuid', array('FF6F8CB0-C57D-11E1-9B21-0800200C9A66'), true),
-            array('uuid', array('zf6f8cb0-c57d-11e1-9b21-0800200c9a66'), false),
-            array('uuid', array('af6f8cb0c57d11e19b210800200c9a66'), false),
-            array('uuid', array('ff6f8cb0-c57da-51e1-9b21-0800200c9a66'), false),
-            array('uuid', array('af6f8cb-c57d-11e1-9b21-0800200c9a66'), false),
-            array('uuid', array('3f6f8cb0-c57d-11e1-9b21-0800200c9a6'), false),
-            array('throws', array(function() { throw new LogicException('test'); }, 'LogicException'), true),
-            array('throws', array(function() { throw new LogicException('test'); }, 'IllogicException'), false),
-            array('throws', array(function() { throw new Exception('test'); }), true),
-            array('throws', array(function() { trigger_error('test'); }, 'Throwable'), true, false, 70000),
-            array('throws', array(function() { trigger_error('test'); }, 'Unthrowable'), false, false, 70000),
-            array('throws', array(function() { throw new Error(); }, 'Throwable'), true, true, 70000),
-        );
-    }
-
-    public function getMethods()
-    {
-        $methods = array();
-
-        foreach ($this->getTests() as $params) {
-            $methods[$params[0]] = array($params[0]);
-        }
-
-        return array_values($methods);
-    }
-
-    /**
-     * @dataProvider getTests
-     */
-    public function testAssert($method, $args, $success, $multibyte = false, $minVersion = null)
-    {
-        if ($minVersion && PHP_VERSION_ID < $minVersion) {
-            $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion));
-
-            return;
-        }
-        if ($multibyte && !function_exists('mb_strlen')) {
-            $this->markTestSkipped('The function mb_strlen() is not available');
-
-            return;
-        }
-
-        if (!$success) {
-            $this->setExpectedException('\InvalidArgumentException');
-        }
-
-        call_user_func_array(array('Webmozart\Assert\Assert', $method), $args);
-    }
-
-    /**
-     * @dataProvider getTests
-     */
-    public function testNullOr($method, $args, $success, $multibyte = false, $minVersion = null)
-    {
-        if ($minVersion && PHP_VERSION_ID < $minVersion) {
-            $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion));
-
-            return;
-        }
-        if ($multibyte && !function_exists('mb_strlen')) {
-            $this->markTestSkipped('The function mb_strlen() is not available');
-
-            return;
-        }
-
-        if (!$success && null !== reset($args)) {
-            $this->setExpectedException('\InvalidArgumentException');
-        }
-
-        call_user_func_array(array('Webmozart\Assert\Assert', 'nullOr'.ucfirst($method)), $args);
-    }
-
-    /**
-     * @dataProvider getMethods
-     */
-    public function testNullOrAcceptsNull($method)
-    {
-        call_user_func(array('Webmozart\Assert\Assert', 'nullOr'.ucfirst($method)), null);
-    }
-
-    /**
-     * @dataProvider getTests
-     */
-    public function testAllArray($method, $args, $success, $multibyte = false, $minVersion = null)
-    {
-        if ($minVersion && PHP_VERSION_ID < $minVersion) {
-            $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion));
-
-            return;
-        }
-        if ($multibyte && !function_exists('mb_strlen')) {
-            $this->markTestSkipped('The function mb_strlen() is not available');
-
-            return;
-        }
-
-        if (!$success) {
-            $this->setExpectedException('\InvalidArgumentException');
-        }
-
-        $arg = array_shift($args);
-        array_unshift($args, array($arg));
-
-        call_user_func_array(array('Webmozart\Assert\Assert', 'all'.ucfirst($method)), $args);
-    }
-
-    /**
-     * @dataProvider getTests
-     */
-    public function testAllTraversable($method, $args, $success, $multibyte = false, $minVersion = null)
-    {
-        if ($minVersion && PHP_VERSION_ID < $minVersion) {
-            $this->markTestSkipped(sprintf('This test requires php %s or upper.', $minVersion));
-
-            return;
-        }
-        if ($multibyte && !function_exists('mb_strlen')) {
-            $this->markTestSkipped('The function mb_strlen() is not available');
-
-            return;
-        }
-
-        if (!$success) {
-            $this->setExpectedException('\InvalidArgumentException');
-        }
-
-        $arg = array_shift($args);
-        array_unshift($args, new ArrayIterator(array($arg)));
-
-        call_user_func_array(array('Webmozart\Assert\Assert', 'all'.ucfirst($method)), $args);
-    }
-
-    public function getStringConversions()
-    {
-        return array(
-            array('integer', array('foobar'), 'Expected an integer. Got: string'),
-            array('string', array(1), 'Expected a string. Got: integer'),
-            array('string', array(true), 'Expected a string. Got: boolean'),
-            array('string', array(null), 'Expected a string. Got: NULL'),
-            array('string', array(array()), 'Expected a string. Got: array'),
-            array('string', array(new stdClass()), 'Expected a string. Got: stdClass'),
-            array('string', array(self::getResource()), 'Expected a string. Got: resource'),
-
-            array('eq', array('1', '2'), 'Expected a value equal to "2". Got: "1"'),
-            array('eq', array(1, 2), 'Expected a value equal to 2. Got: 1'),
-            array('eq', array(true, false), 'Expected a value equal to false. Got: true'),
-            array('eq', array(true, null), 'Expected a value equal to null. Got: true'),
-            array('eq', array(null, true), 'Expected a value equal to true. Got: null'),
-            array('eq', array(array(1), array(2)), 'Expected a value equal to array. Got: array'),
-            array('eq', array(new ArrayIterator(array()), new stdClass()), 'Expected a value equal to stdClass. Got: ArrayIterator'),
-            array('eq', array(1, self::getResource()), 'Expected a value equal to resource. Got: 1'),
-        );
-    }
-
-    /**
-     * @dataProvider getStringConversions
-     */
-    public function testConvertValuesToStrings($method, $args, $exceptionMessage)
-    {
-        $this->setExpectedException('\InvalidArgumentException', $exceptionMessage);
-
-        call_user_func_array(array('Webmozart\Assert\Assert', $method), $args);
-    }
-}



_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits