diff --git a/core/CHANGELOG.txt b/core/CHANGELOG.txt
index 16b05d08828d1485e7755a844b0f1ea187055e91..01a3dd484c166a75e6fef8dafe2d2d79f1c7d07f 100644
--- a/core/CHANGELOG.txt
+++ b/core/CHANGELOG.txt
@@ -1,13 +1,3 @@
-Drupal 8.1.0, xxxx-xx-xx (development version)
-------------------------
-- Removed Composer-managed vendor from the git repository:
- * Drupal.org packager adds dependencies to zip and tar package. This can be
- used without any further steps.
- * When not using zip / tar files, e.g. when using a git clone, run composer
- install to get dependencies.
- * See https://www.drupal.org/documentation/install/download#git
- for instructions.
-
Drupal 8.0.0, 2015-11-19
------------------------
- Significantly improved the front end:
diff --git a/vendor/.htaccess b/vendor/.htaccess
new file mode 100644
index 0000000000000000000000000000000000000000..90748bbc93099df3f75781376c61198eb3d92983
--- /dev/null
+++ b/vendor/.htaccess
@@ -0,0 +1,23 @@
+# Deny all requests from Apache 2.4+.
+
+ Require all denied
+
+
+# Deny all requests from Apache 2.0-2.2.
+
+ Deny from all
+
+# Turn off all options we don't need.
+Options -Indexes -ExecCGI -Includes -MultiViews
+
+# Set the catch-all handler to prevent scripts from being executed.
+SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006
+
+ # Override the handler again if we're run later in the evaluation list.
+ SetHandler Drupal_Security_Do_Not_Remove_See_SA_2013_003
+
+
+# If we know how to do it safely, disable the PHP engine entirely.
+
+ php_flag engine off
+
diff --git a/vendor/autoload.php b/vendor/autoload.php
new file mode 100644
index 0000000000000000000000000000000000000000..5111b1b9c3ad50109fb13cf3fdaf117127c02b60
--- /dev/null
+++ b/vendor/autoload.php
@@ -0,0 +1,7 @@
+
+
+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/behat/mink-browserkit-driver/README.md b/vendor/behat/mink-browserkit-driver/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..1903a5fc8f8be9bc160913ccf5822a7d3b9ffa64
--- /dev/null
+++ b/vendor/behat/mink-browserkit-driver/README.md
@@ -0,0 +1,54 @@
+Mink BrowserKit Driver
+======================
+
+[![Latest Stable Version](https://poser.pugx.org/behat/mink-browserkit-driver/v/stable.png)](https://packagist.org/packages/behat/mink-browserkit-driver)
+[![Latest Unstable Version](https://poser.pugx.org/behat/mink-browserkit-driver/v/unstable.svg)](https://packagist.org/packages/behat/mink-browserkit-driver)
+[![Total Downloads](https://poser.pugx.org/behat/mink-browserkit-driver/downloads.png)](https://packagist.org/packages/behat/mink-browserkit-driver)
+[![Build Status](https://travis-ci.org/minkphp/MinkBrowserKitDriver.svg?branch=master)](https://travis-ci.org/minkphp/MinkBrowserKitDriver)
+[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/minkphp/MinkBrowserKitDriver/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/minkphp/MinkBrowserKitDriver/)
+[![Code Coverage](https://scrutinizer-ci.com/g/minkphp/MinkBrowserKitDriver/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/minkphp/MinkBrowserKitDriver/)
+[![License](https://poser.pugx.org/behat/mink-browserkit-driver/license.svg)](https://packagist.org/packages/behat/mink-browserkit-driver)
+
+Usage Example
+-------------
+
+``` php
+ new Session(new BrowserKitDriver(new Client($app))),
+));
+
+$mink->getSession('silex')->getPage()->findLink('Chat')->click();
+```
+
+Installation
+------------
+
+``` json
+{
+ "require": {
+ "behat/mink": "~1.5",
+ "behat/mink-browserkit-driver": "~1.1"
+ }
+}
+```
+
+``` bash
+$> curl -sS https://getcomposer.org/installer | php
+$> php composer.phar install
+```
+
+Maintainers
+-----------
+
+* Christophe Coevoet [stof](https://github.com/stof)
+* Other [awesome developers](https://github.com/minkphp/MinkBrowserKitDriver/graphs/contributors)
diff --git a/vendor/behat/mink-browserkit-driver/composer.json b/vendor/behat/mink-browserkit-driver/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..7d12bbcf08e36d9513dc6bf22efec761348aeb69
--- /dev/null
+++ b/vendor/behat/mink-browserkit-driver/composer.json
@@ -0,0 +1,46 @@
+{
+ "name": "behat/mink-browserkit-driver",
+ "description": "Symfony2 BrowserKit driver for Mink framework",
+ "keywords": ["Symfony2", "Mink", "testing", "browser"],
+ "homepage": "http://mink.behat.org/",
+ "type": "mink-driver",
+ "license": "MIT",
+
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+
+ "require": {
+ "php": ">=5.3.6",
+ "behat/mink": "~1.7@dev",
+ "symfony/browser-kit": "~2.3",
+ "symfony/dom-crawler": "~2.3"
+ },
+
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7",
+ "silex/silex": "~1.2"
+ },
+
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\Driver\\": "src/"
+ }
+ },
+
+ "autoload-dev": {
+ "psr-4": {
+ "Behat\\Mink\\Tests\\Driver\\": "tests"
+ }
+ },
+
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ }
+}
diff --git a/vendor/behat/mink-browserkit-driver/phpunit.xml.dist b/vendor/behat/mink-browserkit-driver/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..d91581c24eedbe476bac0cb7af42b66c9ecd6275
--- /dev/null
+++ b/vendor/behat/mink-browserkit-driver/phpunit.xml.dist
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+ tests
+ vendor/behat/mink/driver-testsuite/tests/Basic
+ vendor/behat/mink/driver-testsuite/tests/Form
+
+
+
+
+
+ ./src
+
+
+
diff --git a/vendor/behat/mink-browserkit-driver/src/BrowserKitDriver.php b/vendor/behat/mink-browserkit-driver/src/BrowserKitDriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..70682e70bb68263f39bc2d04e16c674dded27c6d
--- /dev/null
+++ b/vendor/behat/mink-browserkit-driver/src/BrowserKitDriver.php
@@ -0,0 +1,855 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Driver;
+
+use Behat\Mink\Exception\DriverException;
+use Behat\Mink\Exception\UnsupportedDriverActionException;
+use Symfony\Component\BrowserKit\Client;
+use Symfony\Component\BrowserKit\Cookie;
+use Symfony\Component\BrowserKit\Response;
+use Symfony\Component\DomCrawler\Crawler;
+use Symfony\Component\DomCrawler\Field\ChoiceFormField;
+use Symfony\Component\DomCrawler\Field\FileFormField;
+use Symfony\Component\DomCrawler\Field\FormField;
+use Symfony\Component\DomCrawler\Field\InputFormField;
+use Symfony\Component\DomCrawler\Field\TextareaFormField;
+use Symfony\Component\DomCrawler\Form;
+use Symfony\Component\HttpKernel\Client as HttpKernelClient;
+
+/**
+ * Symfony2 BrowserKit driver.
+ *
+ * @author Konstantin Kudryashov
+ */
+class BrowserKitDriver extends CoreDriver
+{
+ private $client;
+
+ /**
+ * @var Form[]
+ */
+ private $forms = array();
+ private $serverParameters = array();
+ private $started = false;
+ private $removeScriptFromUrl = false;
+ private $removeHostFromUrl = false;
+
+ /**
+ * Initializes BrowserKit driver.
+ *
+ * @param Client $client BrowserKit client instance
+ * @param string|null $baseUrl Base URL for HttpKernel clients
+ */
+ public function __construct(Client $client, $baseUrl = null)
+ {
+ $this->client = $client;
+ $this->client->followRedirects(true);
+
+ if ($baseUrl !== null && $client instanceof HttpKernelClient) {
+ $client->setServerParameter('SCRIPT_FILENAME', parse_url($baseUrl, PHP_URL_PATH));
+ }
+ }
+
+ /**
+ * Returns BrowserKit HTTP client instance.
+ *
+ * @return Client
+ */
+ public function getClient()
+ {
+ return $this->client;
+ }
+
+ /**
+ * Tells driver to remove hostname from URL.
+ *
+ * @param Boolean $remove
+ *
+ * @deprecated Deprecated as of 1.2, to be removed in 2.0. Pass the base url in the constructor instead.
+ */
+ public function setRemoveHostFromUrl($remove = true)
+ {
+ trigger_error(
+ 'setRemoveHostFromUrl() is deprecated as of 1.2 and will be removed in 2.0. Pass the base url in the constructor instead.',
+ E_USER_DEPRECATED
+ );
+ $this->removeHostFromUrl = (bool) $remove;
+ }
+
+ /**
+ * Tells driver to remove script name from URL.
+ *
+ * @param Boolean $remove
+ *
+ * @deprecated Deprecated as of 1.2, to be removed in 2.0. Pass the base url in the constructor instead.
+ */
+ public function setRemoveScriptFromUrl($remove = true)
+ {
+ trigger_error(
+ 'setRemoveScriptFromUrl() is deprecated as of 1.2 and will be removed in 2.0. Pass the base url in the constructor instead.',
+ E_USER_DEPRECATED
+ );
+ $this->removeScriptFromUrl = (bool) $remove;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function start()
+ {
+ $this->started = true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isStarted()
+ {
+ return $this->started;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function stop()
+ {
+ $this->reset();
+ $this->started = false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reset()
+ {
+ // Restarting the client resets the cookies and the history
+ $this->client->restart();
+ $this->forms = array();
+ $this->serverParameters = array();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function visit($url)
+ {
+ $this->client->request('GET', $this->prepareUrl($url), array(), array(), $this->serverParameters);
+ $this->forms = array();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCurrentUrl()
+ {
+ $request = $this->client->getInternalRequest();
+
+ if ($request === null) {
+ throw new DriverException('Unable to access the request before visiting a page');
+ }
+
+ return $request->getUri();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reload()
+ {
+ $this->client->reload();
+ $this->forms = array();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function forward()
+ {
+ $this->client->forward();
+ $this->forms = array();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function back()
+ {
+ $this->client->back();
+ $this->forms = array();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setBasicAuth($user, $password)
+ {
+ if (false === $user) {
+ unset($this->serverParameters['PHP_AUTH_USER'], $this->serverParameters['PHP_AUTH_PW']);
+
+ return;
+ }
+
+ $this->serverParameters['PHP_AUTH_USER'] = $user;
+ $this->serverParameters['PHP_AUTH_PW'] = $password;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setRequestHeader($name, $value)
+ {
+ $contentHeaders = array('CONTENT_LENGTH' => true, 'CONTENT_MD5' => true, 'CONTENT_TYPE' => true);
+ $name = str_replace('-', '_', strtoupper($name));
+
+ // CONTENT_* are not prefixed with HTTP_ in PHP when building $_SERVER
+ if (!isset($contentHeaders[$name])) {
+ $name = 'HTTP_' . $name;
+ }
+
+ $this->serverParameters[$name] = $value;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getResponseHeaders()
+ {
+ return $this->getResponse()->getHeaders();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setCookie($name, $value = null)
+ {
+ if (null === $value) {
+ $this->deleteCookie($name);
+
+ return;
+ }
+
+ $jar = $this->client->getCookieJar();
+ $jar->set(new Cookie($name, $value));
+ }
+
+ /**
+ * Deletes a cookie by name.
+ *
+ * @param string $name Cookie name.
+ */
+ private function deleteCookie($name)
+ {
+ $path = $this->getCookiePath();
+ $jar = $this->client->getCookieJar();
+
+ do {
+ if (null !== $jar->get($name, $path)) {
+ $jar->expire($name, $path);
+ }
+
+ $path = preg_replace('/.$/', '', $path);
+ } while ($path);
+ }
+
+ /**
+ * Returns current cookie path.
+ *
+ * @return string
+ */
+ private function getCookiePath()
+ {
+ $path = dirname(parse_url($this->getCurrentUrl(), PHP_URL_PATH));
+
+ if ('\\' === DIRECTORY_SEPARATOR) {
+ $path = str_replace('\\', '/', $path);
+ }
+
+ return $path;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCookie($name)
+ {
+ // Note that the following doesn't work well because
+ // Symfony\Component\BrowserKit\CookieJar stores cookies by name,
+ // path, AND domain and if you don't fill them all in correctly then
+ // you won't get the value that you're expecting.
+ //
+ // $jar = $this->client->getCookieJar();
+ //
+ // if (null !== $cookie = $jar->get($name)) {
+ // return $cookie->getValue();
+ // }
+
+ $allValues = $this->client->getCookieJar()->allValues($this->getCurrentUrl());
+
+ if (isset($allValues[$name])) {
+ return $allValues[$name];
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getStatusCode()
+ {
+ return $this->getResponse()->getStatus();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ return $this->getResponse()->getContent();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function findElementXpaths($xpath)
+ {
+ $nodes = $this->getCrawler()->filterXPath($xpath);
+
+ $elements = array();
+ foreach ($nodes as $i => $node) {
+ $elements[] = sprintf('(%s)[%d]', $xpath, $i + 1);
+ }
+
+ return $elements;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTagName($xpath)
+ {
+ return $this->getCrawlerNode($this->getFilteredCrawler($xpath))->nodeName;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getText($xpath)
+ {
+ $text = $this->getFilteredCrawler($xpath)->text();
+ $text = str_replace("\n", ' ', $text);
+ $text = preg_replace('/ {2,}/', ' ', $text);
+
+ return trim($text);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHtml($xpath)
+ {
+ // cut the tag itself (making innerHTML out of outerHTML)
+ return preg_replace('/^\<[^\>]+\>|\<[^\>]+\>$/', '', $this->getOuterHtml($xpath));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getOuterHtml($xpath)
+ {
+ $node = $this->getCrawlerNode($this->getFilteredCrawler($xpath));
+
+ return $node->ownerDocument->saveHTML($node);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAttribute($xpath, $name)
+ {
+ $node = $this->getFilteredCrawler($xpath);
+
+ if ($this->getCrawlerNode($node)->hasAttribute($name)) {
+ return $node->attr($name);
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getValue($xpath)
+ {
+ if (in_array($this->getAttribute($xpath, 'type'), array('submit', 'image', 'button'), true)) {
+ return $this->getAttribute($xpath, 'value');
+ }
+
+ $node = $this->getCrawlerNode($this->getFilteredCrawler($xpath));
+
+ if ('option' === $node->tagName) {
+ return $this->getOptionValue($node);
+ }
+
+ try {
+ $field = $this->getFormField($xpath);
+ } catch (\InvalidArgumentException $e) {
+ return $this->getAttribute($xpath, 'value');
+ }
+
+ return $field->getValue();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setValue($xpath, $value)
+ {
+ $this->getFormField($xpath)->setValue($value);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function check($xpath)
+ {
+ $this->getCheckboxField($xpath)->tick();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function uncheck($xpath)
+ {
+ $this->getCheckboxField($xpath)->untick();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function selectOption($xpath, $value, $multiple = false)
+ {
+ $field = $this->getFormField($xpath);
+
+ if (!$field instanceof ChoiceFormField) {
+ throw new DriverException(sprintf('Impossible to select an option on the element with XPath "%s" as it is not a select or radio input', $xpath));
+ }
+
+ if ($multiple) {
+ $oldValue = (array) $field->getValue();
+ $oldValue[] = $value;
+ $value = $oldValue;
+ }
+
+ $field->select($value);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isSelected($xpath)
+ {
+ $optionValue = $this->getOptionValue($this->getCrawlerNode($this->getFilteredCrawler($xpath)));
+ $selectField = $this->getFormField('(' . $xpath . ')/ancestor-or-self::*[local-name()="select"]');
+ $selectValue = $selectField->getValue();
+
+ return is_array($selectValue) ? in_array($optionValue, $selectValue, true) : $optionValue === $selectValue;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function click($xpath)
+ {
+ $crawler = $this->getFilteredCrawler($xpath);
+ $node = $this->getCrawlerNode($crawler);
+ $tagName = $node->nodeName;
+
+ if ('a' === $tagName) {
+ $this->client->click($crawler->link());
+ $this->forms = array();
+ } elseif ($this->canSubmitForm($node)) {
+ $this->submit($crawler->form());
+ } elseif ($this->canResetForm($node)) {
+ $this->resetForm($node);
+ } else {
+ $message = sprintf('%%s supports clicking on links and submit or reset buttons only. But "%s" provided', $tagName);
+
+ throw new UnsupportedDriverActionException($message, $this);
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isChecked($xpath)
+ {
+ $field = $this->getFormField($xpath);
+
+ if (!$field instanceof ChoiceFormField || 'select' === $field->getType()) {
+ throw new DriverException(sprintf('Impossible to get the checked state of the element with XPath "%s" as it is not a checkbox or radio input', $xpath));
+ }
+
+ if ('checkbox' === $field->getType()) {
+ return $field->hasValue();
+ }
+
+ $radio = $this->getCrawlerNode($this->getFilteredCrawler($xpath));
+
+ return $radio->getAttribute('value') === $field->getValue();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function attachFile($xpath, $path)
+ {
+ $field = $this->getFormField($xpath);
+
+ if (!$field instanceof FileFormField) {
+ throw new DriverException(sprintf('Impossible to attach a file on the element with XPath "%s" as it is not a file input', $xpath));
+ }
+
+ $field->upload($path);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function submitForm($xpath)
+ {
+ $crawler = $this->getFilteredCrawler($xpath);
+
+ $this->submit($crawler->form());
+ }
+
+ /**
+ * @return Response
+ *
+ * @throws DriverException If there is not response yet
+ */
+ protected function getResponse()
+ {
+ $response = $this->client->getInternalResponse();
+
+ if (null === $response) {
+ throw new DriverException('Unable to access the response before visiting a page');
+ }
+
+ return $response;
+ }
+
+ /**
+ * Prepares URL for visiting.
+ * Removes "*.php/" from urls and then passes it to BrowserKitDriver::visit().
+ *
+ * @param string $url
+ *
+ * @return string
+ */
+ protected function prepareUrl($url)
+ {
+ $replacement = ($this->removeHostFromUrl ? '' : '$1') . ($this->removeScriptFromUrl ? '' : '$2');
+
+ return preg_replace('#(https?\://[^/]+)(/[^/\.]+\.php)?#', $replacement, $url);
+ }
+
+ /**
+ * Returns form field from XPath query.
+ *
+ * @param string $xpath
+ *
+ * @return FormField
+ *
+ * @throws DriverException
+ */
+ protected function getFormField($xpath)
+ {
+ $fieldNode = $this->getCrawlerNode($this->getFilteredCrawler($xpath));
+ $fieldName = str_replace('[]', '', $fieldNode->getAttribute('name'));
+
+ $formNode = $this->getFormNode($fieldNode);
+ $formId = $this->getFormNodeId($formNode);
+
+ if (!isset($this->forms[$formId])) {
+ $this->forms[$formId] = new Form($formNode, $this->getCurrentUrl());
+ }
+
+ if (is_array($this->forms[$formId][$fieldName])) {
+ return $this->forms[$formId][$fieldName][$this->getFieldPosition($fieldNode)];
+ }
+
+ return $this->forms[$formId][$fieldName];
+ }
+
+ /**
+ * Returns the checkbox field from xpath query, ensuring it is valid.
+ *
+ * @param string $xpath
+ *
+ * @return ChoiceFormField
+ *
+ * @throws DriverException when the field is not a checkbox
+ */
+ private function getCheckboxField($xpath)
+ {
+ $field = $this->getFormField($xpath);
+
+ if (!$field instanceof ChoiceFormField) {
+ throw new DriverException(sprintf('Impossible to check the element with XPath "%s" as it is not a checkbox', $xpath));
+ }
+
+ return $field;
+ }
+
+ /**
+ * @param \DOMElement $element
+ *
+ * @return \DOMElement
+ *
+ * @throws DriverException if the form node cannot be found
+ */
+ private function getFormNode(\DOMElement $element)
+ {
+ if ($element->hasAttribute('form')) {
+ $formId = $element->getAttribute('form');
+ $formNode = $element->ownerDocument->getElementById($formId);
+
+ if (null === $formNode || 'form' !== $formNode->nodeName) {
+ throw new DriverException(sprintf('The selected node has an invalid form attribute (%s).', $formId));
+ }
+
+ return $formNode;
+ }
+
+ $formNode = $element;
+
+ do {
+ // use the ancestor form element
+ if (null === $formNode = $formNode->parentNode) {
+ throw new DriverException('The selected node does not have a form ancestor.');
+ }
+ } while ('form' !== $formNode->nodeName);
+
+ return $formNode;
+ }
+
+ /**
+ * Gets the position of the field node among elements with the same name
+ *
+ * BrowserKit uses the field name as index to find the field in its Form object.
+ * When multiple fields have the same name (checkboxes for instance), it will return
+ * an array of elements in the order they appear in the DOM.
+ *
+ * @param \DOMElement $fieldNode
+ *
+ * @return integer
+ */
+ private function getFieldPosition(\DOMElement $fieldNode)
+ {
+ $elements = $this->getCrawler()->filterXPath('//*[@name=\''.$fieldNode->getAttribute('name').'\']');
+
+ if (count($elements) > 1) {
+ // more than one element contains this name !
+ // so we need to find the position of $fieldNode
+ foreach ($elements as $key => $element) {
+ /** @var \DOMElement $element */
+ if ($element->getNodePath() === $fieldNode->getNodePath()) {
+ return $key;
+ }
+ }
+ }
+
+ return 0;
+ }
+
+ private function submit(Form $form)
+ {
+ $formId = $this->getFormNodeId($form->getFormNode());
+
+ if (isset($this->forms[$formId])) {
+ $this->mergeForms($form, $this->forms[$formId]);
+ }
+
+ // remove empty file fields from request
+ foreach ($form->getFiles() as $name => $field) {
+ if (empty($field['name']) && empty($field['tmp_name'])) {
+ $form->remove($name);
+ }
+ }
+
+ foreach ($form->all() as $field) {
+ // Add a fix for https://github.com/symfony/symfony/pull/10733 to support Symfony versions which are not fixed
+ if ($field instanceof TextareaFormField && null === $field->getValue()) {
+ $field->setValue('');
+ }
+ }
+
+ $this->client->submit($form);
+
+ $this->forms = array();
+ }
+
+ private function resetForm(\DOMElement $fieldNode)
+ {
+ $formNode = $this->getFormNode($fieldNode);
+ $formId = $this->getFormNodeId($formNode);
+ unset($this->forms[$formId]);
+ }
+
+ /**
+ * Determines if a node can submit a form.
+ *
+ * @param \DOMElement $node Node.
+ *
+ * @return boolean
+ */
+ private function canSubmitForm(\DOMElement $node)
+ {
+ $type = $node->hasAttribute('type') ? $node->getAttribute('type') : null;
+
+ if ('input' === $node->nodeName && in_array($type, array('submit', 'image'), true)) {
+ return true;
+ }
+
+ return 'button' === $node->nodeName && (null === $type || 'submit' === $type);
+ }
+
+ /**
+ * Determines if a node can reset a form.
+ *
+ * @param \DOMElement $node Node.
+ *
+ * @return boolean
+ */
+ private function canResetForm(\DOMElement $node)
+ {
+ $type = $node->hasAttribute('type') ? $node->getAttribute('type') : null;
+
+ return in_array($node->nodeName, array('input', 'button'), true) && 'reset' === $type;
+ }
+
+ /**
+ * Returns form node unique identifier.
+ *
+ * @param \DOMElement $form
+ *
+ * @return string
+ */
+ private function getFormNodeId(\DOMElement $form)
+ {
+ return md5($form->getLineNo() . $form->getNodePath() . $form->nodeValue);
+ }
+
+ /**
+ * Gets the value of an option element
+ *
+ * @param \DOMElement $option
+ *
+ * @return string
+ *
+ * @see \Symfony\Component\DomCrawler\Field\ChoiceFormField::buildOptionValue
+ */
+ private function getOptionValue(\DOMElement $option)
+ {
+ if ($option->hasAttribute('value')) {
+ return $option->getAttribute('value');
+ }
+
+ if (!empty($option->nodeValue)) {
+ return $option->nodeValue;
+ }
+
+ return '1'; // DomCrawler uses 1 by default if there is no text in the option
+ }
+
+ /**
+ * Merges second form values into first one.
+ *
+ * @param Form $to merging target
+ * @param Form $from merging source
+ */
+ private function mergeForms(Form $to, Form $from)
+ {
+ foreach ($from->all() as $name => $field) {
+ $fieldReflection = new \ReflectionObject($field);
+ $nodeReflection = $fieldReflection->getProperty('node');
+ $valueReflection = $fieldReflection->getProperty('value');
+
+ $nodeReflection->setAccessible(true);
+ $valueReflection->setAccessible(true);
+
+ $isIgnoredField = $field instanceof InputFormField &&
+ in_array($nodeReflection->getValue($field)->getAttribute('type'), array('submit', 'button', 'image'), true);
+
+ if (!$isIgnoredField) {
+ $valueReflection->setValue($to[$name], $valueReflection->getValue($field));
+ }
+ }
+ }
+
+ /**
+ * Returns DOMElement from crawler instance.
+ *
+ * @param Crawler $crawler
+ *
+ * @return \DOMElement
+ *
+ * @throws DriverException when the node does not exist
+ */
+ private function getCrawlerNode(Crawler $crawler)
+ {
+ $crawler->rewind();
+ $node = $crawler->current();
+
+ if (null !== $node) {
+ return $node;
+ }
+
+ throw new DriverException('The element does not exist');
+ }
+
+ /**
+ * Returns a crawler filtered for the given XPath, requiring at least 1 result.
+ *
+ * @param string $xpath
+ *
+ * @return Crawler
+ *
+ * @throws DriverException when no matching elements are found
+ */
+ private function getFilteredCrawler($xpath)
+ {
+ if (!count($crawler = $this->getCrawler()->filterXPath($xpath))) {
+ throw new DriverException(sprintf('There is no element matching XPath "%s"', $xpath));
+ }
+
+ return $crawler;
+ }
+
+ /**
+ * Returns crawler instance (got from client).
+ *
+ * @return Crawler
+ *
+ * @throws DriverException
+ */
+ private function getCrawler()
+ {
+ $crawler = $this->client->getCrawler();
+
+ if (null === $crawler) {
+ throw new DriverException('Unable to access the response content before visiting a page');
+ }
+
+ return $crawler;
+ }
+}
diff --git a/vendor/behat/mink-goutte-driver/.gitignore b/vendor/behat/mink-goutte-driver/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..1d034f43f76de9f4066cc5abc0f33c226fcb5daf
--- /dev/null
+++ b/vendor/behat/mink-goutte-driver/.gitignore
@@ -0,0 +1,4 @@
+vendor
+composer.phar
+composer.lock
+phpunit.xml
diff --git a/vendor/behat/mink-goutte-driver/.travis.yml b/vendor/behat/mink-goutte-driver/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5b865317dd76d4e431756074fed712b7c3ef03aa
--- /dev/null
+++ b/vendor/behat/mink-goutte-driver/.travis.yml
@@ -0,0 +1,27 @@
+language: php
+
+sudo: false
+
+cache:
+ directories:
+ - $HOME/.composer/cache/files
+
+php: [5.3, 5.4, 5.5, 5.6, hhvm]
+
+before_install:
+ # Force using Goutte 2 on HHVM for now because Guzzle 6 is broken there
+ - if [ "hhvm" = "$TRAVIS_PHP_VERSION" ]; then composer require fabpot/goutte '~2' --no-update; fi
+
+install:
+ - composer install
+
+before_script:
+ - export WEB_FIXTURES_HOST=http://localhost:8000
+
+ # Start a webserver for web fixtures. Force using PHP 5.6 to be able to run it on PHP 5.3 and HHVM jobs too
+ - ~/.phpenv/versions/5.6/bin/php -S localhost:8000 -t vendor/behat/mink/driver-testsuite/web-fixtures > /dev/null 2>&1 &
+
+script: phpunit -v --coverage-clover=coverage.clover
+
+after_script:
+ - wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover coverage.clover
diff --git a/vendor/behat/mink-goutte-driver/CHANGELOG.md b/vendor/behat/mink-goutte-driver/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..581eb5ec6ef5432c472b6e6cc4bceb57422ba0ef
--- /dev/null
+++ b/vendor/behat/mink-goutte-driver/CHANGELOG.md
@@ -0,0 +1,31 @@
+1.2.0 / 2015-09-21
+==================
+
+New features:
+
+* Added support for Goutte 3.1+
+
+Misc:
+
+* Updated the repository structure to PSR-4
+
+1.1.0 / 2014-10-09
+==================
+
+The driver now relies on BrowserKitDriver 1.2.x, so all changes of this driver are relevant.
+The changes below only describe the changes related to GoutteDriver specifically.
+
+New features:
+
+* Added the possibility to use a normal Goutte client instead of requiring to use an extended one
+* Added the support of Goutte 2.0 as well
+
+Bug fixes:
+
+* Fixed the support of disabling basic auth
+* Fixed the resetting of the driver to reset the basic auth
+
+Testing:
+
+* Updated the testsuite to use the new Mink 1.6 driver testsuite
+* Added testing on HHVM
diff --git a/vendor/behat/mink-goutte-driver/LICENSE b/vendor/behat/mink-goutte-driver/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..3365ae632b46d0212092836a352bbbb666b4dfdb
--- /dev/null
+++ b/vendor/behat/mink-goutte-driver/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2012-2013 Konstantin Kudryashov
+
+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/behat/mink-goutte-driver/README.md b/vendor/behat/mink-goutte-driver/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..cba60a08bffb8549a085366b11f7c3a710430631
--- /dev/null
+++ b/vendor/behat/mink-goutte-driver/README.md
@@ -0,0 +1,60 @@
+Mink Goutte Driver
+==================
+
+[![Latest Stable Version](https://poser.pugx.org/behat/mink-goutte-driver/v/stable.svg)](https://packagist.org/packages/behat/mink-goutte-driver)
+[![Latest Unstable Version](https://poser.pugx.org/behat/mink-goutte-driver/v/unstable.svg)](https://packagist.org/packages/behat/mink-goutte-driver)
+[![Total Downloads](https://poser.pugx.org/behat/mink-goutte-driver/downloads.svg)](https://packagist.org/packages/behat/mink-goutte-driver)
+[![Build Status](https://travis-ci.org/minkphp/MinkGoutteDriver.svg?branch=master)](https://travis-ci.org/minkphp/MinkGoutteDriver)
+[![Scrutinizer Quality Score](https://scrutinizer-ci.com/g/minkphp/MinkGoutteDriver/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/minkphp/MinkGoutteDriver/)
+[![Code Coverage](https://scrutinizer-ci.com/g/minkphp/MinkGoutteDriver/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/minkphp/MinkGoutteDriver/)
+[![License](https://poser.pugx.org/behat/mink-goutte-driver/license.svg)](https://packagist.org/packages/behat/mink-goutte-driver)
+
+Usage Example
+-------------
+
+``` php
+ new Session(new GoutteDriver(new GoutteClient())),
+));
+
+$session = $mink->getSession('goutte');
+$session->visit("http://php.net/");
+$session->getPage()->clickLink('Downloads');
+echo $session->getCurrentUrl() . PHP_EOL;
+```
+
+Installation
+------------
+
+Add a file composer.json with content:
+
+``` json
+{
+ "require": {
+ "behat/mink": "~1.5",
+ "behat/mink-goutte-driver": "~1.0"
+ }
+}
+```
+
+(or merge the above into your project's existing composer.json file)
+
+``` bash
+$> curl -sS https://getcomposer.org/installer | php
+$> php composer.phar install
+```
+
+Maintainers
+-----------
+
+* Christophe Coevoet [stof](https://github.com/stof)
+* Other [awesome developers](https://github.com/minkphp/MinkGoutteDriver/graphs/contributors)
diff --git a/vendor/behat/mink-goutte-driver/composer.json b/vendor/behat/mink-goutte-driver/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..80d6ecf23ed2e38fa92272f03c0c7f6fabe05e87
--- /dev/null
+++ b/vendor/behat/mink-goutte-driver/composer.json
@@ -0,0 +1,45 @@
+{
+ "name": "behat/mink-goutte-driver",
+ "description": "Goutte driver for Mink framework",
+ "keywords": ["goutte", "headless", "testing", "browser"],
+ "homepage": "http://mink.behat.org/",
+ "type": "mink-driver",
+ "license": "MIT",
+
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+
+ "require": {
+ "php": ">=5.3.1",
+ "behat/mink": "~1.6@dev",
+ "behat/mink-browserkit-driver": "~1.2@dev",
+ "fabpot/goutte": "~1.0.4|~2.0|~3.1"
+ },
+
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\Driver\\": "src/"
+ }
+ },
+
+ "autoload-dev": {
+ "psr-4": {
+ "Behat\\Mink\\Tests\\Driver\\": "tests"
+ }
+ },
+
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ }
+}
diff --git a/vendor/behat/mink-goutte-driver/phpunit.xml.dist b/vendor/behat/mink-goutte-driver/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..cbe57c47d390918446fa06d97853aa1fc85a772d
--- /dev/null
+++ b/vendor/behat/mink-goutte-driver/phpunit.xml.dist
@@ -0,0 +1,23 @@
+
+
+
+
+
+ tests
+ vendor/behat/mink/driver-testsuite/tests/Basic
+ vendor/behat/mink/driver-testsuite/tests/Form
+
+
+
+
+
+
+
+
+
+
+
+ ./src
+
+
+
diff --git a/vendor/behat/mink-goutte-driver/src/Goutte/Client.php b/vendor/behat/mink-goutte-driver/src/Goutte/Client.php
new file mode 100644
index 0000000000000000000000000000000000000000..9d64be7604fdcd88d4c0113c80ade0d9bd26c2a7
--- /dev/null
+++ b/vendor/behat/mink-goutte-driver/src/Goutte/Client.php
@@ -0,0 +1,43 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Driver\Goutte;
+
+use Goutte\Client as BaseClient;
+use Symfony\Component\BrowserKit\Response;
+
+/**
+ * Client overrides to support Mink functionality.
+ */
+class Client extends BaseClient
+{
+ /**
+ * Reads response meta tags to guess content-type charset.
+ *
+ * @param Response $response
+ *
+ * @return Response
+ */
+ protected function filterResponse($response)
+ {
+ $contentType = $response->getHeader('Content-Type');
+
+ if (!$contentType || false === strpos($contentType, 'charset=')) {
+ if (preg_match('/\ ]+charset *= *["\']?([a-zA-Z\-0-9]+)/i', $response->getContent(), $matches)) {
+ $headers = $response->getHeaders();
+ $headers['Content-Type'] = $contentType.';charset='.$matches[1];
+
+ $response = new Response($response->getContent(), $response->getStatus(), $headers);
+ }
+ }
+
+ return parent::filterResponse($response);
+ }
+}
diff --git a/vendor/behat/mink-goutte-driver/src/GoutteDriver.php b/vendor/behat/mink-goutte-driver/src/GoutteDriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..a42d5a26ac73f312078d1162eb356e51a933d2d9
--- /dev/null
+++ b/vendor/behat/mink-goutte-driver/src/GoutteDriver.php
@@ -0,0 +1,75 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Driver;
+
+use Behat\Mink\Driver\Goutte\Client as ExtendedClient;
+use Goutte\Client;
+
+/**
+ * Goutte driver.
+ *
+ * @author Konstantin Kudryashov
+ */
+class GoutteDriver extends BrowserKitDriver
+{
+ /**
+ * Initializes Goutte driver.
+ *
+ * @param Client $client Goutte client instance
+ */
+ public function __construct(Client $client = null)
+ {
+ parent::__construct($client ?: new ExtendedClient());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setBasicAuth($user, $password)
+ {
+ if (false === $user) {
+ $this->getClient()->resetAuth();
+
+ return;
+ }
+
+ $this->getClient()->setAuth($user, $password);
+ }
+
+ /**
+ * Gets the Goutte client.
+ *
+ * The method is overwritten only to provide the appropriate return type hint.
+ *
+ * @return Client
+ */
+ public function getClient()
+ {
+ return parent::getClient();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reset()
+ {
+ parent::reset();
+ $this->getClient()->resetAuth();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function prepareUrl($url)
+ {
+ return $url;
+ }
+}
diff --git a/vendor/behat/mink/.gitignore b/vendor/behat/mink/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..66de342a111ac61c9bcba7d19b2372399c8502c3
--- /dev/null
+++ b/vendor/behat/mink/.gitignore
@@ -0,0 +1,5 @@
+*.tgz
+*.phar
+phpunit.xml
+composer.lock
+vendor
diff --git a/vendor/behat/mink/.travis.yml b/vendor/behat/mink/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..677ee0ecfd4c18037e453f0903ed39a0dda153a0
--- /dev/null
+++ b/vendor/behat/mink/.travis.yml
@@ -0,0 +1,28 @@
+language: php
+
+sudo: false
+
+php: [5.3, 5.4, 5.5, 5.6, 7.0, hhvm]
+
+matrix:
+ fast_finish: true
+ include:
+ - php: 5.3
+ env: COMPOSER_FLAGS='--prefer-lowest --prefer-stable' SYMFONY_DEPRECATIONS_HELPER=weak
+ allow_failures:
+ - php: 7.0
+
+cache:
+ directories:
+ - $HOME/.composer/cache/files
+
+before_install:
+ - composer self-update
+
+install:
+ - composer update $COMPOSER_FLAGS
+
+script: phpunit -v --coverage-clover=coverage.clover
+
+after_script:
+ - if [[ "7.0" != "$TRAVIS_PHP_VERSION" && "$TRAVIS_PHP_VERSION" != "hhvm" ]]; then wget https://scrutinizer-ci.com/ocular.phar && php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
diff --git a/vendor/behat/mink/CHANGES.md b/vendor/behat/mink/CHANGES.md
new file mode 100644
index 0000000000000000000000000000000000000000..4ef4ecb28fe095bf76ad4f058d839d34d8ff6a4e
--- /dev/null
+++ b/vendor/behat/mink/CHANGES.md
@@ -0,0 +1,297 @@
+1.7.0 / 2015-09-20
+==================
+
+New features:
+
+* Added `Session::getResponseHeader` to access a response header easily
+* Added support for header assertions
+* Added a forward compatibility layer for drivers to allow them to prepare
+ for Mink 2.0 (they won't require any change if they use it). They should
+ now overwrite `CoreDriver::findElementXpaths` instead of implementing `find`
+ and `setSession` themselves.
+* Added escaping of the locator in the NamedSelector rather than expecting
+ the caller to perform the escaping. Passing an escaped locator is still
+ supported but deprecated.
+* Remove the dependency on the Session in expectation exceptions. Passing
+ the session in the exception constructor is now deprecated. The driver
+ should be passed instead.
+
+Bug fixes:
+
+* Fixed the URL assertions when comparing paths ending in ``.php``
+* Silenced deprecation warnings (following the Symfony convention) to make
+ them less invasive. Use the `symfony/phpunit-bridge` to get them reported
+ when using Mink in your PHPUnit tests.
+* Fixed `NodeElement::hasClass` in case the class attribute contains newlines
+
+Testsuite:
+
+* Made the testsuite compatible with PHPUnit strict timing mode (only the library testsuite, not the driver one)
+* Added testing against PHP 7
+* Added testing against lowest version of dependencies to ensure we got the lower bounds right
+
+Driver testsuite:
+
+* Added an extra test to ensure the right behavior when getting the HTML with empty elements
+* Added a few more safeguards to ensure test failures rather than fatal errors for misbehaving drivers
+* Added a test ensuring that drivers follow recommended practices
+
+Misc:
+
+* Added a few missing deprecation warnings for deprecated APIs or classes.
+
+1.6.1 / 2015-02-04
+==================
+
+Bug fixes:
+
+* Added a check for empty path in `WebAssert::cleanUrl()`
+
+Driver testsuite:
+
+* Added an extra test to ensure the right behavior for traversal
+
+Misc:
+
+* Changed the description in the composer.json
+* Switched the repository structure to use PSR-4
+* Updated URLs for the move to the new Github organization
+
+1.6.0 / 2014-09-26
+==================
+
+ * [BC break] Changed the named selector to prefer exact matches over partial matches
+ * [BC break] Changed `NodeElement::getValue` for checkboxes to return the value rather than the checked state (use `isChecked` for that)
+ * Fixed the XPath prefixing when searching inside an existing element
+ * Refactored the driver testsuite entirely and expand it to cover drivers entirely (covering many more cases for consistency)
+ * Changed `NodeElement::setValue` to support any fields rather than only input elements
+ * Removed the wrapping of any driver-level exception in a MinkException on invalid usage as it was making the code too complex
+ * Fixed the matching of the input type in the named selector to be case insensitive according to the HTML spec
+ * Introduced `Behat\Mink\Selector\Xpath\Escaper` to allow reusing the XPath escaping
+ * Deprecated `Element::getSession`. Code needing the session should get it from outside rather than the element
+ * Changed ElementNotFoundException to extend from ExpectationException
+ * Added `Element::getOuterHtml` to get the HTML code of the element including itself
+ * Fixed the name selectors to match on the `placeholder` only for textual inputs
+ * Enforced consistent behavior for drivers on 4xx and 5xx response to return the response rather than throwing an exception
+ * Added `Element::waitFor` to allow retrying some code until it succeeds or the timeout is reached
+ * Added `Element::isValid` to check whether an element still exists in the page
+ * Made `Session::executeScript` compatible across drivers by ensuring they all support the same syntaxes for the JS expression
+ * Made `Session::evaluateScript` compatible across drivers by ensuring they all support the same syntaxes for the JS expression
+ * Removed `hasClass` from `DocumentElement` (instead of triggering a fatal error)
+ * Added testing on HHVM to ensure consistency
+ * Fixed `NodeElement::getTagName` to ensure that the tag name is lowercase for all drivers
+ * Fixed `Element::hasAttribute` to ensure it supports attributes with an empty value
+ * Fixed the `field` selector to avoid matching inputs with the type `submit` or `reset`
+ * Changed the button XPath selection to accept `reset` buttons as well
+ * Changed `Session::wait` to return the condition value rather than nothing
+ * Added `Session::getWindowName` and `Session::getWindowNames` to get the name of the current and of all windows
+ * Added `Session::maximizeWindow` to maximize the window
+ * Added `NodeElement::isSelected` to check whether an `` is selected
+ * Added `NodeElement::submitForm` to allow submitting a form without using a button
+ * Added assertions about the value of an attribute
+ * Added the anchor in the assertion on the URL in `WebAssert`
+
+1.5.0 / 2013-04-14
+==================
+
+ * Add `CoreDriver` to simplify future drivers improvements
+ * Add `Mink::isSessionStarted()` method
+ * Fix multibite string `preg_replace` bugs
+ * Fix handling of whitespaces in `WebAssert::pageText...()` methods
+
+1.4.3 / 2013-03-02
+==================
+
+ * Bump dependencies constraints
+
+1.4.2 / 2013-02-13
+==================
+
+ * Fix wrong test case to ensure that core drivers work as expected
+
+1.4.1 / 2013-02-10
+==================
+
+ * Update dependencies
+ * Add ElementException to element actions
+ * Rel attribute support for named selectors
+ * Add hasClass() helper to traversable elements
+ * Add getScreenshot() method to session
+ * Name attr support in named selector for button
+ * Fix for bunch of bugs
+
+1.4.0 / 2012-05-40
+==================
+
+ * New `Session::selectWindow()` and `Session::selectIFrame()` methods
+ * New built-in `WebAssert` class
+ * Fixed DocBlocks (autocompletion in any IDE now should just work)
+ * Moved Behat-related code into `Behat\MinkExtension`
+ * Removed PHPUnit test case class
+ * Updated composer dependencies to not require custom repository anymore
+ * All drivers moved into separate packages
+
+1.3.3 / 2012-03-23
+==================
+
+ * Prevent exceptions in `__toString()`
+ * Added couple of useful step definitions for Behat
+ * Fixed issues #168, #211, #212, #208
+ * Lot of small bug fixes and improvements
+ * Fixed dependencies and composer installation routine
+
+1.3.2 / 2011-12-21
+==================
+
+ * Fixed webdriver registration in MinkContext
+
+1.3.1 / 2011-12-21
+==================
+
+ * Fixed Composer package
+
+1.3.0 / 2011-12-21
+==================
+
+ * Brand new Selenium2Driver (webdriver session)
+ * Multiselect bugfixes
+ * ZombieDriver back in the business
+ * Composer now manages dependencies
+ * Some MinkContext steps got fixes
+ * Lots of bug fixes and cleanup
+
+1.2.0 / 2011-11-04
+==================
+
+ * Brand new SeleniumDriver (thanks @alexandresalome)
+ * Multiselect support (multiple options selection), including new Behat steps
+ * Ability to select option by it's text (in addition to value)
+ * ZombieDriver updates
+ * Use SuiteHooks to populate parameters (no need to call parent __construct anymore)
+ * Updated Goutte and all vendors
+ * Lot of bugfixes and new tests
+
+1.1.1 / 2011-08-12
+==================
+
+ * Fixed Zombie.js server termination on Linux
+ * Fixed base_url usage for external URLs
+
+1.1.0 / 2011-08-08
+==================
+
+ * Added Zombie.js driver (thanks @b00giZm)
+ * Added pt translation (thanks Daniel Gomes)
+ * Refactored MinkContext and MinkTestCase
+
+1.0.3 / 2011-08-02
+==================
+
+ * File uploads for empty fields fixed (GoutteDriver)
+ * Lazy sessions restart
+ * `show_tmp_dir` option in MinkContext
+ * Updated to stable Symfony2 components
+ * SahiClient connection limit bumped to 60 seconds
+ * Dutch language support
+
+1.0.2 / 2011-07-22
+==================
+
+ * ElementHtmlException fixed (thanks @Stof)
+
+1.0.1 / 2011-07-21
+==================
+
+ * Fixed buggy assertions in MinkContext
+
+1.0.0 / 2011-07-20
+==================
+
+ * Added missing tests for almost everything
+ * Hude speedup for SahiDriver
+ * Support for Behat 2.0 contexts
+ * Bundled PHPUnit TestCase
+ * Deep element traversing
+ * Correct behavior of getText() method
+ * New getHtml() method
+ * Basic HTTP auth support
+ * Soft and hard session resetting
+ * Cookies management
+ * Browser history interactions (reload(), back(), forward())
+ * Weaverryan'd exception messages
+ * Huge amount of bugfixes and small additions
+
+0.3.2 / 2011-06-20
+==================
+
+ * Fixed file uploads in Goutte driver
+ * Fixed setting of long texts into fields
+ * Added getPlainText() (returns text without tags and whitespaces) method to the element's API
+ * Start_url is now optional parameter
+ * Default session (if needed) name now need to be always specified by hands with setDefaultSessionName()
+ * default_driver => default_session
+ * Updated Symfony Components
+
+0.3.1 / 2011-05-17
+==================
+
+ * Small SahiClient update (it generates SID now if no provided)
+ * setActiveSessionName => setDefaultSessionName method rename
+
+0.3.0 / 2011-05-17
+==================
+
+ * Rewritten from scratch Mink drivers handler. Now it's sessions handler. And Mink now
+ sessions-centric tool. See examples in readme. Much cleaner API now.
+
+0.2.4 / 2011-05-12
+==================
+
+ * Fixed wrong url locator function
+ * Fixed wrong regex in `should see` step
+ * Fixed delimiters use in `should see` step
+ * Added url-match step for checking urls against regex
+
+0.2.3 / 2011-05-01
+==================
+
+ * Updated SahiClient with new version, which is faster and cleaner with it's exceptions
+
+0.2.2 / 2011-05-01
+==================
+
+ * Ability to use already started browser as SahiDriver aim
+ * Added japanese translation for bundled steps (thanks @hidenorigoto)
+ * 10 seconds limit for browser connection in SahiDriver
+
+0.2.1 / 2011-04-21
+==================
+
+ * Fixed some bundled step definitions
+
+0.2.0 / 2011-04-21
+==================
+
+ * Additional step definitions
+ * Support for extended drivers configuration through behat.yml environment parameters
+ * Lots of new named selectors
+ * Bug fixes
+ * Small improvements
+
+0.1.2 / 2011-04-08
+==================
+
+ * Fixed Sahi url escaping
+
+0.1.1 / 2011-04-06
+==================
+
+ * Fixed should/should_not steps
+ * Added spanish translation
+ * Fixed forms to use element
+ * Fixed small UnsupportedByDriverException issue
+
+0.1.0 / 2011-04-04
+==================
+
+ * Initial release
diff --git a/vendor/behat/mink/CONTRIBUTING.md b/vendor/behat/mink/CONTRIBUTING.md
new file mode 100644
index 0000000000000000000000000000000000000000..5db4d856eb99305a9e22113b1e17faa4cbf46eab
--- /dev/null
+++ b/vendor/behat/mink/CONTRIBUTING.md
@@ -0,0 +1,22 @@
+# Contributing
+Mink 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:
+
+## Submitting an issues
+- __Driver-related__ issues must be reported in the corresponding driver repository
+- A reproducible example is required for every bug report, otherwise it will most probably be __closed without warning__
+- If you are going to make a big, substantial change, let's discuss it first
+
+## Working with Pull Requests
+1. Create your feature addition or a bug fix branch based on `master` branch in your repository's fork.
+2. Make necessary changes, but __don't mix__ code reformatting with code changes on topic.
+3. Add tests for those changes (please look into `tests/` folder for some examples). This is important so we don't break it in a future version unintentionally.
+4. Commit your code, but do not mess with `CHANGES.md`.
+5. Squash your commits by topic to preserve a clean and readable log.
+6. Create Pull Request.
+
+# Running tests
+Make sure that you don't break anything with your changes by running:
+
+```bash
+$> phpunit
+```
diff --git a/vendor/behat/mink/LICENSE b/vendor/behat/mink/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..854754b796cf09ef0f1e3100a761ab48ee40f76d
--- /dev/null
+++ b/vendor/behat/mink/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2011-2015 Konstantin Kudryashov
+
+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/behat/mink/README.md b/vendor/behat/mink/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..2299506a60751255cf6e6790da1967efb17cd041
--- /dev/null
+++ b/vendor/behat/mink/README.md
@@ -0,0 +1,74 @@
+Mink
+====
+[![Latest Stable Version](https://poser.pugx.org/behat/mink/v/stable.svg)](https://packagist.org/packages/behat/mink)
+[![Latest Unstable Version](https://poser.pugx.org/behat/mink/v/unstable.svg)](https://packagist.org/packages/behat/mink)
+[![Total Downloads](https://poser.pugx.org/behat/mink/downloads.svg)](https://packagist.org/packages/behat/mink)
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/minkphp/Mink/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/minkphp/Mink/?branch=master)
+[![Code Coverage](https://scrutinizer-ci.com/g/minkphp/Mink/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/minkphp/Mink/)
+[![Build Status](https://travis-ci.org/minkphp/Mink.svg?branch=master)](https://travis-ci.org/minkphp/Mink)
+[![SensioLabsInsight](https://insight.sensiolabs.com/projects/5bb8fab0-978f-428a-ae23-44ee4e129fbc/mini.png)](https://insight.sensiolabs.com/projects/5bb8fab0-978f-428a-ae23-44ee4e129fbc)
+[![License](https://poser.pugx.org/behat/mink/license.svg)](https://packagist.org/packages/behat/mink)
+
+
+Useful Links
+------------
+
+- The main website with documentation is at [http://mink.behat.org](http://mink.behat.org)
+- Official Google Group is at [http://groups.google.com/group/behat](http://groups.google.com/group/behat)
+- IRC channel on [#freenode](http://freenode.net/) is `#behat`
+- [Note on Patches/Pull Requests](CONTRIBUTING.md)
+
+Usage Example
+-------------
+
+``` php
+ new Session(new GoutteDriver(new GoutteClient())),
+ 'goutte2' => new Session(new GoutteDriver(new GoutteClient())),
+ 'custom' => new Session(new MyCustomDriver($startUrl))
+));
+
+// set the default session name
+$mink->setDefaultSessionName('goutte2');
+
+// visit a page
+$mink->getSession()->visit($startUrl);
+
+// call to getSession() without argument will always return a default session if has one (goutte2 here)
+$mink->getSession()->getPage()->findLink('Downloads')->click();
+echo $mink->getSession()->getPage()->getContent();
+
+// call to getSession() with argument will return session by its name
+$mink->getSession('custom')->getPage()->findLink('Downloads')->click();
+echo $mink->getSession('custom')->getPage()->getContent();
+
+// this all is done to make possible mixing sessions
+$mink->getSession('goutte1')->getPage()->findLink('Chat')->click();
+$mink->getSession('goutte2')->getPage()->findLink('Chat')->click();
+```
+
+Install Dependencies
+--------------------
+
+``` bash
+$> curl -sS https://getcomposer.org/installer | php
+$> php composer.phar install
+```
+
+Contributors
+------------
+
+* Konstantin Kudryashov [everzet](https://github.com/everzet) [lead developer]
+* Christophe Coevoet [stof](https://github.com/stof) [lead developer]
+* Alexander Obuhovich [aik099](https://github.com/aik099) [lead developer]
+* Other [awesome developers](https://github.com/minkphp/Mink/graphs/contributors)
diff --git a/vendor/behat/mink/composer.json b/vendor/behat/mink/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..0193f434fa148120480ccd4c0abf19b600361144
--- /dev/null
+++ b/vendor/behat/mink/composer.json
@@ -0,0 +1,50 @@
+{
+ "name": "behat/mink",
+ "description": "Browser controller/emulator abstraction for PHP",
+ "keywords": ["web", "testing", "browser"],
+ "homepage": "http://mink.behat.org/",
+ "type": "library",
+ "license": "MIT",
+
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+
+ "require": {
+ "php": ">=5.3.1",
+ "symfony/css-selector": "~2.1"
+ },
+
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+
+ "suggest": {
+ "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
+ "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
+ "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
+ "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
+ },
+
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\": "src/"
+ }
+ },
+
+ "autoload-dev": {
+ "psr-4": {
+ "Behat\\Mink\\Tests\\": "tests"
+ }
+ },
+
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ }
+}
diff --git a/vendor/behat/mink/phpdoc.ini.dist b/vendor/behat/mink/phpdoc.ini.dist
new file mode 100644
index 0000000000000000000000000000000000000000..3fef75dd0b2e56d97da5e5c03527a0055cfe8ab9
--- /dev/null
+++ b/vendor/behat/mink/phpdoc.ini.dist
@@ -0,0 +1,125 @@
+; Default configuration file for PHPDoctor
+
+; This config file will cause PHPDoctor to generate API documentation of
+; itself.
+
+
+; PHPDoctor settings
+; -----------------------------------------------------------------------------
+
+; Names of files to parse. This can be a single filename, or a comma separated
+; list of filenames. Wildcards are allowed.
+
+files = "*.php"
+
+; Names of files or directories to ignore. This can be a single filename, or a
+; comma separated list of filenames. Wildcards are NOT allowed.
+
+ignore = "CVS, .svn, .git, _compiled"
+
+; The directory to look for files in, if not used the PHPDoctor will look in
+; the current directory (the directory it is run from).
+
+source_path = "./src"
+
+; If you do not want PHPDoctor to look in each sub directory for files
+; uncomment this line.
+
+;subdirs = off
+
+; Set how loud PHPDoctor is as it runs. Quiet mode suppresses all output other
+; than warnings and errors. Verbose mode outputs additional messages during
+; execution.
+
+;quiet = on
+;verbose = on
+
+; Select the doclet to use for generating output.
+
+doclet = standard
+;doclet = debug
+
+; The directory to find the doclet in. Doclets are expected to be in a
+; directory named after themselves at the location given.
+
+;doclet_path = ./doclets
+
+; The directory to find taglets in. Taglets allow you to make PHPDoctor handle
+; new tags and to alter the behavour of existing tags and their output.
+
+;taglet_path = ./taglets
+
+; If the code you are parsing does not use package tags or not all elements
+; have package tags, use this setting to place unbound elements into a
+; particular package.
+
+default_package = "Behat\Mink"
+
+; Specifies the name of a HTML file containing text for the overview
+; documentation to be placed on the overview page. The path is relative to
+; "source_path" unless an absolute path is given.
+
+overview = readme.html
+
+; Package comments will be looked for in a file named package.html in the same
+; directory as the first source file parsed in that package or in the directory
+; given below. If package comments are placed in the directory given below then
+; they should be named ".html".
+
+package_comment_dir = ./
+
+; Parse out global variables and/or global constants?
+
+;globals = off
+;constants = off
+
+; Generate documentation for all class members
+
+;private = on
+
+; Generate documentation for public and protected class members
+
+;protected = on
+
+; Generate documentation for only public class members
+
+public = on
+
+; Use the PEAR compatible handling of the docblock first sentence
+
+;pear_compat = on
+
+; Standard doclet settings
+; -----------------------------------------------------------------------------
+
+; The directory to place generated documentation in. If the given path is
+; relative to it will be relative to "source_path".
+
+d = "api"
+
+; Specifies the title to be placed in the HTML tag.
+
+windowtitle = "Behat\Mink"
+
+; Specifies the title to be placed near the top of the overview summary file.
+
+doctitle = "Behat\Mink: browser emulators abstraction library for PHP"
+
+; Specifies the header text to be placed at the top of each output file. The
+; header will be placed to the right of the upper navigation bar.
+
+header = "Behat\Mink"
+
+; Specifies the footer text to be placed at the bottom of each output file. The
+; footer will be placed to the right of the lower navigation bar.
+
+footer = "Behat\Mink"
+
+; Specifies the text to be placed at the bottom of each output file. The text
+; will be placed at the bottom of the page, below the lower navigation bar.
+
+;bottom = "This document was generated by PHPDoctor: The PHP Documentation Creator "
+
+; Create a class tree?
+
+tree = on
diff --git a/vendor/behat/mink/phpunit.xml.dist b/vendor/behat/mink/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..6695433a05d1169d637a09f75b0394c58b8e0591
--- /dev/null
+++ b/vendor/behat/mink/phpunit.xml.dist
@@ -0,0 +1,15 @@
+
+
+
+
+
+ tests
+
+
+
+
+
+ ./src
+
+
+
diff --git a/vendor/behat/mink/src/Driver/CoreDriver.php b/vendor/behat/mink/src/Driver/CoreDriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..9b4c04e43208234ed3b6ff5ab6ac42959d6cedd9
--- /dev/null
+++ b/vendor/behat/mink/src/Driver/CoreDriver.php
@@ -0,0 +1,475 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Driver;
+
+use Behat\Mink\Element\NodeElement;
+use Behat\Mink\Exception\UnsupportedDriverActionException;
+use Behat\Mink\Session;
+
+/**
+ * Core driver.
+ * All other drivers should extend this class for future compatibility.
+ *
+ * @author Konstantin Kudryashov
+ */
+abstract class CoreDriver implements DriverInterface
+{
+ /**
+ * @var Session
+ */
+ private $session;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setSession(Session $session)
+ {
+ $this->session = $session;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function start()
+ {
+ throw new UnsupportedDriverActionException('Starting the driver is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isStarted()
+ {
+ throw new UnsupportedDriverActionException('Checking the driver state is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function stop()
+ {
+ throw new UnsupportedDriverActionException('Stopping the driver is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reset()
+ {
+ throw new UnsupportedDriverActionException('Resetting the driver is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function visit($url)
+ {
+ throw new UnsupportedDriverActionException('Visiting an url is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCurrentUrl()
+ {
+ throw new UnsupportedDriverActionException('Getting the current url is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ throw new UnsupportedDriverActionException('Getting the page content is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function find($xpath)
+ {
+ $elements = array();
+
+ foreach ($this->findElementXpaths($xpath) as $xpath) {
+ $elements[] = new NodeElement($xpath, $this->session);
+ }
+
+ return $elements;
+ }
+
+ /**
+ * Finds elements with specified XPath query.
+ *
+ * @see find()
+ *
+ * @param string $xpath
+ *
+ * @return string[] The XPath of the matched elements
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ */
+ protected function findElementXpaths($xpath)
+ {
+ throw new UnsupportedDriverActionException('Finding elements is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getTagName($xpath)
+ {
+ throw new UnsupportedDriverActionException('Getting the tag name is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getText($xpath)
+ {
+ throw new UnsupportedDriverActionException('Getting the element text is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHtml($xpath)
+ {
+ throw new UnsupportedDriverActionException('Getting the element inner HTML is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getOuterHtml($xpath)
+ {
+ throw new UnsupportedDriverActionException('Getting the element outer HTML is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getAttribute($xpath, $name)
+ {
+ throw new UnsupportedDriverActionException('Getting the element attribute is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getValue($xpath)
+ {
+ throw new UnsupportedDriverActionException('Getting the field value is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setValue($xpath, $value)
+ {
+ throw new UnsupportedDriverActionException('Setting the field value is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function check($xpath)
+ {
+ throw new UnsupportedDriverActionException('Checking a checkbox is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function uncheck($xpath)
+ {
+ throw new UnsupportedDriverActionException('Unchecking a checkbox is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isChecked($xpath)
+ {
+ throw new UnsupportedDriverActionException('Getting the state of a checkbox is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function selectOption($xpath, $value, $multiple = false)
+ {
+ throw new UnsupportedDriverActionException('Selecting an option is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function click($xpath)
+ {
+ throw new UnsupportedDriverActionException('Clicking on an element is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function attachFile($xpath, $path)
+ {
+ throw new UnsupportedDriverActionException('Attaching a file in an input is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function reload()
+ {
+ throw new UnsupportedDriverActionException('Page reloading is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function forward()
+ {
+ throw new UnsupportedDriverActionException('Forward action is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function back()
+ {
+ throw new UnsupportedDriverActionException('Backward action is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setBasicAuth($user, $password)
+ {
+ throw new UnsupportedDriverActionException('Basic auth setup is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function switchToWindow($name = null)
+ {
+ throw new UnsupportedDriverActionException('Windows management is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function switchToIFrame($name = null)
+ {
+ throw new UnsupportedDriverActionException('iFrames management is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setRequestHeader($name, $value)
+ {
+ throw new UnsupportedDriverActionException('Request headers manipulation is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getResponseHeaders()
+ {
+ throw new UnsupportedDriverActionException('Response headers are not available from %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setCookie($name, $value = null)
+ {
+ throw new UnsupportedDriverActionException('Cookies manipulation is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getCookie($name)
+ {
+ throw new UnsupportedDriverActionException('Cookies are not available from %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getStatusCode()
+ {
+ throw new UnsupportedDriverActionException('Status code is not available from %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getScreenshot()
+ {
+ throw new UnsupportedDriverActionException('Screenshots are not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWindowNames()
+ {
+ throw new UnsupportedDriverActionException('Listing all window names is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getWindowName()
+ {
+ throw new UnsupportedDriverActionException('Listing this window name is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function doubleClick($xpath)
+ {
+ throw new UnsupportedDriverActionException('Double-clicking is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function rightClick($xpath)
+ {
+ throw new UnsupportedDriverActionException('Right-clicking is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isVisible($xpath)
+ {
+ throw new UnsupportedDriverActionException('Element visibility check is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isSelected($xpath)
+ {
+ throw new UnsupportedDriverActionException('Element selection check is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function mouseOver($xpath)
+ {
+ throw new UnsupportedDriverActionException('Mouse manipulations are not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function focus($xpath)
+ {
+ throw new UnsupportedDriverActionException('Mouse manipulations are not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function blur($xpath)
+ {
+ throw new UnsupportedDriverActionException('Mouse manipulations are not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function keyPress($xpath, $char, $modifier = null)
+ {
+ throw new UnsupportedDriverActionException('Keyboard manipulations are not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function keyDown($xpath, $char, $modifier = null)
+ {
+ throw new UnsupportedDriverActionException('Keyboard manipulations are not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function keyUp($xpath, $char, $modifier = null)
+ {
+ throw new UnsupportedDriverActionException('Keyboard manipulations are not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function dragTo($sourceXpath, $destinationXpath)
+ {
+ throw new UnsupportedDriverActionException('Mouse manipulations are not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function executeScript($script)
+ {
+ throw new UnsupportedDriverActionException('JS is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function evaluateScript($script)
+ {
+ throw new UnsupportedDriverActionException('JS is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function wait($timeout, $condition)
+ {
+ throw new UnsupportedDriverActionException('JS is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function resizeWindow($width, $height, $name = null)
+ {
+ throw new UnsupportedDriverActionException('Window resizing is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function maximizeWindow($name = null)
+ {
+ throw new UnsupportedDriverActionException('Window maximize is not supported by %s', $this);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function submitForm($xpath)
+ {
+ throw new UnsupportedDriverActionException('Form submission is not supported by %s', $this);
+ }
+}
diff --git a/vendor/behat/mink/src/Driver/DriverInterface.php b/vendor/behat/mink/src/Driver/DriverInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..0880960c779d8757d4b29e66a3bca317c0546d28
--- /dev/null
+++ b/vendor/behat/mink/src/Driver/DriverInterface.php
@@ -0,0 +1,637 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Driver;
+
+use Behat\Mink\Element\NodeElement;
+use Behat\Mink\Exception\DriverException;
+use Behat\Mink\Exception\UnsupportedDriverActionException;
+use Behat\Mink\Session;
+
+/**
+ * Driver interface.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface DriverInterface
+{
+ /**
+ * Sets driver's current session.
+ *
+ * @param Session $session
+ */
+ public function setSession(Session $session);
+
+ /**
+ * Starts driver.
+ *
+ * Once started, the driver should be ready to visit a page.
+ *
+ * Calling any action before visiting a page is an undefined behavior.
+ * The only supported method calls on a fresh driver are
+ * - visit()
+ * - setRequestHeader()
+ * - setBasicAuth()
+ * - reset()
+ * - stop()
+ *
+ * Calling start on a started driver is an undefined behavior. Driver
+ * implementations are free to handle it silently or to fail with an
+ * exception.
+ *
+ * @throws DriverException When the driver cannot be started
+ */
+ public function start();
+
+ /**
+ * Checks whether driver is started.
+ *
+ * @return Boolean
+ */
+ public function isStarted();
+
+ /**
+ * Stops driver.
+ *
+ * Once stopped, the driver should be started again before using it again.
+ *
+ * Calling any action on a stopped driver is an undefined behavior.
+ * The only supported method call after stopping a driver is starting it again.
+ *
+ * Calling stop on a stopped driver is an undefined behavior. Driver
+ * implementations are free to handle it silently or to fail with an
+ * exception.
+ *
+ * @throws DriverException When the driver cannot be closed
+ */
+ public function stop();
+
+ /**
+ * Resets driver state.
+ *
+ * This should reset cookies, request headers and basic authentication.
+ * When possible, the history should be reset as well, but this is not enforced
+ * as some implementations may not be able to reset it without restarting the
+ * driver entirely. Consumers requiring a clean history should restart the driver
+ * to enforce it.
+ *
+ * Once reset, the driver should be ready to visit a page.
+ * Calling any action before visiting a page is an undefined behavior.
+ * The only supported method calls on a fresh driver are
+ * - visit()
+ * - setRequestHeader()
+ * - setBasicAuth()
+ * - reset()
+ * - stop()
+ *
+ * Calling reset on a stopped driver is an undefined behavior.
+ */
+ public function reset();
+
+ /**
+ * Visit specified URL.
+ *
+ * @param string $url url of the page
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function visit($url);
+
+ /**
+ * Returns current URL address.
+ *
+ * @return string
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getCurrentUrl();
+
+ /**
+ * Reloads current page.
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function reload();
+
+ /**
+ * Moves browser forward 1 page.
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function forward();
+
+ /**
+ * Moves browser backward 1 page.
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function back();
+
+ /**
+ * Sets HTTP Basic authentication parameters.
+ *
+ * @param string|Boolean $user user name or false to disable authentication
+ * @param string $password password
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function setBasicAuth($user, $password);
+
+ /**
+ * Switches to specific browser window.
+ *
+ * @param string $name window name (null for switching back to main window)
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function switchToWindow($name = null);
+
+ /**
+ * Switches to specific iFrame.
+ *
+ * @param string $name iframe name (null for switching back)
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function switchToIFrame($name = null);
+
+ /**
+ * Sets specific request header on client.
+ *
+ * @param string $name
+ * @param string $value
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function setRequestHeader($name, $value);
+
+ /**
+ * Returns last response headers.
+ *
+ * @return array
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getResponseHeaders();
+
+ /**
+ * Sets cookie.
+ *
+ * @param string $name
+ * @param string $value
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function setCookie($name, $value = null);
+
+ /**
+ * Returns cookie by name.
+ *
+ * @param string $name
+ *
+ * @return string|null
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getCookie($name);
+
+ /**
+ * Returns last response status code.
+ *
+ * @return int
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getStatusCode();
+
+ /**
+ * Returns last response content.
+ *
+ * @return string
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getContent();
+
+ /**
+ * Capture a screenshot of the current window.
+ *
+ * @return string screenshot of MIME type image/* depending
+ * on driver (e.g., image/png, image/jpeg)
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getScreenshot();
+
+ /**
+ * Return the names of all open windows.
+ *
+ * @return array array of all open windows
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getWindowNames();
+
+ /**
+ * Return the name of the currently active window.
+ *
+ * @return string the name of the current window
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getWindowName();
+
+ /**
+ * Finds elements with specified XPath query.
+ *
+ * @param string $xpath
+ *
+ * @return NodeElement[]
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function find($xpath);
+
+ /**
+ * Returns element's tag name by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @return string
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getTagName($xpath);
+
+ /**
+ * Returns element's text by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @return string
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getText($xpath);
+
+ /**
+ * Returns element's inner html by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @return string
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getHtml($xpath);
+
+ /**
+ * Returns element's outer html by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @return string
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getOuterHtml($xpath);
+
+ /**
+ * Returns element's attribute by it's XPath query.
+ *
+ * @param string $xpath
+ * @param string $name
+ *
+ * @return string|null
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function getAttribute($xpath, $name);
+
+ /**
+ * Returns element's value by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @return string|bool|array
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ *
+ * @see \Behat\Mink\Element\NodeElement::getValue
+ */
+ public function getValue($xpath);
+
+ /**
+ * Sets element's value by it's XPath query.
+ *
+ * @param string $xpath
+ * @param string|bool|array $value
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ *
+ * @see \Behat\Mink\Element\NodeElement::setValue
+ */
+ public function setValue($xpath, $value);
+
+ /**
+ * Checks checkbox by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ *
+ * @see \Behat\Mink\Element\NodeElement::check
+ */
+ public function check($xpath);
+
+ /**
+ * Unchecks checkbox by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ *
+ * @see \Behat\Mink\Element\NodeElement::uncheck
+ */
+ public function uncheck($xpath);
+
+ /**
+ * Checks whether checkbox or radio button located by it's XPath query is checked.
+ *
+ * @param string $xpath
+ *
+ * @return Boolean
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ *
+ * @see \Behat\Mink\Element\NodeElement::isChecked
+ */
+ public function isChecked($xpath);
+
+ /**
+ * Selects option from select field or value in radio group located by it's XPath query.
+ *
+ * @param string $xpath
+ * @param string $value
+ * @param Boolean $multiple
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ *
+ * @see \Behat\Mink\Element\NodeElement::selectOption
+ */
+ public function selectOption($xpath, $value, $multiple = false);
+
+ /**
+ * Checks whether select option, located by it's XPath query, is selected.
+ *
+ * @param string $xpath
+ *
+ * @return Boolean
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ *
+ * @see \Behat\Mink\Element\NodeElement::isSelected
+ */
+ public function isSelected($xpath);
+
+ /**
+ * Clicks button or link located by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function click($xpath);
+
+ /**
+ * Double-clicks button or link located by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function doubleClick($xpath);
+
+ /**
+ * Right-clicks button or link located by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function rightClick($xpath);
+
+ /**
+ * Attaches file path to file field located by it's XPath query.
+ *
+ * @param string $xpath
+ * @param string $path
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ *
+ * @see \Behat\Mink\Element\NodeElement::attachFile
+ */
+ public function attachFile($xpath, $path);
+
+ /**
+ * Checks whether element visible located by it's XPath query.
+ *
+ * @param string $xpath
+ *
+ * @return Boolean
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function isVisible($xpath);
+
+ /**
+ * Simulates a mouse over on the element.
+ *
+ * @param string $xpath
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function mouseOver($xpath);
+
+ /**
+ * Brings focus to element.
+ *
+ * @param string $xpath
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function focus($xpath);
+
+ /**
+ * Removes focus from element.
+ *
+ * @param string $xpath
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function blur($xpath);
+
+ /**
+ * Presses specific keyboard key.
+ *
+ * @param string $xpath
+ * @param string|int $char could be either char ('b') or char-code (98)
+ * @param string $modifier keyboard modifier (could be 'ctrl', 'alt', 'shift' or 'meta')
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function keyPress($xpath, $char, $modifier = null);
+
+ /**
+ * Pressed down specific keyboard key.
+ *
+ * @param string $xpath
+ * @param string|int $char could be either char ('b') or char-code (98)
+ * @param string $modifier keyboard modifier (could be 'ctrl', 'alt', 'shift' or 'meta')
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function keyDown($xpath, $char, $modifier = null);
+
+ /**
+ * Pressed up specific keyboard key.
+ *
+ * @param string $xpath
+ * @param string|int $char could be either char ('b') or char-code (98)
+ * @param string $modifier keyboard modifier (could be 'ctrl', 'alt', 'shift' or 'meta')
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function keyUp($xpath, $char, $modifier = null);
+
+ /**
+ * Drag one element onto another.
+ *
+ * @param string $sourceXpath
+ * @param string $destinationXpath
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function dragTo($sourceXpath, $destinationXpath);
+
+ /**
+ * Executes JS script.
+ *
+ * @param string $script
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function executeScript($script);
+
+ /**
+ * Evaluates JS script.
+ *
+ * The "return" keyword is optional in the script passed as argument. Driver implementations
+ * must accept the expression both with and without the keyword.
+ *
+ * @param string $script
+ *
+ * @return mixed
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function evaluateScript($script);
+
+ /**
+ * Waits some time or until JS condition turns true.
+ *
+ * @param int $timeout timeout in milliseconds
+ * @param string $condition JS condition
+ *
+ * @return bool
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function wait($timeout, $condition);
+
+ /**
+ * Set the dimensions of the window.
+ *
+ * @param int $width set the window width, measured in pixels
+ * @param int $height set the window height, measured in pixels
+ * @param string $name window name (null for the main window)
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function resizeWindow($width, $height, $name = null);
+
+ /**
+ * Maximizes the window if it is not maximized already.
+ *
+ * @param string $name window name (null for the main window)
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ */
+ public function maximizeWindow($name = null);
+
+ /**
+ * Submits the form.
+ *
+ * @param string $xpath Xpath.
+ *
+ * @throws UnsupportedDriverActionException When operation not supported by the driver
+ * @throws DriverException When the operation cannot be done
+ *
+ * @see \Behat\Mink\Element\NodeElement::submitForm
+ */
+ public function submitForm($xpath);
+}
diff --git a/vendor/behat/mink/src/Element/DocumentElement.php b/vendor/behat/mink/src/Element/DocumentElement.php
new file mode 100644
index 0000000000000000000000000000000000000000..c2daf6601febdaab4d3a3ba6ad479bcf94f0c46d
--- /dev/null
+++ b/vendor/behat/mink/src/Element/DocumentElement.php
@@ -0,0 +1,51 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Element;
+
+/**
+ * Document element.
+ *
+ * @author Konstantin Kudryashov
+ */
+class DocumentElement extends TraversableElement
+{
+ /**
+ * Returns XPath for handled element.
+ *
+ * @return string
+ */
+ public function getXpath()
+ {
+ return '//html';
+ }
+
+ /**
+ * Returns document content.
+ *
+ * @return string
+ */
+ public function getContent()
+ {
+ return trim($this->getDriver()->getContent());
+ }
+
+ /**
+ * Check whether document has specified content.
+ *
+ * @param string $content
+ *
+ * @return Boolean
+ */
+ public function hasContent($content)
+ {
+ return $this->has('named', array('content', $content));
+ }
+}
diff --git a/vendor/behat/mink/src/Element/Element.php b/vendor/behat/mink/src/Element/Element.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2b6c0ef33f236a053748aca67492a0308f97a62
--- /dev/null
+++ b/vendor/behat/mink/src/Element/Element.php
@@ -0,0 +1,214 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Element;
+
+use Behat\Mink\Driver\DriverInterface;
+use Behat\Mink\Exception\ElementNotFoundException;
+use Behat\Mink\Selector\SelectorsHandler;
+use Behat\Mink\Selector\Xpath\Manipulator;
+use Behat\Mink\Session;
+
+/**
+ * Base element.
+ *
+ * @author Konstantin Kudryashov
+ */
+abstract class Element implements ElementInterface
+{
+ /**
+ * @var Session
+ */
+ private $session;
+
+ /**
+ * Driver.
+ *
+ * @var DriverInterface
+ */
+ private $driver;
+
+ /**
+ * @var SelectorsHandler
+ */
+ private $selectorsHandler;
+
+ /**
+ * @var Manipulator
+ */
+ private $xpathManipulator;
+
+ /**
+ * Initialize element.
+ *
+ * @param Session $session
+ */
+ public function __construct(Session $session)
+ {
+ $this->xpathManipulator = new Manipulator();
+ $this->session = $session;
+
+ $this->driver = $session->getDriver();
+ $this->selectorsHandler = $session->getSelectorsHandler();
+ }
+
+ /**
+ * Returns element session.
+ *
+ * @return Session
+ *
+ * @deprecated Accessing the session from the element is deprecated as of 1.6 and will be impossible in 2.0.
+ */
+ public function getSession()
+ {
+ @trigger_error(sprintf('The method %s is deprecated as of 1.6 and will be removed in 2.0', __METHOD__), E_USER_DEPRECATED);
+
+ return $this->session;
+ }
+
+ /**
+ * Returns element's driver.
+ *
+ * @return DriverInterface
+ */
+ protected function getDriver()
+ {
+ return $this->driver;
+ }
+
+ /**
+ * Returns selectors handler.
+ *
+ * @return SelectorsHandler
+ *
+ * @deprecated Accessing the selectors handler in the element is deprecated as of 1.7 and will be impossible in 2.0.
+ */
+ protected function getSelectorsHandler()
+ {
+ @trigger_error(sprintf('The method %s is deprecated as of 1.7 and will be removed in 2.0', __METHOD__), E_USER_DEPRECATED);
+
+ return $this->selectorsHandler;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function has($selector, $locator)
+ {
+ return null !== $this->find($selector, $locator);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isValid()
+ {
+ return 1 === count($this->getDriver()->find($this->getXpath()));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function waitFor($timeout, $callback)
+ {
+ if (!is_callable($callback)) {
+ throw new \InvalidArgumentException('Given callback is not a valid callable');
+ }
+
+ $start = microtime(true);
+ $end = $start + $timeout;
+
+ do {
+ $result = call_user_func($callback, $this);
+
+ if ($result) {
+ break;
+ }
+
+ usleep(100000);
+ } while (microtime(true) < $end);
+
+ return $result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function find($selector, $locator)
+ {
+ $items = $this->findAll($selector, $locator);
+
+ return count($items) ? current($items) : null;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function findAll($selector, $locator)
+ {
+ if ('named' === $selector) {
+ $items = $this->findAll('named_exact', $locator);
+ if (empty($items)) {
+ $items = $this->findAll('named_partial', $locator);
+ }
+
+ return $items;
+ }
+
+ $xpath = $this->selectorsHandler->selectorToXpath($selector, $locator);
+ $xpath = $this->xpathManipulator->prepend($xpath, $this->getXpath());
+
+ return $this->getDriver()->find($xpath);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getText()
+ {
+ return $this->getDriver()->getText($this->getXpath());
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getHtml()
+ {
+ return $this->getDriver()->getHtml($this->getXpath());
+ }
+
+ /**
+ * Returns element outer html.
+ *
+ * @return string
+ */
+ public function getOuterHtml()
+ {
+ return $this->getDriver()->getOuterHtml($this->getXpath());
+ }
+
+ /**
+ * Builds an ElementNotFoundException.
+ *
+ * @param string $type
+ * @param string|null $selector
+ * @param string|null $locator
+ *
+ * @return ElementNotFoundException
+ *
+ * @deprecated as of 1.7, to be removed in 2.0
+ */
+ protected function elementNotFound($type, $selector = null, $locator = null)
+ {
+ @trigger_error(sprintf('The method %s is deprecated as of 1.7 and will be removed in 2.0', __METHOD__), E_USER_DEPRECATED);
+
+ return new ElementNotFoundException($this->driver, $type, $selector, $locator);
+ }
+}
diff --git a/vendor/behat/mink/src/Element/ElementInterface.php b/vendor/behat/mink/src/Element/ElementInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..1d9cc4f9ec0a1fa059040290298b6d3a4c10b136
--- /dev/null
+++ b/vendor/behat/mink/src/Element/ElementInterface.php
@@ -0,0 +1,115 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Element;
+
+use Behat\Mink\Session;
+
+/**
+ * Element interface.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface ElementInterface
+{
+ /**
+ * Returns XPath for handled element.
+ *
+ * @return string
+ */
+ public function getXpath();
+
+ /**
+ * Returns element's session.
+ *
+ * @return Session
+ *
+ * @deprecated Accessing the session from the element is deprecated as of 1.6 and will be impossible in 2.0.
+ */
+ public function getSession();
+
+ /**
+ * Checks whether element with specified selector exists inside the current element.
+ *
+ * @param string $selector selector engine name
+ * @param string|array $locator selector locator
+ *
+ * @return Boolean
+ *
+ * @see ElementInterface::findAll for the supported selectors
+ */
+ public function has($selector, $locator);
+
+ /**
+ * Checks if an element still exists in the DOM.
+ *
+ * @return bool
+ */
+ public function isValid();
+
+ /**
+ * Waits for an element(-s) to appear and returns it.
+ *
+ * @param int|float $timeout Maximal allowed waiting time in seconds.
+ * @param callable $callback Callback, which result is both used as waiting condition and returned.
+ * Will receive reference to `this element` as first argument.
+ *
+ * @return mixed
+ *
+ * @throws \InvalidArgumentException When invalid callback given.
+ */
+ public function waitFor($timeout, $callback);
+
+ /**
+ * Finds first element with specified selector inside the current element.
+ *
+ * @param string $selector selector engine name
+ * @param string|array $locator selector locator
+ *
+ * @return NodeElement|null
+ *
+ * @see ElementInterface::findAll for the supported selectors
+ */
+ public function find($selector, $locator);
+
+ /**
+ * Finds all elements with specified selector inside the current element.
+ *
+ * Valid selector engines are named, xpath, css, named_partial and named_exact.
+ *
+ * 'named' is a pseudo selector engine which prefers an exact match but
+ * will return a partial match if no exact match is found.
+ * 'xpath' is a pseudo selector engine supported by SelectorsHandler.
+ *
+ * More selector engines can be registered in the SelectorsHandler.
+ *
+ * @param string $selector selector engine name
+ * @param string|array $locator selector locator
+ *
+ * @return NodeElement[]
+ *
+ * @see NamedSelector for the locators supported by the named selectors
+ */
+ public function findAll($selector, $locator);
+
+ /**
+ * Returns element text (inside tag).
+ *
+ * @return string
+ */
+ public function getText();
+
+ /**
+ * Returns element inner html.
+ *
+ * @return string
+ */
+ public function getHtml();
+}
diff --git a/vendor/behat/mink/src/Element/NodeElement.php b/vendor/behat/mink/src/Element/NodeElement.php
new file mode 100644
index 0000000000000000000000000000000000000000..bbb857332ca0703934bff830c182aec1ca5bf38b
--- /dev/null
+++ b/vendor/behat/mink/src/Element/NodeElement.php
@@ -0,0 +1,350 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Element;
+
+use Behat\Mink\Session;
+use Behat\Mink\Exception\ElementNotFoundException;
+
+/**
+ * Page element node.
+ *
+ * @author Konstantin Kudryashov
+ */
+class NodeElement extends TraversableElement
+{
+ private $xpath;
+
+ /**
+ * Initializes node element.
+ *
+ * @param string $xpath element xpath
+ * @param Session $session session instance
+ */
+ public function __construct($xpath, Session $session)
+ {
+ $this->xpath = $xpath;
+
+ parent::__construct($session);
+ }
+
+ /**
+ * Returns XPath for handled element.
+ *
+ * @return string
+ */
+ public function getXpath()
+ {
+ return $this->xpath;
+ }
+
+ /**
+ * Returns parent element to the current one.
+ *
+ * @return NodeElement
+ */
+ public function getParent()
+ {
+ return $this->find('xpath', '..');
+ }
+
+ /**
+ * Returns current node tag name.
+ *
+ * The value is always returned in lowercase to allow an easy comparison.
+ *
+ * @return string
+ */
+ public function getTagName()
+ {
+ return strtolower($this->getDriver()->getTagName($this->getXpath()));
+ }
+
+ /**
+ * Returns the value of the form field or option element.
+ *
+ * For checkbox fields, the value is a boolean indicating whether the checkbox is checked.
+ * For radio buttons, the value is the value of the selected button in the radio group
+ * or null if no button is selected.
+ * For single select boxes, the value is the value of the selected option.
+ * For multiple select boxes, the value is an array of selected option values.
+ * for file inputs, the return value is undefined given that browsers don't allow accessing
+ * the value of file inputs for security reasons. Some drivers may allow accessing the
+ * path of the file set in the field, but this is not required if it cannot be implemented.
+ * For textarea elements and all textual fields, the value is the content of the field.
+ * Form option elements, the value is the value of the option (the value attribute or the text
+ * content if the attribute is not set).
+ *
+ * Calling this method on other elements than form fields or option elements is not allowed.
+ *
+ * @return string|bool|array
+ */
+ public function getValue()
+ {
+ return $this->getDriver()->getValue($this->getXpath());
+ }
+
+ /**
+ * Sets the value of the form field.
+ *
+ * Calling this method on other elements than form fields is not allowed.
+ *
+ * @param string|bool|array $value
+ *
+ * @see NodeElement::getValue for the format of the value for each type of field
+ */
+ public function setValue($value)
+ {
+ $this->getDriver()->setValue($this->getXpath(), $value);
+ }
+
+ /**
+ * Checks whether element has attribute with specified name.
+ *
+ * @param string $name
+ *
+ * @return Boolean
+ */
+ public function hasAttribute($name)
+ {
+ return null !== $this->getDriver()->getAttribute($this->getXpath(), $name);
+ }
+
+ /**
+ * Returns specified attribute value.
+ *
+ * @param string $name
+ *
+ * @return string|null
+ */
+ public function getAttribute($name)
+ {
+ return $this->getDriver()->getAttribute($this->getXpath(), $name);
+ }
+
+ /**
+ * Checks whether an element has a named CSS class.
+ *
+ * @param string $className Name of the class
+ *
+ * @return bool
+ */
+ public function hasClass($className)
+ {
+ if ($this->hasAttribute('class')) {
+ return in_array($className, preg_split('/\s+/', $this->getAttribute('class')));
+ }
+
+ return false;
+ }
+
+ /**
+ * Clicks current node.
+ */
+ public function click()
+ {
+ $this->getDriver()->click($this->getXpath());
+ }
+
+ /**
+ * Presses current button.
+ */
+ public function press()
+ {
+ $this->click();
+ }
+
+ /**
+ * Double-clicks current node.
+ */
+ public function doubleClick()
+ {
+ $this->getDriver()->doubleClick($this->getXpath());
+ }
+
+ /**
+ * Right-clicks current node.
+ */
+ public function rightClick()
+ {
+ $this->getDriver()->rightClick($this->getXpath());
+ }
+
+ /**
+ * Checks current node if it's a checkbox field.
+ */
+ public function check()
+ {
+ $this->getDriver()->check($this->getXpath());
+ }
+
+ /**
+ * Unchecks current node if it's a checkbox field.
+ */
+ public function uncheck()
+ {
+ $this->getDriver()->uncheck($this->getXpath());
+ }
+
+ /**
+ * Checks whether current node is checked if it's a checkbox or radio field.
+ *
+ * Calling this method on any other elements is not allowed.
+ *
+ * @return Boolean
+ */
+ public function isChecked()
+ {
+ return (Boolean) $this->getDriver()->isChecked($this->getXpath());
+ }
+
+ /**
+ * Selects specified option for select field or specified radio button in the group.
+ *
+ * If the current node is a select box, this selects the option found by its value or
+ * its text.
+ * If the current node is a radio button, this selects the radio button with the given
+ * value in the radio button group of the current node.
+ *
+ * Calling this method on any other elements is not allowed.
+ *
+ * @param string $option
+ * @param Boolean $multiple whether the option should be added to the selection for multiple selects
+ *
+ * @throws ElementNotFoundException when the option is not found in the select box
+ */
+ public function selectOption($option, $multiple = false)
+ {
+ if ('select' !== $this->getTagName()) {
+ $this->getDriver()->selectOption($this->getXpath(), $option, $multiple);
+
+ return;
+ }
+
+ $opt = $this->find('named', array('option', $option));
+
+ if (null === $opt) {
+ throw new ElementNotFoundException($this->getDriver(), 'select option', 'value|text', $option);
+ }
+
+ $this->getDriver()->selectOption($this->getXpath(), $opt->getValue(), $multiple);
+ }
+
+ /**
+ * Checks whether current node is selected if it's a option field.
+ *
+ * Calling this method on any other elements is not allowed.
+ *
+ * @return Boolean
+ */
+ public function isSelected()
+ {
+ return (Boolean) $this->getDriver()->isSelected($this->getXpath());
+ }
+
+ /**
+ * Attach file to current node if it's a file input.
+ *
+ * Calling this method on any other elements than file input is not allowed.
+ *
+ * @param string $path path to file (local)
+ */
+ public function attachFile($path)
+ {
+ $this->getDriver()->attachFile($this->getXpath(), $path);
+ }
+
+ /**
+ * Checks whether current node is visible on page.
+ *
+ * @return Boolean
+ */
+ public function isVisible()
+ {
+ return (Boolean) $this->getDriver()->isVisible($this->getXpath());
+ }
+
+ /**
+ * Simulates a mouse over on the element.
+ */
+ public function mouseOver()
+ {
+ $this->getDriver()->mouseOver($this->getXpath());
+ }
+
+ /**
+ * Drags current node onto other node.
+ *
+ * @param ElementInterface $destination other node
+ */
+ public function dragTo(ElementInterface $destination)
+ {
+ $this->getDriver()->dragTo($this->getXpath(), $destination->getXpath());
+ }
+
+ /**
+ * Brings focus to element.
+ */
+ public function focus()
+ {
+ $this->getDriver()->focus($this->getXpath());
+ }
+
+ /**
+ * Removes focus from element.
+ */
+ public function blur()
+ {
+ $this->getDriver()->blur($this->getXpath());
+ }
+
+ /**
+ * Presses specific keyboard key.
+ *
+ * @param string|int $char could be either char ('b') or char-code (98)
+ * @param string $modifier keyboard modifier (could be 'ctrl', 'alt', 'shift' or 'meta')
+ */
+ public function keyPress($char, $modifier = null)
+ {
+ $this->getDriver()->keyPress($this->getXpath(), $char, $modifier);
+ }
+
+ /**
+ * Pressed down specific keyboard key.
+ *
+ * @param string|int $char could be either char ('b') or char-code (98)
+ * @param string $modifier keyboard modifier (could be 'ctrl', 'alt', 'shift' or 'meta')
+ */
+ public function keyDown($char, $modifier = null)
+ {
+ $this->getDriver()->keyDown($this->getXpath(), $char, $modifier);
+ }
+
+ /**
+ * Pressed up specific keyboard key.
+ *
+ * @param string|int $char could be either char ('b') or char-code (98)
+ * @param string $modifier keyboard modifier (could be 'ctrl', 'alt', 'shift' or 'meta')
+ */
+ public function keyUp($char, $modifier = null)
+ {
+ $this->getDriver()->keyUp($this->getXpath(), $char, $modifier);
+ }
+
+ /**
+ * Submits the form.
+ *
+ * Calling this method on anything else than form elements is not allowed.
+ */
+ public function submit()
+ {
+ $this->getDriver()->submitForm($this->getXpath());
+ }
+}
diff --git a/vendor/behat/mink/src/Element/TraversableElement.php b/vendor/behat/mink/src/Element/TraversableElement.php
new file mode 100644
index 0000000000000000000000000000000000000000..a5e05b9991ba81e197502ec9ae71912a4eeb6317
--- /dev/null
+++ b/vendor/behat/mink/src/Element/TraversableElement.php
@@ -0,0 +1,297 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Element;
+
+use Behat\Mink\Exception\ElementNotFoundException;
+
+/**
+ * Traversable element.
+ *
+ * @author Konstantin Kudryashov
+ */
+abstract class TraversableElement extends Element
+{
+ /**
+ * Finds element by its id.
+ *
+ * @param string $id element id
+ *
+ * @return NodeElement|null
+ */
+ public function findById($id)
+ {
+ return $this->find('named', array('id', $id));
+ }
+
+ /**
+ * Checks whether element has a link with specified locator.
+ *
+ * @param string $locator link id, title, text or image alt
+ *
+ * @return Boolean
+ */
+ public function hasLink($locator)
+ {
+ return null !== $this->findLink($locator);
+ }
+
+ /**
+ * Finds link with specified locator.
+ *
+ * @param string $locator link id, title, text or image alt
+ *
+ * @return NodeElement|null
+ */
+ public function findLink($locator)
+ {
+ return $this->find('named', array('link', $locator));
+ }
+
+ /**
+ * Clicks link with specified locator.
+ *
+ * @param string $locator link id, title, text or image alt
+ *
+ * @throws ElementNotFoundException
+ */
+ public function clickLink($locator)
+ {
+ $link = $this->findLink($locator);
+
+ if (null === $link) {
+ throw new ElementNotFoundException($this->getDriver(), 'link', 'id|title|alt|text', $locator);
+ }
+
+ $link->click();
+ }
+
+ /**
+ * Checks whether element has a button (input[type=submit|image|button|reset], button) with specified locator.
+ *
+ * @param string $locator button id, value or alt
+ *
+ * @return Boolean
+ */
+ public function hasButton($locator)
+ {
+ return null !== $this->findButton($locator);
+ }
+
+ /**
+ * Finds button (input[type=submit|image|button|reset], button) with specified locator.
+ *
+ * @param string $locator button id, value or alt
+ *
+ * @return NodeElement|null
+ */
+ public function findButton($locator)
+ {
+ return $this->find('named', array('button', $locator));
+ }
+
+ /**
+ * Presses button (input[type=submit|image|button|reset], button) with specified locator.
+ *
+ * @param string $locator button id, value or alt
+ *
+ * @throws ElementNotFoundException
+ */
+ public function pressButton($locator)
+ {
+ $button = $this->findButton($locator);
+
+ if (null === $button) {
+ throw new ElementNotFoundException($this->getDriver(), 'button', 'id|name|title|alt|value', $locator);
+ }
+
+ $button->press();
+ }
+
+ /**
+ * Checks whether element has a field (input, textarea, select) with specified locator.
+ *
+ * @param string $locator input id, name or label
+ *
+ * @return Boolean
+ */
+ public function hasField($locator)
+ {
+ return null !== $this->findField($locator);
+ }
+
+ /**
+ * Finds field (input, textarea, select) with specified locator.
+ *
+ * @param string $locator input id, name or label
+ *
+ * @return NodeElement|null
+ */
+ public function findField($locator)
+ {
+ return $this->find('named', array('field', $locator));
+ }
+
+ /**
+ * Fills in field (input, textarea, select) with specified locator.
+ *
+ * @param string $locator input id, name or label
+ * @param string $value value
+ *
+ * @throws ElementNotFoundException
+ *
+ * @see NodeElement::setValue
+ */
+ public function fillField($locator, $value)
+ {
+ $field = $this->findField($locator);
+
+ if (null === $field) {
+ throw new ElementNotFoundException($this->getDriver(), 'form field', 'id|name|label|value|placeholder', $locator);
+ }
+
+ $field->setValue($value);
+ }
+
+ /**
+ * Checks whether element has a checkbox with specified locator, which is checked.
+ *
+ * @param string $locator input id, name or label
+ *
+ * @return Boolean
+ *
+ * @see NodeElement::isChecked
+ */
+ public function hasCheckedField($locator)
+ {
+ $field = $this->findField($locator);
+
+ return null !== $field && $field->isChecked();
+ }
+
+ /**
+ * Checks whether element has a checkbox with specified locator, which is unchecked.
+ *
+ * @param string $locator input id, name or label
+ *
+ * @return Boolean
+ *
+ * @see NodeElement::isChecked
+ */
+ public function hasUncheckedField($locator)
+ {
+ $field = $this->findField($locator);
+
+ return null !== $field && !$field->isChecked();
+ }
+
+ /**
+ * Checks checkbox with specified locator.
+ *
+ * @param string $locator input id, name or label
+ *
+ * @throws ElementNotFoundException
+ */
+ public function checkField($locator)
+ {
+ $field = $this->findField($locator);
+
+ if (null === $field) {
+ throw new ElementNotFoundException($this->getDriver(), 'form field', 'id|name|label|value', $locator);
+ }
+
+ $field->check();
+ }
+
+ /**
+ * Unchecks checkbox with specified locator.
+ *
+ * @param string $locator input id, name or label
+ *
+ * @throws ElementNotFoundException
+ */
+ public function uncheckField($locator)
+ {
+ $field = $this->findField($locator);
+
+ if (null === $field) {
+ throw new ElementNotFoundException($this->getDriver(), 'form field', 'id|name|label|value', $locator);
+ }
+
+ $field->uncheck();
+ }
+
+ /**
+ * Checks whether element has a select field with specified locator.
+ *
+ * @param string $locator select id, name or label
+ *
+ * @return Boolean
+ */
+ public function hasSelect($locator)
+ {
+ return $this->has('named', array('select', $locator));
+ }
+
+ /**
+ * Selects option from select field with specified locator.
+ *
+ * @param string $locator input id, name or label
+ * @param string $value option value
+ * @param Boolean $multiple select multiple options
+ *
+ * @throws ElementNotFoundException
+ *
+ * @see NodeElement::selectOption
+ */
+ public function selectFieldOption($locator, $value, $multiple = false)
+ {
+ $field = $this->findField($locator);
+
+ if (null === $field) {
+ throw new ElementNotFoundException($this->getDriver(), 'form field', 'id|name|label|value', $locator);
+ }
+
+ $field->selectOption($value, $multiple);
+ }
+
+ /**
+ * Checks whether element has a table with specified locator.
+ *
+ * @param string $locator table id or caption
+ *
+ * @return Boolean
+ */
+ public function hasTable($locator)
+ {
+ return $this->has('named', array('table', $locator));
+ }
+
+ /**
+ * Attach file to file field with specified locator.
+ *
+ * @param string $locator input id, name or label
+ * @param string $path path to file
+ *
+ * @throws ElementNotFoundException
+ *
+ * @see NodeElement::attachFile
+ */
+ public function attachFileToField($locator, $path)
+ {
+ $field = $this->findField($locator);
+
+ if (null === $field) {
+ throw new ElementNotFoundException($this->getDriver(), 'form field', 'id|name|label|value', $locator);
+ }
+
+ $field->attachFile($path);
+ }
+}
diff --git a/vendor/behat/mink/src/Exception/DriverException.php b/vendor/behat/mink/src/Exception/DriverException.php
new file mode 100644
index 0000000000000000000000000000000000000000..840f8bdeaeade1ad85f79ce3d24398b07b8a6f3d
--- /dev/null
+++ b/vendor/behat/mink/src/Exception/DriverException.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Exception;
+
+/**
+ * Exception thrown by drivers when they fail to perform an action.
+ *
+ * @author Konstantin Kudryashov
+ */
+class DriverException extends Exception
+{
+ /**
+ * Initializes exception.
+ *
+ * @param string $message
+ * @param int $code
+ * @param \Exception|null $previous
+ */
+ public function __construct($message, $code = 0, \Exception $previous = null)
+ {
+ parent::__construct($message, $code, $previous);
+ }
+}
diff --git a/vendor/behat/mink/src/Exception/ElementException.php b/vendor/behat/mink/src/Exception/ElementException.php
new file mode 100644
index 0000000000000000000000000000000000000000..16ebdc9813c98a3aeb15cb1613e9dd8625b66070
--- /dev/null
+++ b/vendor/behat/mink/src/Exception/ElementException.php
@@ -0,0 +1,60 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Exception;
+
+@trigger_error('The class '.__NAMESPACE__.'\ElementException is deprecated as of Mink 1.6 and will be removed in 2.0', E_USER_DEPRECATED);
+
+use Behat\Mink\Element\Element;
+
+/**
+ * A standard way for elements to re-throw exceptions.
+ *
+ * @deprecated This exception class is not used anymore in Mink 1.6 and will be removed in 2.0
+ *
+ * @author Chris Worfolk
+ */
+class ElementException extends Exception
+{
+ private $element;
+
+ /**
+ * Initialises exception.
+ *
+ * @param Element $element optional message
+ * @param \Exception $exception exception
+ */
+ public function __construct(Element $element, \Exception $exception)
+ {
+ $this->element = $element;
+
+ parent::__construct(sprintf("Exception thrown by %s\n%s", $element->getXpath(), $exception->getMessage()));
+ }
+
+ /**
+ * Override default toString so we don't send a full backtrace in verbose mode.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->getMessage();
+ }
+
+ /**
+ * Get the element that caused the exception.
+ *
+ * @return Element
+ */
+ public function getElement()
+ {
+ return $this->element;
+ }
+}
diff --git a/vendor/behat/mink/src/Exception/ElementHtmlException.php b/vendor/behat/mink/src/Exception/ElementHtmlException.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb2fed68ef82354ac72452b7cdb858bc0f807d36
--- /dev/null
+++ b/vendor/behat/mink/src/Exception/ElementHtmlException.php
@@ -0,0 +1,50 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Exception;
+
+use Behat\Mink\Driver\DriverInterface;
+use Behat\Mink\Element\Element;
+use Behat\Mink\Session;
+
+/**
+ * Exception thrown when an expectation on the HTML of an element fails.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ElementHtmlException extends ExpectationException
+{
+ /**
+ * Element instance.
+ *
+ * @var Element
+ */
+ protected $element;
+
+ /**
+ * Initializes exception.
+ *
+ * @param string $message optional message
+ * @param DriverInterface|Session $driver driver instance
+ * @param Element $element element
+ * @param \Exception $exception expectation exception
+ */
+ public function __construct($message, $driver, Element $element, \Exception $exception = null)
+ {
+ $this->element = $element;
+
+ parent::__construct($message, $driver, $exception);
+ }
+
+ protected function getContext()
+ {
+ return $this->element->getOuterHtml();
+ }
+}
diff --git a/vendor/behat/mink/src/Exception/ElementNotFoundException.php b/vendor/behat/mink/src/Exception/ElementNotFoundException.php
new file mode 100644
index 0000000000000000000000000000000000000000..6716ab3ff70b252614f01cfadaa434707806e0b2
--- /dev/null
+++ b/vendor/behat/mink/src/Exception/ElementNotFoundException.php
@@ -0,0 +1,54 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Exception;
+
+use Behat\Mink\Driver\DriverInterface;
+use Behat\Mink\Session;
+
+/**
+ * Exception thrown when an expected element is not found.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ElementNotFoundException extends ExpectationException
+{
+ /**
+ * Initializes exception.
+ *
+ * @param DriverInterface|Session $driver driver instance
+ * @param string $type element type
+ * @param string $selector element selector type
+ * @param string $locator element locator
+ */
+ public function __construct($driver, $type = null, $selector = null, $locator = null)
+ {
+ $message = '';
+
+ if (null !== $type) {
+ $message .= ucfirst($type);
+ } else {
+ $message .= 'Tag';
+ }
+
+ if (null !== $locator) {
+ if (null === $selector || in_array($selector, array('css', 'xpath'))) {
+ $selector = 'matching '.($selector ?: 'locator');
+ } else {
+ $selector = 'with '.$selector;
+ }
+ $message .= ' '.$selector.' "'.$locator.'"';
+ }
+
+ $message .= ' not found.';
+
+ parent::__construct($message, $driver);
+ }
+}
diff --git a/vendor/behat/mink/src/Exception/ElementTextException.php b/vendor/behat/mink/src/Exception/ElementTextException.php
new file mode 100644
index 0000000000000000000000000000000000000000..5efff0fc91c92aa74aff9774df3b52c04dfde81f
--- /dev/null
+++ b/vendor/behat/mink/src/Exception/ElementTextException.php
@@ -0,0 +1,24 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Exception;
+
+/**
+ * Exception thrown when an expectation on the text of an element fails.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ElementTextException extends ElementHtmlException
+{
+ protected function getContext()
+ {
+ return $this->element->getText();
+ }
+}
diff --git a/vendor/behat/mink/src/Exception/Exception.php b/vendor/behat/mink/src/Exception/Exception.php
new file mode 100644
index 0000000000000000000000000000000000000000..4662a5ba49bd01cc49c643f7d65ef0ce7b07ad65
--- /dev/null
+++ b/vendor/behat/mink/src/Exception/Exception.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Exception;
+
+/**
+ * Mink base exception class.
+ *
+ * @author Konstantin Kudryashov
+ */
+abstract class Exception extends \Exception
+{
+}
diff --git a/vendor/behat/mink/src/Exception/ExpectationException.php b/vendor/behat/mink/src/Exception/ExpectationException.php
new file mode 100644
index 0000000000000000000000000000000000000000..35f7150a29896c7b1cb7b3a2feab7442e860a5cd
--- /dev/null
+++ b/vendor/behat/mink/src/Exception/ExpectationException.php
@@ -0,0 +1,175 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Exception;
+
+use Behat\Mink\Driver\DriverInterface;
+use Behat\Mink\Session;
+
+/**
+ * Exception thrown for failed expectations.
+ *
+ * Some specialized child classes are available to customize the error rendering.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ExpectationException extends Exception
+{
+ private $session;
+ private $driver;
+
+ /**
+ * Initializes exception.
+ *
+ * @param string $message optional message
+ * @param DriverInterface|Session $driver driver instance (or session for BC)
+ * @param \Exception|null $exception expectation exception
+ */
+ public function __construct($message, $driver, \Exception $exception = null)
+ {
+ if ($driver instanceof Session) {
+ @trigger_error('Passing a Session object to the ExpectationException constructor is deprecated as of Mink 1.7. Pass the driver instead.', E_USER_DEPRECATED);
+
+ $this->session = $driver;
+ $this->driver = $driver->getDriver();
+ } elseif (!$driver instanceof DriverInterface) {
+ // Trigger an exception as we cannot typehint a disjunction
+ throw new \InvalidArgumentException('The ExpectationException constructor expects a DriverInterface or a Session.');
+ } else {
+ $this->driver = $driver;
+ }
+
+ if (!$message && null !== $exception) {
+ $message = $exception->getMessage();
+ }
+
+ parent::__construct($message, 0, $exception);
+ }
+
+ /**
+ * Returns exception message with additional context info.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ try {
+ $pageText = $this->pipeString($this->trimString($this->getContext())."\n");
+ $string = sprintf("%s\n\n%s%s", $this->getMessage(), $this->getResponseInfo(), $pageText);
+ } catch (\Exception $e) {
+ return $this->getMessage();
+ }
+
+ return $string;
+ }
+
+ /**
+ * Gets the context rendered for this exception.
+ *
+ * @return string
+ */
+ protected function getContext()
+ {
+ return $this->trimBody($this->driver->getContent());
+ }
+
+ /**
+ * Returns driver.
+ *
+ * @return DriverInterface
+ */
+ protected function getDriver()
+ {
+ return $this->driver;
+ }
+
+ /**
+ * Returns exception session.
+ *
+ * @return Session
+ *
+ * @deprecated since 1.7, to be removed in 2.0. Use getDriver and the driver API instead.
+ */
+ protected function getSession()
+ {
+ if (null === $this->session) {
+ throw new \LogicException(sprintf('The deprecated method %s cannot be used when passing a driver in the constructor', __METHOD__));
+ }
+
+ @trigger_error(sprintf('The method %s is deprecated as of Mink 1.7 and will be removed in 2.0. Use getDriver and the driver API instead.'));
+
+ return $this->session;
+ }
+
+ /**
+ * Prepends every line in a string with pipe (|).
+ *
+ * @param string $string
+ *
+ * @return string
+ */
+ protected function pipeString($string)
+ {
+ return '| '.strtr($string, array("\n" => "\n| "));
+ }
+
+ /**
+ * Removes response header/footer, letting only content.
+ *
+ * @param string $string response content
+ *
+ * @return string
+ */
+ protected function trimBody($string)
+ {
+ $string = preg_replace(array('/^.*/s', '/<\/body>.*$/s'), array('', ''), $string);
+
+ return $string;
+ }
+
+ /**
+ * Trims string to specified number of chars.
+ *
+ * @param string $string response content
+ * @param int $count trim count
+ *
+ * @return string
+ */
+ protected function trimString($string, $count = 1000)
+ {
+ $string = trim($string);
+
+ if ($count < mb_strlen($string)) {
+ return mb_substr($string, 0, $count - 3).'...';
+ }
+
+ return $string;
+ }
+
+ /**
+ * Returns response information string.
+ *
+ * @return string
+ */
+ protected function getResponseInfo()
+ {
+ $driver = basename(str_replace('\\', '/', get_class($this->driver)));
+
+ $info = '+--[ ';
+ try {
+ $info .= 'HTTP/1.1 '.$this->driver->getStatusCode().' | ';
+ } catch (UnsupportedDriverActionException $e) {
+ // Ignore the status code when not supported
+ }
+ $info .= $this->driver->getCurrentUrl().' | '.$driver." ]\n|\n";
+
+ return $info;
+ }
+}
diff --git a/vendor/behat/mink/src/Exception/ResponseTextException.php b/vendor/behat/mink/src/Exception/ResponseTextException.php
new file mode 100644
index 0000000000000000000000000000000000000000..515c5694df5b22c70134c2568e623bed1f8b102e
--- /dev/null
+++ b/vendor/behat/mink/src/Exception/ResponseTextException.php
@@ -0,0 +1,24 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Exception;
+
+/**
+ * Exception thrown when an expectation on the response text fails.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ResponseTextException extends ExpectationException
+{
+ protected function getContext()
+ {
+ return $this->getDriver()->getText('//html');
+ }
+}
diff --git a/vendor/behat/mink/src/Exception/UnsupportedDriverActionException.php b/vendor/behat/mink/src/Exception/UnsupportedDriverActionException.php
new file mode 100644
index 0000000000000000000000000000000000000000..d02969b6297e81fe542204bfe6f238f4fb8caad4
--- /dev/null
+++ b/vendor/behat/mink/src/Exception/UnsupportedDriverActionException.php
@@ -0,0 +1,35 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Exception;
+
+use Behat\Mink\Driver\DriverInterface;
+
+/**
+ * Exception thrown by drivers when they don't support the requested action.
+ *
+ * @author Konstantin Kudryashov
+ */
+class UnsupportedDriverActionException extends DriverException
+{
+ /**
+ * Initializes exception.
+ *
+ * @param string $template what is unsupported?
+ * @param DriverInterface $driver driver instance
+ * @param \Exception $previous previous exception
+ */
+ public function __construct($template, DriverInterface $driver, \Exception $previous = null)
+ {
+ $message = sprintf($template, get_class($driver));
+
+ parent::__construct($message, 0, $previous);
+ }
+}
diff --git a/vendor/behat/mink/src/Mink.php b/vendor/behat/mink/src/Mink.php
new file mode 100644
index 0000000000000000000000000000000000000000..333bfbdecea1048e4d9ba9b02082a3526f08e82b
--- /dev/null
+++ b/vendor/behat/mink/src/Mink.php
@@ -0,0 +1,216 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink;
+
+/**
+ * Mink sessions manager.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Mink
+{
+ private $defaultSessionName;
+
+ /**
+ * Sessions.
+ *
+ * @var Session[]
+ */
+ private $sessions = array();
+
+ /**
+ * Initializes manager.
+ *
+ * @param Session[] $sessions
+ */
+ public function __construct(array $sessions = array())
+ {
+ foreach ($sessions as $name => $session) {
+ $this->registerSession($name, $session);
+ }
+ }
+
+ /**
+ * Stops all started sessions.
+ */
+ public function __destruct()
+ {
+ $this->stopSessions();
+ }
+
+ /**
+ * Registers new session.
+ *
+ * @param string $name
+ * @param Session $session
+ */
+ public function registerSession($name, Session $session)
+ {
+ $name = strtolower($name);
+
+ $this->sessions[$name] = $session;
+ }
+
+ /**
+ * Checks whether session with specified name is registered.
+ *
+ * @param string $name
+ *
+ * @return Boolean
+ */
+ public function hasSession($name)
+ {
+ return isset($this->sessions[strtolower($name)]);
+ }
+
+ /**
+ * Sets default session name to use.
+ *
+ * @param string $name name of the registered session
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setDefaultSessionName($name)
+ {
+ $name = strtolower($name);
+
+ if (!isset($this->sessions[$name])) {
+ throw new \InvalidArgumentException(sprintf('Session "%s" is not registered.', $name));
+ }
+
+ $this->defaultSessionName = $name;
+ }
+
+ /**
+ * Returns default session name or null if none.
+ *
+ * @return null|string
+ */
+ public function getDefaultSessionName()
+ {
+ return $this->defaultSessionName;
+ }
+
+ /**
+ * Returns registered session by it's name or active one and automatically starts it if required.
+ *
+ * @param string $name session name
+ *
+ * @return Session
+ *
+ * @throws \InvalidArgumentException If the named session is not registered
+ */
+ public function getSession($name = null)
+ {
+ $session = $this->locateSession($name);
+
+ // start session if needed
+ if (!$session->isStarted()) {
+ $session->start();
+ }
+
+ return $session;
+ }
+
+ /**
+ * Checks whether a named session (or the default session) has already been started.
+ *
+ * @param string $name session name - if null then the default session will be checked
+ *
+ * @return bool whether the session has been started
+ *
+ * @throws \InvalidArgumentException If the named session is not registered
+ */
+ public function isSessionStarted($name = null)
+ {
+ $session = $this->locateSession($name);
+
+ return $session->isStarted();
+ }
+
+ /**
+ * Returns session asserter.
+ *
+ * @param Session|string $session session object or name
+ *
+ * @return WebAssert
+ */
+ public function assertSession($session = null)
+ {
+ if (!($session instanceof Session)) {
+ $session = $this->getSession($session);
+ }
+
+ return new WebAssert($session);
+ }
+
+ /**
+ * Resets all started sessions.
+ */
+ public function resetSessions()
+ {
+ foreach ($this->sessions as $session) {
+ if ($session->isStarted()) {
+ $session->reset();
+ }
+ }
+ }
+
+ /**
+ * Restarts all started sessions.
+ */
+ public function restartSessions()
+ {
+ foreach ($this->sessions as $session) {
+ if ($session->isStarted()) {
+ $session->restart();
+ }
+ }
+ }
+
+ /**
+ * Stops all started sessions.
+ */
+ public function stopSessions()
+ {
+ foreach ($this->sessions as $session) {
+ if ($session->isStarted()) {
+ $session->stop();
+ }
+ }
+ }
+
+ /**
+ * Returns the named or default session without starting it.
+ *
+ * @param string $name session name
+ *
+ * @return Session
+ *
+ * @throws \InvalidArgumentException If the named session is not registered
+ */
+ protected function locateSession($name = null)
+ {
+ $name = strtolower($name) ?: $this->defaultSessionName;
+
+ if (null === $name) {
+ throw new \InvalidArgumentException('Specify session name to get');
+ }
+
+ if (!isset($this->sessions[$name])) {
+ throw new \InvalidArgumentException(sprintf('Session "%s" is not registered.', $name));
+ }
+
+ $session = $this->sessions[$name];
+
+ return $session;
+ }
+}
diff --git a/vendor/behat/mink/src/Selector/CssSelector.php b/vendor/behat/mink/src/Selector/CssSelector.php
new file mode 100644
index 0000000000000000000000000000000000000000..363658635ca4e9d06d835a0b6165815bce314ed1
--- /dev/null
+++ b/vendor/behat/mink/src/Selector/CssSelector.php
@@ -0,0 +1,37 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Selector;
+
+use Symfony\Component\CssSelector\CssSelector as CSS;
+
+/**
+ * CSS selector engine. Transforms CSS to XPath.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CssSelector implements SelectorInterface
+{
+ /**
+ * Translates CSS into XPath.
+ *
+ * @param string|array $locator current selector locator
+ *
+ * @return string
+ */
+ public function translateToXPath($locator)
+ {
+ if (!is_string($locator)) {
+ throw new \InvalidArgumentException('The CssSelector expects to get a string as locator');
+ }
+
+ return CSS::toXPath($locator);
+ }
+}
diff --git a/vendor/behat/mink/src/Selector/ExactNamedSelector.php b/vendor/behat/mink/src/Selector/ExactNamedSelector.php
new file mode 100644
index 0000000000000000000000000000000000000000..03315a9cffa43fe152e5d4fac9ca7e2adcffdae0
--- /dev/null
+++ b/vendor/behat/mink/src/Selector/ExactNamedSelector.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Selector;
+
+/**
+ * Exact match selector engine. Like the Named selector engine but ignores partial matches.
+ */
+class ExactNamedSelector extends NamedSelector
+{
+ public function __construct()
+ {
+ $this->registerReplacement('%tagTextMatch%', 'normalize-space(string(.)) = %locator%');
+ $this->registerReplacement('%valueMatch%', './@value = %locator%');
+ $this->registerReplacement('%titleMatch%', './@title = %locator%');
+ $this->registerReplacement('%altMatch%', './@alt = %locator%');
+ $this->registerReplacement('%relMatch%', './@rel = %locator%');
+ $this->registerReplacement('%labelAttributeMatch%', './@label = %locator%');
+
+ parent::__construct();
+ }
+}
diff --git a/vendor/behat/mink/src/Selector/NamedSelector.php b/vendor/behat/mink/src/Selector/NamedSelector.php
new file mode 100644
index 0000000000000000000000000000000000000000..d1936cc12ed78bea3c55f8bfcc45b34ab1ae960e
--- /dev/null
+++ b/vendor/behat/mink/src/Selector/NamedSelector.php
@@ -0,0 +1,263 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Selector;
+
+use Behat\Mink\Selector\Xpath\Escaper;
+
+/**
+ * Named selectors engine. Uses registered XPath selectors to create new expressions.
+ *
+ * @author Konstantin Kudryashov
+ */
+class NamedSelector implements SelectorInterface
+{
+ private $replacements = array(
+ // simple replacements
+ '%lowercaseType%' => "translate(./@type, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')",
+ '%lowercaseRole%' => "translate(./@role, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')",
+ '%tagTextMatch%' => 'contains(normalize-space(string(.)), %locator%)',
+ '%labelTextMatch%' => './@id = //label[%tagTextMatch%]/@for',
+ '%idMatch%' => './@id = %locator%',
+ '%valueMatch%' => 'contains(./@value, %locator%)',
+ '%idOrValueMatch%' => '(%idMatch% or %valueMatch%)',
+ '%idOrNameMatch%' => '(%idMatch% or ./@name = %locator%)',
+ '%placeholderMatch%' => './@placeholder = %locator%',
+ '%titleMatch%' => 'contains(./@title, %locator%)',
+ '%altMatch%' => 'contains(./@alt, %locator%)',
+ '%relMatch%' => 'contains(./@rel, %locator%)',
+ '%labelAttributeMatch%' => 'contains(./@label, %locator%)',
+
+ // complex replacements
+ '%inputTypeWithoutPlaceholderFilter%' => "%lowercaseType% = 'radio' or %lowercaseType% = 'checkbox' or %lowercaseType% = 'file'",
+ '%fieldFilterWithPlaceholder%' => 'self::input[not(%inputTypeWithoutPlaceholderFilter%)] | self::textarea',
+ '%fieldMatchWithPlaceholder%' => '(%idOrNameMatch% or %labelTextMatch% or %placeholderMatch%)',
+ '%fieldMatchWithoutPlaceholder%' => '(%idOrNameMatch% or %labelTextMatch%)',
+ '%fieldFilterWithoutPlaceholder%' => 'self::input[%inputTypeWithoutPlaceholderFilter%] | self::select',
+ '%buttonTypeFilter%' => "%lowercaseType% = 'submit' or %lowercaseType% = 'image' or %lowercaseType% = 'button' or %lowercaseType% = 'reset'",
+ '%notFieldTypeFilter%' => "not(%buttonTypeFilter% or %lowercaseType% = 'hidden')",
+ '%buttonMatch%' => '%idOrNameMatch% or %valueMatch% or %titleMatch%',
+ '%linkMatch%' => '(%idMatch% or %tagTextMatch% or %titleMatch% or %relMatch%)',
+ '%imgAltMatch%' => './/img[%altMatch%]',
+ );
+
+ private $selectors = array(
+ 'fieldset' => << << << << << << << << << << << << << << <<xpathEscaper = new Escaper();
+
+ foreach ($this->replacements as $from => $to) {
+ $this->replacements[$from] = strtr($to, $this->replacements);
+ }
+
+ foreach ($this->selectors as $alias => $selector) {
+ $this->selectors[$alias] = strtr($selector, $this->replacements);
+ }
+ }
+
+ /**
+ * Registers new XPath selector with specified name.
+ *
+ * @param string $name name for selector
+ * @param string $xpath xpath expression
+ */
+ public function registerNamedXpath($name, $xpath)
+ {
+ $this->selectors[$name] = $xpath;
+ }
+
+ /**
+ * Translates provided locator into XPath.
+ *
+ * @param string|array $locator selector name or array of (selector_name, locator)
+ *
+ * @return string
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function translateToXPath($locator)
+ {
+ if (2 < count($locator)) {
+ throw new \InvalidArgumentException('NamedSelector expects array(name, locator) as argument');
+ }
+
+ if (2 == count($locator)) {
+ $selector = $locator[0];
+ $locator = $locator[1];
+ } else {
+ $selector = (string) $locator;
+ $locator = null;
+ }
+
+ if (!isset($this->selectors[$selector])) {
+ throw new \InvalidArgumentException(sprintf(
+ 'Unknown named selector provided: "%s". Expected one of (%s)',
+ $selector,
+ implode(', ', array_keys($this->selectors))
+ ));
+ }
+
+ $xpath = $this->selectors[$selector];
+
+ if (null !== $locator) {
+ $xpath = strtr($xpath, array('%locator%' => $this->escapeLocator($locator)));
+ }
+
+ return $xpath;
+ }
+
+ /**
+ * Registers a replacement in the list of replacements.
+ *
+ * This method must be called in the constructor before calling the parent constructor.
+ *
+ * @param string $from
+ * @param string $to
+ */
+ protected function registerReplacement($from, $to)
+ {
+ $this->replacements[$from] = $to;
+ }
+
+ private function escapeLocator($locator)
+ {
+ // If the locator looks like an escaped one, don't escape it again for BC reasons.
+ if (
+ preg_match('/^\'[^\']*+\'$/', $locator)
+ || (false !== strpos($locator, '\'') && preg_match('/^"[^"]*+"$/', $locator))
+ || ((8 < $length = strlen($locator)) && 'concat(' === substr($locator, 0, 7) && ')' === $locator[$length - 1])
+ ) {
+ @trigger_error(
+ 'Passing an escaped locator to the named selector is deprecated as of 1.7 and will be removed in 2.0.'
+ .' Pass the raw value instead.',
+ E_USER_DEPRECATED
+ );
+
+ return $locator;
+ }
+
+ return $this->xpathEscaper->escapeLiteral($locator);
+ }
+}
diff --git a/vendor/behat/mink/src/Selector/PartialNamedSelector.php b/vendor/behat/mink/src/Selector/PartialNamedSelector.php
new file mode 100644
index 0000000000000000000000000000000000000000..b864a2265db1ef9e8b1d1afb8e534271c9597c99
--- /dev/null
+++ b/vendor/behat/mink/src/Selector/PartialNamedSelector.php
@@ -0,0 +1,31 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Selector;
+
+/**
+ * Named selectors engine. Uses registered XPath selectors to create new expressions.
+ *
+ * @author Konstantin Kudryashov
+ */
+class PartialNamedSelector extends NamedSelector
+{
+ public function __construct()
+ {
+ $this->registerReplacement('%tagTextMatch%', 'contains(normalize-space(string(.)), %locator%)');
+ $this->registerReplacement('%valueMatch%', 'contains(./@value, %locator%)');
+ $this->registerReplacement('%titleMatch%', 'contains(./@title, %locator%)');
+ $this->registerReplacement('%altMatch%', 'contains(./@alt, %locator%)');
+ $this->registerReplacement('%relMatch%', 'contains(./@rel, %locator%)');
+ $this->registerReplacement('%labelAttributeMatch%', 'contains(./@label, %locator%)');
+
+ parent::__construct();
+ }
+}
diff --git a/vendor/behat/mink/src/Selector/SelectorInterface.php b/vendor/behat/mink/src/Selector/SelectorInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..e4f5f17942fedef18602924e7bb4b59f75daba66
--- /dev/null
+++ b/vendor/behat/mink/src/Selector/SelectorInterface.php
@@ -0,0 +1,28 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Selector;
+
+/**
+ * Mink selector engine interface.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface SelectorInterface
+{
+ /**
+ * Translates provided locator into XPath.
+ *
+ * @param string|array $locator current selector locator
+ *
+ * @return string
+ */
+ public function translateToXPath($locator);
+}
diff --git a/vendor/behat/mink/src/Selector/SelectorsHandler.php b/vendor/behat/mink/src/Selector/SelectorsHandler.php
new file mode 100644
index 0000000000000000000000000000000000000000..09b947ca5fe8d9ce3d33247b2069d4de5233acd5
--- /dev/null
+++ b/vendor/behat/mink/src/Selector/SelectorsHandler.php
@@ -0,0 +1,135 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Selector;
+
+use Behat\Mink\Selector\Xpath\Escaper;
+
+/**
+ * Selectors handler.
+ *
+ * @author Konstantin Kudryashov
+ */
+class SelectorsHandler
+{
+ private $selectors;
+ private $escaper;
+
+ /**
+ * Initializes selectors handler.
+ *
+ * @param SelectorInterface[] $selectors default selectors to register
+ */
+ public function __construct(array $selectors = array())
+ {
+ $this->escaper = new Escaper();
+
+ $this->registerSelector('named_partial', new PartialNamedSelector());
+ $this->registerSelector('named_exact', new ExactNamedSelector());
+ $this->registerSelector('css', new CssSelector());
+
+ foreach ($selectors as $name => $selector) {
+ $this->registerSelector($name, $selector);
+ }
+ }
+
+ /**
+ * Registers new selector engine with specified name.
+ *
+ * @param string $name selector engine name
+ * @param SelectorInterface $selector selector engine instance
+ */
+ public function registerSelector($name, SelectorInterface $selector)
+ {
+ $this->selectors[$name] = $selector;
+ }
+
+ /**
+ * Checks whether selector with specified name is registered on handler.
+ *
+ * @param string $name selector engine name
+ *
+ * @return Boolean
+ */
+ public function isSelectorRegistered($name)
+ {
+ return isset($this->selectors[$name]);
+ }
+
+ /**
+ * Returns selector engine with specified name.
+ *
+ * @param string $name selector engine name
+ *
+ * @return SelectorInterface
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function getSelector($name)
+ {
+ if ('named' === $name) {
+ @trigger_error(
+ 'Using the "named" selector directly from the handler is deprecated as of 1.6 and will be removed in 2.0.'
+ .' Use the "named_partial" or use the "named" selector through the Element API instead.',
+ E_USER_DEPRECATED
+ );
+ $name = 'named_partial';
+ }
+
+ if (!$this->isSelectorRegistered($name)) {
+ throw new \InvalidArgumentException("Selector \"$name\" is not registered.");
+ }
+
+ return $this->selectors[$name];
+ }
+
+ /**
+ * Translates selector with specified name to XPath.
+ *
+ * @param string $selector selector engine name (registered)
+ * @param string|array $locator selector locator (an array or a string depending of the selector being used)
+ *
+ * @return string
+ */
+ public function selectorToXpath($selector, $locator)
+ {
+ if ('xpath' === $selector) {
+ if (!is_string($locator)) {
+ throw new \InvalidArgumentException('The xpath selector expects to get a string as locator');
+ }
+
+ return $locator;
+ }
+
+ return $this->getSelector($selector)->translateToXPath($locator);
+ }
+
+ /**
+ * Translates string to XPath literal.
+ *
+ * @deprecated since Mink 1.7. Use \Behat\Mink\Selector\Xpath\Escaper::escapeLiteral when building Xpath
+ * or pass the unescaped value when using the named selector.
+ *
+ * @param string $s
+ *
+ * @return string
+ */
+ public function xpathLiteral($s)
+ {
+ @trigger_error(
+ 'The '.__METHOD__.' method is deprecated as of 1.7 and will be removed in 2.0.'
+ .' Use \Behat\Mink\Selector\Xpath\Escaper::escapeLiteral instead when building Xpath'
+ .' or pass the unescaped value when using the named selector.',
+ E_USER_DEPRECATED
+ );
+
+ return $this->escaper->escapeLiteral($s);
+ }
+}
diff --git a/vendor/behat/mink/src/Selector/Xpath/Escaper.php b/vendor/behat/mink/src/Selector/Xpath/Escaper.php
new file mode 100644
index 0000000000000000000000000000000000000000..c3aa7a3bab2b67f0f2071bfc4f9589109f17acb6
--- /dev/null
+++ b/vendor/behat/mink/src/Selector/Xpath/Escaper.php
@@ -0,0 +1,52 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Selector\Xpath;
+
+/**
+ * XPath escaper.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Escaper
+{
+ /**
+ * Escapes the string as a XPath literal.
+ *
+ * @param string $s
+ *
+ * @return string
+ */
+ public function escapeLiteral($s)
+ {
+ if (false === strpos($s, "'")) {
+ return sprintf("'%s'", $s);
+ }
+
+ if (false === strpos($s, '"')) {
+ return sprintf('"%s"', $s);
+ }
+
+ $string = $s;
+ $parts = array();
+ while (true) {
+ if (false !== $pos = strpos($string, "'")) {
+ $parts[] = sprintf("'%s'", substr($string, 0, $pos));
+ $parts[] = "\"'\"";
+ $string = substr($string, $pos + 1);
+ } else {
+ $parts[] = "'$string'";
+ break;
+ }
+ }
+
+ return sprintf('concat(%s)', implode($parts, ','));
+ }
+}
diff --git a/vendor/behat/mink/src/Selector/Xpath/Manipulator.php b/vendor/behat/mink/src/Selector/Xpath/Manipulator.php
new file mode 100644
index 0000000000000000000000000000000000000000..116650a5b5106096df72f871f44bb440655ca3e9
--- /dev/null
+++ b/vendor/behat/mink/src/Selector/Xpath/Manipulator.php
@@ -0,0 +1,69 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink\Selector\Xpath;
+
+/**
+ * XPath manipulation utility.
+ *
+ * @author Graham Bates
+ * @author Christophe Coevoet
+ */
+class Manipulator
+{
+ /**
+ * Regex to find union operators not inside brackets.
+ */
+ const UNION_PATTERN = '/\|(?![^\[]*\])/';
+
+ /**
+ * Prepends the XPath prefix to the given XPath.
+ *
+ * The returned XPath will match elements matching the XPath inside an element
+ * matching the prefix.
+ *
+ * @param string $xpath
+ * @param string $prefix
+ *
+ * @return string
+ */
+ public function prepend($xpath, $prefix)
+ {
+ $expressions = array();
+
+ // If the xpath prefix contains a union we need to wrap it in parentheses.
+ if (preg_match(self::UNION_PATTERN, $prefix)) {
+ $prefix = '('.$prefix.')';
+ }
+
+ // Split any unions into individual expressions.
+ foreach (preg_split(self::UNION_PATTERN, $xpath) as $expression) {
+ $expression = trim($expression);
+ $parenthesis = '';
+
+ // If the union is inside some braces, we need to preserve the opening braces and apply
+ // the prefix only inside it.
+ if (preg_match('/^[\(\s*]+/', $expression, $matches)) {
+ $parenthesis = $matches[0];
+ $expression = substr($expression, strlen($parenthesis));
+ }
+
+ // add prefix before element selector
+ if (0 === strpos($expression, '/')) {
+ $expression = $prefix.$expression;
+ } else {
+ $expression = $prefix.'/'.$expression;
+ }
+ $expressions[] = $parenthesis.$expression;
+ }
+
+ return implode(' | ', $expressions);
+ }
+}
diff --git a/vendor/behat/mink/src/Session.php b/vendor/behat/mink/src/Session.php
new file mode 100644
index 0000000000000000000000000000000000000000..c8815f9582ac790de778036324a5d42cf0efa4a7
--- /dev/null
+++ b/vendor/behat/mink/src/Session.php
@@ -0,0 +1,373 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink;
+
+use Behat\Mink\Driver\DriverInterface;
+use Behat\Mink\Selector\SelectorsHandler;
+use Behat\Mink\Element\DocumentElement;
+
+/**
+ * Mink session.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Session
+{
+ private $driver;
+ private $page;
+ private $selectorsHandler;
+
+ /**
+ * Initializes session.
+ *
+ * @param DriverInterface $driver
+ * @param SelectorsHandler $selectorsHandler
+ */
+ public function __construct(DriverInterface $driver, SelectorsHandler $selectorsHandler = null)
+ {
+ $driver->setSession($this);
+
+ if (null === $selectorsHandler) {
+ $selectorsHandler = new SelectorsHandler();
+ }
+
+ $this->driver = $driver;
+ $this->selectorsHandler = $selectorsHandler;
+ $this->page = new DocumentElement($this);
+ }
+
+ /**
+ * Checks whether session (driver) was started.
+ *
+ * @return Boolean
+ */
+ public function isStarted()
+ {
+ return $this->driver->isStarted();
+ }
+
+ /**
+ * Starts session driver.
+ *
+ * Calling any action before visiting a page is an undefined behavior.
+ * The only supported method calls on a fresh driver are
+ * - visit()
+ * - setRequestHeader()
+ * - setBasicAuth()
+ * - reset()
+ * - stop()
+ */
+ public function start()
+ {
+ $this->driver->start();
+ }
+
+ /**
+ * Stops session driver.
+ */
+ public function stop()
+ {
+ $this->driver->stop();
+ }
+
+ /**
+ * Restart session driver.
+ */
+ public function restart()
+ {
+ $this->driver->stop();
+ $this->driver->start();
+ }
+
+ /**
+ * Reset session driver state.
+ *
+ * Calling any action before visiting a page is an undefined behavior.
+ * The only supported method calls on a fresh driver are
+ * - visit()
+ * - setRequestHeader()
+ * - setBasicAuth()
+ * - reset()
+ * - stop()
+ */
+ public function reset()
+ {
+ $this->driver->reset();
+ }
+
+ /**
+ * Returns session driver.
+ *
+ * @return DriverInterface
+ */
+ public function getDriver()
+ {
+ return $this->driver;
+ }
+
+ /**
+ * Returns page element.
+ *
+ * @return DocumentElement
+ */
+ public function getPage()
+ {
+ return $this->page;
+ }
+
+ /**
+ * Returns selectors handler.
+ *
+ * @return SelectorsHandler
+ */
+ public function getSelectorsHandler()
+ {
+ return $this->selectorsHandler;
+ }
+
+ /**
+ * Visit specified URL.
+ *
+ * @param string $url url of the page
+ */
+ public function visit($url)
+ {
+ $this->driver->visit($url);
+ }
+
+ /**
+ * Sets HTTP Basic authentication parameters.
+ *
+ * @param string|Boolean $user user name or false to disable authentication
+ * @param string $password password
+ */
+ public function setBasicAuth($user, $password = '')
+ {
+ $this->driver->setBasicAuth($user, $password);
+ }
+
+ /**
+ * Sets specific request header.
+ *
+ * @param string $name
+ * @param string $value
+ */
+ public function setRequestHeader($name, $value)
+ {
+ $this->driver->setRequestHeader($name, $value);
+ }
+
+ /**
+ * Returns all response headers.
+ *
+ * @return array
+ */
+ public function getResponseHeaders()
+ {
+ return $this->driver->getResponseHeaders();
+ }
+
+ /**
+ * Returns specific response header.
+ *
+ * @param string $name
+ *
+ * @return string|null
+ */
+ public function getResponseHeader($name)
+ {
+ $headers = $this->driver->getResponseHeaders();
+
+ $name = strtolower($name);
+ $headers = array_change_key_case($headers, CASE_LOWER);
+
+ if (!isset($headers[$name])) {
+ return null;
+ }
+
+ return is_array($headers[$name]) ? $headers[$name][0] : $headers[$name];
+ }
+
+ /**
+ * Sets cookie.
+ *
+ * @param string $name
+ * @param string $value
+ */
+ public function setCookie($name, $value = null)
+ {
+ $this->driver->setCookie($name, $value);
+ }
+
+ /**
+ * Returns cookie by name.
+ *
+ * @param string $name
+ *
+ * @return string|null
+ */
+ public function getCookie($name)
+ {
+ return $this->driver->getCookie($name);
+ }
+
+ /**
+ * Returns response status code.
+ *
+ * @return int
+ */
+ public function getStatusCode()
+ {
+ return $this->driver->getStatusCode();
+ }
+
+ /**
+ * Returns current URL address.
+ *
+ * @return string
+ */
+ public function getCurrentUrl()
+ {
+ return $this->driver->getCurrentUrl();
+ }
+
+ /**
+ * Capture a screenshot of the current window.
+ *
+ * @return string screenshot of MIME type image/* depending
+ * on driver (e.g., image/png, image/jpeg)
+ */
+ public function getScreenshot()
+ {
+ return $this->driver->getScreenshot();
+ }
+
+ /**
+ * Return the names of all open windows.
+ *
+ * @return array Array of all open window's names.
+ */
+ public function getWindowNames()
+ {
+ return $this->driver->getWindowNames();
+ }
+
+ /**
+ * Return the name of the currently active window.
+ *
+ * @return string The name of the current window.
+ */
+ public function getWindowName()
+ {
+ return $this->driver->getWindowName();
+ }
+
+ /**
+ * Reloads current session page.
+ */
+ public function reload()
+ {
+ $this->driver->reload();
+ }
+
+ /**
+ * Moves backward 1 page in history.
+ */
+ public function back()
+ {
+ $this->driver->back();
+ }
+
+ /**
+ * Moves forward 1 page in history.
+ */
+ public function forward()
+ {
+ $this->driver->forward();
+ }
+
+ /**
+ * Switches to specific browser window.
+ *
+ * @param string $name window name (null for switching back to main window)
+ */
+ public function switchToWindow($name = null)
+ {
+ $this->driver->switchToWindow($name);
+ }
+
+ /**
+ * Switches to specific iFrame.
+ *
+ * @param string $name iframe name (null for switching back)
+ */
+ public function switchToIFrame($name = null)
+ {
+ $this->driver->switchToIFrame($name);
+ }
+
+ /**
+ * Execute JS in browser.
+ *
+ * @param string $script javascript
+ */
+ public function executeScript($script)
+ {
+ $this->driver->executeScript($script);
+ }
+
+ /**
+ * Execute JS in browser and return it's response.
+ *
+ * @param string $script javascript
+ *
+ * @return string
+ */
+ public function evaluateScript($script)
+ {
+ return $this->driver->evaluateScript($script);
+ }
+
+ /**
+ * Waits some time or until JS condition turns true.
+ *
+ * @param int $time time in milliseconds
+ * @param string $condition JS condition
+ *
+ * @return bool
+ */
+ public function wait($time, $condition = 'false')
+ {
+ return $this->driver->wait($time, $condition);
+ }
+
+ /**
+ * Set the dimensions of the window.
+ *
+ * @param int $width set the window width, measured in pixels
+ * @param int $height set the window height, measured in pixels
+ * @param string $name window name (null for the main window)
+ */
+ public function resizeWindow($width, $height, $name = null)
+ {
+ $this->driver->resizeWindow($width, $height, $name);
+ }
+
+ /**
+ * Maximize the window if it is not maximized already.
+ *
+ * @param string $name window name (null for the main window)
+ */
+ public function maximizeWindow($name = null)
+ {
+ $this->driver->maximizeWindow($name);
+ }
+}
diff --git a/vendor/behat/mink/src/WebAssert.php b/vendor/behat/mink/src/WebAssert.php
new file mode 100644
index 0000000000000000000000000000000000000000..0f0e6fa71b93ef0a20b967fcb1cb9221b488e044
--- /dev/null
+++ b/vendor/behat/mink/src/WebAssert.php
@@ -0,0 +1,849 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\Mink;
+
+use Behat\Mink\Element\Element;
+use Behat\Mink\Element\ElementInterface;
+use Behat\Mink\Element\NodeElement;
+use Behat\Mink\Element\TraversableElement;
+use Behat\Mink\Exception\ElementNotFoundException;
+use Behat\Mink\Exception\ExpectationException;
+use Behat\Mink\Exception\ResponseTextException;
+use Behat\Mink\Exception\ElementHtmlException;
+use Behat\Mink\Exception\ElementTextException;
+
+/**
+ * Mink web assertions tool.
+ *
+ * @author Konstantin Kudryashov
+ */
+class WebAssert
+{
+ protected $session;
+
+ /**
+ * Initializes assertion engine.
+ *
+ * @param Session $session
+ */
+ public function __construct(Session $session)
+ {
+ $this->session = $session;
+ }
+
+ /**
+ * Checks that current session address is equals to provided one.
+ *
+ * @param string $page
+ *
+ * @throws ExpectationException
+ */
+ public function addressEquals($page)
+ {
+ $expected = $this->cleanUrl($page);
+ $actual = $this->getCurrentUrlPath();
+
+ $this->assert($actual === $expected, sprintf('Current page is "%s", but "%s" expected.', $actual, $expected));
+ }
+
+ /**
+ * Checks that current session address is not equals to provided one.
+ *
+ * @param string $page
+ *
+ * @throws ExpectationException
+ */
+ public function addressNotEquals($page)
+ {
+ $expected = $this->cleanUrl($page);
+ $actual = $this->getCurrentUrlPath();
+
+ $this->assert($actual !== $expected, sprintf('Current page is "%s", but should not be.', $actual));
+ }
+
+ /**
+ * Checks that current session address matches regex.
+ *
+ * @param string $regex
+ *
+ * @throws ExpectationException
+ */
+ public function addressMatches($regex)
+ {
+ $actual = $this->getCurrentUrlPath();
+ $message = sprintf('Current page "%s" does not match the regex "%s".', $actual, $regex);
+
+ $this->assert((bool) preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that specified cookie exists and its value equals to a given one.
+ *
+ * @param string $name cookie name
+ * @param string $value cookie value
+ *
+ * @throws ExpectationException
+ */
+ public function cookieEquals($name, $value)
+ {
+ $this->cookieExists($name);
+
+ $actualValue = $this->session->getCookie($name);
+ $message = sprintf('Cookie "%s" value is "%s", but should be "%s".', $name, $actualValue, $value);
+
+ $this->assert($actualValue == $value, $message);
+ }
+
+ /**
+ * Checks that specified cookie exists.
+ *
+ * @param string $name cookie name
+ *
+ * @throws ExpectationException
+ */
+ public function cookieExists($name)
+ {
+ $message = sprintf('Cookie "%s" is not set, but should be.', $name);
+ $this->assert($this->session->getCookie($name) !== null, $message);
+ }
+
+ /**
+ * Checks that current response code equals to provided one.
+ *
+ * @param int $code
+ *
+ * @throws ExpectationException
+ */
+ public function statusCodeEquals($code)
+ {
+ $actual = $this->session->getStatusCode();
+ $message = sprintf('Current response status code is %d, but %d expected.', $actual, $code);
+
+ $this->assert(intval($code) === intval($actual), $message);
+ }
+
+ /**
+ * Checks that current response code not equals to provided one.
+ *
+ * @param int $code
+ *
+ * @throws ExpectationException
+ */
+ public function statusCodeNotEquals($code)
+ {
+ $actual = $this->session->getStatusCode();
+ $message = sprintf('Current response status code is %d, but should not be.', $actual);
+
+ $this->assert(intval($code) !== intval($actual), $message);
+ }
+
+ /**
+ * Checks that current response header equals value.
+ *
+ * @param string $name
+ * @param string $value
+ *
+ * @throws ExpectationException
+ */
+ public function responseHeaderEquals($name, $value)
+ {
+ $actual = $this->session->getResponseHeader($name);
+ $message = sprintf('Current response header "%s" is "%s", but "%s" expected.', $name, $actual, $value);
+
+ $this->assert($value === $actual, $message);
+ }
+
+ /**
+ * Checks that current response header does not equal value.
+ *
+ * @param string $name
+ * @param string $value
+ *
+ * @throws ExpectationException
+ */
+ public function responseHeaderNotEquals($name, $value)
+ {
+ $actual = $this->session->getResponseHeader($name);
+ $message = sprintf('Current response header "%s" is "%s", but should not be.', $name, $actual, $value);
+
+ $this->assert($value !== $actual, $message);
+ }
+
+ /**
+ * Checks that current response header contains value.
+ *
+ * @param string $name
+ * @param string $value
+ *
+ * @throws ExpectationException
+ */
+ public function responseHeaderContains($name, $value)
+ {
+ $actual = $this->session->getResponseHeader($name);
+ $message = sprintf('The text "%s" was not found anywhere in the "%s" response header.', $value, $name);
+
+ $this->assert(false !== stripos($actual, $value), $message);
+ }
+
+ /**
+ * Checks that current response header does not contain value.
+ *
+ * @param string $name
+ * @param string $value
+ *
+ * @throws ExpectationException
+ */
+ public function responseHeaderNotContains($name, $value)
+ {
+ $actual = $this->session->getResponseHeader($name);
+ $message = sprintf('The text "%s" was found in the "%s" response header, but it should not.', $value, $name);
+
+ $this->assert(false === stripos($actual, $value), $message);
+ }
+
+ /**
+ * Checks that current response header matches regex.
+ *
+ * @param string $name
+ * @param string $regex
+ *
+ * @throws ExpectationException
+ */
+ public function responseHeaderMatches($name, $regex)
+ {
+ $actual = $this->session->getResponseHeader($name);
+ $message = sprintf('The pattern "%s" was not found anywhere in the "%s" response header.', $regex, $name);
+
+ $this->assert((bool) preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that current response header does not match regex.
+ *
+ * @param string $name
+ * @param string $regex
+ *
+ * @throws ExpectationException
+ */
+ public function responseHeaderNotMatches($name, $regex)
+ {
+ $actual = $this->session->getResponseHeader($name);
+ $message = sprintf(
+ 'The pattern "%s" was found in the text of the "%s" response header, but it should not.',
+ $regex,
+ $name
+ );
+
+ $this->assert(!preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that current page contains text.
+ *
+ * @param string $text
+ *
+ * @throws ResponseTextException
+ */
+ public function pageTextContains($text)
+ {
+ $actual = $this->session->getPage()->getText();
+ $actual = preg_replace('/\s+/u', ' ', $actual);
+ $regex = '/'.preg_quote($text, '/').'/ui';
+ $message = sprintf('The text "%s" was not found anywhere in the text of the current page.', $text);
+
+ $this->assertResponseText((bool) preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that current page does not contains text.
+ *
+ * @param string $text
+ *
+ * @throws ResponseTextException
+ */
+ public function pageTextNotContains($text)
+ {
+ $actual = $this->session->getPage()->getText();
+ $actual = preg_replace('/\s+/u', ' ', $actual);
+ $regex = '/'.preg_quote($text, '/').'/ui';
+ $message = sprintf('The text "%s" appears in the text of this page, but it should not.', $text);
+
+ $this->assertResponseText(!preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that current page text matches regex.
+ *
+ * @param string $regex
+ *
+ * @throws ResponseTextException
+ */
+ public function pageTextMatches($regex)
+ {
+ $actual = $this->session->getPage()->getText();
+ $message = sprintf('The pattern %s was not found anywhere in the text of the current page.', $regex);
+
+ $this->assertResponseText((bool) preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that current page text does not matches regex.
+ *
+ * @param string $regex
+ *
+ * @throws ResponseTextException
+ */
+ public function pageTextNotMatches($regex)
+ {
+ $actual = $this->session->getPage()->getText();
+ $message = sprintf('The pattern %s was found in the text of the current page, but it should not.', $regex);
+
+ $this->assertResponseText(!preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that page HTML (response content) contains text.
+ *
+ * @param string $text
+ *
+ * @throws ExpectationException
+ */
+ public function responseContains($text)
+ {
+ $actual = $this->session->getPage()->getContent();
+ $regex = '/'.preg_quote($text, '/').'/ui';
+ $message = sprintf('The string "%s" was not found anywhere in the HTML response of the current page.', $text);
+
+ $this->assert((bool) preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that page HTML (response content) does not contains text.
+ *
+ * @param string $text
+ *
+ * @throws ExpectationException
+ */
+ public function responseNotContains($text)
+ {
+ $actual = $this->session->getPage()->getContent();
+ $regex = '/'.preg_quote($text, '/').'/ui';
+ $message = sprintf('The string "%s" appears in the HTML response of this page, but it should not.', $text);
+
+ $this->assert(!preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that page HTML (response content) matches regex.
+ *
+ * @param string $regex
+ *
+ * @throws ExpectationException
+ */
+ public function responseMatches($regex)
+ {
+ $actual = $this->session->getPage()->getContent();
+ $message = sprintf('The pattern %s was not found anywhere in the HTML response of the page.', $regex);
+
+ $this->assert((bool) preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that page HTML (response content) does not matches regex.
+ *
+ * @param $regex
+ *
+ * @throws ExpectationException
+ */
+ public function responseNotMatches($regex)
+ {
+ $actual = $this->session->getPage()->getContent();
+ $message = sprintf('The pattern %s was found in the HTML response of the page, but it should not.', $regex);
+
+ $this->assert(!preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that there is specified number of specific elements on the page.
+ *
+ * @param string $selectorType element selector type (css, xpath)
+ * @param string|array $selector element selector
+ * @param int $count expected count
+ * @param ElementInterface $container document to check against
+ *
+ * @throws ExpectationException
+ */
+ public function elementsCount($selectorType, $selector, $count, ElementInterface $container = null)
+ {
+ $container = $container ?: $this->session->getPage();
+ $nodes = $container->findAll($selectorType, $selector);
+
+ $message = sprintf(
+ '%d %s found on the page, but should be %d.',
+ count($nodes),
+ $this->getMatchingElementRepresentation($selectorType, $selector, count($nodes) !== 1),
+ $count
+ );
+
+ $this->assert(intval($count) === count($nodes), $message);
+ }
+
+ /**
+ * Checks that specific element exists on the current page.
+ *
+ * @param string $selectorType element selector type (css, xpath)
+ * @param string|array $selector element selector
+ * @param ElementInterface $container document to check against
+ *
+ * @return NodeElement
+ *
+ * @throws ElementNotFoundException
+ */
+ public function elementExists($selectorType, $selector, ElementInterface $container = null)
+ {
+ $container = $container ?: $this->session->getPage();
+ $node = $container->find($selectorType, $selector);
+
+ if (null === $node) {
+ if (is_array($selector)) {
+ $selector = implode(' ', $selector);
+ }
+
+ throw new ElementNotFoundException($this->session->getDriver(), 'element', $selectorType, $selector);
+ }
+
+ return $node;
+ }
+
+ /**
+ * Checks that specific element does not exists on the current page.
+ *
+ * @param string $selectorType element selector type (css, xpath)
+ * @param string|array $selector element selector
+ * @param ElementInterface $container document to check against
+ *
+ * @throws ExpectationException
+ */
+ public function elementNotExists($selectorType, $selector, ElementInterface $container = null)
+ {
+ $container = $container ?: $this->session->getPage();
+ $node = $container->find($selectorType, $selector);
+
+ $message = sprintf(
+ 'An %s appears on this page, but it should not.',
+ $this->getMatchingElementRepresentation($selectorType, $selector)
+ );
+
+ $this->assert(null === $node, $message);
+ }
+
+ /**
+ * Checks that specific element contains text.
+ *
+ * @param string $selectorType element selector type (css, xpath)
+ * @param string|array $selector element selector
+ * @param string $text expected text
+ *
+ * @throws ElementTextException
+ */
+ public function elementTextContains($selectorType, $selector, $text)
+ {
+ $element = $this->elementExists($selectorType, $selector);
+ $actual = $element->getText();
+ $regex = '/'.preg_quote($text, '/').'/ui';
+
+ $message = sprintf(
+ 'The text "%s" was not found in the text of the %s.',
+ $text,
+ $this->getMatchingElementRepresentation($selectorType, $selector)
+ );
+
+ $this->assertElementText((bool) preg_match($regex, $actual), $message, $element);
+ }
+
+ /**
+ * Checks that specific element does not contains text.
+ *
+ * @param string $selectorType element selector type (css, xpath)
+ * @param string|array $selector element selector
+ * @param string $text expected text
+ *
+ * @throws ElementTextException
+ */
+ public function elementTextNotContains($selectorType, $selector, $text)
+ {
+ $element = $this->elementExists($selectorType, $selector);
+ $actual = $element->getText();
+ $regex = '/'.preg_quote($text, '/').'/ui';
+
+ $message = sprintf(
+ 'The text "%s" appears in the text of the %s, but it should not.',
+ $text,
+ $this->getMatchingElementRepresentation($selectorType, $selector)
+ );
+
+ $this->assertElementText(!preg_match($regex, $actual), $message, $element);
+ }
+
+ /**
+ * Checks that specific element contains HTML.
+ *
+ * @param string $selectorType element selector type (css, xpath)
+ * @param string|array $selector element selector
+ * @param string $html expected text
+ *
+ * @throws ElementHtmlException
+ */
+ public function elementContains($selectorType, $selector, $html)
+ {
+ $element = $this->elementExists($selectorType, $selector);
+ $actual = $element->getHtml();
+ $regex = '/'.preg_quote($html, '/').'/ui';
+
+ $message = sprintf(
+ 'The string "%s" was not found in the HTML of the %s.',
+ $html,
+ $this->getMatchingElementRepresentation($selectorType, $selector)
+ );
+
+ $this->assertElement((bool) preg_match($regex, $actual), $message, $element);
+ }
+
+ /**
+ * Checks that specific element does not contains HTML.
+ *
+ * @param string $selectorType element selector type (css, xpath)
+ * @param string|array $selector element selector
+ * @param string $html expected text
+ *
+ * @throws ElementHtmlException
+ */
+ public function elementNotContains($selectorType, $selector, $html)
+ {
+ $element = $this->elementExists($selectorType, $selector);
+ $actual = $element->getHtml();
+ $regex = '/'.preg_quote($html, '/').'/ui';
+
+ $message = sprintf(
+ 'The string "%s" appears in the HTML of the %s, but it should not.',
+ $html,
+ $this->getMatchingElementRepresentation($selectorType, $selector)
+ );
+
+ $this->assertElement(!preg_match($regex, $actual), $message, $element);
+ }
+
+ /**
+ * Checks that an attribute exists in an element.
+ *
+ * @param string $selectorType
+ * @param string|array $selector
+ * @param string $attribute
+ *
+ * @return NodeElement
+ *
+ * @throws ElementHtmlException
+ */
+ public function elementAttributeExists($selectorType, $selector, $attribute)
+ {
+ $element = $this->elementExists($selectorType, $selector);
+
+ $message = sprintf(
+ 'The attribute "%s" was not found in the %s.',
+ $attribute,
+ $this->getMatchingElementRepresentation($selectorType, $selector)
+ );
+
+ $this->assertElement($element->hasAttribute($attribute), $message, $element);
+
+ return $element;
+ }
+
+ /**
+ * Checks that an attribute of a specific elements contains text.
+ *
+ * @param string $selectorType
+ * @param string|array $selector
+ * @param string $attribute
+ * @param string $text
+ *
+ * @throws ElementHtmlException
+ */
+ public function elementAttributeContains($selectorType, $selector, $attribute, $text)
+ {
+ $element = $this->elementAttributeExists($selectorType, $selector, $attribute);
+ $actual = $element->getAttribute($attribute);
+ $regex = '/'.preg_quote($text, '/').'/ui';
+
+ $message = sprintf(
+ 'The text "%s" was not found in the attribute "%s" of the %s.',
+ $text,
+ $attribute,
+ $this->getMatchingElementRepresentation($selectorType, $selector)
+ );
+
+ $this->assertElement((bool) preg_match($regex, $actual), $message, $element);
+ }
+
+ /**
+ * Checks that an attribute of a specific elements does not contain text.
+ *
+ * @param string $selectorType
+ * @param string|array $selector
+ * @param string $attribute
+ * @param string $text
+ *
+ * @throws ElementHtmlException
+ */
+ public function elementAttributeNotContains($selectorType, $selector, $attribute, $text)
+ {
+ $element = $this->elementAttributeExists($selectorType, $selector, $attribute);
+ $actual = $element->getAttribute($attribute);
+ $regex = '/'.preg_quote($text, '/').'/ui';
+
+ $message = sprintf(
+ 'The text "%s" was found in the attribute "%s" of the %s.',
+ $text,
+ $attribute,
+ $this->getMatchingElementRepresentation($selectorType, $selector)
+ );
+
+ $this->assertElement(!preg_match($regex, $actual), $message, $element);
+ }
+
+ /**
+ * Checks that specific field exists on the current page.
+ *
+ * @param string $field field id|name|label|value
+ * @param TraversableElement $container document to check against
+ *
+ * @return NodeElement
+ *
+ * @throws ElementNotFoundException
+ */
+ public function fieldExists($field, TraversableElement $container = null)
+ {
+ $container = $container ?: $this->session->getPage();
+ $node = $container->findField($field);
+
+ if (null === $node) {
+ throw new ElementNotFoundException($this->session->getDriver(), 'form field', 'id|name|label|value', $field);
+ }
+
+ return $node;
+ }
+
+ /**
+ * Checks that specific field does not exists on the current page.
+ *
+ * @param string $field field id|name|label|value
+ * @param TraversableElement $container document to check against
+ *
+ * @throws ExpectationException
+ */
+ public function fieldNotExists($field, TraversableElement $container = null)
+ {
+ $container = $container ?: $this->session->getPage();
+ $node = $container->findField($field);
+
+ $this->assert(null === $node, sprintf('A field "%s" appears on this page, but it should not.', $field));
+ }
+
+ /**
+ * Checks that specific field have provided value.
+ *
+ * @param string $field field id|name|label|value
+ * @param string $value field value
+ * @param TraversableElement $container document to check against
+ *
+ * @throws ExpectationException
+ */
+ public function fieldValueEquals($field, $value, TraversableElement $container = null)
+ {
+ $node = $this->fieldExists($field, $container);
+ $actual = $node->getValue();
+ $regex = '/^'.preg_quote($value, '/').'$/ui';
+
+ $message = sprintf('The field "%s" value is "%s", but "%s" expected.', $field, $actual, $value);
+
+ $this->assert((bool) preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that specific field have provided value.
+ *
+ * @param string $field field id|name|label|value
+ * @param string $value field value
+ * @param TraversableElement $container document to check against
+ *
+ * @throws ExpectationException
+ */
+ public function fieldValueNotEquals($field, $value, TraversableElement $container = null)
+ {
+ $node = $this->fieldExists($field, $container);
+ $actual = $node->getValue();
+ $regex = '/^'.preg_quote($value, '/').'$/ui';
+
+ $message = sprintf('The field "%s" value is "%s", but it should not be.', $field, $actual);
+
+ $this->assert(!preg_match($regex, $actual), $message);
+ }
+
+ /**
+ * Checks that specific checkbox is checked.
+ *
+ * @param string $field field id|name|label|value
+ * @param TraversableElement $container document to check against
+ *
+ * @throws ExpectationException
+ */
+ public function checkboxChecked($field, TraversableElement $container = null)
+ {
+ $node = $this->fieldExists($field, $container);
+
+ $this->assert($node->isChecked(), sprintf('Checkbox "%s" is not checked, but it should be.', $field));
+ }
+
+ /**
+ * Checks that specific checkbox is unchecked.
+ *
+ * @param string $field field id|name|label|value
+ * @param TraversableElement $container document to check against
+ *
+ * @throws ExpectationException
+ */
+ public function checkboxNotChecked($field, TraversableElement $container = null)
+ {
+ $node = $this->fieldExists($field, $container);
+
+ $this->assert(!$node->isChecked(), sprintf('Checkbox "%s" is checked, but it should not be.', $field));
+ }
+
+ /**
+ * Gets current url of the page.
+ *
+ * @return string
+ */
+ protected function getCurrentUrlPath()
+ {
+ return $this->cleanUrl($this->session->getCurrentUrl());
+ }
+
+ /**
+ * Trims scriptname from the URL.
+ *
+ * @param string $url
+ *
+ * @return string
+ */
+ protected function cleanUrl($url)
+ {
+ $parts = parse_url($url);
+ $fragment = empty($parts['fragment']) ? '' : '#'.$parts['fragment'];
+ $path = empty($parts['path']) ? '/' : $parts['path'];
+
+ return preg_replace('/^\/[^\.\/]+\.php\//', '/', $path).$fragment;
+ }
+
+ /**
+ * Asserts a condition.
+ *
+ * @param bool $condition
+ * @param string $message Failure message
+ *
+ * @throws ExpectationException when the condition is not fulfilled
+ */
+ private function assert($condition, $message)
+ {
+ if ($condition) {
+ return;
+ }
+
+ throw new ExpectationException($message, $this->session->getDriver());
+ }
+
+ /**
+ * Asserts a condition involving the response text.
+ *
+ * @param bool $condition
+ * @param string $message Failure message
+ *
+ * @throws ResponseTextException when the condition is not fulfilled
+ */
+ private function assertResponseText($condition, $message)
+ {
+ if ($condition) {
+ return;
+ }
+
+ throw new ResponseTextException($message, $this->session->getDriver());
+ }
+
+ /**
+ * Asserts a condition on an element.
+ *
+ * @param bool $condition
+ * @param string $message Failure message
+ * @param Element $element
+ *
+ * @throws ElementHtmlException when the condition is not fulfilled
+ */
+ private function assertElement($condition, $message, Element $element)
+ {
+ if ($condition) {
+ return;
+ }
+
+ throw new ElementHtmlException($message, $this->session->getDriver(), $element);
+ }
+
+ /**
+ * Asserts a condition involving the text of an element.
+ *
+ * @param bool $condition
+ * @param string $message Failure message
+ * @param Element $element
+ *
+ * @throws ElementTextException when the condition is not fulfilled
+ */
+ private function assertElementText($condition, $message, Element $element)
+ {
+ if ($condition) {
+ return;
+ }
+
+ throw new ElementTextException($message, $this->session->getDriver(), $element);
+ }
+
+ /**
+ * @param string $selectorType
+ * @param string|array $selector
+ * @param bool $plural
+ *
+ * @return string
+ */
+ private function getMatchingElementRepresentation($selectorType, $selector, $plural = false)
+ {
+ $pluralization = $plural ? 's' : '';
+
+ if (in_array($selectorType, array('named', 'named_exact', 'named_partial'))
+ && is_array($selector) && 2 === count($selector)
+ ) {
+ return sprintf('%s%s matching locator "%s"', $selector[0], $pluralization, $selector[1]);
+ }
+
+ if (is_array($selector)) {
+ $selector = implode(' ', $selector);
+ }
+
+ return sprintf('element%s matching %s "%s"', $pluralization, $selectorType, $selector);
+ }
+}
diff --git a/vendor/bin/phpunit b/vendor/bin/phpunit
new file mode 120000
index 0000000000000000000000000000000000000000..2c48930310589e25e38ac71f5439db0eb1887daf
--- /dev/null
+++ b/vendor/bin/phpunit
@@ -0,0 +1 @@
+../phpunit/phpunit/phpunit
\ No newline at end of file
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
new file mode 100644
index 0000000000000000000000000000000000000000..990cfdcfa2296c0246e88b9485dfd66fe0ea17e7
--- /dev/null
+++ b/vendor/composer/ClassLoader.php
@@ -0,0 +1,413 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier
+ * @author Jordi Boggiano
+ * @see http://www.php-fig.org/psr/psr-0/
+ * @see http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+ // PSR-4
+ private $prefixLengthsPsr4 = array();
+ private $prefixDirsPsr4 = array();
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ private $prefixesPsr0 = array();
+ private $fallbackDirsPsr0 = array();
+
+ private $useIncludePath = false;
+ private $classMap = array();
+
+ private $classMapAuthoritative = false;
+
+ public function getPrefixes()
+ {
+ if (!empty($this->prefixesPsr0)) {
+ return call_user_func_array('array_merge', $this->prefixesPsr0);
+ }
+
+ return array();
+ }
+
+ public function getPrefixesPsr4()
+ {
+ return $this->prefixDirsPsr4;
+ }
+
+ public function getFallbackDirs()
+ {
+ return $this->fallbackDirsPsr0;
+ }
+
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix, either
+ * appending or prepending to the ones previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 root directories
+ * @param bool $prepend Whether to prepend the directories
+ */
+ public function add($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ if ($prepend) {
+ $this->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace, either
+ * appending or prepending to the ones previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-0 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function addPsr4($prefix, $paths, $prepend = false)
+ {
+ if (!$prefix) {
+ // Register directories for the root namespace.
+ if ($prepend) {
+ $this->fallbackDirsPsr4 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr4
+ );
+ } else {
+ $this->fallbackDirsPsr4 = array_merge(
+ $this->fallbackDirsPsr4,
+ (array) $paths
+ );
+ }
+ } elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+ // Register directories for a new namespace.
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ } elseif ($prepend) {
+ // Prepend directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixDirsPsr4[$prefix]
+ );
+ } else {
+ // Append directories for an already registered namespace.
+ $this->prefixDirsPsr4[$prefix] = array_merge(
+ $this->prefixDirsPsr4[$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * Registers a set of PSR-0 directories for a given prefix,
+ * replacing any others previously set for this prefix.
+ *
+ * @param string $prefix The prefix
+ * @param array|string $paths The PSR-0 base directories
+ */
+ public function set($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Registers a set of PSR-4 directories for a given namespace,
+ * replacing any others previously set for this namespace.
+ *
+ * @param string $prefix The prefix/namespace, with trailing '\\'
+ * @param array|string $paths The PSR-4 base directories
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setPsr4($prefix, $paths)
+ {
+ if (!$prefix) {
+ $this->fallbackDirsPsr4 = (array) $paths;
+ } else {
+ $length = strlen($prefix);
+ if ('\\' !== $prefix[$length - 1]) {
+ throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator.");
+ }
+ $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+ $this->prefixDirsPsr4[$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Turns off searching the prefix and fallback directories for classes
+ * that have not been registered with the class map.
+ *
+ * @param bool $classMapAuthoritative
+ */
+ public function setClassMapAuthoritative($classMapAuthoritative)
+ {
+ $this->classMapAuthoritative = $classMapAuthoritative;
+ }
+
+ /**
+ * Should class lookup fail if not found in the current class map?
+ *
+ * @return bool
+ */
+ public function isClassMapAuthoritative()
+ {
+ return $this->classMapAuthoritative;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ public function findFile($class)
+ {
+ // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
+ if ('\\' == $class[0]) {
+ $class = substr($class, 1);
+ }
+
+ // class map lookup
+ if (isset($this->classMap[$class])) {
+ return $this->classMap[$class];
+ }
+ if ($this->classMapAuthoritative) {
+ return false;
+ }
+
+ $file = $this->findFileWithExtension($class, '.php');
+
+ // Search for Hack files if we are running on HHVM
+ if ($file === null && defined('HHVM_VERSION')) {
+ $file = $this->findFileWithExtension($class, '.hh');
+ }
+
+ if ($file === null) {
+ // Remember that this class does not exist.
+ return $this->classMap[$class] = false;
+ }
+
+ return $file;
+ }
+
+ private function findFileWithExtension($class, $ext)
+ {
+ // PSR-4 lookup
+ $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext;
+
+ $first = $class[0];
+ if (isset($this->prefixLengthsPsr4[$first])) {
+ foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-4 fallback dirs
+ foreach ($this->fallbackDirsPsr4 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 lookup
+ if (false !== $pos = strrpos($class, '\\')) {
+ // namespaced class name
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ if (isset($this->prefixesPsr0[$first])) {
+ foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+ if (0 === strpos($class, $prefix)) {
+ foreach ($dirs as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..c8d57af8b2788b6908cbfabc50c35970f40d7cc6
--- /dev/null
+++ b/vendor/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) 2015 Nils Adermann, Jordi Boggiano
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+
diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php
new file mode 100644
index 0000000000000000000000000000000000000000..fac9eabc1b9d437aac5bb81257e3d87f2bd04887
--- /dev/null
+++ b/vendor/composer/autoload_classmap.php
@@ -0,0 +1,458 @@
+ $baseDir . '/core/lib/Drupal/Component/Utility/Timer.php',
+ 'Drupal\\Component\\Utility\\Unicode' => $baseDir . '/core/lib/Drupal/Component/Utility/Unicode.php',
+ 'Drupal\\Core\\Database\\Database' => $baseDir . '/core/lib/Drupal/Core/Database/Database.php',
+ 'Drupal\\Core\\DrupalKernel' => $baseDir . '/core/lib/Drupal/Core/DrupalKernel.php',
+ 'Drupal\\Core\\DrupalKernelInterface' => $baseDir . '/core/lib/Drupal/Core/DrupalKernelInterface.php',
+ 'Drupal\\Core\\Site\\Settings' => $baseDir . '/core/lib/Drupal/Core/Site/Settings.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',
+ 'PHPUnit_Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php',
+ 'PHPUnit_Extensions_GroupTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php',
+ 'PHPUnit_Extensions_PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestCase.php',
+ 'PHPUnit_Extensions_PhptTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php',
+ 'PHPUnit_Extensions_RepeatedTest' => $vendorDir . '/phpunit/phpunit/src/Extensions/RepeatedTest.php',
+ 'PHPUnit_Extensions_TestDecorator' => $vendorDir . '/phpunit/phpunit/src/Extensions/TestDecorator.php',
+ 'PHPUnit_Extensions_TicketListener' => $vendorDir . '/phpunit/phpunit/src/Extensions/TicketListener.php',
+ 'PHPUnit_Framework_Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php',
+ 'PHPUnit_Framework_AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/AssertionFailedError.php',
+ 'PHPUnit_Framework_BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/BaseTestListener.php',
+ 'PHPUnit_Framework_CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/CodeCoverageException.php',
+ 'PHPUnit_Framework_Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint.php',
+ 'PHPUnit_Framework_Constraint_And' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/And.php',
+ 'PHPUnit_Framework_Constraint_ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php',
+ 'PHPUnit_Framework_Constraint_ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php',
+ 'PHPUnit_Framework_Constraint_Attribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php',
+ 'PHPUnit_Framework_Constraint_Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php',
+ 'PHPUnit_Framework_Constraint_ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php',
+ 'PHPUnit_Framework_Constraint_Composite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Composite.php',
+ 'PHPUnit_Framework_Constraint_Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php',
+ 'PHPUnit_Framework_Constraint_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php',
+ 'PHPUnit_Framework_Constraint_ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php',
+ 'PHPUnit_Framework_Constraint_FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php',
+ 'PHPUnit_Framework_Constraint_GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php',
+ 'PHPUnit_Framework_Constraint_IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php',
+ 'PHPUnit_Framework_Constraint_IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php',
+ 'PHPUnit_Framework_Constraint_IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php',
+ 'PHPUnit_Framework_Constraint_IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php',
+ 'PHPUnit_Framework_Constraint_IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php',
+ 'PHPUnit_Framework_Constraint_IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php',
+ 'PHPUnit_Framework_Constraint_IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php',
+ 'PHPUnit_Framework_Constraint_IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php',
+ 'PHPUnit_Framework_Constraint_IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php',
+ 'PHPUnit_Framework_Constraint_IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php',
+ 'PHPUnit_Framework_Constraint_LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php',
+ 'PHPUnit_Framework_Constraint_Not' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Not.php',
+ 'PHPUnit_Framework_Constraint_ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_Or' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Or.php',
+ 'PHPUnit_Framework_Constraint_PCREMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php',
+ 'PHPUnit_Framework_Constraint_SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php',
+ 'PHPUnit_Framework_Constraint_StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php',
+ 'PHPUnit_Framework_Constraint_StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php',
+ 'PHPUnit_Framework_Constraint_StringMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php',
+ 'PHPUnit_Framework_Constraint_StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php',
+ 'PHPUnit_Framework_Constraint_TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php',
+ 'PHPUnit_Framework_Constraint_TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php',
+ 'PHPUnit_Framework_Constraint_Xor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Xor.php',
+ 'PHPUnit_Framework_Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error.php',
+ 'PHPUnit_Framework_Error_Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php',
+ 'PHPUnit_Framework_Error_Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php',
+ 'PHPUnit_Framework_Error_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php',
+ 'PHPUnit_Framework_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception.php',
+ 'PHPUnit_Framework_ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php',
+ 'PHPUnit_Framework_ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php',
+ 'PHPUnit_Framework_IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php',
+ 'PHPUnit_Framework_IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php',
+ 'PHPUnit_Framework_IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestError.php',
+ 'PHPUnit_Framework_InvalidCoversTargetError' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetError.php',
+ 'PHPUnit_Framework_InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php',
+ 'PHPUnit_Framework_MockObject_BadMethodCallException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php',
+ 'PHPUnit_Framework_MockObject_Builder_Identity' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php',
+ 'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Builder_Match' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php',
+ 'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Namespace' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php',
+ 'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php',
+ 'PHPUnit_Framework_MockObject_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php',
+ 'PHPUnit_Framework_MockObject_Generator' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php',
+ 'PHPUnit_Framework_MockObject_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php',
+ 'PHPUnit_Framework_MockObject_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Object' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Static' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php',
+ 'PHPUnit_Framework_MockObject_Invokable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php',
+ 'PHPUnit_Framework_MockObject_Matcher' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php',
+ 'PHPUnit_Framework_MockObject_Matcher_MethodName' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Parameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php',
+ 'PHPUnit_Framework_MockObject_MockBuilder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php',
+ 'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php',
+ 'PHPUnit_Framework_MockObject_RuntimeException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php',
+ 'PHPUnit_Framework_MockObject_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php',
+ 'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php',
+ 'PHPUnit_Framework_MockObject_Stub_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php',
+ 'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php',
+ 'PHPUnit_Framework_MockObject_Stub_Return' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php',
+ 'PHPUnit_Framework_MockObject_Verifiable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php',
+ 'PHPUnit_Framework_OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/OutputError.php',
+ 'PHPUnit_Framework_RiskyTest' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTest.php',
+ 'PHPUnit_Framework_RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTestError.php',
+ 'PHPUnit_Framework_SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php',
+ 'PHPUnit_Framework_SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php',
+ 'PHPUnit_Framework_SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php',
+ 'PHPUnit_Framework_SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestError.php',
+ 'PHPUnit_Framework_SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php',
+ 'PHPUnit_Framework_SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/SyntheticError.php',
+ 'PHPUnit_Framework_Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php',
+ 'PHPUnit_Framework_TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php',
+ 'PHPUnit_Framework_TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php',
+ 'PHPUnit_Framework_TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php',
+ 'PHPUnit_Framework_TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php',
+ 'PHPUnit_Framework_TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php',
+ 'PHPUnit_Framework_TestSuite_DataProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php',
+ 'PHPUnit_Framework_UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php',
+ 'PHPUnit_Framework_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Warning.php',
+ 'PHPUnit_Runner_BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php',
+ 'PHPUnit_Runner_Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php',
+ 'PHPUnit_Runner_Filter_Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php',
+ 'PHPUnit_Runner_Filter_GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group.php',
+ 'PHPUnit_Runner_Filter_Group_Exclude' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php',
+ 'PHPUnit_Runner_Filter_Group_Include' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php',
+ 'PHPUnit_Runner_Filter_Test' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Test.php',
+ 'PHPUnit_Runner_StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php',
+ 'PHPUnit_Runner_TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php',
+ 'PHPUnit_Runner_Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php',
+ 'PHPUnit_TextUI_Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php',
+ 'PHPUnit_TextUI_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php',
+ 'PHPUnit_TextUI_TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php',
+ 'PHPUnit_Util_Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php',
+ 'PHPUnit_Util_Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php',
+ 'PHPUnit_Util_ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php',
+ 'PHPUnit_Util_Fileloader' => $vendorDir . '/phpunit/phpunit/src/Util/Fileloader.php',
+ 'PHPUnit_Util_Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php',
+ 'PHPUnit_Util_Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php',
+ 'PHPUnit_Util_Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php',
+ 'PHPUnit_Util_GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php',
+ 'PHPUnit_Util_InvalidArgumentHelper' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php',
+ 'PHPUnit_Util_Log_JSON' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JSON.php',
+ 'PHPUnit_Util_Log_JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php',
+ 'PHPUnit_Util_Log_TAP' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TAP.php',
+ 'PHPUnit_Util_PHP' => $vendorDir . '/phpunit/phpunit/src/Util/PHP.php',
+ 'PHPUnit_Util_PHP_Default' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Default.php',
+ 'PHPUnit_Util_PHP_Windows' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Windows.php',
+ 'PHPUnit_Util_Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php',
+ 'PHPUnit_Util_Regex' => $vendorDir . '/phpunit/phpunit/src/Util/Regex.php',
+ 'PHPUnit_Util_String' => $vendorDir . '/phpunit/phpunit/src/Util/String.php',
+ 'PHPUnit_Util_Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php',
+ 'PHPUnit_Util_TestDox_NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_Text' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php',
+ 'PHPUnit_Util_TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Util/TestSuiteIterator.php',
+ 'PHPUnit_Util_Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php',
+ 'PHPUnit_Util_XML' => $vendorDir . '/phpunit/phpunit/src/Util/XML.php',
+ 'PHP_CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php',
+ 'PHP_CodeCoverage_Driver' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver.php',
+ 'PHP_CodeCoverage_Driver_HHVM' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/HHVM.php',
+ 'PHP_CodeCoverage_Driver_PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php',
+ 'PHP_CodeCoverage_Driver_Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/Xdebug.php',
+ 'PHP_CodeCoverage_Exception' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Exception.php',
+ 'PHP_CodeCoverage_Exception_UnintentionallyCoveredCode' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php',
+ 'PHP_CodeCoverage_Filter' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Filter.php',
+ 'PHP_CodeCoverage_Report_Clover' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php',
+ 'PHP_CodeCoverage_Report_Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Crap4j.php',
+ 'PHP_CodeCoverage_Report_Factory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php',
+ 'PHP_CodeCoverage_Report_HTML' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php',
+ 'PHP_CodeCoverage_Report_HTML_Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.php',
+ 'PHP_CodeCoverage_Report_HTML_Renderer_Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php',
+ 'PHP_CodeCoverage_Report_HTML_Renderer_Directory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Directory.php',
+ 'PHP_CodeCoverage_Report_HTML_Renderer_File' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php',
+ 'PHP_CodeCoverage_Report_Node' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node.php',
+ 'PHP_CodeCoverage_Report_Node_Directory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Directory.php',
+ 'PHP_CodeCoverage_Report_Node_File' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/File.php',
+ 'PHP_CodeCoverage_Report_Node_Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Iterator.php',
+ 'PHP_CodeCoverage_Report_PHP' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/PHP.php',
+ 'PHP_CodeCoverage_Report_Text' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Text.php',
+ 'PHP_CodeCoverage_Report_XML' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML.php',
+ 'PHP_CodeCoverage_Report_XML_Directory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Directory.php',
+ 'PHP_CodeCoverage_Report_XML_File' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File.php',
+ 'PHP_CodeCoverage_Report_XML_File_Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Coverage.php',
+ 'PHP_CodeCoverage_Report_XML_File_Method' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Method.php',
+ 'PHP_CodeCoverage_Report_XML_File_Report' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Report.php',
+ 'PHP_CodeCoverage_Report_XML_File_Unit' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Unit.php',
+ 'PHP_CodeCoverage_Report_XML_Node' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Node.php',
+ 'PHP_CodeCoverage_Report_XML_Project' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Project.php',
+ 'PHP_CodeCoverage_Report_XML_Tests' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Tests.php',
+ 'PHP_CodeCoverage_Report_XML_Totals' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Totals.php',
+ 'PHP_CodeCoverage_Util' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Util.php',
+ 'PHP_CodeCoverage_Util_InvalidArgumentHelper' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Util/InvalidArgumentHelper.php',
+ 'PHP_Timer' => $vendorDir . '/phpunit/php-timer/src/Timer.php',
+ 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ASYNC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AWAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COALESCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMPILER_HALT_OFFSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENUM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUALS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_JOIN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_CP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_OP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ONUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SHAPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SPACESHIP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php',
+ 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php',
+ 'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHERE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_ATTRIBUTE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CHILDREN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_REQUIRED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TEXT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD_FROM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php',
+ 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php',
+ 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php',
+ 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php',
+ 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php',
+ 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php',
+ 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php',
+ 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php',
+ 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php',
+ 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php',
+ 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php',
+ 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php',
+ 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php',
+ 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php',
+ 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php',
+ 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php',
+ 'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => $vendorDir . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php',
+ 'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php',
+ 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php',
+ 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php',
+ 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php',
+ 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php',
+ 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php',
+ 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/Exception.php',
+ 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php',
+ 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/RuntimeException.php',
+ 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php',
+ 'SebastianBergmann\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php',
+ 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php',
+ 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php',
+ 'SessionHandlerInterface' => $vendorDir . '/symfony/http-foundation/Resources/stubs/SessionHandlerInterface.php',
+ 'Symfony\\Component\\HttpFoundation\\FileBag' => $vendorDir . '/symfony/http-foundation/FileBag.php',
+ 'Symfony\\Component\\HttpFoundation\\HeaderBag' => $vendorDir . '/symfony/http-foundation/HeaderBag.php',
+ 'Symfony\\Component\\HttpFoundation\\ParameterBag' => $vendorDir . '/symfony/http-foundation/ParameterBag.php',
+ 'Symfony\\Component\\HttpFoundation\\Request' => $vendorDir . '/symfony/http-foundation/Request.php',
+ 'Symfony\\Component\\HttpFoundation\\ServerBag' => $vendorDir . '/symfony/http-foundation/ServerBag.php',
+ 'Symfony\\Component\\HttpKernel\\HttpKernel' => $vendorDir . '/symfony/http-kernel/HttpKernel.php',
+ 'Symfony\\Component\\HttpKernel\\HttpKernelInterface' => $vendorDir . '/symfony/http-kernel/HttpKernelInterface.php',
+ 'Symfony\\Component\\HttpKernel\\TerminableInterface' => $vendorDir . '/symfony/http-kernel/TerminableInterface.php',
+ 'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php',
+);
diff --git a/vendor/composer/autoload_files.php b/vendor/composer/autoload_files.php
new file mode 100644
index 0000000000000000000000000000000000000000..9a2fb754bb8cf04595d013a14291f8ffe16ebe71
--- /dev/null
+++ b/vendor/composer/autoload_files.php
@@ -0,0 +1,14 @@
+ $vendorDir . '/guzzlehttp/promises/src/functions_include.php',
+ 'a0edc8309cc5e1d60e3047b5df6b7052' => $vendorDir . '/guzzlehttp/psr7/src/functions_include.php',
+ '37a3dc5111fe8f707ab4c132ef1dbc62' => $vendorDir . '/guzzlehttp/guzzle/src/functions_include.php',
+ '5255c38a0faeba867671b61dfda6d864' => $vendorDir . '/paragonie/random_compat/lib/random.php',
+ '454414594637b9dd94a19af83f56f1a2' => $baseDir . '/core/lib/Drupal.php',
+);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
new file mode 100644
index 0000000000000000000000000000000000000000..bb43043a3119e862075754500aaeaa2c7ad34efc
--- /dev/null
+++ b/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,24 @@
+ array($vendorDir . '/phpdocumentor/reflection-docblock/src'),
+ 'org\\bovigo\\vfs\\' => array($vendorDir . '/mikey179/vfsStream/src/main/php'),
+ 'Twig_' => array($vendorDir . '/twig/twig/lib'),
+ 'Stack' => array($vendorDir . '/stack/builder/src'),
+ 'Psr\\Log\\' => array($vendorDir . '/psr/log'),
+ 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'),
+ 'Egulias\\' => array($vendorDir . '/egulias/email-validator/src'),
+ 'EasyRdf_' => array($vendorDir . '/easyrdf/easyrdf/lib'),
+ 'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib'),
+ 'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib'),
+ 'Doctrine\\Common\\Collections\\' => array($vendorDir . '/doctrine/collections/lib'),
+ 'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib'),
+ 'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib'),
+ 'Doctrine\\Common\\' => array($vendorDir . '/doctrine/common/lib'),
+ 'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src'),
+);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
new file mode 100644
index 0000000000000000000000000000000000000000..030a0de768aaf8b3ee5e11b22cc34faa49e16141
--- /dev/null
+++ b/vendor/composer/autoload_psr4.php
@@ -0,0 +1,49 @@
+ array($vendorDir . '/jcalderonzumba/mink-phantomjs-driver/src'),
+ 'Zumba\\GastonJS\\' => array($vendorDir . '/jcalderonzumba/gastonjs/src'),
+ 'Zend\\Stdlib\\' => array($vendorDir . '/zendframework/zend-stdlib/src'),
+ 'Zend\\Hydrator\\' => array($vendorDir . '/zendframework/zend-hydrator/src'),
+ 'Zend\\Feed\\' => array($vendorDir . '/zendframework/zend-feed/src'),
+ 'Zend\\Escaper\\' => array($vendorDir . '/zendframework/zend-escaper/src'),
+ 'Zend\\Diactoros\\' => array($vendorDir . '/zendframework/zend-diactoros/src'),
+ 'Wikimedia\\Composer\\' => array($vendorDir . '/wikimedia/composer-merge-plugin/src'),
+ 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
+ 'Symfony\\Component\\Validator\\' => array($vendorDir . '/symfony/validator'),
+ 'Symfony\\Component\\Translation\\' => array($vendorDir . '/symfony/translation'),
+ 'Symfony\\Component\\Serializer\\' => array($vendorDir . '/symfony/serializer'),
+ 'Symfony\\Component\\Routing\\' => array($vendorDir . '/symfony/routing'),
+ 'Symfony\\Component\\Process\\' => array($vendorDir . '/symfony/process'),
+ 'Symfony\\Component\\HttpKernel\\' => array($vendorDir . '/symfony/http-kernel'),
+ 'Symfony\\Component\\HttpFoundation\\' => array($vendorDir . '/symfony/http-foundation'),
+ 'Symfony\\Component\\EventDispatcher\\' => array($vendorDir . '/symfony/event-dispatcher'),
+ 'Symfony\\Component\\DomCrawler\\' => array($vendorDir . '/symfony/dom-crawler'),
+ 'Symfony\\Component\\DependencyInjection\\' => array($vendorDir . '/symfony/dependency-injection'),
+ 'Symfony\\Component\\Debug\\' => array($vendorDir . '/symfony/debug'),
+ 'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'),
+ 'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
+ 'Symfony\\Component\\ClassLoader\\' => array($vendorDir . '/symfony/class-loader'),
+ 'Symfony\\Component\\BrowserKit\\' => array($vendorDir . '/symfony/browser-kit'),
+ 'Symfony\\Cmf\\Component\\Routing\\' => array($vendorDir . '/symfony-cmf/routing'),
+ 'Symfony\\Bridge\\PsrHttpMessage\\' => array($vendorDir . '/symfony/psr-http-message-bridge'),
+ 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
+ 'Masterminds\\' => array($vendorDir . '/masterminds/html5/src'),
+ 'GuzzleHttp\\Psr7\\' => array($vendorDir . '/guzzlehttp/psr7/src'),
+ 'GuzzleHttp\\Promise\\' => array($vendorDir . '/guzzlehttp/promises/src'),
+ 'GuzzleHttp\\' => array($vendorDir . '/guzzlehttp/guzzle/src'),
+ 'Goutte\\' => array($vendorDir . '/fabpot/goutte/Goutte'),
+ 'Drupal\\Driver\\' => array($baseDir . '/drivers/lib/Drupal/Driver'),
+ 'Drupal\\Core\\Composer\\' => array($baseDir . '/core/lib/Drupal/Core/Composer'),
+ 'Drupal\\Core\\' => array($baseDir . '/core/lib/Drupal/Core'),
+ 'Drupal\\Component\\' => array($baseDir . '/core/lib/Drupal/Component'),
+ 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
+ 'Composer\\Semver\\' => array($vendorDir . '/composer/semver/src'),
+ 'Behat\\Mink\\Driver\\' => array($vendorDir . '/behat/mink-browserkit-driver/src', $vendorDir . '/behat/mink-goutte-driver/src'),
+ 'Behat\\Mink\\' => array($vendorDir . '/behat/mink/src'),
+);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
new file mode 100644
index 0000000000000000000000000000000000000000..4303fced9f301cb55f6cce257486f987dd939c56
--- /dev/null
+++ b/vendor/composer/autoload_real.php
@@ -0,0 +1,59 @@
+ $path) {
+ $loader->set($namespace, $path);
+ }
+
+ $map = require __DIR__ . '/autoload_psr4.php';
+ foreach ($map as $namespace => $path) {
+ $loader->setPsr4($namespace, $path);
+ }
+
+ $classMap = require __DIR__ . '/autoload_classmap.php';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+
+ $loader->register(true);
+
+ $includeFiles = require __DIR__ . '/autoload_files.php';
+ foreach ($includeFiles as $fileIdentifier => $file) {
+ composerRequireDrupal8($fileIdentifier, $file);
+ }
+
+ return $loader;
+ }
+}
+
+function composerRequireDrupal8($fileIdentifier, $file)
+{
+ if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
+ require $file;
+
+ $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
+ }
+}
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
new file mode 100644
index 0000000000000000000000000000000000000000..ac6e43f1b3a166ad1864c802302e9c98bdeca032
--- /dev/null
+++ b/vendor/composer/installed.json
@@ -0,0 +1,3911 @@
+[
+ {
+ "name": "composer/installers",
+ "version": "v1.0.21",
+ "version_normalized": "1.0.21.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/installers.git",
+ "reference": "d64e23fce42a4063d63262b19b8e7c0f3b5e4c45"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/installers/zipball/d64e23fce42a4063d63262b19b8e7c0f3b5e4c45",
+ "reference": "d64e23fce42a4063d63262b19b8e7c0f3b5e4c45",
+ "shasum": ""
+ },
+ "replace": {
+ "roundcube/plugin-installer": "*",
+ "shama/baton": "*"
+ },
+ "require-dev": {
+ "composer/composer": "1.0.*@dev",
+ "phpunit/phpunit": "4.1.*"
+ },
+ "time": "2015-02-18 17:17:01",
+ "type": "composer-installer",
+ "extra": {
+ "class": "Composer\\Installers\\Installer",
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Composer\\Installers\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kyle Robinson Young",
+ "email": "kyle@dontkry.com",
+ "homepage": "https://github.com/shama"
+ }
+ ],
+ "description": "A multi-framework Composer library installer",
+ "homepage": "http://composer.github.com/installers/",
+ "keywords": [
+ "Craft",
+ "Dolibarr",
+ "Hurad",
+ "MODX Evo",
+ "OXID",
+ "SMF",
+ "Thelia",
+ "WolfCMS",
+ "agl",
+ "aimeos",
+ "annotatecms",
+ "bitrix",
+ "cakephp",
+ "chef",
+ "codeigniter",
+ "concrete5",
+ "croogo",
+ "dokuwiki",
+ "drupal",
+ "elgg",
+ "fuelphp",
+ "grav",
+ "installer",
+ "joomla",
+ "kohana",
+ "laravel",
+ "lithium",
+ "magento",
+ "mako",
+ "mediawiki",
+ "modulework",
+ "moodle",
+ "phpbb",
+ "piwik",
+ "ppi",
+ "puppet",
+ "roundcube",
+ "shopware",
+ "silverstripe",
+ "symfony",
+ "typo3",
+ "wordpress",
+ "zend",
+ "zikula"
+ ]
+ },
+ {
+ "name": "composer/semver",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/semver.git",
+ "reference": "d0e1ccc6d44ab318b758d709e19176037da6b1ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/semver/zipball/d0e1ccc6d44ab318b758d709e19176037da6b1ba",
+ "reference": "d0e1ccc6d44ab318b758d709e19176037da6b1ba",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.5",
+ "phpunit/phpunit-mock-objects": "~2.3"
+ },
+ "time": "2015-09-21 09:42:36",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com"
+ },
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "keywords": [
+ "semantic",
+ "semver",
+ "validation",
+ "versioning"
+ ]
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "v1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c",
+ "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "time": "2014-09-09 13:34:57",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Lexer\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "lexer",
+ "parser"
+ ]
+ },
+ {
+ "name": "doctrine/inflector",
+ "version": "v1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/0bcb2e79d8571787f18b7eb036ed3d004908e604",
+ "reference": "0bcb2e79d8571787f18b7eb036ed3d004908e604",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*"
+ },
+ "time": "2014-12-20 21:24:13",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Inflector\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Common String Manipulations with regard to casing and singular/plural rules.",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "inflection",
+ "pluralize",
+ "singularize",
+ "string"
+ ]
+ },
+ {
+ "name": "doctrine/collections",
+ "version": "v1.3.0",
+ "version_normalized": "1.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/collections.git",
+ "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/collections/zipball/6c1e4eef75f310ea1b3e30945e9f06e652128b8a",
+ "reference": "6c1e4eef75f310ea1b3e30945e9f06e652128b8a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "time": "2015-04-14 22:21:58",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Collections\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Collections Abstraction library",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "array",
+ "collections",
+ "iterator"
+ ]
+ },
+ {
+ "name": "doctrine/cache",
+ "version": "v1.4.2",
+ "version_normalized": "1.4.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/cache.git",
+ "reference": "8c434000f420ade76a07c64cbe08ca47e5c101ca"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/cache/zipball/8c434000f420ade76a07c64cbe08ca47e5c101ca",
+ "reference": "8c434000f420ade76a07c64cbe08ca47e5c101ca",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "conflict": {
+ "doctrine/common": ">2.2,<2.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": ">=3.7",
+ "predis/predis": "~1.0",
+ "satooshi/php-coveralls": "~0.6"
+ },
+ "time": "2015-08-31 12:36:41",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.5.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Cache\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Caching library offering an object-oriented API for many cache backends",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "cache",
+ "caching"
+ ]
+ },
+ {
+ "name": "doctrine/annotations",
+ "version": "v1.2.7",
+ "version_normalized": "1.2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535",
+ "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "1.*",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "doctrine/cache": "1.*",
+ "phpunit/phpunit": "4.*"
+ },
+ "time": "2015-08-31 12:32:49",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Annotations\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Docblock Annotations Parser",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "parser"
+ ]
+ },
+ {
+ "name": "doctrine/common",
+ "version": "v2.5.1",
+ "version_normalized": "2.5.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/common.git",
+ "reference": "0009b8f0d4a917aabc971fb089eba80e872f83f9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/common/zipball/0009b8f0d4a917aabc971fb089eba80e872f83f9",
+ "reference": "0009b8f0d4a917aabc971fb089eba80e872f83f9",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/annotations": "1.*",
+ "doctrine/cache": "1.*",
+ "doctrine/collections": "1.*",
+ "doctrine/inflector": "1.*",
+ "doctrine/lexer": "1.*",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~3.7"
+ },
+ "time": "2015-08-31 13:00:22",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.6.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Common Library for Doctrine projects",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "annotations",
+ "collections",
+ "eventmanager",
+ "persistence",
+ "spl"
+ ]
+ },
+ {
+ "name": "easyrdf/easyrdf",
+ "version": "0.9.1",
+ "version_normalized": "0.9.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/njh/easyrdf.git",
+ "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/njh/easyrdf/zipball/acd09dfe0555fbcfa254291e433c45fdd4652566",
+ "reference": "acd09dfe0555fbcfa254291e433c45fdd4652566",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "ext-pcre": "*",
+ "php": ">=5.2.8"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~3.5",
+ "sami/sami": "~1.4",
+ "squizlabs/php_codesniffer": "~1.4.3"
+ },
+ "suggest": {
+ "ml/json-ld": "~1.0"
+ },
+ "time": "2015-02-27 09:45:49",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "EasyRdf_": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nicholas Humfrey",
+ "email": "njh@aelius.com",
+ "homepage": "http://www.aelius.com/njh/",
+ "role": "Developer"
+ },
+ {
+ "name": "Alexey Zakhlestin",
+ "email": "indeyets@gmail.com",
+ "role": "Developer"
+ }
+ ],
+ "description": "EasyRdf is a PHP library designed to make it easy to consume and produce RDF.",
+ "homepage": "http://www.easyrdf.org/",
+ "keywords": [
+ "Linked Data",
+ "RDF",
+ "Semantic Web",
+ "Turtle",
+ "rdfa",
+ "sparql"
+ ]
+ },
+ {
+ "name": "egulias/email-validator",
+ "version": "1.2.9",
+ "version_normalized": "1.2.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/egulias/EmailValidator.git",
+ "reference": "af864423f50ea59f96c87bb1eae147a70bcf67a1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/af864423f50ea59f96c87bb1eae147a70bcf67a1",
+ "reference": "af864423f50ea59f96c87bb1eae147a70bcf67a1",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "~1.0,>=1.0.1",
+ "php": ">= 5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4",
+ "satooshi/php-coveralls": "dev-master"
+ },
+ "time": "2015-06-22 21:07:51",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Egulias\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Eduardo Gulias Davis"
+ }
+ ],
+ "description": "A library for validating emails",
+ "homepage": "https://github.com/egulias/EmailValidator",
+ "keywords": [
+ "email",
+ "emailvalidation",
+ "emailvalidator",
+ "validation",
+ "validator"
+ ]
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "1.0.2",
+ "version_normalized": "1.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "97fe7210def29451ec74923b27e552238defd75a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/97fe7210def29451ec74923b27e552238defd75a",
+ "reference": "97fe7210def29451ec74923b27e552238defd75a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "time": "2015-08-15 19:37:21",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ]
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
+ "reference": "85d63699f0dbedb190bbd4b0d2b9dc707ea4c298",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "time": "2015-05-04 20:22:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ]
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.2.0",
+ "version_normalized": "1.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/4ef919b0cf3b1989523138b60163bbcb7ba1ff7e",
+ "reference": "4ef919b0cf3b1989523138b60163bbcb7ba1ff7e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "time": "2015-08-15 19:32:36",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "PSR-7 message implementation",
+ "keywords": [
+ "http",
+ "message",
+ "stream",
+ "uri"
+ ]
+ },
+ {
+ "name": "masterminds/html5",
+ "version": "2.1.2",
+ "version_normalized": "2.1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Masterminds/html5-php.git",
+ "reference": "8f782e0f01a6e33a319bdc8f6de9cfd6569979a4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/Masterminds/html5-php/zipball/8f782e0f01a6e33a319bdc8f6de9cfd6569979a4",
+ "reference": "8f782e0f01a6e33a319bdc8f6de9cfd6569979a4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-libxml": "*",
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "sami/sami": "~2.0",
+ "satooshi/php-coveralls": "0.6.*"
+ },
+ "time": "2015-06-07 08:43:18",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Masterminds\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Matt Butcher",
+ "email": "technosophos@gmail.com"
+ },
+ {
+ "name": "Asmir Mustafic",
+ "email": "goetas@gmail.com"
+ },
+ {
+ "name": "Matt Farina",
+ "email": "matt@mattfarina.com"
+ }
+ ],
+ "description": "An HTML5 parser and serializer.",
+ "homepage": "http://masterminds.github.io/html5-php",
+ "keywords": [
+ "HTML5",
+ "dom",
+ "html",
+ "parser",
+ "querypath",
+ "serializer",
+ "xml"
+ ]
+ },
+ {
+ "name": "psr/log",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/log.git",
+ "reference": "1.0.0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
+ "reference": "1.0.0",
+ "shasum": ""
+ },
+ "time": "2012-12-21 11:40:51",
+ "type": "library",
+ "installation-source": "dist",
+ "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"
+ ]
+ },
+ {
+ "name": "stack/builder",
+ "version": "v1.0.3",
+ "version_normalized": "1.0.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/stackphp/builder.git",
+ "reference": "c1f8a4693b55c563405024f708a76ef576c3b276"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/stackphp/builder/zipball/c1f8a4693b55c563405024f708a76ef576c3b276",
+ "reference": "c1f8a4693b55c563405024f708a76ef576c3b276",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "symfony/http-foundation": "~2.1",
+ "symfony/http-kernel": "~2.1"
+ },
+ "require-dev": {
+ "silex/silex": "~1.0"
+ },
+ "time": "2014-11-23 20:37:11",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Stack": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Igor Wiedler",
+ "email": "igor@wiedler.ch"
+ }
+ ],
+ "description": "Builder for stack middlewares based on HttpKernelInterface.",
+ "keywords": [
+ "stack"
+ ]
+ },
+ {
+ "name": "symfony-cmf/routing",
+ "version": "1.3.0",
+ "version_normalized": "1.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony-cmf/Routing.git",
+ "reference": "8e87981d72c6930a27585dcd3119f3199f6cb2a6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony-cmf/Routing/zipball/8e87981d72c6930a27585dcd3119f3199f6cb2a6",
+ "reference": "8e87981d72c6930a27585dcd3119f3199f6cb2a6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "psr/log": "~1.0",
+ "symfony/http-kernel": "~2.2",
+ "symfony/routing": "~2.2"
+ },
+ "require-dev": {
+ "symfony/config": "~2.2",
+ "symfony/dependency-injection": "~2.0@stable",
+ "symfony/event-dispatcher": "~2.1"
+ },
+ "suggest": {
+ "symfony/event-dispatcher": "DynamicRouter can optionally trigger an event at the start of matching. Minimal version ~2.1"
+ },
+ "time": "2014-10-20 20:55:17",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Cmf\\Component\\Routing\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony CMF Community",
+ "homepage": "https://github.com/symfony-cmf/Routing/contributors"
+ }
+ ],
+ "description": "Extends the Symfony2 routing component for dynamic routes and chaining several routers",
+ "homepage": "http://cmf.symfony.com",
+ "keywords": [
+ "database",
+ "routing"
+ ]
+ },
+ {
+ "name": "symfony/psr-http-message-bridge",
+ "version": "v0.2",
+ "version_normalized": "0.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/psr-http-message-bridge.git",
+ "reference": "dc7e308e1dc2898a46776e2221a643cb08315453"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/psr-http-message-bridge/zipball/dc7e308e1dc2898a46776e2221a643cb08315453",
+ "reference": "dc7e308e1dc2898a46776e2221a643cb08315453",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "psr/http-message": "~1.0",
+ "symfony/http-foundation": "~2.3|~3.0"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7|~3.0"
+ },
+ "suggest": {
+ "zendframework/zend-diactoros": "To use the Zend Diactoros factory"
+ },
+ "time": "2015-05-29 17:57:12",
+ "type": "symfony-bridge",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Bridge\\PsrHttpMessage\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Symfony Community",
+ "homepage": "http://symfony.com/contributors"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "PSR HTTP message bridge",
+ "homepage": "http://symfony.com",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr-7"
+ ]
+ },
+ {
+ "name": "zendframework/zend-diactoros",
+ "version": "1.1.3",
+ "version_normalized": "1.1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-diactoros.git",
+ "reference": "e2f5c12916c74da384058d0dfbc7fbc0b03d1181"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-diactoros/zipball/e2f5c12916c74da384058d0dfbc7fbc0b03d1181",
+ "reference": "e2f5c12916c74da384058d0dfbc7fbc0b03d1181",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "~1.0.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.6",
+ "squizlabs/php_codesniffer": "^2.3.1"
+ },
+ "time": "2015-08-10 20:04:20",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev",
+ "dev-develop": "1.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Zend\\Diactoros\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-2-Clause"
+ ],
+ "description": "PSR HTTP Message implementations",
+ "homepage": "https://github.com/zendframework/zend-diactoros",
+ "keywords": [
+ "http",
+ "psr",
+ "psr-7"
+ ]
+ },
+ {
+ "name": "zendframework/zend-stdlib",
+ "version": "2.7.3",
+ "version_normalized": "2.7.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-stdlib.git",
+ "reference": "8ac0c77ff567fcf49b58689ee3bfa7595be102bc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-stdlib/zipball/8ac0c77ff567fcf49b58689ee3bfa7595be102bc",
+ "reference": "8ac0c77ff567fcf49b58689ee3bfa7595be102bc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "zendframework/zend-hydrator": "~1.0"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1",
+ "fabpot/php-cs-fixer": "1.7.*",
+ "phpunit/phpunit": "~4.0",
+ "zendframework/zend-config": "~2.5",
+ "zendframework/zend-eventmanager": "~2.5",
+ "zendframework/zend-filter": "~2.5",
+ "zendframework/zend-inputfilter": "~2.5",
+ "zendframework/zend-serializer": "~2.5",
+ "zendframework/zend-servicemanager": "~2.5"
+ },
+ "suggest": {
+ "zendframework/zend-eventmanager": "To support aggregate hydrator usage",
+ "zendframework/zend-filter": "To support naming strategy hydrator usage",
+ "zendframework/zend-serializer": "Zend\\Serializer component",
+ "zendframework/zend-servicemanager": "To support hydrator plugin manager usage"
+ },
+ "time": "2015-09-25 04:06:33",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev",
+ "dev-develop": "2.8-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Zend\\Stdlib\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "homepage": "https://github.com/zendframework/zend-stdlib",
+ "keywords": [
+ "stdlib",
+ "zf2"
+ ]
+ },
+ {
+ "name": "zendframework/zend-hydrator",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-hydrator.git",
+ "reference": "f3ed8b833355140350bbed98d8a7b8b66875903f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-hydrator/zipball/f3ed8b833355140350bbed98d8a7b8b66875903f",
+ "reference": "f3ed8b833355140350bbed98d8a7b8b66875903f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "zendframework/zend-stdlib": "^2.5.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "^2.0@dev",
+ "zendframework/zend-eventmanager": "^2.5.1",
+ "zendframework/zend-filter": "^2.5.1",
+ "zendframework/zend-inputfilter": "^2.5.1",
+ "zendframework/zend-serializer": "^2.5.1",
+ "zendframework/zend-servicemanager": "^2.5.1"
+ },
+ "suggest": {
+ "zendframework/zend-eventmanager": "^2.5.1, to support aggregate hydrator usage",
+ "zendframework/zend-filter": "^2.5.1, to support naming strategy hydrator usage",
+ "zendframework/zend-serializer": "^2.5.1, to use the SerializableStrategy",
+ "zendframework/zend-servicemanager": "^2.5.1, to support hydrator plugin manager usage"
+ },
+ "time": "2015-09-17 14:06:43",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev",
+ "dev-develop": "1.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Zend\\Hydrator\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "homepage": "https://github.com/zendframework/zend-hydrator",
+ "keywords": [
+ "hydrator",
+ "zf2"
+ ]
+ },
+ {
+ "name": "zendframework/zend-escaper",
+ "version": "2.5.1",
+ "version_normalized": "2.5.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-escaper.git",
+ "reference": "a4b227d8a477f4e7e9073f8e0a7ae7dbd3104a73"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-escaper/zipball/a4b227d8a477f4e7e9073f8e0a7ae7dbd3104a73",
+ "reference": "a4b227d8a477f4e7e9073f8e0a7ae7dbd3104a73",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.23"
+ },
+ "require-dev": {
+ "fabpot/php-cs-fixer": "1.7.*",
+ "phpunit/phpunit": "~4.0"
+ },
+ "time": "2015-06-03 14:05:37",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev",
+ "dev-develop": "2.6-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Zend\\Escaper\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "homepage": "https://github.com/zendframework/zend-escaper",
+ "keywords": [
+ "escaper",
+ "zf2"
+ ]
+ },
+ {
+ "name": "zendframework/zend-feed",
+ "version": "2.5.2",
+ "version_normalized": "2.5.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/zendframework/zend-feed.git",
+ "reference": "0661345b82b51428619e05d3aadd3de65b57fa54"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/zendframework/zend-feed/zipball/0661345b82b51428619e05d3aadd3de65b57fa54",
+ "reference": "0661345b82b51428619e05d3aadd3de65b57fa54",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "zendframework/zend-escaper": "~2.5",
+ "zendframework/zend-stdlib": "~2.5"
+ },
+ "require-dev": {
+ "fabpot/php-cs-fixer": "1.7.*",
+ "phpunit/phpunit": "~4.0",
+ "zendframework/zend-cache": "~2.5",
+ "zendframework/zend-db": "~2.5",
+ "zendframework/zend-http": "~2.5",
+ "zendframework/zend-servicemanager": "~2.5",
+ "zendframework/zend-validator": "~2.5"
+ },
+ "suggest": {
+ "zendframework/zend-cache": "Zend\\Cache component",
+ "zendframework/zend-db": "Zend\\Db component",
+ "zendframework/zend-http": "Zend\\Http for PubSubHubbub, and optionally for use with Zend\\Feed\\Reader",
+ "zendframework/zend-servicemanager": "Zend\\ServiceManager component, for default/recommended ExtensionManager implementations",
+ "zendframework/zend-validator": "Zend\\Validator component"
+ },
+ "time": "2015-08-04 21:39:18",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.5-dev",
+ "dev-develop": "2.6-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Zend\\Feed\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "description": "provides functionality for consuming RSS and Atom feeds",
+ "homepage": "https://github.com/zendframework/zend-feed",
+ "keywords": [
+ "feed",
+ "zf2"
+ ]
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "6.1.0",
+ "version_normalized": "6.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "66fd14b4d0b8f2389eaf37c5458608c7cb793a81"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/66fd14b4d0b8f2389eaf37c5458608c7cb793a81",
+ "reference": "66fd14b4d0b8f2389eaf37c5458608c7cb793a81",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/promises": "~1.0",
+ "guzzlehttp/psr7": "~1.1",
+ "php": ">=5.5.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "~4.0",
+ "psr/log": "~1.0"
+ },
+ "time": "2015-09-08 17:36:26",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ]
+ },
+ {
+ "name": "fabpot/goutte",
+ "version": "v3.1.1",
+ "version_normalized": "3.1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/FriendsOfPHP/Goutte.git",
+ "reference": "751a3dc5c4d86ec3e97c9f27133ef9694d9243cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/FriendsOfPHP/Goutte/zipball/751a3dc5c4d86ec3e97c9f27133ef9694d9243cc",
+ "reference": "751a3dc5c4d86ec3e97c9f27133ef9694d9243cc",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "^6.0",
+ "php": ">=5.5.0",
+ "symfony/browser-kit": "~2.1",
+ "symfony/css-selector": "~2.1",
+ "symfony/dom-crawler": "~2.1"
+ },
+ "time": "2015-08-29 16:16:56",
+ "type": "application",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Goutte\\": "Goutte"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ }
+ ],
+ "description": "A simple PHP Web Scraper",
+ "homepage": "https://github.com/FriendsOfPHP/Goutte",
+ "keywords": [
+ "scraper"
+ ]
+ },
+ {
+ "name": "behat/mink",
+ "version": "v1.7.0",
+ "version_normalized": "1.7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/minkphp/Mink.git",
+ "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/minkphp/Mink/zipball/6c129030ec2cc029905cf969a56ca8f087b2dfdf",
+ "reference": "6c129030ec2cc029905cf969a56ca8f087b2dfdf",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.1",
+ "symfony/css-selector": "~2.1"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "suggest": {
+ "behat/mink-browserkit-driver": "extremely fast headless driver for Symfony\\Kernel-based apps (Sf2, Silex)",
+ "behat/mink-goutte-driver": "fast headless driver for any app without JS emulation",
+ "behat/mink-selenium2-driver": "slow, but JS-enabled driver for any app (requires Selenium2)",
+ "behat/mink-zombie-driver": "fast and JS-enabled headless driver for any app (requires node.js)"
+ },
+ "time": "2015-09-20 20:24:03",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Browser controller/emulator abstraction for PHP",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "browser",
+ "testing",
+ "web"
+ ]
+ },
+ {
+ "name": "behat/mink-browserkit-driver",
+ "version": "v1.3.0",
+ "version_normalized": "1.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/minkphp/MinkBrowserKitDriver.git",
+ "reference": "da47df1593dac132f04d24e7277ef40d33d9f201"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/minkphp/MinkBrowserKitDriver/zipball/da47df1593dac132f04d24e7277ef40d33d9f201",
+ "reference": "da47df1593dac132f04d24e7277ef40d33d9f201",
+ "shasum": ""
+ },
+ "require": {
+ "behat/mink": "~1.7@dev",
+ "php": ">=5.3.6",
+ "symfony/browser-kit": "~2.3",
+ "symfony/dom-crawler": "~2.3"
+ },
+ "require-dev": {
+ "silex/silex": "~1.2",
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "time": "2015-09-21 20:56:13",
+ "type": "mink-driver",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\Driver\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Symfony2 BrowserKit driver for Mink framework",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "Mink",
+ "Symfony2",
+ "browser",
+ "testing"
+ ]
+ },
+ {
+ "name": "behat/mink-goutte-driver",
+ "version": "v1.2.0",
+ "version_normalized": "1.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/minkphp/MinkGoutteDriver.git",
+ "reference": "c8e254f127d6f2242b994afd4339fb62d471df3f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/minkphp/MinkGoutteDriver/zipball/c8e254f127d6f2242b994afd4339fb62d471df3f",
+ "reference": "c8e254f127d6f2242b994afd4339fb62d471df3f",
+ "shasum": ""
+ },
+ "require": {
+ "behat/mink": "~1.6@dev",
+ "behat/mink-browserkit-driver": "~1.2@dev",
+ "fabpot/goutte": "~1.0.4|~2.0|~3.1",
+ "php": ">=5.3.1"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "time": "2015-09-21 21:31:11",
+ "type": "mink-driver",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Behat\\Mink\\Driver\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ }
+ ],
+ "description": "Goutte driver for Mink framework",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "browser",
+ "goutte",
+ "headless",
+ "testing"
+ ]
+ },
+ {
+ "name": "mikey179/vfsStream",
+ "version": "v1.6.0",
+ "version_normalized": "1.6.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/mikey179/vfsStream.git",
+ "reference": "73bcb605b741a7d5044b47592338c633788b0eb7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/mikey179/vfsStream/zipball/73bcb605b741a7d5044b47592338c633788b0eb7",
+ "reference": "73bcb605b741a7d5044b47592338c633788b0eb7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.5"
+ },
+ "time": "2015-10-06 16:59:57",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "org\\bovigo\\vfs\\": "src/main/php"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Frank Kleine",
+ "homepage": "http://frankkleine.de/",
+ "role": "Developer"
+ }
+ ],
+ "description": "Virtual file system to mock the real file system in unit tests.",
+ "homepage": "http://vfs.bovigo.org/"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "2.0.4",
+ "version_normalized": "2.0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "dflydev/markdown": "~1.0",
+ "erusev/parsedown": "~1.0"
+ },
+ "time": "2015-02-03 12:10:50",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "mike.vanriel@naenius.com"
+ }
+ ]
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.8",
+ "version_normalized": "1.4.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+ "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "time": "2015-09-15 10:49:45",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ]
+ },
+ {
+ "name": "sebastian/version",
+ "version": "1.0.6",
+ "version_normalized": "1.0.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "shasum": ""
+ },
+ "time": "2015-06-21 13:59:46",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.0.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+ "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "time": "2014-10-06 09:23:50",
+ "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": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ]
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.1",
+ "version_normalized": "1.0.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "994d4a811bafe801fb06dccbee797863ba2792ba"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/994d4a811bafe801fb06dccbee797863ba2792ba",
+ "reference": "994d4a811bafe801fb06dccbee797863ba2792ba",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2015-06-21 08:04:50",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.1",
+ "version_normalized": "1.2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "7ae5513327cb536431847bcc0c10edba2701064e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e",
+ "reference": "7ae5513327cb536431847bcc0c10edba2701064e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2015-06-21 07:55:53",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ]
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.3.2",
+ "version_normalized": "1.3.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6324c907ce7a52478eeeaede764f48733ef5ae44",
+ "reference": "6324c907ce7a52478eeeaede764f48733ef5ae44",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2015-08-03 06:14:51",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ]
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.3.0",
+ "version_normalized": "1.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "time": "2015-02-22 15:13:53",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "http://www.github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ]
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.0",
+ "version_normalized": "1.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
+ "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2015-07-26 15:48:44",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ]
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "version_normalized": "1.2.1.0",
+ "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"
+ },
+ "time": "2015-06-21 13:50:34",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ]
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "version_normalized": "1.0.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "time": "2015-06-14 21:17:01",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "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",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ]
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "2.3.8",
+ "version_normalized": "2.3.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": ">=5.3.3",
+ "phpunit/php-text-template": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "time": "2015-10-02 06:51:40",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ]
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.7",
+ "version_normalized": "1.0.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
+ "reference": "3e82f4e9fc92665fafd9157568e4dcb01d014e5b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "time": "2015-06-21 08:01:12",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ]
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.1",
+ "version_normalized": "1.4.1.0",
+ "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"
+ },
+ "time": "2015-06-21 13:08:43",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "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"
+ ]
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.2.4",
+ "version_normalized": "2.2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "phpunit/php-file-iterator": "~1.3",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-token-stream": "~1.3",
+ "sebastian/environment": "^1.3.2",
+ "sebastian/version": "~1.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "~4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
+ },
+ "time": "2015-10-06 15:47:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "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": "phpspec/prophecy",
+ "version": "v1.5.0",
+ "version_normalized": "1.5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4745ded9307786b730d7a60df5cb5a6c43cf95f7",
+ "reference": "4745ded9307786b730d7a60df5cb5a6c43cf95f7",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "phpdocumentor/reflection-docblock": "~2.0",
+ "sebastian/comparator": "~1.1"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "~2.0"
+ },
+ "time": "2015-08-13 10:07:40",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ]
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "4.8.11",
+ "version_normalized": "4.8.11.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "bdd199472410fd7e32751f9c814c7e06f2c21bd5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/bdd199472410fd7e32751f9c814c7e06f2c21bd5",
+ "reference": "bdd199472410fd7e32751f9c814c7e06f2c21bd5",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=5.3.3",
+ "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.6",
+ "phpunit/phpunit-mock-objects": "~2.3",
+ "sebastian/comparator": "~1.1",
+ "sebastian/diff": "~1.2",
+ "sebastian/environment": "~1.3",
+ "sebastian/exporter": "~1.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/version": "~1.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "suggest": {
+ "phpunit/php-invoker": "~1.1"
+ },
+ "time": "2015-10-07 10:39:46",
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.8.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ]
+ },
+ {
+ "name": "jcalderonzumba/gastonjs",
+ "version": "dev-master",
+ "version_normalized": "9999999-dev",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jcalderonzumba/gastonjs.git",
+ "reference": "5e231b4df98275c404e1371fc5fadd34f6a121ad"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jcalderonzumba/gastonjs/zipball/5e231b4df98275c404e1371fc5fadd34f6a121ad",
+ "reference": "5e231b4df98275c404e1371fc5fadd34f6a121ad",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/guzzle": "~5.0|~6.0",
+ "php": ">=5.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.6",
+ "silex/silex": "~1.2",
+ "symfony/phpunit-bridge": "~2.7",
+ "symfony/process": "~2.1"
+ },
+ "time": "2015-10-07 11:40:41",
+ "type": "phantomjs-api",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "installation-source": "source",
+ "autoload": {
+ "psr-4": {
+ "Zumba\\GastonJS\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Juan Francisco Calderón Zumba",
+ "email": "juanfcz@gmail.com",
+ "homepage": "http://github.com/jcalderonzumba"
+ }
+ ],
+ "description": "PhantomJS API based server for webpage automation",
+ "homepage": "https://github.com/jcalderonzumba/gastonjs",
+ "keywords": [
+ "api",
+ "automation",
+ "browser",
+ "headless",
+ "phantomjs"
+ ]
+ },
+ {
+ "name": "symfony/class-loader",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/class-loader.git",
+ "reference": "320f8d2a9cdbcbeb24be602c124aae9d998474a4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/class-loader/zipball/320f8d2a9cdbcbeb24be602c124aae9d998474a4",
+ "reference": "320f8d2a9cdbcbeb24be602c124aae9d998474a4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/finder": "~2.0,>=2.0.5"
+ },
+ "time": "2015-10-23 14:47:27",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\ClassLoader\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony ClassLoader Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/console",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/console.git",
+ "reference": "5efd632294c8320ea52492db22292ff853a43766"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/console/zipball/5efd632294c8320ea52492db22292ff853a43766",
+ "reference": "5efd632294c8320ea52492db22292ff853a43766",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/event-dispatcher": "~2.1",
+ "symfony/process": "~2.1"
+ },
+ "suggest": {
+ "psr/log": "For using the console logger",
+ "symfony/event-dispatcher": "",
+ "symfony/process": ""
+ },
+ "time": "2015-10-20 14:38:46",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Console\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Console Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/dependency-injection",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dependency-injection.git",
+ "reference": "af284e795ec8a08c80d1fc47518fd23004b89847"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/af284e795ec8a08c80d1fc47518fd23004b89847",
+ "reference": "af284e795ec8a08c80d1fc47518fd23004b89847",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "conflict": {
+ "symfony/expression-language": "<2.6"
+ },
+ "require-dev": {
+ "symfony/config": "~2.2",
+ "symfony/expression-language": "~2.6",
+ "symfony/yaml": "~2.1"
+ },
+ "suggest": {
+ "symfony/config": "",
+ "symfony/proxy-manager-bridge": "Generate service proxies to lazy load them",
+ "symfony/yaml": ""
+ },
+ "time": "2015-10-27 15:38:06",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DependencyInjection\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DependencyInjection Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/debug",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/debug.git",
+ "reference": "fb9e6887db716939f41af0ba8ef38a1582eb501b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/debug/zipball/fb9e6887db716939f41af0ba8ef38a1582eb501b",
+ "reference": "fb9e6887db716939f41af0ba8ef38a1582eb501b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9",
+ "psr/log": "~1.0"
+ },
+ "conflict": {
+ "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2"
+ },
+ "require-dev": {
+ "symfony/class-loader": "~2.2",
+ "symfony/http-kernel": "~2.3.24|~2.5.9|~2.6,>=2.6.2"
+ },
+ "time": "2015-10-11 09:39:48",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Debug\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Debug Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/http-foundation",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-foundation.git",
+ "reference": "7598eea151ae3d4134df1f9957364b17809eea75"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-foundation/zipball/7598eea151ae3d4134df1f9957364b17809eea75",
+ "reference": "7598eea151ae3d4134df1f9957364b17809eea75",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/expression-language": "~2.4"
+ },
+ "time": "2015-10-23 14:47:27",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpFoundation\\": ""
+ },
+ "classmap": [
+ "Resources/stubs"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony HttpFoundation Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/event-dispatcher",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/event-dispatcher.git",
+ "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/87a5db5ea887763fa3a31a5471b512ff1596d9b8",
+ "reference": "87a5db5ea887763fa3a31a5471b512ff1596d9b8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.0,>=2.0.5",
+ "symfony/dependency-injection": "~2.6",
+ "symfony/expression-language": "~2.6",
+ "symfony/stopwatch": "~2.3"
+ },
+ "suggest": {
+ "symfony/dependency-injection": "",
+ "symfony/http-kernel": ""
+ },
+ "time": "2015-10-11 09:39:48",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\EventDispatcher\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony EventDispatcher Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/http-kernel",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/http-kernel.git",
+ "reference": "4260f2273a446a6715063dc9ca89fd0c475c2f77"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/http-kernel/zipball/4260f2273a446a6715063dc9ca89fd0c475c2f77",
+ "reference": "4260f2273a446a6715063dc9ca89fd0c475c2f77",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9",
+ "psr/log": "~1.0",
+ "symfony/debug": "~2.6,>=2.6.2",
+ "symfony/event-dispatcher": "~2.6,>=2.6.7",
+ "symfony/http-foundation": "~2.5,>=2.5.4"
+ },
+ "conflict": {
+ "symfony/config": "<2.7"
+ },
+ "require-dev": {
+ "symfony/browser-kit": "~2.3",
+ "symfony/class-loader": "~2.1",
+ "symfony/config": "~2.7",
+ "symfony/console": "~2.3",
+ "symfony/css-selector": "~2.0,>=2.0.5",
+ "symfony/dependency-injection": "~2.2",
+ "symfony/dom-crawler": "~2.0,>=2.0.5",
+ "symfony/expression-language": "~2.4",
+ "symfony/finder": "~2.0,>=2.0.5",
+ "symfony/process": "~2.0,>=2.0.5",
+ "symfony/routing": "~2.2",
+ "symfony/stopwatch": "~2.3",
+ "symfony/templating": "~2.2",
+ "symfony/translation": "~2.0,>=2.0.5",
+ "symfony/var-dumper": "~2.6"
+ },
+ "suggest": {
+ "symfony/browser-kit": "",
+ "symfony/class-loader": "",
+ "symfony/config": "",
+ "symfony/console": "",
+ "symfony/dependency-injection": "",
+ "symfony/finder": "",
+ "symfony/var-dumper": ""
+ },
+ "time": "2015-10-27 19:07:21",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\HttpKernel\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony HttpKernel Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/routing",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/routing.git",
+ "reference": "f353e1f588679c3ec987624e6c617646bd01ba38"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/routing/zipball/f353e1f588679c3ec987624e6c617646bd01ba38",
+ "reference": "f353e1f588679c3ec987624e6c617646bd01ba38",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "conflict": {
+ "symfony/config": "<2.7"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/common": "~2.2",
+ "psr/log": "~1.0",
+ "symfony/config": "~2.7",
+ "symfony/expression-language": "~2.4",
+ "symfony/http-foundation": "~2.3",
+ "symfony/yaml": "~2.0,>=2.0.5"
+ },
+ "suggest": {
+ "doctrine/annotations": "For using the annotation loader",
+ "symfony/config": "For using the all-in-one router or any loader",
+ "symfony/expression-language": "For using expression matching",
+ "symfony/yaml": "For using the YAML loader"
+ },
+ "time": "2015-10-27 15:38:06",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Routing\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Routing Component",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "router",
+ "routing",
+ "uri",
+ "url"
+ ]
+ },
+ {
+ "name": "symfony/serializer",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/serializer.git",
+ "reference": "14056684acad23b8815eb336bccc0b4ac76bd823"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/serializer/zipball/14056684acad23b8815eb336bccc0b4ac76bd823",
+ "reference": "14056684acad23b8815eb336bccc0b4ac76bd823",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/cache": "~1.0",
+ "symfony/config": "~2.2",
+ "symfony/property-access": "~2.3",
+ "symfony/yaml": "~2.0,>=2.0.5"
+ },
+ "suggest": {
+ "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.",
+ "doctrine/cache": "For using the default cached annotation reader and metadata cache.",
+ "symfony/config": "For using the XML mapping loader.",
+ "symfony/property-access": "For using the ObjectNormalizer.",
+ "symfony/yaml": "For using the default YAML mapping loader."
+ },
+ "time": "2015-10-11 09:39:48",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Serializer\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Serializer Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "6ccd9289ec1c71d01a49d83480de3b5293ce30c8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/6ccd9289ec1c71d01a49d83480de3b5293ce30c8",
+ "reference": "6ccd9289ec1c71d01a49d83480de3b5293ce30c8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "conflict": {
+ "symfony/config": "<2.7"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.7",
+ "symfony/intl": "~2.4",
+ "symfony/yaml": "~2.2"
+ },
+ "suggest": {
+ "psr/log": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "time": "2015-10-27 15:38:06",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Translation Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/validator",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/validator.git",
+ "reference": "df9021e689aa3d08367881e7f8917219fabe5e64"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/validator/zipball/df9021e689aa3d08367881e7f8917219fabe5e64",
+ "reference": "df9021e689aa3d08367881e7f8917219fabe5e64",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9",
+ "symfony/translation": "~2.4"
+ },
+ "require-dev": {
+ "doctrine/annotations": "~1.0",
+ "doctrine/cache": "~1.0",
+ "doctrine/common": "~2.3",
+ "egulias/email-validator": "~1.2,>=1.2.1",
+ "symfony/config": "~2.2",
+ "symfony/expression-language": "~2.4",
+ "symfony/http-foundation": "~2.1",
+ "symfony/intl": "~2.4",
+ "symfony/property-access": "~2.3",
+ "symfony/yaml": "~2.0,>=2.0.5"
+ },
+ "suggest": {
+ "doctrine/annotations": "For using the annotation mapping. You will also need doctrine/cache.",
+ "doctrine/cache": "For using the default cached annotation reader and metadata cache.",
+ "egulias/email-validator": "Strict (RFC compliant) email validation",
+ "symfony/config": "",
+ "symfony/expression-language": "For using the 2.4 Expression validator",
+ "symfony/http-foundation": "",
+ "symfony/intl": "",
+ "symfony/property-access": "For using the 2.4 Validator API",
+ "symfony/yaml": ""
+ },
+ "time": "2015-10-18 20:23:18",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Validator\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Validator Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/process",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/process.git",
+ "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/process/zipball/4a959dd4e19c2c5d7512689413921e0a74386ec7",
+ "reference": "4a959dd4e19c2c5d7512689413921e0a74386ec7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "time": "2015-10-23 14:47:27",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Process\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Process Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "eca9019c88fbe250164affd107bc8057771f3f4d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/eca9019c88fbe250164affd107bc8057771f3f4d",
+ "reference": "eca9019c88fbe250164affd107bc8057771f3f4d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "time": "2015-10-11 09:39:48",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "e1b865b26be4a56d22a8dee398375044a80c865b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/e1b865b26be4a56d22a8dee398375044a80c865b",
+ "reference": "e1b865b26be4a56d22a8dee398375044a80c865b",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "time": "2015-10-11 09:39:48",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\CssSelector\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony CssSelector Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/dom-crawler",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dom-crawler.git",
+ "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/5fef7d8b80d8f9992df99d8ee283f420484c9612",
+ "reference": "5fef7d8b80d8f9992df99d8ee283f420484c9612",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.3"
+ },
+ "suggest": {
+ "symfony/css-selector": ""
+ },
+ "time": "2015-10-11 09:39:48",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DomCrawler\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DomCrawler Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "symfony/browser-kit",
+ "version": "v2.7.6",
+ "version_normalized": "2.7.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/browser-kit.git",
+ "reference": "07d664a052572ccc28eb2ab7dbbe82155b1ad367"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/browser-kit/zipball/07d664a052572ccc28eb2ab7dbbe82155b1ad367",
+ "reference": "07d664a052572ccc28eb2ab7dbbe82155b1ad367",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9",
+ "symfony/dom-crawler": "~2.0,>=2.0.5"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.0,>=2.0.5",
+ "symfony/process": "~2.3.34|~2.7,>=2.7.6"
+ },
+ "suggest": {
+ "symfony/process": ""
+ },
+ "time": "2015-10-23 14:47:27",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\BrowserKit\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony BrowserKit Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "twig/twig",
+ "version": "v1.23.1",
+ "version_normalized": "1.23.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/twigphp/Twig.git",
+ "reference": "d9b6333ae8dd2c8e3fd256e127548def0bc614c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/twigphp/Twig/zipball/d9b6333ae8dd2c8e3fd256e127548def0bc614c6",
+ "reference": "d9b6333ae8dd2c8e3fd256e127548def0bc614c6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.7"
+ },
+ "require-dev": {
+ "symfony/debug": "~2.7",
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "time": "2015-11-05 12:49:06",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.23-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Twig_": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com",
+ "homepage": "http://fabien.potencier.org",
+ "role": "Lead Developer"
+ },
+ {
+ "name": "Armin Ronacher",
+ "email": "armin.ronacher@active-4.com",
+ "role": "Project Founder"
+ },
+ {
+ "name": "Twig Team",
+ "homepage": "http://twig.sensiolabs.org/contributors",
+ "role": "Contributors"
+ }
+ ],
+ "description": "Twig, the flexible, fast, and secure template language for PHP",
+ "homepage": "http://twig.sensiolabs.org",
+ "keywords": [
+ "templating"
+ ]
+ },
+ {
+ "name": "wikimedia/composer-merge-plugin",
+ "version": "v1.3.0",
+ "version_normalized": "1.3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/wikimedia/composer-merge-plugin.git",
+ "reference": "bfed1f8d4eb97e9ba80eee57ea46229d7e5364d9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/wikimedia/composer-merge-plugin/zipball/bfed1f8d4eb97e9ba80eee57ea46229d7e5364d9",
+ "reference": "bfed1f8d4eb97e9ba80eee57ea46229d7e5364d9",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.0",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "composer/composer": "1.0.*@dev",
+ "jakub-onderka/php-parallel-lint": "~0.8",
+ "phpunit/phpunit": "~4.8|~5.0",
+ "squizlabs/php_codesniffer": "~2.1.0"
+ },
+ "time": "2015-11-06 20:31:16",
+ "type": "composer-plugin",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ },
+ "class": "Wikimedia\\Composer\\MergePlugin"
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Wikimedia\\Composer\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bryan Davis",
+ "email": "bd808@wikimedia.org"
+ }
+ ],
+ "description": "Composer plugin to merge multiple composer.json files"
+ },
+ {
+ "name": "jcalderonzumba/mink-phantomjs-driver",
+ "version": "v0.3.1",
+ "version_normalized": "0.3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/jcalderonzumba/MinkPhantomJSDriver.git",
+ "reference": "782892dbea4af7d04024374672b3790b6c008def"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/jcalderonzumba/MinkPhantomJSDriver/zipball/782892dbea4af7d04024374672b3790b6c008def",
+ "reference": "782892dbea4af7d04024374672b3790b6c008def",
+ "shasum": ""
+ },
+ "require": {
+ "behat/mink": "~1.6",
+ "jcalderonzumba/gastonjs": "~1.0",
+ "php": ">=5.4",
+ "twig/twig": "~1.20|~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.6",
+ "silex/silex": "~1.2",
+ "symfony/css-selector": "~2.1",
+ "symfony/phpunit-bridge": "~2.7",
+ "symfony/process": "~2.3"
+ },
+ "time": "2015-12-04 13:55:02",
+ "type": "mink-driver",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.4.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Zumba\\Mink\\Driver\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Juan Francisco Calderón Zumba",
+ "email": "juanfcz@gmail.com",
+ "homepage": "http://github.com/jcalderonzumba"
+ }
+ ],
+ "description": "PhantomJS driver for Mink framework",
+ "homepage": "http://mink.behat.org/",
+ "keywords": [
+ "ajax",
+ "browser",
+ "headless",
+ "javascript",
+ "phantomjs",
+ "testing"
+ ]
+ },
+ {
+ "name": "paragonie/random_compat",
+ "version": "1.1.1",
+ "version_normalized": "1.1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/paragonie/random_compat.git",
+ "reference": "a208865a5aeffc2dbbef2a5b3409887272d93f32"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/paragonie/random_compat/zipball/a208865a5aeffc2dbbef2a5b3409887272d93f32",
+ "reference": "a208865a5aeffc2dbbef2a5b3409887272d93f32",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.*|5.*"
+ },
+ "suggest": {
+ "ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
+ },
+ "time": "2015-12-01 02:52:15",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "files": [
+ "lib/random.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Paragon Initiative Enterprises",
+ "email": "security@paragonie.com",
+ "homepage": "https://paragonie.com"
+ }
+ ],
+ "description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
+ "keywords": [
+ "csprng",
+ "pseudorandom",
+ "random"
+ ]
+ }
+]
diff --git a/vendor/composer/installers/.editorconfig b/vendor/composer/installers/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..153cf3ef5bd040f196bf7ede995e02e896cbdb95
--- /dev/null
+++ b/vendor/composer/installers/.editorconfig
@@ -0,0 +1,10 @@
+; top-most EditorConfig file
+root = true
+
+; Unix-style newlines
+[*]
+end_of_line = LF
+
+[*.php]
+indent_style = space
+indent_size = 4
diff --git a/vendor/composer/installers/.gitignore b/vendor/composer/installers/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ff7f293dc8987aeb2c6bb2d9715965442b5496d9
--- /dev/null
+++ b/vendor/composer/installers/.gitignore
@@ -0,0 +1,3 @@
+vendor/
+composer.lock
+.idea/
diff --git a/vendor/composer/installers/.travis.yml b/vendor/composer/installers/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..81ca8e10137b5e90bebf4623b444f73185cb50b5
--- /dev/null
+++ b/vendor/composer/installers/.travis.yml
@@ -0,0 +1,14 @@
+language: php
+
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - hhvm
+
+before_script:
+ - curl -s http://getcomposer.org/installer | php -- --quiet
+ - php composer.phar install --dev
+
+script: phpunit
diff --git a/vendor/composer/installers/LICENSE b/vendor/composer/installers/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..85f97fc795118a2291ce2fcf6d4f985b07d139c7
--- /dev/null
+++ b/vendor/composer/installers/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2012 Kyle Robinson Young
+
+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.
\ No newline at end of file
diff --git a/vendor/composer/installers/README.md b/vendor/composer/installers/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..b33177198dbd6cb287fc5054701f5f0b59c4e310
--- /dev/null
+++ b/vendor/composer/installers/README.md
@@ -0,0 +1,191 @@
+# A Multi-Framework [Composer](http://getcomposer.org) Library Installer
+
+[![Build Status](http://img.shields.io/travis/composer/installers.svg)](http://travis-ci.org/composer/installers)
+
+This is for PHP package authors to require in their `composer.json`. It will
+install their package to the correct location based on the specified package
+type.
+
+The goal of `installers` is to be a simple package type to install path map.
+Users can also customize the install path per package and package authors can
+modify the package name upon installing.
+
+`installers` isn't intended on replacing all custom installers. If your
+package requires special installation handling then by all means, create a
+custom installer to handle it.
+
+**Natively Supported Frameworks**:
+
+The following frameworks natively work with Composer and will be
+installed to the default `vendor` directory. `composer/installers`
+is not needed to install packages with these frameworks:
+
+* Aura
+* Symfony2
+* Yii
+* Yii2
+
+**Current Supported Package Types**:
+
+> Stable types are marked as **bold**, this means that installation paths
+> for those type will not be changed. Any adjustment for those types would
+> require creation of brand new type that will cover required changes.
+
+| Framework | Types
+| --------- | -----
+| Aimeos | `aimeos-extension`
+| Asgard | `asgard-module` `asgard-theme`
+| AGL | `agl-module`
+| AnnotateCms | `annotatecms-module` `annotatecms-component` `annotatecms-service`
+| Bitrix | `bitrix-module` `bitrix-component` `bitrix-theme`
+| CakePHP 2+ | **`cakephp-plugin`**
+| Chef | `chef-cookbook` `chef-role`
+| CCFramework | `ccframework-ship` `ccframework-theme`
+| CodeIgniter | `codeigniter-library` `codeigniter-third-party` `codeigniter-module`
+| concrete5 | `concrete5-block` `concrete5-package` `concrete5-theme` `concrete5-update`
+| Craft | `craft-plugin`
+| Croogo | `croogo-plugin` `croogo-theme`
+| DokuWiki | `dokuwiki-plugin` `dokuwiki-template`
+| Dolibarr | `dolibarr-module`
+| Drupal | `drupal-module` `drupal-theme` `drupal-library` `drupal-profile` `drupal-drush`
+| Elgg | `elgg-plugin`
+| FuelPHP v1.x | `fuel-module` `fuel-package` `fuel-theme`
+| FuelPHP v2.x | `fuelphp-component`
+| Grav | `grav-plugin` `grav-theme`
+| Hurad | `hurad-plugin` `hurad-theme`
+| Joomla | `joomla-component` `joomla-module` `joomla-template` `joomla-plugin` `joomla-library`
+| Kirby | **`kirby-plugin`**
+| Kohana | **`kohana-module`**
+| Laravel | `laravel-library`
+| Lithium | **`lithium-library` `lithium-source`**
+| Magento | `magento-library` `magento-skin` `magento-theme`
+| Mako | `mako-package`
+| MODX Evo | `modxevo-snippet` `modxevo-plugin` `modxevo-module` `modxevo-template` `modxevo-lib`
+| MediaWiki | `mediawiki-extension`
+| October | **`october-module` `october-plugin` `october-theme`**
+| OXID | `oxid-module` `oxid-theme` `oxid-out`
+| MODULEWork | `modulework-module`
+| Moodle | `moodle-*` (Please [check source](https://raw.githubusercontent.com/composer/installers/master/src/Composer/Installers/MoodleInstaller.php) for all supported types)
+| Piwik | `piwik-plugin`
+| phpBB | `phpbb-extension` `phpbb-style` `phpbb-language`
+| Pimcore | `pimcore-plugin`
+| PPI | **`ppi-module`**
+| Puppet | `puppet-module`
+| REDAXO | `redaxo-addon`
+| Roundcube | `roundcube-plugin`
+| shopware | `shopware-backend-plugin` `shopware-core-plugin` `shopware-frontend-plugin` `shopware-theme`
+| SilverStripe | `silverstripe-module` `silverstripe-theme`
+| SMF | `smf-module` `smf-theme`
+| symfony1 | **`symfony1-plugin`**
+| Tusk | `tusk-task` `tusk-command` `tusk-asset`
+| TYPO3 Flow | `typo3-flow-package` `typo3-flow-framework` `typo3-flow-plugin` `typo3-flow-site` `typo3-flow-boilerplate` `typo3-flow-build`
+| TYPO3 CMS | `typo3-cms-extension`
+| Wolf CMS | `wolfcms-plugin`
+| WordPress | `wordpress-plugin` `wordpress-theme` `wordpress-muplugin`
+| Zend | `zend-library` `zend-extra` `zend-module`
+| Zikula | `zikula-module` `zikula-theme`
+| Prestashop | `prestashop-module` `prestashop-theme`
+
+## Example `composer.json` File
+
+This is an example for a CakePHP plugin. The only important parts to set in your
+composer.json file are `"type": "cakephp-plugin"` which describes what your
+package is and `"require": { "composer/installers": "~1.0" }` which tells composer
+to load the custom installers.
+
+```json
+{
+ "name": "you/ftp",
+ "type": "cakephp-plugin",
+ "require": {
+ "composer/installers": "~1.0"
+ }
+}
+```
+
+This would install your package to the `Plugin/Ftp/` folder of a CakePHP app
+when a user runs `php composer.phar install`.
+
+So submit your packages to [packagist.org](http://packagist.org)!
+
+## Custom Install Paths
+
+If you are consuming a package that uses the `composer/installers` you can
+override the install path with the following extra in your `composer.json`:
+
+```json
+{
+ "extra": {
+ "installer-paths": {
+ "your/custom/path/{$name}/": ["shama/ftp", "vendor/package"]
+ }
+ }
+}
+```
+
+A package type can have a custom installation path with a `type:` prefix.
+
+``` json
+{
+ "extra": {
+ "installer-paths": {
+ "your/custom/path/{$name}/": ["type:wordpress-plugin"]
+ }
+ }
+}
+```
+
+This would use your custom path for each of the listed packages. The available
+variables to use in your paths are: `{$name}`, `{$vendor}`, `{$type}`.
+
+## Custom Install Names
+
+If you're a package author and need your package to be named differently when
+installed consider using the `installer-name` extra.
+
+For example you have a package named `shama/cakephp-ftp` with the type
+`cakephp-plugin`. Installing with `composer/installers` would install to the
+path `Plugin/CakephpFtp`. Due to the strict naming conventions, you as a
+package author actually need the package to be named and installed to
+`Plugin/Ftp`. Using the following config within your **package** `composer.json`
+will allow this:
+
+```json
+{
+ "name": "shama/cakephp-ftp",
+ "type": "cakephp-plugin",
+ "extra": {
+ "installer-name": "Ftp"
+ }
+}
+```
+
+Please note the name entered into `installer-name` will be the final and will
+not be inflected.
+
+## Contribute!
+
+* [Fork and clone](https://help.github.com/articles/fork-a-repo).
+* Run the command `php composer.phar install --dev` to install the dev
+ dependencies. See [Composer](https://github.com/composer/composer#installation--usage).
+* Use the command `phpunit` to run the tests. See [PHPUnit](http://phpunit.de).
+* Create a branch, commit, push and send us a
+ [pull request](https://help.github.com/articles/using-pull-requests).
+
+To ensure a consistent code base, you should make sure the code follows the
+[Coding Standards](http://symfony.com/doc/2.0/contributing/code/standards.html)
+which we borrowed from Symfony.
+
+If you would like to help, please take a look at the list of
+[issues](https://github.com/composer/installers/issues).
+
+### Should we allow dynamic package types or paths? No.
+What are they? The ability for a package author to determine where a package
+will be installed either through setting the path directly in their
+`composer.json` or through a dynamic package type: `"type":
+"framework-install-here"`.
+
+It has been proposed many times. Even implemented once early on and then
+removed. `installers` won't do this because it would allow a single package
+author to wipe out entire folders without the user's consent. That user would
+then come here to yell at us.
diff --git a/vendor/composer/installers/composer.json b/vendor/composer/installers/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..6ee931ee99bca153c4bb2c5bfe8290c12e6e8a46
--- /dev/null
+++ b/vendor/composer/installers/composer.json
@@ -0,0 +1,77 @@
+{
+ "name": "composer/installers",
+ "type": "composer-installer",
+ "license": "MIT",
+ "description": "A multi-framework Composer library installer",
+ "keywords": [
+ "installer",
+ "Aimeos",
+ "AGL",
+ "AnnotateCms",
+ "Bitrix",
+ "CakePHP",
+ "Chef",
+ "CodeIgniter",
+ "concrete5",
+ "Craft",
+ "Croogo",
+ "DokuWiki",
+ "Dolibarr",
+ "Drupal",
+ "Elgg",
+ "FuelPHP",
+ "Grav",
+ "Hurad",
+ "Joomla",
+ "Kohana",
+ "Laravel",
+ "Lithium",
+ "Magento",
+ "Mako",
+ "MODX Evo",
+ "MediaWiki",
+ "OXID",
+ "MODULEWork",
+ "Moodle",
+ "Piwik",
+ "phpBB",
+ "PPI",
+ "Puppet",
+ "Roundcube",
+ "shopware",
+ "SilverStripe",
+ "SMF",
+ "symfony",
+ "Thelia",
+ "TYPO3",
+ "WolfCMS",
+ "WordPress",
+ "Zend",
+ "Zikula"
+ ],
+ "homepage": "http://composer.github.com/installers/",
+ "authors": [
+ {
+ "name": "Kyle Robinson Young",
+ "email": "kyle@dontkry.com",
+ "homepage": "https://github.com/shama"
+ }
+ ],
+ "autoload": {
+ "psr-0": { "Composer\\Installers\\": "src/" }
+ },
+ "extra": {
+ "class": "Composer\\Installers\\Installer",
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "replace": {
+ "shama/baton": "*",
+ "roundcube/plugin-installer": "*"
+ },
+ "require-dev": {
+ "composer/composer": "1.0.*@dev",
+ "phpunit/phpunit": "4.1.*"
+ }
+}
diff --git a/vendor/composer/installers/phpunit.xml.dist b/vendor/composer/installers/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..cc5cc991590d56cd319af89e725e969fff8fe1c9
--- /dev/null
+++ b/vendor/composer/installers/phpunit.xml.dist
@@ -0,0 +1,25 @@
+
+
+
+
+
+ tests/Composer/Installers
+
+
+
+
+
+ src/Composer/Installers
+
+
+
\ No newline at end of file
diff --git a/vendor/composer/installers/src/Composer/Installers/AglInstaller.php b/vendor/composer/installers/src/Composer/Installers/AglInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..01b8a41659251103b33d05957a438c41efa5a842
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/AglInstaller.php
@@ -0,0 +1,21 @@
+ 'More/{$name}/',
+ );
+
+ /**
+ * Format package name to CamelCase
+ */
+ public function inflectPackageVars($vars)
+ {
+ $vars['name'] = preg_replace_callback('/(?:^|_|-)(.?)/', function ($matches) {
+ return strtoupper($matches[1]);
+ }, $vars['name']);
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php b/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..79a0e958fd4815e612adce43a08b586a29de9cae
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php
@@ -0,0 +1,9 @@
+ 'ext/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php b/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..89d7ad9057d06232b1b5f522a605d08ea674046d
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php
@@ -0,0 +1,11 @@
+ 'addons/modules/{$name}/',
+ 'component' => 'addons/components/{$name}/',
+ 'service' => 'addons/services/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php b/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..995ee2b49b4be10a5a8c0b3c91e2707048aec84b
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php
@@ -0,0 +1,45 @@
+ 'Modules/{$name}/',
+ 'theme' => 'Themes/{$name}/'
+ );
+
+ /**
+ * Format package name.
+ *
+ * For package type asgard-module, cut off a trailing '-plugin' if present.
+ *
+ * For package type asgard-theme, cut off a trailing '-theme' if present.
+ *
+ */
+ public function inflectPackageVars($vars)
+ {
+ if ($vars['type'] === 'asgard-module') {
+ return $this->inflectPluginVars($vars);
+ }
+
+ if ($vars['type'] === 'asgard-theme') {
+ return $this->inflectThemeVars($vars);
+ }
+
+ return $vars;
+ }
+
+ protected function inflectPluginVars($vars)
+ {
+ $vars['name'] = ucfirst(preg_replace('/-module/', '', $vars['name']));
+
+ return $vars;
+ }
+
+ protected function inflectThemeVars($vars)
+ {
+ $vars['name'] = ucfirst(preg_replace('/-theme$/', '', $vars['name']));
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php b/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..cc27d3e2866c48177e77b4b115041a0de11a0fcd
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php
@@ -0,0 +1,131 @@
+composer = $composer;
+ $this->package = $package;
+ }
+
+ /**
+ * Return the install path based on package type.
+ *
+ * @param PackageInterface $package
+ * @param string $frameworkType
+ * @return string
+ */
+ public function getInstallPath(PackageInterface $package, $frameworkType = '')
+ {
+ $type = $this->package->getType();
+
+ $prettyName = $this->package->getPrettyName();
+ if (strpos($prettyName, '/') !== false) {
+ list($vendor, $name) = explode('/', $prettyName);
+ } else {
+ $vendor = '';
+ $name = $prettyName;
+ }
+
+ $availableVars = $this->inflectPackageVars(compact('name', 'vendor', 'type'));
+
+ $extra = $package->getExtra();
+ if (!empty($extra['installer-name'])) {
+ $availableVars['name'] = $extra['installer-name'];
+ }
+
+ if ($this->composer->getPackage()) {
+ $extra = $this->composer->getPackage()->getExtra();
+ if (!empty($extra['installer-paths'])) {
+ $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type);
+ if ($customPath !== false) {
+ return $this->templatePath($customPath, $availableVars);
+ }
+ }
+ }
+
+ $packageType = substr($type, strlen($frameworkType) + 1);
+ $locations = $this->getLocations();
+ if (!isset($locations[$packageType])) {
+ throw new \InvalidArgumentException(sprintf('Package type "%s" is not supported', $type));
+ }
+
+ return $this->templatePath($locations[$packageType], $availableVars);
+ }
+
+ /**
+ * For an installer to override to modify the vars per installer.
+ *
+ * @param array $vars
+ * @return array
+ */
+ public function inflectPackageVars($vars)
+ {
+ return $vars;
+ }
+
+ /**
+ * Gets the installer's locations
+ *
+ * @return array
+ */
+ public function getLocations()
+ {
+ return $this->locations;
+ }
+
+ /**
+ * Replace vars in a path
+ *
+ * @param string $path
+ * @param array $vars
+ * @return string
+ */
+ protected function templatePath($path, array $vars = array())
+ {
+ if (strpos($path, '{') !== false) {
+ extract($vars);
+ preg_match_all('@\{\$([A-Za-z0-9_]*)\}@i', $path, $matches);
+ if (!empty($matches[1])) {
+ foreach ($matches[1] as $var) {
+ $path = str_replace('{$' . $var . '}', $$var, $path);
+ }
+ }
+ }
+
+ return $path;
+ }
+
+ /**
+ * Search through a passed paths array for a custom install path.
+ *
+ * @param array $paths
+ * @param string $name
+ * @param string $type
+ * @return string
+ */
+ protected function mapCustomInstallPaths(array $paths, $name, $type)
+ {
+ foreach ($paths as $path => $names) {
+ if (in_array($name, $names) || in_array('type:' . $type, $names)) {
+ return $path;
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php b/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..48a8367ab6cfd742615405944f809e280c535feb
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php
@@ -0,0 +1,11 @@
+ 'local/modules/{$name}/',
+ 'component' => 'local/components/{$name}/',
+ 'theme' => 'local/templates/{$name}/'
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php b/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..cbeb60b800fb7f5088695f04941aa6c94c292676
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php
@@ -0,0 +1,78 @@
+ 'Plugin/{$name}/',
+ );
+
+ /**
+ * Format package name to CamelCase
+ */
+ public function inflectPackageVars($vars)
+ {
+ if ($this->matchesCakeVersion('>=', '3.0.0')) {
+ return $vars;
+ }
+
+ $nameParts = explode('/', $vars['name']);
+ foreach ($nameParts as &$value) {
+ $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value));
+ $value = str_replace(array('-', '_'), ' ', $value);
+ $value = str_replace(' ', '', ucwords($value));
+ }
+ $vars['name'] = implode('/', $nameParts);
+
+ return $vars;
+ }
+
+ /**
+ * Change the default plugin location when cakephp >= 3.0
+ */
+ public function getLocations()
+ {
+ if ($this->matchesCakeVersion('>=', '3.0.0')) {
+ $this->locations['plugin'] = $this->composer->getConfig()->get('vendor-dir') . '/{$vendor}/{$name}/';
+ }
+ return $this->locations;
+ }
+
+ /**
+ * Check if CakePHP version matches against a version
+ *
+ * @param string $matcher
+ * @param string $version
+ * @return bool
+ */
+ protected function matchesCakeVersion($matcher, $version)
+ {
+ $repositoryManager = $this->composer->getRepositoryManager();
+ if ($repositoryManager) {
+ $repos = $repositoryManager->getLocalRepository();
+ if (!$repos) {
+ return false;
+ }
+ $cake3 = new MultiConstraint(array(
+ new VersionConstraint($matcher, $version),
+ new VersionConstraint('!=', '9999999-dev'),
+ ));
+ $pool = new Pool('dev');
+ $pool->addRepository($repos);
+ $packages = $pool->whatProvides('cakephp/cakephp');
+ foreach ($packages as $package) {
+ $installed = new VersionConstraint('=', $package->getVersion());
+ if ($cake3->matches($installed)) {
+ return true;
+ break;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php b/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..ab2f9aad807c230cdfd1e6b3774374bc08bd1614
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php
@@ -0,0 +1,11 @@
+ 'Chef/{$vendor}/{$name}/',
+ 'role' => 'Chef/roles/{$name}/',
+ );
+}
+
diff --git a/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php b/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..c887815c95abfaa3fc45a4ee0e46bb9f53603d09
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php
@@ -0,0 +1,10 @@
+ 'CCF/orbit/{$name}/',
+ 'theme' => 'CCF/app/themes/{$name}/',
+ );
+}
\ No newline at end of file
diff --git a/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php b/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..3b4a4ece11abe7a790ebc7e8bf0dc1d3d1809715
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php
@@ -0,0 +1,11 @@
+ 'application/libraries/{$name}/',
+ 'third-party' => 'application/third_party/{$name}/',
+ 'module' => 'application/modules/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php b/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php
new file mode 100644
index 0000000000000000000000000000000000000000..4d398a445dc6c354191e506c4b1ce5ee87cd9a71
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php
@@ -0,0 +1,12 @@
+ 'blocks/{$name}/',
+ 'package' => 'packages/{$name}/',
+ 'theme' => 'themes/{$name}/',
+ 'update' => 'updates/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php b/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..dc3be8d1a5fef8358046996ee2f24bf795c2e882
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php
@@ -0,0 +1,9 @@
+ 'craft/plugins/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php b/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..d94219d3a45e237ce3db0e18cdcad72159ef40ad
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php
@@ -0,0 +1,21 @@
+ 'Plugin/{$name}/',
+ 'theme' => 'View/Themed/{$name}/',
+ );
+
+ /**
+ * Format package name to CamelCase
+ */
+ public function inflectPackageVars($vars)
+ {
+ $vars['name'] = strtolower(str_replace(array('-', '_'), ' ', $vars['name']));
+ $vars['name'] = str_replace(' ', '', ucwords($vars['name']));
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php b/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..cfd638d5f5f85e46437d372da709389888bbc702
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php
@@ -0,0 +1,50 @@
+ 'lib/plugins/{$name}/',
+ 'template' => 'lib/tpl/{$name}/',
+ );
+
+ /**
+ * Format package name.
+ *
+ * For package type dokuwiki-plugin, cut off a trailing '-plugin',
+ * or leading dokuwiki_ if present.
+ *
+ * For package type dokuwiki-template, cut off a trailing '-template' if present.
+ *
+ */
+ public function inflectPackageVars($vars)
+ {
+
+ if ($vars['type'] === 'dokuwiki-plugin') {
+ return $this->inflectPluginVars($vars);
+ }
+
+ if ($vars['type'] === 'dokuwiki-template') {
+ return $this->inflectTemplateVars($vars);
+ }
+
+ return $vars;
+ }
+
+ protected function inflectPluginVars($vars)
+ {
+ $vars['name'] = preg_replace('/-plugin$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']);
+
+ return $vars;
+ }
+
+ protected function inflectTemplateVars($vars)
+ {
+ $vars['name'] = preg_replace('/-template$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']);
+
+ return $vars;
+ }
+
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php b/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..21f7e8e801625884471cb095d39b82e6f373ac60
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php
@@ -0,0 +1,16 @@
+
+ */
+class DolibarrInstaller extends BaseInstaller
+{
+ //TODO: Add support for scripts and themes
+ protected $locations = array(
+ 'module' => 'htdocs/custom/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php b/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..179413145fcbb17d20ed4661a8c4d1e1877bad1c
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php
@@ -0,0 +1,14 @@
+ 'core/',
+ 'module' => 'modules/{$name}/',
+ 'theme' => 'themes/{$name}/',
+ 'library' => 'libraries/{$name}/',
+ 'profile' => 'profiles/{$name}/',
+ 'drush' => 'drush/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php b/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..c0bb609f4fe2392bc7e596f1d15d39011fde6b9f
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php
@@ -0,0 +1,9 @@
+ 'mod/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php b/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..6eba2e34f2f55a94a6a96ec0599b1fe9e00f59b2
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php
@@ -0,0 +1,11 @@
+ 'fuel/app/modules/{$name}/',
+ 'package' => 'fuel/packages/{$name}/',
+ 'theme' => 'fuel/app/themes/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php b/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..29d980b30da5cfed375b6a8456dd7ccdb3754683
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php
@@ -0,0 +1,9 @@
+ 'components/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/GravInstaller.php b/vendor/composer/installers/src/Composer/Installers/GravInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..dbe63e07ec2eae260ad3ca5464a02eb85615999e
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/GravInstaller.php
@@ -0,0 +1,30 @@
+ 'user/plugins/{$name}/',
+ 'theme' => 'user/themes/{$name}/',
+ );
+
+ /**
+ * Format package name
+ *
+ * @param array $vars
+ *
+ * @return array
+ */
+ public function inflectPackageVars($vars)
+ {
+ $restrictedWords = implode('|', array_keys($this->locations));
+
+ $vars['name'] = strtolower($vars['name']);
+ $vars['name'] = preg_replace('/^(?:grav-)?(?:(?:'.$restrictedWords.')-)?(.*?)(?:-(?:'.$restrictedWords.'))?$/ui',
+ '$1',
+ $vars['name']
+ );
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php b/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..8fe017f0f744c4cf36e68fb0e49b4cd5104b4e36
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php
@@ -0,0 +1,25 @@
+ 'plugins/{$name}/',
+ 'theme' => 'plugins/{$name}/',
+ );
+
+ /**
+ * Format package name to CamelCase
+ */
+ public function inflectPackageVars($vars)
+ {
+ $nameParts = explode('/', $vars['name']);
+ foreach ($nameParts as &$value) {
+ $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value));
+ $value = str_replace(array('-', '_'), ' ', $value);
+ $value = str_replace(' ', '', ucwords($value));
+ }
+ $vars['name'] = implode('/', $nameParts);
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/Installer.php b/vendor/composer/installers/src/Composer/Installers/Installer.php
new file mode 100644
index 0000000000000000000000000000000000000000..63ba64ce37874647aa0d34c688d7bb7a5c835091
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/Installer.php
@@ -0,0 +1,163 @@
+ 'AimeosInstaller',
+ 'asgard' => 'AsgardInstaller',
+ 'agl' => 'AglInstaller',
+ 'annotatecms' => 'AnnotateCmsInstaller',
+ 'bitrix' => 'BitrixInstaller',
+ 'cakephp' => 'CakePHPInstaller',
+ 'chef' => 'ChefInstaller',
+ 'ccframework' => 'ClanCatsFrameworkInstaller',
+ 'codeigniter' => 'CodeIgniterInstaller',
+ 'concrete5' => 'Concrete5Installer',
+ 'craft' => 'CraftInstaller',
+ 'croogo' => 'CroogoInstaller',
+ 'dokuwiki' => 'DokuWikiInstaller',
+ 'dolibarr' => 'DolibarrInstaller',
+ 'drupal' => 'DrupalInstaller',
+ 'elgg' => 'ElggInstaller',
+ 'fuel' => 'FuelInstaller',
+ 'fuelphp' => 'FuelphpInstaller',
+ 'grav' => 'GravInstaller',
+ 'hurad' => 'HuradInstaller',
+ 'joomla' => 'JoomlaInstaller',
+ 'kirby' => 'KirbyInstaller',
+ 'kohana' => 'KohanaInstaller',
+ 'laravel' => 'LaravelInstaller',
+ 'lithium' => 'LithiumInstaller',
+ 'magento' => 'MagentoInstaller',
+ 'mako' => 'MakoInstaller',
+ 'mediawiki' => 'MediaWikiInstaller',
+ 'microweber' => 'MicroweberInstaller',
+ 'modulework' => 'MODULEWorkInstaller',
+ 'modxevo' => 'MODXEvoInstaller',
+ 'moodle' => 'MoodleInstaller',
+ 'october' => 'OctoberInstaller',
+ 'oxid' => 'OxidInstaller',
+ 'phpbb' => 'PhpBBInstaller',
+ 'pimcore' => 'PimcoreInstaller',
+ 'piwik' => 'PiwikInstaller',
+ 'ppi' => 'PPIInstaller',
+ 'puppet' => 'PuppetInstaller',
+ 'redaxo' => 'RedaxoInstaller',
+ 'roundcube' => 'RoundcubeInstaller',
+ 'shopware' => 'ShopwareInstaller',
+ 'silverstripe' => 'SilverStripeInstaller',
+ 'smf' => 'SMFInstaller',
+ 'symfony1' => 'Symfony1Installer',
+ 'thelia' => 'TheliaInstaller',
+ 'tusk' => 'TuskInstaller',
+ 'typo3-cms' => 'TYPO3CmsInstaller',
+ 'typo3-flow' => 'TYPO3FlowInstaller',
+ 'whmcs' => 'WHMCSInstaller',
+ 'wolfcms' => 'WolfCMSInstaller',
+ 'wordpress' => 'WordPressInstaller',
+ 'zend' => 'ZendInstaller',
+ 'zikula' => 'ZikulaInstaller',
+ 'prestashop' => 'PrestashopInstaller',
+ );
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getInstallPath(PackageInterface $package)
+ {
+ $type = $package->getType();
+ $frameworkType = $this->findFrameworkType($type);
+
+ if ($frameworkType === false) {
+ throw new \InvalidArgumentException(
+ 'Sorry the package type of this package is not yet supported.'
+ );
+ }
+
+ $class = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType];
+ $installer = new $class($package, $this->composer);
+
+ return $installer->getInstallPath($package, $frameworkType);
+ }
+
+ public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package)
+ {
+ if (!$repo->hasPackage($package)) {
+ throw new \InvalidArgumentException('Package is not installed: '.$package);
+ }
+
+ $repo->removePackage($package);
+
+ $installPath = $this->getInstallPath($package);
+ $this->io->write(sprintf('Deleting %s - %s', $installPath, $this->filesystem->removeDirectory($installPath) ? 'deleted ' : 'not deleted '));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function supports($packageType)
+ {
+ $frameworkType = $this->findFrameworkType($packageType);
+
+ if ($frameworkType === false) {
+ return false;
+ }
+
+ $locationPattern = $this->getLocationPattern($frameworkType);
+
+ return preg_match('#' . $frameworkType . '-' . $locationPattern . '#', $packageType, $matches) === 1;
+ }
+
+ /**
+ * Finds a supported framework type if it exists and returns it
+ *
+ * @param string $type
+ * @return string
+ */
+ protected function findFrameworkType($type)
+ {
+ $frameworkType = false;
+
+ krsort($this->supportedTypes);
+
+ foreach ($this->supportedTypes as $key => $val) {
+ if ($key === substr($type, 0, strlen($key))) {
+ $frameworkType = substr($type, 0, strlen($key));
+ break;
+ }
+ }
+
+ return $frameworkType;
+ }
+
+ /**
+ * Get the second part of the regular expression to check for support of a
+ * package type
+ *
+ * @param string $frameworkType
+ * @return string
+ */
+ protected function getLocationPattern($frameworkType)
+ {
+ $pattern = false;
+ if (!empty($this->supportedTypes[$frameworkType])) {
+ $frameworkClass = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType];
+ /** @var BaseInstaller $framework */
+ $framework = new $frameworkClass(null, $this->composer);
+ $locations = array_keys($framework->getLocations());
+ $pattern = $locations ? '(' . implode('|', $locations) . ')' : false;
+ }
+
+ return $pattern ? : '(\w+)';
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php b/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ee7759651a54321b5bfa57e9077240ea17b7950
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php
@@ -0,0 +1,15 @@
+ 'components/{$name}/',
+ 'module' => 'modules/{$name}/',
+ 'template' => 'templates/{$name}/',
+ 'plugin' => 'plugins/{$name}/',
+ 'library' => 'libraries/{$name}/',
+ );
+
+ // TODO: Add inflector for mod_ and com_ names
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php b/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae7ba8a4b24bc24b70df62cab0a4b93c95e7439e
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php
@@ -0,0 +1,9 @@
+ 'site/plugins/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php b/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..dcd6d26322a052a765eabdaaf57c8b248f25f38c
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php
@@ -0,0 +1,9 @@
+ 'modules/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php b/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..be4d53a7bd3a8c3f05cd28280a15de68beaad430
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php
@@ -0,0 +1,9 @@
+ 'libraries/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php b/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..47bbd4cabebf966237567578745ca6fe3380d402
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php
@@ -0,0 +1,10 @@
+ 'libraries/{$name}/',
+ 'source' => 'libraries/_source/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php b/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..9c2e9fb40c346a6faedc3ad5b4652eef213d3991
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php
@@ -0,0 +1,9 @@
+ 'modules/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php b/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..5a664608df92681a1c23c0f18a0d70ab555e3254
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php
@@ -0,0 +1,16 @@
+ 'assets/snippets/{$name}/',
+ 'plugin' => 'assets/plugins/{$name}/',
+ 'module' => 'assets/modules/{$name}/',
+ 'template' => 'assets/templates/{$name}/',
+ 'lib' => 'assets/lib/{$name}/'
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php b/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..cf18e9478ce7bf7e5e74fb9ce82268f2ff9a5d6c
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php
@@ -0,0 +1,11 @@
+ 'app/design/frontend/{$name}/',
+ 'skin' => 'skin/frontend/default/{$name}/',
+ 'library' => 'lib/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php b/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca3cfacb49acf1a0b9ee642350c488bd1b880124
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php
@@ -0,0 +1,9 @@
+ 'app/packages/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php b/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..01008c638e188d9994ed1b00146172c0187d80d0
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php
@@ -0,0 +1,50 @@
+ 'extensions/{$name}/',
+ 'skin' => 'skins/{$name}/',
+ );
+
+ /**
+ * Format package name.
+ *
+ * For package type mediawiki-extension, cut off a trailing '-extension' if present and transform
+ * to CamelCase keeping existing uppercase chars.
+ *
+ * For package type mediawiki-skin, cut off a trailing '-skin' if present.
+ *
+ */
+ public function inflectPackageVars($vars)
+ {
+
+ if ($vars['type'] === 'mediawiki-extension') {
+ return $this->inflectExtensionVars($vars);
+ }
+
+ if ($vars['type'] === 'mediawiki-skin') {
+ return $this->inflectSkinVars($vars);
+ }
+
+ return $vars;
+ }
+
+ protected function inflectExtensionVars($vars)
+ {
+ $vars['name'] = preg_replace('/-extension$/', '', $vars['name']);
+ $vars['name'] = str_replace('-', ' ', $vars['name']);
+ $vars['name'] = str_replace(' ', '', ucwords($vars['name']));
+
+ return $vars;
+ }
+
+ protected function inflectSkinVars($vars)
+ {
+ $vars['name'] = preg_replace('/-skin$/', '', $vars['name']);
+
+ return $vars;
+ }
+
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php b/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..4bbbec8c06b1a4adc56c87e60d421a68419625bf
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php
@@ -0,0 +1,111 @@
+ 'userfiles/modules/{$name}/',
+ 'module-skin' => 'userfiles/modules/{$name}/templates/',
+ 'template' => 'userfiles/templates/{$name}/',
+ 'element' => 'userfiles/elements/{$name}/',
+ 'vendor' => 'vendor/{$name}/',
+ 'components' => 'components/{$name}/'
+ );
+
+ /**
+ * Format package name.
+ *
+ * For package type microweber-module, cut off a trailing '-module' if present
+ *
+ * For package type microweber-template, cut off a trailing '-template' if present.
+ *
+ */
+ public function inflectPackageVars($vars)
+ {
+ if ($vars['type'] === 'microweber-template') {
+ return $this->inflectTemplateVars($vars);
+ }
+ if ($vars['type'] === 'microweber-templates') {
+ return $this->inflectTemplatesVars($vars);
+ }
+ if ($vars['type'] === 'microweber-core') {
+ return $this->inflectCoreVars($vars);
+ }
+ if ($vars['type'] === 'microweber-adapter') {
+ return $this->inflectCoreVars($vars);
+ }
+ if ($vars['type'] === 'microweber-module') {
+ return $this->inflectModuleVars($vars);
+ }
+ if ($vars['type'] === 'microweber-modules') {
+ return $this->inflectModulesVars($vars);
+ }
+ if ($vars['type'] === 'microweber-skin') {
+ return $this->inflectSkinVars($vars);
+ }
+ if ($vars['type'] === 'microweber-element' or $vars['type'] === 'microweber-elements') {
+ return $this->inflectElementVars($vars);
+ }
+
+ return $vars;
+ }
+
+ protected function inflectTemplateVars($vars)
+ {
+ $vars['name'] = preg_replace('/-template$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/template-$/', '', $vars['name']);
+
+ return $vars;
+ }
+
+ protected function inflectTemplatesVars($vars)
+ {
+ $vars['name'] = preg_replace('/-templates$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/templates-$/', '', $vars['name']);
+
+ return $vars;
+ }
+
+ protected function inflectCoreVars($vars)
+ {
+ $vars['name'] = preg_replace('/-providers$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/-provider$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/-adapter$/', '', $vars['name']);
+
+ return $vars;
+ }
+
+ protected function inflectModuleVars($vars)
+ {
+ $vars['name'] = preg_replace('/-module$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/module-$/', '', $vars['name']);
+
+ return $vars;
+ }
+
+ protected function inflectModulesVars($vars)
+ {
+ $vars['name'] = preg_replace('/-modules$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/modules-$/', '', $vars['name']);
+
+ return $vars;
+ }
+
+ protected function inflectSkinVars($vars)
+ {
+ $vars['name'] = preg_replace('/-skin$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/skin-$/', '', $vars['name']);
+
+ return $vars;
+ }
+
+ protected function inflectElementVars($vars)
+ {
+ $vars['name'] = preg_replace('/-elements$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/elements-$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/-element$/', '', $vars['name']);
+ $vars['name'] = preg_replace('/element-$/', '', $vars['name']);
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php b/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..04be73c2a84e6baa05273801c78e72adb59546df
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php
@@ -0,0 +1,47 @@
+ 'mod/{$name}/',
+ 'admin_report' => 'admin/report/{$name}/',
+ 'tool' => 'admin/tool/{$name}/',
+ 'assignment' => 'mod/assignment/type/{$name}/',
+ 'assignsubmission' => 'mod/assign/submission/{$name}/',
+ 'assignfeedback' => 'mod/assign/feedback/{$name}/',
+ 'auth' => 'auth/{$name}/',
+ 'availability' => 'availability/condition/{$name}/',
+ 'block' => 'blocks/{$name}/',
+ 'calendartype' => 'calendar/type/{$name}/',
+ 'format' => 'course/format/{$name}/',
+ 'coursereport' => 'course/report/{$name}/',
+ 'datafield' => 'mod/data/field/{$name}/',
+ 'datapreset' => 'mod/data/preset/{$name}/',
+ 'editor' => 'lib/editor/{$name}/',
+ 'enrol' => 'enrol/{$name}/',
+ 'filter' => 'filter/{$name}/',
+ 'gradeexport' => 'grade/export/{$name}/',
+ 'gradeimport' => 'grade/import/{$name}/',
+ 'gradereport' => 'grade/report/{$name}/',
+ 'gradingform' => 'grade/grading/form/{$name}/',
+ 'local' => 'local/{$name}/',
+ 'message' => 'message/output/{$name}/',
+ 'plagiarism' => 'plagiarism/{$name}/',
+ 'portfolio' => 'portfolio/{$name}/',
+ 'qbehaviour' => 'question/behaviour/{$name}/',
+ 'qformat' => 'question/format/{$name}/',
+ 'qtype' => 'question/type/{$name}/',
+ 'quizaccess' => 'mod/quiz/accessrule/{$name}/',
+ 'quiz' => 'mod/quiz/report/{$name}/',
+ 'report' => 'report/{$name}/',
+ 'repository' => 'repository/{$name}/',
+ 'scormreport' => 'mod/scorm/report/{$name}/',
+ 'theme' => 'theme/{$name}/',
+ 'profilefield' => 'user/profile/field/{$name}/',
+ 'webservice' => 'webservice/{$name}/',
+ 'workshopallocation' => 'mod/workshop/allocation/{$name}/',
+ 'workshopeval' => 'mod/workshop/eval/{$name}/',
+ 'workshopform' => 'mod/workshop/form/{$name}/'
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php b/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..6bf53fd141a168c5de54b4dd27dde98a9fa7d3cd
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php
@@ -0,0 +1,46 @@
+ 'modules/{$name}/',
+ 'plugin' => 'plugins/{$vendor}/{$name}/',
+ 'theme' => 'themes/{$name}/'
+ );
+
+ /**
+ * Format package name.
+ *
+ * For package type october-plugin, cut off a trailing '-plugin' if present.
+ *
+ * For package type october-theme, cut off a trailing '-theme' if present.
+ *
+ */
+ public function inflectPackageVars($vars)
+ {
+ if ($vars['type'] === 'october-plugin') {
+ return $this->inflectPluginVars($vars);
+ }
+
+ if ($vars['type'] === 'october-theme') {
+ return $this->inflectThemeVars($vars);
+ }
+
+ return $vars;
+ }
+
+ protected function inflectPluginVars($vars)
+ {
+ $vars['name'] = preg_replace('/-plugin$/', '', $vars['name']);
+
+ return $vars;
+ }
+
+ protected function inflectThemeVars($vars)
+ {
+ $vars['name'] = preg_replace('/-theme$/', '', $vars['name']);
+
+ return $vars;
+ }
+}
\ No newline at end of file
diff --git a/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php b/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..22fb56aa15118d0802a2d30a67415cfe1031dcf6
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php
@@ -0,0 +1,11 @@
+ 'modules/{$name}/',
+ 'theme' => 'application/views/{$name}/',
+ 'out' => 'out/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php b/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..170136f98409672cd65eb1e7fc542f45687079fa
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php
@@ -0,0 +1,9 @@
+ 'modules/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php b/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..deb2b77a67edae79e1306a09509bbb861a1fc1b0
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php
@@ -0,0 +1,11 @@
+ 'ext/{$vendor}/{$name}/',
+ 'language' => 'language/{$name}/',
+ 'style' => 'styles/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php b/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..4781fa6d107600487b4bb701a18ef4bd0b40393d
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php
@@ -0,0 +1,21 @@
+ 'plugins/{$name}/',
+ );
+
+ /**
+ * Format package name to CamelCase
+ */
+ public function inflectPackageVars($vars)
+ {
+ $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name']));
+ $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']);
+ $vars['name'] = str_replace(' ', '', ucwords($vars['name']));
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php b/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..c17f4572b3280da83e0d01813c55034d4ffdc8e2
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php
@@ -0,0 +1,32 @@
+ 'plugins/{$name}/',
+ );
+
+ /**
+ * Format package name to CamelCase
+ * @param array $vars
+ *
+ * @return array
+ */
+ public function inflectPackageVars($vars)
+ {
+ $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name']));
+ $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']);
+ $vars['name'] = str_replace(' ', '', ucwords($vars['name']));
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php b/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..4c8421e36409e3d746d02f21170104eaabca8135
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php
@@ -0,0 +1,10 @@
+ 'modules/{$name}/',
+ 'theme' => 'themes/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php b/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..77cc3dd8777a1db611040e02d3620f19d118188f
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php
@@ -0,0 +1,11 @@
+ 'modules/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php b/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..09544576b20546aa5f0b06377c2dac66ebfe0935
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php
@@ -0,0 +1,10 @@
+ 'redaxo/include/addons/{$name}/',
+ 'bestyle-plugin' => 'redaxo/include/addons/be_style/plugins/{$name}/'
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php b/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..d8d795be0972b5616119b27efd6366861c2dbabc
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php
@@ -0,0 +1,22 @@
+ 'plugins/{$name}/',
+ );
+
+ /**
+ * Lowercase name and changes the name to a underscores
+ *
+ * @param array $vars
+ * @return array
+ */
+ public function inflectPackageVars($vars)
+ {
+ $vars['name'] = strtolower(str_replace('-', '_', $vars['name']));
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php b/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..1acd3b14c38b95c27861c4bbcd055342df16a072
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php
@@ -0,0 +1,10 @@
+ 'Sources/{$name}/',
+ 'theme' => 'Themes/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php b/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..673f1fc1f284b1a99a2e0669ee96b9e22474f54d
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php
@@ -0,0 +1,58 @@
+ 'engine/Shopware/Plugins/Local/Backend/{$name}/',
+ 'core-plugin' => 'engine/Shopware/Plugins/Local/Core/{$name}/',
+ 'frontend-plugin' => 'engine/Shopware/Plugins/Local/Frontend/{$name}/',
+ 'theme' => 'templates/{$name}/'
+ );
+
+ /**
+ * Transforms the names
+ * @param array $vars
+ * @return array
+ */
+ public function inflectPackageVars($vars)
+ {
+ if ($vars['type'] === 'shopware-theme') {
+ return $this->correctThemeName($vars);
+ } else {
+ return $this->correctPluginName($vars);
+ }
+ }
+
+ /**
+ * Changes the name to a camelcased combination of vendor and name
+ * @param array $vars
+ * @return array
+ */
+ private function correctPluginName($vars)
+ {
+ $camelCasedName = preg_replace_callback('/(-[a-z])/', function ($matches) {
+ return strtoupper($matches[0][1]);
+ }, $vars['name']);
+
+ $vars['name'] = ucfirst($vars['vendor']) . ucfirst($camelCasedName);
+
+ return $vars;
+ }
+
+ /**
+ * Changes the name to a underscore separated name
+ * @param array $vars
+ * @return array
+ */
+ private function correctThemeName($vars)
+ {
+ $vars['name'] = str_replace('-', '_', $vars['name']);
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php b/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..17ca543a2569e82162b9266eadcda05bfb4d1700
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php
@@ -0,0 +1,36 @@
+ '{$name}/',
+ 'theme' => 'themes/{$name}/',
+ );
+
+ /**
+ * Return the install path based on package type.
+ *
+ * Relies on built-in BaseInstaller behaviour with one exception: silverstripe/framework
+ * must be installed to 'sapphire' and not 'framework' if the version is <3.0.0
+ *
+ * @param PackageInterface $package
+ * @param string $frameworkType
+ * @return string
+ */
+ public function getInstallPath(PackageInterface $package, $frameworkType = '')
+ {
+ if (
+ $package->getName() == 'silverstripe/framework'
+ && preg_match('/^\d+\.\d+\.\d+/', $package->getVersion())
+ && version_compare($package->getVersion(), '2.999.999') < 0
+ ) {
+ return $this->templatePath($this->locations['module'], array('name' => 'sapphire'));
+ } else {
+ return parent::getInstallPath($package, $frameworkType);
+ }
+
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php b/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php
new file mode 100644
index 0000000000000000000000000000000000000000..1675c4f213bd1ec7f425ab18cb8dd25df2d96d69
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php
@@ -0,0 +1,26 @@
+
+ */
+class Symfony1Installer extends BaseInstaller
+{
+ protected $locations = array(
+ 'plugin' => 'plugins/{$name}/',
+ );
+
+ /**
+ * Format package name to CamelCase
+ */
+ public function inflectPackageVars($vars)
+ {
+ $vars['name'] = preg_replace_callback('/(-[a-z])/', function ($matches) {
+ return strtoupper($matches[0][1]);
+ }, $vars['name']);
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php b/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..8220b40df9444dfa679647ca57345f05fb9c3895
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php
@@ -0,0 +1,14 @@
+
+ */
+class TYPO3CmsInstaller extends BaseInstaller
+{
+ protected $locations = array(
+ 'extension' => 'typo3conf/ext/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php b/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..42572f44f56ad08108f39ec42976082918fa4b3d
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php
@@ -0,0 +1,38 @@
+ 'Packages/Application/{$name}/',
+ 'framework' => 'Packages/Framework/{$name}/',
+ 'plugin' => 'Packages/Plugins/{$name}/',
+ 'site' => 'Packages/Sites/{$name}/',
+ 'boilerplate' => 'Packages/Boilerplates/{$name}/',
+ 'build' => 'Build/{$name}/',
+ );
+
+ /**
+ * Modify the package name to be a TYPO3 Flow style key.
+ *
+ * @param array $vars
+ * @return array
+ */
+ public function inflectPackageVars($vars)
+ {
+ $autoload = $this->package->getAutoload();
+ if (isset($autoload['psr-0']) && is_array($autoload['psr-0'])) {
+ $namespace = key($autoload['psr-0']);
+ $vars['name'] = str_replace('\\', '.', $namespace);
+ }
+ if (isset($autoload['psr-4']) && is_array($autoload['psr-4'])) {
+ $namespace = key($autoload['psr-4']);
+ $vars['name'] = rtrim(str_replace('\\', '.', $namespace), '.');
+ }
+
+ return $vars;
+ }
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php b/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..158af52610b6eacd264965b1a79891afca0c61a8
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php
@@ -0,0 +1,12 @@
+ 'local/modules/{$name}/',
+ 'frontoffice-template' => 'templates/frontOffice/{$name}/',
+ 'backoffice-template' => 'templates/backOffice/{$name}/',
+ 'email-template' => 'templates/email/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php b/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c0113b85a6754bb83581f49666abe4b520e0883
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php
@@ -0,0 +1,14 @@
+
+ */
+ class TuskInstaller extends BaseInstaller
+ {
+ protected $locations = array(
+ 'task' => '.tusk/tasks/{$name}/',
+ 'command' => '.tusk/commands/{$name}/',
+ 'asset' => 'assets/tusk/{$name}/',
+ );
+ }
diff --git a/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php b/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..2cbb4a463b7ef5999fcfd6f584e10319552c1f05
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php
@@ -0,0 +1,10 @@
+ 'modules/gateways/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php b/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..cb387881dc9075c10b58bc53680d99ec5c0c96d8
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php
@@ -0,0 +1,9 @@
+ 'wolf/plugins/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php b/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..b03219c696b8bcc9fadac373ff7fb5a192f346fb
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php
@@ -0,0 +1,11 @@
+ 'wp-content/plugins/{$name}/',
+ 'theme' => 'wp-content/themes/{$name}/',
+ 'muplugin' => 'wp-content/mu-plugins/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php b/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..bde9bc8c848792b9bf8d07253be1a6c7aba506f7
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php
@@ -0,0 +1,11 @@
+ 'library/{$name}/',
+ 'extra' => 'extras/library/{$name}/',
+ 'module' => 'module/{$name}/',
+ );
+}
diff --git a/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php b/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php
new file mode 100644
index 0000000000000000000000000000000000000000..56cdf5da75d7930f3b00b2faaa135480f88e89bf
--- /dev/null
+++ b/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php
@@ -0,0 +1,10 @@
+ 'modules/{$vendor}-{$name}/',
+ 'theme' => 'themes/{$vendor}-{$name}/'
+ );
+}
diff --git a/vendor/composer/installers/src/bootstrap.php b/vendor/composer/installers/src/bootstrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..0de276ee26cfcd78da02db1155c9a3d2eab498bd
--- /dev/null
+++ b/vendor/composer/installers/src/bootstrap.php
@@ -0,0 +1,13 @@
+installer = new AsgardInstaller(
+ new Package('NyanCat', '4.2', '4.2'),
+ new Composer()
+ );
+ }
+
+ /**
+ * @dataProvider packageNameInflectionProvider
+ */
+ public function testInflectPackageVars($type, $name, $expected)
+ {
+ $this->assertEquals(
+ $this->installer->inflectPackageVars(array('name' => $name, 'type' => $type)),
+ array('name' => $expected, 'type' => $type)
+ );
+ }
+
+ public function packageNameInflectionProvider()
+ {
+ return array(
+ array(
+ 'asgard-module',
+ 'asgard-module',
+ 'Asgard'
+ ),
+ array(
+ 'asgard-module',
+ 'blog',
+ 'Blog'
+ ),
+ // tests that exactly one '-theme' is cut off
+ array(
+ 'asgard-theme',
+ 'some-theme-theme',
+ 'Some-theme',
+ ),
+ // tests that names without '-theme' suffix stay valid
+ array(
+ 'asgard-theme',
+ 'someothertheme',
+ 'Someothertheme',
+ ),
+ );
+ }
+}
diff --git a/vendor/composer/installers/tests/Composer/Installers/Test/CakePHPInstallerTest.php b/vendor/composer/installers/tests/Composer/Installers/Test/CakePHPInstallerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..976bd9be8f3e7e532bf42b48f35b2518b53a6a28
--- /dev/null
+++ b/vendor/composer/installers/tests/Composer/Installers/Test/CakePHPInstallerTest.php
@@ -0,0 +1,115 @@
+package = new Package('CamelCased', '1.0', '1.0');
+ $this->io = $this->getMock('Composer\IO\PackageInterface');
+ $this->composer = new Composer();
+ $this->composer->setConfig(new Config(false));
+ }
+
+ /**
+ * testInflectPackageVars
+ *
+ * @return void
+ */
+ public function testInflectPackageVars()
+ {
+ $installer = new CakePHPInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'CamelCased'));
+ $this->assertEquals($result, array('name' => 'CamelCased'));
+
+ $installer = new CakePHPInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'with-dash'));
+ $this->assertEquals($result, array('name' => 'WithDash'));
+
+ $installer = new CakePHPInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'with_underscore'));
+ $this->assertEquals($result, array('name' => 'WithUnderscore'));
+
+ $installer = new CakePHPInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'cake/acl'));
+ $this->assertEquals($result, array('name' => 'Cake/Acl'));
+
+ $installer = new CakePHPInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'cake/debug-kit'));
+ $this->assertEquals($result, array('name' => 'Cake/DebugKit'));
+ }
+
+ /**
+ * Test getLocations returning appropriate values based on CakePHP version
+ *
+ */
+ public function testGetLocations() {
+ $package = new RootPackage('CamelCased', '1.0', '1.0');
+ $composer = $this->composer;
+ $rm = new RepositoryManager(
+ $this->getMock('Composer\IO\IOInterface'),
+ $this->getMock('Composer\Config')
+ );
+ $composer->setRepositoryManager($rm);
+ $installer = new CakePHPInstaller($package, $composer);
+
+ // 2.0 < cakephp < 3.0
+ $this->setCakephpVersion($rm, '2.0.0');
+ $result = $installer->getLocations();
+ $this->assertContains('Plugin/', $result['plugin']);
+
+ $this->setCakephpVersion($rm, '2.5.9');
+ $result = $installer->getLocations();
+ $this->assertContains('Plugin/', $result['plugin']);
+
+ $this->setCakephpVersion($rm, '~2.5');
+ $result = $installer->getLocations();
+ $this->assertContains('Plugin/', $result['plugin']);
+
+ // special handling for 2.x versions when 3.x is still in development
+ $this->setCakephpVersion($rm, 'dev-master');
+ $result = $installer->getLocations();
+ $this->assertContains('Plugin/', $result['plugin']);
+
+ $this->setCakephpVersion($rm, '>=2.5');
+ $result = $installer->getLocations();
+ $this->assertContains('Plugin/', $result['plugin']);
+
+ // cakephp >= 3.0
+ $this->setCakephpVersion($rm, '3.0.*-dev');
+ $result = $installer->getLocations();
+ $this->assertContains('vendor/{$vendor}/{$name}/', $result['plugin']);
+
+ $this->setCakephpVersion($rm, '~8.8');
+ $result = $installer->getLocations();
+ $this->assertEquals('vendor/{$vendor}/{$name}/', $result['plugin']);
+ }
+
+ protected function setCakephpVersion($rm, $version) {
+ $parser = new VersionParser();
+ list(, $version) = explode(' ', $parser->parseConstraints($version));
+ $installed = new InstalledArrayRepository();
+ $package = new Package('cakephp/cakephp', $version, $version);
+ $installed->addPackage($package);
+ $rm->setLocalRepository($installed);
+ }
+
+}
diff --git a/vendor/composer/installers/tests/Composer/Installers/Test/DokuWikiInstallerTest.php b/vendor/composer/installers/tests/Composer/Installers/Test/DokuWikiInstallerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..9e385e6a8fc18467d1a16f2dde89e5a0e903ccba
--- /dev/null
+++ b/vendor/composer/installers/tests/Composer/Installers/Test/DokuWikiInstallerTest.php
@@ -0,0 +1,89 @@
+installer = new DokuWikiInstaller(
+ new Package('NyanCat', '4.2', '4.2'),
+ new Composer()
+ );
+ }
+
+ /**
+ * @dataProvider packageNameInflectionProvider
+ */
+ public function testInflectPackageVars($type, $name, $expected)
+ {
+ $this->assertEquals(
+ $this->installer->inflectPackageVars(array('name' => $name, 'type'=>$type)),
+ array('name' => $expected, 'type'=>$type)
+ );
+ }
+
+ public function packageNameInflectionProvider()
+ {
+ return array(
+ array(
+ 'dokuwiki-plugin',
+ 'dokuwiki-test-plugin',
+ 'test',
+ ),
+ array(
+ 'dokuwiki-plugin',
+ 'test-plugin',
+ 'test',
+ ),
+ array(
+ 'dokuwiki-plugin',
+ 'dokuwiki_test',
+ 'test',
+ ),
+ array(
+ 'dokuwiki-plugin',
+ 'test',
+ 'test',
+ ),
+ array(
+ 'dokuwiki-plugin',
+ 'test-template',
+ 'test-template',
+ ),
+ array(
+ 'dokuwiki-template',
+ 'dokuwiki-test-template',
+ 'test',
+ ),
+ array(
+ 'dokuwiki-template',
+ 'test-template',
+ 'test',
+ ),
+ array(
+ 'dokuwiki-template',
+ 'dokuwiki_test',
+ 'test',
+ ),
+ array(
+ 'dokuwiki-template',
+ 'test',
+ 'test',
+ ),
+ array(
+ 'dokuwiki-template',
+ 'test-plugin',
+ 'test-plugin',
+ ),
+ );
+ }
+}
diff --git a/vendor/composer/installers/tests/Composer/Installers/Test/GravInstallerTest.php b/vendor/composer/installers/tests/Composer/Installers/Test/GravInstallerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b757799b4841cdb232894145dd0838e905a190a6
--- /dev/null
+++ b/vendor/composer/installers/tests/Composer/Installers/Test/GravInstallerTest.php
@@ -0,0 +1,63 @@
+composer = new Composer();
+ }
+
+ public function testInflectPackageVars()
+ {
+ $package = $this->getPackage('vendor/name', '0.0.0');
+ $installer = new GravInstaller($package, $this->composer);
+ $packageVars = $this->getPackageVars($package);
+
+ $result = $installer->inflectPackageVars(array_merge($packageVars, array('name' => 'test')));
+ $this->assertEquals('test', $result['name']);
+
+ foreach ($installer->getLocations() as $name => $location) {
+ $result = $installer->inflectPackageVars(array_merge($packageVars, array('name' => "$name-test")));
+ $this->assertEquals('test', $result['name']);
+ $result = $installer->inflectPackageVars(array_merge($packageVars, array('name' => "test-$name")));
+ $this->assertEquals('test', $result['name']);
+ $result = $installer->inflectPackageVars(array_merge($packageVars, array('name' => "$name-test-test")));
+ $this->assertEquals('test-test', $result['name']);
+ $result = $installer->inflectPackageVars(array_merge($packageVars, array('name' => "test-test-$name")));
+ $this->assertEquals('test-test', $result['name']);
+ $result = $installer->inflectPackageVars(array_merge($packageVars, array('name' => "grav-$name-test")));
+ $this->assertEquals('test', $result['name']);
+ $result = $installer->inflectPackageVars(array_merge($packageVars, array('name' => "grav-test-$name")));
+ $this->assertEquals('test', $result['name']);
+ $result = $installer->inflectPackageVars(array_merge($packageVars, array('name' => "grav-$name-test-test")));
+ $this->assertEquals('test-test', $result['name']);
+ $result = $installer->inflectPackageVars(array_merge($packageVars, array('name' => "grav-test-test-$name")));
+ $this->assertEquals('test-test', $result['name']);
+ }
+ }
+
+ /**
+ * @param $package \Composer\Package\PackageInterface
+ */
+ public function getPackageVars($package)
+ {
+ $type = $package->getType();
+
+ $prettyName = $package->getPrettyName();
+ if (strpos($prettyName, '/') !== false) {
+ list($vendor, $name) = explode('/', $prettyName);
+ } else {
+ $vendor = '';
+ $name = $prettyName;
+ }
+
+ return compact('name', 'vendor', 'type');
+ }
+}
diff --git a/vendor/composer/installers/tests/Composer/Installers/Test/InstallerTest.php b/vendor/composer/installers/tests/Composer/Installers/Test/InstallerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a516daf074117dcd6819e995dd853f271c7d30cb
--- /dev/null
+++ b/vendor/composer/installers/tests/Composer/Installers/Test/InstallerTest.php
@@ -0,0 +1,422 @@
+fs = new Filesystem;
+
+ $this->composer = new Composer();
+ $this->config = new Config();
+ $this->composer->setConfig($this->config);
+
+ $this->vendorDir = realpath(sys_get_temp_dir()) . DIRECTORY_SEPARATOR . 'baton-test-vendor';
+ $this->ensureDirectoryExistsAndClear($this->vendorDir);
+
+ $this->binDir = realpath(sys_get_temp_dir()) . DIRECTORY_SEPARATOR . 'baton-test-bin';
+ $this->ensureDirectoryExistsAndClear($this->binDir);
+
+ $this->config->merge(array(
+ 'config' => array(
+ 'vendor-dir' => $this->vendorDir,
+ 'bin-dir' => $this->binDir,
+ ),
+ ));
+
+ $this->dm = $this->getMockBuilder('Composer\Downloader\DownloadManager')
+ ->disableOriginalConstructor()
+ ->getMock();
+ $this->composer->setDownloadManager($this->dm);
+
+ $this->repository = $this->getMock('Composer\Repository\InstalledRepositoryInterface');
+ $this->io = $this->getMock('Composer\IO\IOInterface');
+ }
+
+ /**
+ * tearDown
+ *
+ * @return void
+ */
+ public function tearDown()
+ {
+ $this->fs->removeDirectory($this->vendorDir);
+ $this->fs->removeDirectory($this->binDir);
+ }
+
+ /**
+ * testSupports
+ *
+ * @return void
+ *
+ * @dataProvider dataForTestSupport
+ */
+ public function testSupports($type, $expected)
+ {
+ $installer = new Installer($this->io, $this->composer);
+ $this->assertSame($expected, $installer->supports($type), sprintf('Failed to show support for %s', $type));
+ }
+
+ /**
+ * dataForTestSupport
+ */
+ public function dataForTestSupport()
+ {
+ return array(
+ array('agl-module', true),
+ array('aimeos-extension', true),
+ array('annotatecms-module', true),
+ array('annotatecms-component', true),
+ array('annotatecms-service', true),
+ array('bitrix-module', true),
+ array('bitrix-component', true),
+ array('bitrix-theme', true),
+ array('cakephp', false),
+ array('cakephp-', false),
+ array('cakephp-app', false),
+ array('cakephp-plugin', true),
+ array('chef-cookbook', true),
+ array('chef-role', true),
+ array('codeigniter-app', false),
+ array('codeigniter-library', true),
+ array('codeigniter-third-party', true),
+ array('codeigniter-module', true),
+ array('concrete5-block', true),
+ array('concrete5-package', true),
+ array('concrete5-theme', true),
+ array('concrete5-update', true),
+ array('craft-plugin', true),
+ array('croogo-plugin', true),
+ array('croogo-theme', true),
+ array('dokuwiki-plugin', true),
+ array('dokuwiki-template', true),
+ array('drupal-module', true),
+ array('dolibarr-module', true),
+ array('elgg-plugin', true),
+ array('fuel-module', true),
+ array('fuel-package', true),
+ array('fuel-theme', true),
+ array('fuelphp-component', true),
+ array('hurad-plugin', true),
+ array('hurad-theme', true),
+ array('joomla-library', true),
+ array('kirby-plugin', true),
+ array('kohana-module', true),
+ array('laravel-library', true),
+ array('lithium-library', true),
+ array('magento-library', true),
+ array('mako-package', true),
+ array('modxevo-snippet', true),
+ array('modxevo-plugin', true),
+ array('modxevo-module', true),
+ array('modxevo-template', true),
+ array('modxevo-lib', true),
+ array('mediawiki-extension', true),
+ array('mediawiki-skin', true),
+ array('microweber-module', true),
+ array('modulework-module', true),
+ array('moodle-mod', true),
+ array('october-module', true),
+ array('october-plugin', true),
+ array('piwik-plugin', true),
+ array('phpbb-extension', true),
+ array('pimcore-plugin', true),
+ array('ppi-module', true),
+ array('prestashop-module', true),
+ array('prestashop-theme', true),
+ array('puppet-module', true),
+ array('redaxo-addon', true),
+ array('redaxo-bestyle-plugin', true),
+ array('roundcube-plugin', true),
+ array('shopware-backend-plugin', true),
+ array('shopware-core-plugin', true),
+ array('shopware-frontend-plugin', true),
+ array('shopware-theme', true),
+ array('silverstripe-module', true),
+ array('silverstripe-theme', true),
+ array('smf-module', true),
+ array('smf-theme', true),
+ array('symfony1-plugin', true),
+ array('thelia-module', true),
+ array('thelia-frontoffice-template', true),
+ array('thelia-backoffice-template', true),
+ array('thelia-email-template', true),
+ array('tusk-task', true),
+ array('tusk-asset', true),
+ array('typo3-flow-plugin', true),
+ array('typo3-cms-extension', true),
+ array('whmcs-gateway', true),
+ array('wolfcms-plugin', true),
+ array('wordpress-plugin', true),
+ array('wordpress-core', false),
+ array('zend-library', true),
+ array('zikula-module', true),
+ array('zikula-theme', true),
+ );
+ }
+
+ /**
+ * testInstallPath
+ *
+ * @dataProvider dataForTestInstallPath
+ */
+ public function testInstallPath($type, $path, $name, $version = '1.0.0')
+ {
+ $installer = new Installer($this->io, $this->composer);
+ $package = new Package($name, $version, $version);
+
+ $package->setType($type);
+ $result = $installer->getInstallPath($package);
+ $this->assertEquals($path, $result);
+ }
+
+ /**
+ * dataFormTestInstallPath
+ */
+ public function dataForTestInstallPath()
+ {
+ return array(
+ array('agl-module', 'More/MyTestPackage/', 'agl/my_test-package'),
+ array('aimeos-extension', 'ext/ai-test/', 'author/ai-test'),
+ array('annotatecms-module', 'addons/modules/my_module/', 'vysinsky/my_module'),
+ array('annotatecms-component', 'addons/components/my_component/', 'vysinsky/my_component'),
+ array('annotatecms-service', 'addons/services/my_service/', 'vysinsky/my_service'),
+ array('bitrix-module', 'local/modules/my_module/', 'author/my_module'),
+ array('bitrix-component', 'local/components/my_component/', 'author/my_component'),
+ array('bitrix-theme', 'local/templates/my_theme/', 'author/my_theme'),
+ array('cakephp-plugin', 'Plugin/Ftp/', 'shama/ftp'),
+ array('chef-cookbook', 'Chef/mre/my_cookbook/', 'mre/my_cookbook'),
+ array('chef-role', 'Chef/roles/my_role/', 'mre/my_role'),
+ array('codeigniter-library', 'application/libraries/my_package/', 'shama/my_package'),
+ array('codeigniter-module', 'application/modules/my_package/', 'shama/my_package'),
+ array('concrete5-block', 'blocks/concrete5_block/', 'remo/concrete5_block'),
+ array('concrete5-package', 'packages/concrete5_package/', 'remo/concrete5_package'),
+ array('concrete5-theme', 'themes/concrete5_theme/', 'remo/concrete5_theme'),
+ array('concrete5-update', 'updates/concrete5/', 'concrete5/concrete5'),
+ array('craft-plugin', 'craft/plugins/my_plugin/', 'mdcpepper/my_plugin'),
+ array('croogo-plugin', 'Plugin/Sitemaps/', 'fahad19/sitemaps'),
+ array('croogo-theme', 'View/Themed/Readable/', 'rchavik/readable'),
+ array('dokuwiki-plugin', 'lib/plugins/someplugin/', 'author/someplugin'),
+ array('dokuwiki-template', 'lib/tpl/sometemplate/', 'author/sometemplate'),
+ array('dolibarr-module', 'htdocs/custom/my_module/', 'shama/my_module'),
+ array('drupal-module', 'modules/my_module/', 'shama/my_module'),
+ array('drupal-theme', 'themes/my_module/', 'shama/my_module'),
+ array('drupal-profile', 'profiles/my_module/', 'shama/my_module'),
+ array('drupal-drush', 'drush/my_module/', 'shama/my_module'),
+ array('elgg-plugin', 'mod/sample_plugin/', 'test/sample_plugin'),
+ array('fuel-module', 'fuel/app/modules/module/', 'fuel/module'),
+ array('fuel-package', 'fuel/packages/orm/', 'fuel/orm'),
+ array('fuel-theme', 'fuel/app/themes/theme/', 'fuel/theme'),
+ array('fuelphp-component', 'components/demo/', 'fuelphp/demo'),
+ array('hurad-plugin', 'plugins/Akismet/', 'atkrad/akismet'),
+ array('hurad-theme', 'plugins/Hurad2013/', 'atkrad/Hurad2013'),
+ array('joomla-plugin', 'plugins/my_plugin/', 'shama/my_plugin'),
+ array('kirby-plugin', 'site/plugins/my_plugin/', 'shama/my_plugin'),
+ array('kohana-module', 'modules/my_package/', 'shama/my_package'),
+ array('laravel-library', 'libraries/my_package/', 'shama/my_package'),
+ array('lithium-library', 'libraries/li3_test/', 'user/li3_test'),
+ array('magento-library', 'lib/foo/', 'test/foo'),
+ array('modxevo-snippet', 'assets/snippets/my_snippet/', 'shama/my_snippet'),
+ array('modxevo-plugin', 'assets/plugins/my_plugin/', 'shama/my_plugin'),
+ array('modxevo-module', 'assets/modules/my_module/', 'shama/my_module'),
+ array('modxevo-template', 'assets/templates/my_template/', 'shama/my_template'),
+ array('modxevo-lib', 'assets/lib/my_lib/', 'shama/my_lib'),
+ array('mako-package', 'app/packages/my_package/', 'shama/my_package'),
+ array('mediawiki-extension', 'extensions/APC/', 'author/APC'),
+ array('mediawiki-extension', 'extensions/APC/', 'author/APC-extension'),
+ array('mediawiki-extension', 'extensions/UploadWizard/', 'author/upload-wizard'),
+ array('mediawiki-extension', 'extensions/SyntaxHighlight_GeSHi/', 'author/syntax-highlight_GeSHi'),
+ array('mediawiki-skin', 'skins/someskin/', 'author/someskin-skin'),
+ array('mediawiki-skin', 'skins/someskin/', 'author/someskin'),
+ array('microweber-module', 'userfiles/modules/my-thing/', 'author/my-thing-module'),
+ array('modulework-module', 'modules/my_package/', 'shama/my_package'),
+ array('moodle-mod', 'mod/my_package/', 'shama/my_package'),
+ array('october-module', 'modules/my_plugin/', 'shama/my_plugin'),
+ array('october-plugin', 'plugins/shama/my_plugin/', 'shama/my_plugin'),
+ array('october-theme', 'themes/my_theme/', 'shama/my_theme'),
+ array('piwik-plugin', 'plugins/VisitSummary/', 'shama/visit-summary'),
+ array('prestashop-module', 'modules/a-module/', 'vendor/a-module'),
+ array('prestashop-theme', 'themes/a-theme/', 'vendor/a-theme'),
+ array('phpbb-extension', 'ext/test/foo/', 'test/foo'),
+ array('phpbb-style', 'styles/foo/', 'test/foo'),
+ array('phpbb-language', 'language/foo/', 'test/foo'),
+ array('pimcore-plugin', 'plugins/MyPlugin/', 'ubikz/my_plugin'),
+ array('ppi-module', 'modules/foo/', 'test/foo'),
+ array('puppet-module', 'modules/puppet-name/', 'puppet/puppet-name'),
+ array('redaxo-addon', 'redaxo/include/addons/my_plugin/', 'shama/my_plugin'),
+ array('redaxo-bestyle-plugin', 'redaxo/include/addons/be_style/plugins/my_plugin/', 'shama/my_plugin'),
+ array('roundcube-plugin', 'plugins/base/', 'test/base'),
+ array('roundcube-plugin', 'plugins/replace_dash/', 'test/replace-dash'),
+ array('shopware-backend-plugin', 'engine/Shopware/Plugins/Local/Backend/ShamaMyBackendPlugin/', 'shama/my-backend-plugin'),
+ array('shopware-core-plugin', 'engine/Shopware/Plugins/Local/Core/ShamaMyCorePlugin/', 'shama/my-core-plugin'),
+ array('shopware-frontend-plugin', 'engine/Shopware/Plugins/Local/Frontend/ShamaMyFrontendPlugin/', 'shama/my-frontend-plugin'),
+ array('shopware-theme', 'templates/my_theme/', 'shama/my-theme'),
+ array('silverstripe-module', 'my_module/', 'shama/my_module'),
+ array('silverstripe-module', 'sapphire/', 'silverstripe/framework', '2.4.0'),
+ array('silverstripe-module', 'framework/', 'silverstripe/framework', '3.0.0'),
+ array('silverstripe-module', 'framework/', 'silverstripe/framework', '3.0.0-rc1'),
+ array('silverstripe-module', 'framework/', 'silverstripe/framework', 'my/branch'),
+ array('silverstripe-theme', 'themes/my_theme/', 'shama/my_theme'),
+ array('smf-module', 'Sources/my_module/', 'shama/my_module'),
+ array('smf-theme', 'Themes/my_theme/', 'shama/my_theme'),
+ array('symfony1-plugin', 'plugins/sfShamaPlugin/', 'shama/sfShamaPlugin'),
+ array('symfony1-plugin', 'plugins/sfShamaPlugin/', 'shama/sf-shama-plugin'),
+ array('thelia-module', 'local/modules/my_module/', 'shama/my_module'),
+ array('thelia-frontoffice-template', 'templates/frontOffice/my_template_fo/', 'shama/my_template_fo'),
+ array('thelia-backoffice-template', 'templates/backOffice/my_template_bo/', 'shama/my_template_bo'),
+ array('thelia-email-template', 'templates/email/my_template_email/', 'shama/my_template_email'),
+ array('tusk-task', '.tusk/tasks/my_task/', 'shama/my_task'),
+ array('typo3-flow-package', 'Packages/Application/my_package/', 'shama/my_package'),
+ array('typo3-flow-build', 'Build/my_package/', 'shama/my_package'),
+ array('typo3-cms-extension', 'typo3conf/ext/my_extension/', 'shama/my_extension'),
+ array('whmcs-gateway', 'modules/gateways/gateway_name/', 'vendor/gateway_name'),
+ array('wolfcms-plugin', 'wolf/plugins/my_plugin/', 'shama/my_plugin'),
+ array('wordpress-plugin', 'wp-content/plugins/my_plugin/', 'shama/my_plugin'),
+ array('wordpress-muplugin', 'wp-content/mu-plugins/my_plugin/', 'shama/my_plugin'),
+ array('zend-extra', 'extras/library/zend_test/', 'shama/zend_test'),
+ array('zikula-module', 'modules/my-test_module/', 'my/test_module'),
+ array('zikula-theme', 'themes/my-test_theme/', 'my/test_theme'),
+ );
+ }
+
+ /**
+ * testGetCakePHPInstallPathException
+ *
+ * @return void
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testGetCakePHPInstallPathException()
+ {
+ $installer = new Installer($this->io, $this->composer);
+ $package = new Package('shama/ftp', '1.0.0', '1.0.0');
+
+ $package->setType('cakephp-whoops');
+ $result = $installer->getInstallPath($package);
+ }
+
+ /**
+ * testCustomInstallPath
+ */
+ public function testCustomInstallPath()
+ {
+ $installer = new Installer($this->io, $this->composer);
+ $package = new Package('shama/ftp', '1.0.0', '1.0.0');
+ $package->setType('cakephp-plugin');
+ $consumerPackage = new RootPackage('foo/bar', '1.0.0', '1.0.0');
+ $this->composer->setPackage($consumerPackage);
+ $consumerPackage->setExtra(array(
+ 'installer-paths' => array(
+ 'my/custom/path/{$name}/' => array(
+ 'shama/ftp',
+ 'foo/bar',
+ ),
+ ),
+ ));
+ $result = $installer->getInstallPath($package);
+ $this->assertEquals('my/custom/path/Ftp/', $result);
+ }
+
+ /**
+ * testCustomInstallerName
+ */
+ public function testCustomInstallerName()
+ {
+ $installer = new Installer($this->io, $this->composer);
+ $package = new Package('shama/cakephp-ftp-plugin', '1.0.0', '1.0.0');
+ $package->setType('cakephp-plugin');
+ $package->setExtra(array(
+ 'installer-name' => 'FTP',
+ ));
+ $result = $installer->getInstallPath($package);
+ $this->assertEquals('Plugin/FTP/', $result);
+ }
+
+ /**
+ * testCustomTypePath
+ */
+ public function testCustomTypePath()
+ {
+ $installer = new Installer($this->io, $this->composer);
+ $package = new Package('slbmeh/my_plugin', '1.0.0', '1.0.0');
+ $package->setType('wordpress-plugin');
+ $consumerPackage = new RootPackage('foo/bar', '1.0.0', '1.0.0');
+ $this->composer->setPackage($consumerPackage);
+ $consumerPackage->setExtra(array(
+ 'installer-paths' => array(
+ 'my/custom/path/{$name}/' => array(
+ 'type:wordpress-plugin'
+ ),
+ ),
+ ));
+ $result = $installer->getInstallPath($package);
+ $this->assertEquals('my/custom/path/my_plugin/', $result);
+ }
+
+ /**
+ * testNoVendorName
+ */
+ public function testNoVendorName()
+ {
+ $installer = new Installer($this->io, $this->composer);
+ $package = new Package('sfPhpunitPlugin', '1.0.0', '1.0.0');
+
+ $package->setType('symfony1-plugin');
+ $result = $installer->getInstallPath($package);
+ $this->assertEquals('plugins/sfPhpunitPlugin/', $result);
+ }
+
+ /**
+ * testTypo3Inflection
+ */
+ public function testTypo3Inflection()
+ {
+ $installer = new Installer($this->io, $this->composer);
+ $package = new Package('typo3/fluid', '1.0.0', '1.0.0');
+
+ $package->setAutoload(array(
+ 'psr-0' => array(
+ 'TYPO3\\Fluid' => 'Classes',
+ ),
+ ));
+
+ $package->setType('typo3-flow-package');
+ $result = $installer->getInstallPath($package);
+ $this->assertEquals('Packages/Application/TYPO3.Fluid/', $result);
+ }
+
+ public function testUninstallAndDeletePackageFromLocalRepo()
+ {
+ $package = new Package('foo', '1.0.0', '1.0.0');
+
+ $installer = $this->getMock('Composer\Installers\Installer', array('getInstallPath'), array($this->io, $this->composer));
+ $installer->expects($this->once())->method('getInstallPath')->with($package)->will($this->returnValue(sys_get_temp_dir().'/foo'));
+
+ $repo = $this->getMock('Composer\Repository\InstalledRepositoryInterface');
+ $repo->expects($this->once())->method('hasPackage')->with($package)->will($this->returnValue(true));
+ $repo->expects($this->once())->method('removePackage')->with($package);
+
+ $installer->uninstall($repo, $package);
+ }
+}
diff --git a/vendor/composer/installers/tests/Composer/Installers/Test/MediaWikiInstallerTest.php b/vendor/composer/installers/tests/Composer/Installers/Test/MediaWikiInstallerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3675e188b2f8205f3f6d0069bee2105a35e8dfbb
--- /dev/null
+++ b/vendor/composer/installers/tests/Composer/Installers/Test/MediaWikiInstallerTest.php
@@ -0,0 +1,66 @@
+installer = new MediaWikiInstaller(
+ new Package('NyanCat', '4.2', '4.2'),
+ new Composer()
+ );
+ }
+
+ /**
+ * @dataProvider packageNameInflectionProvider
+ */
+ public function testInflectPackageVars($type, $name, $expected)
+ {
+ $this->assertEquals(
+ $this->installer->inflectPackageVars(array('name' => $name, 'type'=>$type)),
+ array('name' => $expected, 'type'=>$type)
+ );
+ }
+
+ public function packageNameInflectionProvider()
+ {
+ return array(
+ array(
+ 'mediawiki-extension',
+ 'sub-page-list',
+ 'SubPageList',
+ ),
+ array(
+ 'mediawiki-extension',
+ 'sub-page-list-extension',
+ 'SubPageList',
+ ),
+ array(
+ 'mediawiki-extension',
+ 'semantic-mediawiki',
+ 'SemanticMediawiki',
+ ),
+ // tests that exactly one '-skin' is cut off, and that skins do not get ucwords treatment like extensions
+ array(
+ 'mediawiki-skin',
+ 'some-skin-skin',
+ 'some-skin',
+ ),
+ // tests that names without '-skin' suffix stay valid
+ array(
+ 'mediawiki-skin',
+ 'someotherskin',
+ 'someotherskin',
+ ),
+ );
+ }
+}
diff --git a/vendor/composer/installers/tests/Composer/Installers/Test/OctoberInstallerTest.php b/vendor/composer/installers/tests/Composer/Installers/Test/OctoberInstallerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd427cdc3112120867c9100fb5b0a3be3b83c6ae
--- /dev/null
+++ b/vendor/composer/installers/tests/Composer/Installers/Test/OctoberInstallerTest.php
@@ -0,0 +1,66 @@
+installer = new OctoberInstaller(
+ new Package('NyanCat', '4.2', '4.2'),
+ new Composer()
+ );
+ }
+
+ /**
+ * @dataProvider packageNameInflectionProvider
+ */
+ public function testInflectPackageVars($type, $name, $expected)
+ {
+ $this->assertEquals(
+ $this->installer->inflectPackageVars(array('name' => $name, 'type' => $type)),
+ array('name' => $expected, 'type' => $type)
+ );
+ }
+
+ public function packageNameInflectionProvider()
+ {
+ return array(
+ array(
+ 'october-plugin',
+ 'subpagelist',
+ 'subpagelist',
+ ),
+ array(
+ 'october-plugin',
+ 'subpagelist-plugin',
+ 'subpagelist',
+ ),
+ array(
+ 'october-plugin',
+ 'semanticoctober',
+ 'semanticoctober',
+ ),
+ // tests that exactly one '-theme' is cut off
+ array(
+ 'october-theme',
+ 'some-theme-theme',
+ 'some-theme',
+ ),
+ // tests that names without '-theme' suffix stay valid
+ array(
+ 'october-theme',
+ 'someothertheme',
+ 'someothertheme',
+ ),
+ );
+ }
+}
\ No newline at end of file
diff --git a/vendor/composer/installers/tests/Composer/Installers/Test/PimcoreInstallerTest.php b/vendor/composer/installers/tests/Composer/Installers/Test/PimcoreInstallerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ea79374bf51c37063fafefb26a420b4a43806a63
--- /dev/null
+++ b/vendor/composer/installers/tests/Composer/Installers/Test/PimcoreInstallerTest.php
@@ -0,0 +1,44 @@
+package = new Package('CamelCased', '1.0', '1.0');
+ $this->io = $this->getMock('Composer\IO\PackageInterface');
+ $this->composer = new Composer();
+ }
+
+ /**
+ * testInflectPackageVars
+ *
+ * @return void
+ */
+ public function testInflectPackageVars()
+ {
+ $installer = new PimcoreInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'CamelCased'));
+ $this->assertEquals($result, array('name' => 'CamelCased'));
+
+ $installer = new PimcoreInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'with-dash'));
+ $this->assertEquals($result, array('name' => 'WithDash'));
+
+ $installer = new PimcoreInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'with_underscore'));
+ $this->assertEquals($result, array('name' => 'WithUnderscore'));
+ }
+}
diff --git a/vendor/composer/installers/tests/Composer/Installers/Test/PiwikInstallerTest.php b/vendor/composer/installers/tests/Composer/Installers/Test/PiwikInstallerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..8d9ff3f82e11a6f13bdf45acc12e1dcde1c30fc4
--- /dev/null
+++ b/vendor/composer/installers/tests/Composer/Installers/Test/PiwikInstallerTest.php
@@ -0,0 +1,63 @@
+package = new Package('VisitSummary', '1.0', '1.0');
+ $this->io = $this->getMock('Composer\IO\PackageInterface');
+ $this->composer = new Composer();
+ }
+
+ /**
+ * testInflectPackageVars
+ *
+ * @return void
+ */
+ public function testInflectPackageVars()
+ {
+ $installer = new PiwikInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'VisitSummary'));
+ $this->assertEquals($result, array('name' => 'VisitSummary'));
+
+ $installer = new PiwikInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'visit-summary'));
+ $this->assertEquals($result, array('name' => 'VisitSummary'));
+
+ $installer = new PiwikInstaller($this->package, $this->composer);
+ $result = $installer->inflectPackageVars(array('name' => 'visit_summary'));
+ $this->assertEquals($result, array('name' => 'VisitSummary'));
+ }
+
+}
diff --git a/vendor/composer/installers/tests/Composer/Installers/Test/TestCase.php b/vendor/composer/installers/tests/Composer/Installers/Test/TestCase.php
new file mode 100644
index 0000000000000000000000000000000000000000..6418a03b827c013bc31c30243ce57997d09586f7
--- /dev/null
+++ b/vendor/composer/installers/tests/Composer/Installers/Test/TestCase.php
@@ -0,0 +1,64 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Installers\Test;
+
+use Composer\Package\Version\VersionParser;
+use Composer\Package\Package;
+use Composer\Package\AliasPackage;
+use Composer\Package\LinkConstraint\VersionConstraint;
+use Composer\Util\Filesystem;
+
+abstract class TestCase extends \PHPUnit_Framework_TestCase
+{
+ private static $parser;
+
+ protected static function getVersionParser()
+ {
+ if (!self::$parser) {
+ self::$parser = new VersionParser();
+ }
+
+ return self::$parser;
+ }
+
+ protected function getVersionConstraint($operator, $version)
+ {
+ return new VersionConstraint(
+ $operator,
+ self::getVersionParser()->normalize($version)
+ );
+ }
+
+ protected function getPackage($name, $version)
+ {
+ $normVersion = self::getVersionParser()->normalize($version);
+
+ return new Package($name, $normVersion, $version);
+ }
+
+ protected function getAliasPackage($package, $version)
+ {
+ $normVersion = self::getVersionParser()->normalize($version);
+
+ return new AliasPackage($package, $normVersion, $version);
+ }
+
+ protected function ensureDirectoryExistsAndClear($directory)
+ {
+ $fs = new Filesystem();
+ if (is_dir($directory)) {
+ $fs->removeDirectory($directory);
+ }
+ mkdir($directory, 0777, true);
+ }
+}
diff --git a/vendor/composer/installers/tests/bootstrap.php b/vendor/composer/installers/tests/bootstrap.php
new file mode 100644
index 0000000000000000000000000000000000000000..30c8fdc67a059c166d31c7e2cba3d8d0c62c8b36
--- /dev/null
+++ b/vendor/composer/installers/tests/bootstrap.php
@@ -0,0 +1,4 @@
+add('Composer\Installers\Test', __DIR__);
diff --git a/vendor/composer/semver/CHANGELOG.md b/vendor/composer/semver/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..8352cb72d32ea3bc6e39c6c22958b88058a8238b
--- /dev/null
+++ b/vendor/composer/semver/CHANGELOG.md
@@ -0,0 +1,28 @@
+# Change Log
+
+All notable changes to this project will be documented in this file.
+This project adheres to [Semantic Versioning](http://semver.org/).
+
+### [1.0.0] 2015-09-21
+
+ * Break: `VersionConstraint` renamed to `Constraint`.
+ * Break: `SpecificConstraint` renamed to `AbstractConstraint`.
+ * Break: `LinkConstraintInterface` renamed to `ConstraintInterface`.
+ * Break: `VersionParser::parseNameVersionPairs` was removed.
+ * Changed: `VersionParser::parseConstraints` allows (but ignores) build metadata now.
+ * Changed: `VersionParser::parseConstraints` allows (but ignores) prefixing numeric versions with a 'v' now.
+ * Changed: Fixed namespace(s) of test files.
+ * Changed: `Comparator::compare` no longer throws `InvalidArgumentException`.
+ * Changed: `VersionConstraint` now throws `InvalidArgumentException`.
+
+### [0.1.0] 2015-07-23
+
+ * Added: `Composer\Semver\Comparator`, various methods to compare versions.
+ * Added: various documents such as README.md, LICENSE, etc.
+ * Added: configuration files for Git, Travis, php-cs-fixer, phpunit.
+ * Break: the following namespaces were renamed:
+ - Namespace: `Composer\Package\Version` -> `Composer\Semver`
+ - Namespace: `Composer\Package\LinkConstraint` -> `Composer\Semver\Constraint`
+ - Namespace: `Composer\Test\Package\Version` -> `Composer\Test\Semver`
+ - Namespace: `Composer\Test\Package\LinkConstraint` -> `Composer\Test\Semver\Constraint`
+ * Changed: code style using php-cs-fixer.
diff --git a/vendor/composer/semver/LICENSE b/vendor/composer/semver/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..466975862624c73fa7ba3d55e0e05f7be6d6e0a6
--- /dev/null
+++ b/vendor/composer/semver/LICENSE
@@ -0,0 +1,19 @@
+Copyright (C) 2015 Composer
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/vendor/composer/semver/README.md b/vendor/composer/semver/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..c8b6979849ce671274486be2b6d085ee8bffa1f2
--- /dev/null
+++ b/vendor/composer/semver/README.md
@@ -0,0 +1,70 @@
+composer/semver
+===============
+
+Semver library that offers utilities, version constraint parsing and validation.
+
+Originally written as part of [composer/composer](https://github.com/composer/composer),
+now extracted and made available as a stand-alone library.
+
+[![Build Status](https://travis-ci.org/composer/semver.svg?branch=master)](https://travis-ci.org/composer/semver)
+
+
+Installation
+------------
+
+Install the latest version with:
+
+```bash
+$ composer require composer/semver
+```
+
+
+Requirements
+------------
+
+* PHP 5.3.2 is required but using the latest version of PHP is highly recommended.
+
+
+Version Comparison
+------------------
+
+For details on how versions are compared, refer to the [Versions](https://getcomposer.org/doc/articles/versions.md)
+article in the documentation section of the [getcomposer.org](https://getcomposer.org) website.
+
+
+Basic usage
+-----------
+
+### Comparator
+
+The `Composer\Semver\Comparator` class provides the following methods for comparing versions:
+
+* greaterThan($v1, $v2)
+* greaterThanOrEqualTo($v1, $v2)
+* lessThan($v1, $v2)
+* lessThanOrEqualTo($v1, $v2)
+* equalTo($v1, $v2)
+* notEqualTo($v1, $v2)
+
+Each function takes two version strings as arguments. For example:
+
+```php
+use Composer\Semver\Comparator;
+
+Comparator::greaterThan('1.25.0', '1.24.0'); // 1.25.0 > 1.24.0
+```
+
+### Semver
+
+The `Composer\Semver\Semver` class providers the following methods:
+
+* satisfies($version, $constraints)
+* satisfiedBy($constraint, array $versions)
+* sort($versions)
+* rsort($versions)
+
+
+License
+-------
+
+composer/semver is licensed under the MIT License, see the LICENSE file for details.
diff --git a/vendor/composer/semver/composer.json b/vendor/composer/semver/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..b996186f21c9f2e3a8ce818cc0e209e42500b6c3
--- /dev/null
+++ b/vendor/composer/semver/composer.json
@@ -0,0 +1,57 @@
+{
+ "name": "composer/semver",
+ "description": "Semver library that offers utilities, version constraint parsing and validation.",
+ "type": "library",
+ "license": "MIT",
+ "keywords": [
+ "semver",
+ "semantic",
+ "versioning",
+ "validation"
+ ],
+ "authors": [
+ {
+ "name": "Nils Adermann",
+ "email": "naderman@naderman.de",
+ "homepage": "http://www.naderman.de"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be",
+ "homepage": "http://seld.be"
+ },
+ {
+ "name": "Rob Bast",
+ "email": "rob.bast@gmail.com"
+ }
+ ],
+ "support": {
+ "irc": "irc://irc.freenode.org/composer",
+ "issues": "https://github.com/composer/semver/issues"
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.5",
+ "phpunit/phpunit-mock-objects": "~2.3"
+ },
+ "autoload": {
+ "psr-4": {
+ "Composer\\Semver\\": "src"
+ }
+ },
+ "autoload-dev": {
+ "psr-4": {
+ "Composer\\Semver\\Test\\": "tests"
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.1-dev"
+ }
+ },
+ "scripts": {
+ "test": "phpunit"
+ }
+}
diff --git a/vendor/composer/semver/src/Comparator.php b/vendor/composer/semver/src/Comparator.php
new file mode 100644
index 0000000000000000000000000000000000000000..a9d758f1c0ceea21c7a8fc6ffb865339cce6b12f
--- /dev/null
+++ b/vendor/composer/semver/src/Comparator.php
@@ -0,0 +1,111 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\Semver;
+
+use Composer\Semver\Constraint\Constraint;
+
+class Comparator
+{
+ /**
+ * Evaluates the expression: $version1 > $version2.
+ *
+ * @param string $version1
+ * @param string $version2
+ *
+ * @return bool
+ */
+ public static function greaterThan($version1, $version2)
+ {
+ return self::compare($version1, '>', $version2);
+ }
+
+ /**
+ * Evaluates the expression: $version1 >= $version2.
+ *
+ * @param string $version1
+ * @param string $version2
+ *
+ * @return bool
+ */
+ public static function greaterThanOrEqualTo($version1, $version2)
+ {
+ return self::compare($version1, '>=', $version2);
+ }
+
+ /**
+ * Evaluates the expression: $version1 < $version2.
+ *
+ * @param string $version1
+ * @param string $version2
+ *
+ * @return bool
+ */
+ public static function lessThan($version1, $version2)
+ {
+ return self::compare($version1, '<', $version2);
+ }
+
+ /**
+ * Evaluates the expression: $version1 <= $version2.
+ *
+ * @param string $version1
+ * @param string $version2
+ *
+ * @return bool
+ */
+ public static function lessThanOrEqualTo($version1, $version2)
+ {
+ return self::compare($version1, '<=', $version2);
+ }
+
+ /**
+ * Evaluates the expression: $version1 == $version2.
+ *
+ * @param string $version1
+ * @param string $version2
+ *
+ * @return bool
+ */
+ public static function equalTo($version1, $version2)
+ {
+ return self::compare($version1, '==', $version2);
+ }
+
+ /**
+ * Evaluates the expression: $version1 != $version2.
+ *
+ * @param string $version1
+ * @param string $version2
+ *
+ * @return bool
+ */
+ public static function notEqualTo($version1, $version2)
+ {
+ return self::compare($version1, '!=', $version2);
+ }
+
+ /**
+ * Evaluates the expression: $version1 $operator $version2.
+ *
+ * @param string $version1
+ * @param string $operator
+ * @param string $version2
+ *
+ * @return bool
+ */
+ public static function compare($version1, $operator, $version2)
+ {
+ $constraint = new Constraint($operator, $version2);
+
+ return $constraint->matches(new Constraint('==', $version1));
+ }
+}
diff --git a/vendor/composer/semver/src/Constraint/AbstractConstraint.php b/vendor/composer/semver/src/Constraint/AbstractConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..ccd834f6bb406839ba4e267078dabc4805f47a12
--- /dev/null
+++ b/vendor/composer/semver/src/Constraint/AbstractConstraint.php
@@ -0,0 +1,65 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\Semver\Constraint;
+
+/**
+ * Base constraint class.
+ */
+abstract class AbstractConstraint implements ConstraintInterface
+{
+ /** @var string */
+ protected $prettyString;
+
+ /**
+ * @param ConstraintInterface $provider
+ *
+ * @return bool
+ */
+ public function matches(ConstraintInterface $provider)
+ {
+ if ($provider instanceof MultiConstraint) {
+ // turn matching around to find a match
+ return $provider->matches($this);
+ }
+
+ if ($provider instanceof $this) {
+ // see note at bottom of this class declaration
+ return $this->matchSpecific($provider);
+ }
+
+ return true;
+ }
+
+ /**
+ * @param string $prettyString
+ */
+ public function setPrettyString($prettyString)
+ {
+ $this->prettyString = $prettyString;
+ }
+
+ /**
+ * @return string
+ */
+ public function getPrettyString()
+ {
+ if ($this->prettyString) {
+ return $this->prettyString;
+ }
+
+ return $this->__toString();
+ }
+
+ // implementations must implement a method of this format:
+ // not declared abstract here because type hinting violates parameter coherence (TODO right word?)
+ // public function matchSpecific( $provider);
+}
diff --git a/vendor/composer/semver/src/Constraint/Constraint.php b/vendor/composer/semver/src/Constraint/Constraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..8bc68db7b31eac596050be9f15bdc1973dcefe3a
--- /dev/null
+++ b/vendor/composer/semver/src/Constraint/Constraint.php
@@ -0,0 +1,181 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\Semver\Constraint;
+
+/**
+ * Defines a constraint.
+ */
+class Constraint extends AbstractConstraint
+{
+ /* operator integer values */
+ const OP_EQ = 0;
+ const OP_LT = 1;
+ const OP_LE = 2;
+ const OP_GT = 3;
+ const OP_GE = 4;
+ const OP_NE = 5;
+
+ /**
+ * Operator to integer translation table.
+ *
+ * @var array
+ */
+ private static $transOpStr = array(
+ '=' => self::OP_EQ,
+ '==' => self::OP_EQ,
+ '<' => self::OP_LT,
+ '<=' => self::OP_LE,
+ '>' => self::OP_GT,
+ '>=' => self::OP_GE,
+ '<>' => self::OP_NE,
+ '!=' => self::OP_NE,
+ );
+
+ /**
+ * Integer to operator translation table.
+ *
+ * @var array
+ */
+ private static $transOpInt = array(
+ self::OP_EQ => '==',
+ self::OP_LT => '<',
+ self::OP_LE => '<=',
+ self::OP_GT => '>',
+ self::OP_GE => '>=',
+ self::OP_NE => '!=',
+ );
+
+ /** @var string */
+ private $operator;
+
+ /** @var string */
+ private $version;
+
+ /**
+ * Get all supported comparison operators.
+ *
+ * @return array
+ */
+ public static function getSupportedOperators()
+ {
+ return array_keys(self::$transOpStr);
+ }
+
+ /**
+ * Sets operator and version to compare with.
+ *
+ * @param string $operator
+ * @param string $version
+ *
+ * @throws \InvalidArgumentException if invalid operator is given.
+ */
+ public function __construct($operator, $version)
+ {
+ if (!isset(self::$transOpStr[$operator])) {
+ throw new \InvalidArgumentException(sprintf(
+ 'Invalid operator "%s" given, expected one of: %s',
+ $operator,
+ implode(', ', self::getSupportedOperators())
+ ));
+ }
+
+ $this->operator = self::$transOpStr[$operator];
+ $this->version = $version;
+ }
+
+ /**
+ * @param string $a
+ * @param string $b
+ * @param string $operator
+ * @param bool $compareBranches
+ *
+ * @throws \InvalidArgumentException if invalid operator is given.
+ *
+ * @return bool
+ */
+ public function versionCompare($a, $b, $operator, $compareBranches = false)
+ {
+ if (!isset(self::$transOpStr[$operator])) {
+ throw new \InvalidArgumentException(sprintf(
+ 'Invalid operator "%s" given, expected one of: %s',
+ $operator,
+ implode(', ', self::getSupportedOperators())
+ ));
+ }
+
+ $aIsBranch = 'dev-' === substr($a, 0, 4);
+ $bIsBranch = 'dev-' === substr($b, 0, 4);
+
+ if ($aIsBranch && $bIsBranch) {
+ return $operator === '==' && $a === $b;
+ }
+
+ // when branches are not comparable, we make sure dev branches never match anything
+ if (!$compareBranches && ($aIsBranch || $bIsBranch)) {
+ return false;
+ }
+
+ return version_compare($a, $b, $operator);
+ }
+
+ /**
+ * @param Constraint $provider
+ * @param bool $compareBranches
+ *
+ * @return bool
+ */
+ public function matchSpecific(Constraint $provider, $compareBranches = false)
+ {
+ $noEqualOp = str_replace('=', '', self::$transOpInt[$this->operator]);
+ $providerNoEqualOp = str_replace('=', '', self::$transOpInt[$provider->operator]);
+
+ $isEqualOp = self::OP_EQ === $this->operator;
+ $isNonEqualOp = self::OP_NE === $this->operator;
+ $isProviderEqualOp = self::OP_EQ === $provider->operator;
+ $isProviderNonEqualOp = self::OP_NE === $provider->operator;
+
+ // '!=' operator is match when other operator is not '==' operator or version is not match
+ // these kinds of comparisons always have a solution
+ if ($isNonEqualOp || $isProviderNonEqualOp) {
+ return !$isEqualOp && !$isProviderEqualOp
+ || $this->versionCompare($provider->version, $this->version, '!=', $compareBranches);
+ }
+
+ // an example for the condition is <= 2.0 & < 1.0
+ // these kinds of comparisons always have a solution
+ if ($this->operator !== self::OP_EQ && $noEqualOp === $providerNoEqualOp) {
+ return true;
+ }
+
+ if ($this->versionCompare($provider->version, $this->version, self::$transOpInt[$this->operator], $compareBranches)) {
+ // special case, e.g. require >= 1.0 and provide < 1.0
+ // 1.0 >= 1.0 but 1.0 is outside of the provided interval
+ if ($provider->version === $this->version
+ && self::$transOpInt[$provider->operator] === $providerNoEqualOp
+ && self::$transOpInt[$this->operator] !== $noEqualOp) {
+ return false;
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return self::$transOpInt[$this->operator] . ' ' . $this->version;
+ }
+}
diff --git a/vendor/composer/semver/src/Constraint/ConstraintInterface.php b/vendor/composer/semver/src/Constraint/ConstraintInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..78c099cec107c13e0dc96656e5758ca099f069a0
--- /dev/null
+++ b/vendor/composer/semver/src/Constraint/ConstraintInterface.php
@@ -0,0 +1,37 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\Semver\Constraint;
+
+interface ConstraintInterface
+{
+ /**
+ * @param ConstraintInterface $provider
+ *
+ * @return bool
+ */
+ public function matches(ConstraintInterface $provider);
+
+ /**
+ * @param string $prettyString
+ */
+ public function setPrettyString($prettyString);
+
+ /**
+ * @return string
+ */
+ public function getPrettyString();
+
+ /**
+ * @return string
+ */
+ public function __toString();
+}
diff --git a/vendor/composer/semver/src/Constraint/EmptyConstraint.php b/vendor/composer/semver/src/Constraint/EmptyConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..faba56bf0c814c0134558737bab3b598643c0879
--- /dev/null
+++ b/vendor/composer/semver/src/Constraint/EmptyConstraint.php
@@ -0,0 +1,59 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\Semver\Constraint;
+
+/**
+ * Defines the absence of a constraint.
+ */
+class EmptyConstraint implements ConstraintInterface
+{
+ /** @var string */
+ protected $prettyString;
+
+ /**
+ * @param ConstraintInterface $provider
+ *
+ * @return bool
+ */
+ public function matches(ConstraintInterface $provider)
+ {
+ return true;
+ }
+
+ /**
+ * @param $prettyString
+ */
+ public function setPrettyString($prettyString)
+ {
+ $this->prettyString = $prettyString;
+ }
+
+ /**
+ * @return string
+ */
+ public function getPrettyString()
+ {
+ if ($this->prettyString) {
+ return $this->prettyString;
+ }
+
+ return $this->__toString();
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return '[]';
+ }
+}
diff --git a/vendor/composer/semver/src/Constraint/MultiConstraint.php b/vendor/composer/semver/src/Constraint/MultiConstraint.php
new file mode 100644
index 0000000000000000000000000000000000000000..0d769b7c1d5d63dfd969d942b7f9ba5f10d2227f
--- /dev/null
+++ b/vendor/composer/semver/src/Constraint/MultiConstraint.php
@@ -0,0 +1,96 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\Semver\Constraint;
+
+/**
+ * Defines a conjunctive or disjunctive set of constraints.
+ */
+class MultiConstraint implements ConstraintInterface
+{
+ /** @var ConstraintInterface[] */
+ protected $constraints;
+
+ /** @var string */
+ protected $prettyString;
+
+ /** @var bool */
+ protected $conjunctive;
+
+ /**
+ * @param ConstraintInterface[] $constraints A set of constraints
+ * @param bool $conjunctive Whether the constraints should be treated as conjunctive or disjunctive
+ */
+ public function __construct(array $constraints, $conjunctive = true)
+ {
+ $this->constraints = $constraints;
+ $this->conjunctive = $conjunctive;
+ }
+
+ /**
+ * @param ConstraintInterface $provider
+ *
+ * @return bool
+ */
+ public function matches(ConstraintInterface $provider)
+ {
+ if (false === $this->conjunctive) {
+ foreach ($this->constraints as $constraint) {
+ if ($constraint->matches($provider)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ foreach ($this->constraints as $constraint) {
+ if (!$constraint->matches($provider)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * @param string $prettyString
+ */
+ public function setPrettyString($prettyString)
+ {
+ $this->prettyString = $prettyString;
+ }
+
+ /**
+ * @return string
+ */
+ public function getPrettyString()
+ {
+ if ($this->prettyString) {
+ return $this->prettyString;
+ }
+
+ return $this->__toString();
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ $constraints = array();
+ foreach ($this->constraints as $constraint) {
+ $constraints[] = (string) $constraint;
+ }
+
+ return '[' . implode($this->conjunctive ? ' ' : ' || ', $constraints) . ']';
+ }
+}
diff --git a/vendor/composer/semver/src/Semver.php b/vendor/composer/semver/src/Semver.php
new file mode 100644
index 0000000000000000000000000000000000000000..0225bb55ad645cdb9679d68a6e5c172b58ba13fe
--- /dev/null
+++ b/vendor/composer/semver/src/Semver.php
@@ -0,0 +1,127 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\Semver;
+
+use Composer\Semver\Constraint\Constraint;
+
+class Semver
+{
+ const SORT_ASC = 1;
+ const SORT_DESC = -1;
+
+ /** @var VersionParser */
+ private static $versionParser;
+
+ /**
+ * Determine if given version satisfies given constraints.
+ *
+ * @param string $version
+ * @param string $constraints
+ *
+ * @return bool
+ */
+ public static function satisfies($version, $constraints)
+ {
+ if (null === self::$versionParser) {
+ self::$versionParser = new VersionParser();
+ }
+
+ $versionParser = self::$versionParser;
+ $provider = new Constraint('==', $versionParser->normalize($version));
+ $constraints = $versionParser->parseConstraints($constraints);
+
+ return $constraints->matches($provider);
+ }
+
+ /**
+ * Return all versions that satisfy given constraints.
+ *
+ * @param array $versions
+ * @param string $constraints
+ *
+ * @return array
+ */
+ public static function satisfiedBy(array $versions, $constraints)
+ {
+ $versions = array_filter($versions, function ($version) use ($constraints) {
+ return Semver::satisfies($version, $constraints);
+ });
+
+ return array_values($versions);
+ }
+
+ /**
+ * Sort given array of versions.
+ *
+ * @param array $versions
+ *
+ * @return array
+ */
+ public static function sort(array $versions)
+ {
+ return self::usort($versions, self::SORT_ASC);
+ }
+
+ /**
+ * Sort given array of versions in reverse.
+ *
+ * @param array $versions
+ *
+ * @return array
+ */
+ public static function rsort(array $versions)
+ {
+ return self::usort($versions, self::SORT_DESC);
+ }
+
+ /**
+ * @param array $versions
+ * @param int $direction
+ *
+ * @return array
+ */
+ private static function usort(array $versions, $direction)
+ {
+ if (null === self::$versionParser) {
+ self::$versionParser = new VersionParser();
+ }
+
+ $versionParser = self::$versionParser;
+ $normalized = array();
+
+ // Normalize outside of usort() scope for minor performance increase.
+ // Creates an array of arrays: [[normalized, key], ...]
+ foreach ($versions as $key => $version) {
+ $normalized[] = array($versionParser->normalize($version), $key);
+ }
+
+ usort($normalized, function (array $left, array $right) use ($direction) {
+ if ($left[0] === $right[0]) {
+ return 0;
+ }
+
+ if (Comparator::lessThan($left[0], $right[0])) {
+ return -$direction;
+ }
+
+ return $direction;
+ });
+
+ // Recreate input array, using the original indexes which are now in sorted order.
+ $sorted = array();
+ foreach ($normalized as $item) {
+ $sorted[] = $versions[$item[1]];
+ }
+
+ return $sorted;
+ }
+}
diff --git a/vendor/composer/semver/src/VersionParser.php b/vendor/composer/semver/src/VersionParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..269aee9487133b14168dca31b24b4e3b0c33e71b
--- /dev/null
+++ b/vendor/composer/semver/src/VersionParser.php
@@ -0,0 +1,520 @@
+
+ *
+ * For the full copyright and license information, please view
+ * the LICENSE file that was distributed with this source code.
+ */
+
+namespace Composer\Semver;
+
+use Composer\Semver\Constraint\ConstraintInterface;
+use Composer\Semver\Constraint\EmptyConstraint;
+use Composer\Semver\Constraint\MultiConstraint;
+use Composer\Semver\Constraint\Constraint;
+
+/**
+ * Version parser.
+ *
+ * @author Jordi Boggiano
+ */
+class VersionParser
+{
+ /** @var string */
+ private static $modifierRegex = '[._-]?(?:(stable|beta|b|RC|alpha|a|patch|pl|p)(?:[.-]?(\d+))?)?([.-]?dev)?';
+
+ /** @var array */
+ private static $stabilities = array(
+ 'stable', 'RC', 'beta', 'alpha', 'dev',
+ );
+
+ /**
+ * Returns the stability of a version.
+ *
+ * @param string $version
+ *
+ * @return string
+ */
+ public static function parseStability($version)
+ {
+ $version = preg_replace('{#.+$}i', '', $version);
+
+ if ('dev-' === substr($version, 0, 4) || '-dev' === substr($version, -4)) {
+ return 'dev';
+ }
+
+ preg_match('{' . self::$modifierRegex . '$}i', strtolower($version), $match);
+ if (!empty($match[3])) {
+ return 'dev';
+ }
+
+ if (!empty($match[1])) {
+ if ('beta' === $match[1] || 'b' === $match[1]) {
+ return 'beta';
+ }
+ if ('alpha' === $match[1] || 'a' === $match[1]) {
+ return 'alpha';
+ }
+ if ('rc' === $match[1]) {
+ return 'RC';
+ }
+ }
+
+ return 'stable';
+ }
+
+ /**
+ * @param string $stability
+ *
+ * @return string
+ */
+ public static function normalizeStability($stability)
+ {
+ $stability = strtolower($stability);
+
+ return $stability === 'rc' ? 'RC' : $stability;
+ }
+
+ /**
+ * Normalizes a version string to be able to perform comparisons on it.
+ *
+ * @param string $version
+ * @param string $fullVersion optional complete version string to give more context
+ *
+ * @throws \UnexpectedValueException
+ *
+ * @return string
+ */
+ public function normalize($version, $fullVersion = null)
+ {
+ $version = trim($version);
+ if (null === $fullVersion) {
+ $fullVersion = $version;
+ }
+
+ // strip off aliasing
+ if (preg_match('{^([^,\s]+) +as +([^,\s]+)$}', $version, $match)) {
+ $version = $match[1];
+ }
+
+ // strip off build metadata
+ if (preg_match('{^([^,\s+]+)\+[^\s]+$}', $version, $match)) {
+ $version = $match[1];
+ }
+
+ // match master-like branches
+ if (preg_match('{^(?:dev-)?(?:master|trunk|default)$}i', $version)) {
+ return '9999999-dev';
+ }
+
+ if ('dev-' === strtolower(substr($version, 0, 4))) {
+ return 'dev-' . substr($version, 4);
+ }
+
+ // match classical versioning
+ if (preg_match('{^v?(\d{1,5})(\.\d+)?(\.\d+)?(\.\d+)?' . self::$modifierRegex . '$}i', $version, $matches)) {
+ $version = $matches[1]
+ . (!empty($matches[2]) ? $matches[2] : '.0')
+ . (!empty($matches[3]) ? $matches[3] : '.0')
+ . (!empty($matches[4]) ? $matches[4] : '.0');
+ $index = 5;
+ // match date(time) based versioning
+ } elseif (preg_match('{^v?(\d{4}(?:[.:-]?\d{2}){1,6}(?:[.:-]?\d{1,3})?)' . self::$modifierRegex . '$}i', $version, $matches)) {
+ $version = preg_replace('{\D}', '-', $matches[1]);
+ $index = 2;
+ }
+
+ // add version modifiers if a version was matched
+ if (isset($index)) {
+ if (!empty($matches[$index])) {
+ if ('stable' === $matches[$index]) {
+ return $version;
+ }
+ $version .= '-' . $this->expandStability($matches[$index]) . (!empty($matches[$index + 1]) ? $matches[$index + 1] : '');
+ }
+
+ if (!empty($matches[$index + 2])) {
+ $version .= '-dev';
+ }
+
+ return $version;
+ }
+
+ // match dev branches
+ if (preg_match('{(.*?)[.-]?dev$}i', $version, $match)) {
+ try {
+ return $this->normalizeBranch($match[1]);
+ } catch (\Exception $e) {
+ }
+ }
+
+ $extraMessage = '';
+ if (preg_match('{ +as +' . preg_quote($version) . '$}', $fullVersion)) {
+ $extraMessage = ' in "' . $fullVersion . '", the alias must be an exact version';
+ } elseif (preg_match('{^' . preg_quote($version) . ' +as +}', $fullVersion)) {
+ $extraMessage = ' in "' . $fullVersion . '", the alias source must be an exact version, if it is a branch name you should prefix it with dev-';
+ }
+
+ throw new \UnexpectedValueException('Invalid version string "' . $version . '"' . $extraMessage);
+ }
+
+ /**
+ * Extract numeric prefix from alias, if it is in numeric format, suitable for version comparison.
+ *
+ * @param string $branch Branch name (e.g. 2.1.x-dev)
+ *
+ * @return string|false Numeric prefix if present (e.g. 2.1.) or false
+ */
+ public function parseNumericAliasPrefix($branch)
+ {
+ if (preg_match('{^(?P(\d+\\.)*\d+)(?:\.x)?-dev$}i', $branch, $matches)) {
+ return $matches['version'] . '.';
+ }
+
+ return false;
+ }
+
+ /**
+ * Normalizes a branch name to be able to perform comparisons on it.
+ *
+ * @param string $name
+ *
+ * @return string
+ */
+ public function normalizeBranch($name)
+ {
+ $name = trim($name);
+
+ if (in_array($name, array('master', 'trunk', 'default'))) {
+ return $this->normalize($name);
+ }
+
+ if (preg_match('{^v?(\d+)(\.(?:\d+|[xX*]))?(\.(?:\d+|[xX*]))?(\.(?:\d+|[xX*]))?$}i', $name, $matches)) {
+ $version = '';
+ for ($i = 1; $i < 5; ++$i) {
+ $version .= isset($matches[$i]) ? str_replace(array('*', 'X'), 'x', $matches[$i]) : '.x';
+ }
+
+ return str_replace('x', '9999999', $version) . '-dev';
+ }
+
+ return 'dev-' . $name;
+ }
+
+ /**
+ * Parses as constraint string into LinkConstraint objects.
+ *
+ * @param string $constraints
+ *
+ * @return ConstraintInterface
+ */
+ public function parseConstraints($constraints)
+ {
+ $prettyConstraint = $constraints;
+
+ if (preg_match('{^([^,\s]*?)@(' . implode('|', self::$stabilities) . ')$}i', $constraints, $match)) {
+ $constraints = empty($match[1]) ? '*' : $match[1];
+ }
+
+ if (preg_match('{^(dev-[^,\s@]+?|[^,\s@]+?\.x-dev)#.+$}i', $constraints, $match)) {
+ $constraints = $match[1];
+ }
+
+ $orConstraints = preg_split('{\s*\|\|?\s*}', trim($constraints));
+ $orGroups = array();
+ foreach ($orConstraints as $constraints) {
+ $andConstraints = preg_split('{(?< ,]) *(? 1) {
+ $constraintObjects = array();
+ foreach ($andConstraints as $constraint) {
+ foreach ($this->parseConstraint($constraint) as $parsedConstraint) {
+ $constraintObjects[] = $parsedConstraint;
+ }
+ }
+ } else {
+ $constraintObjects = $this->parseConstraint($andConstraints[0]);
+ }
+
+ if (1 === count($constraintObjects)) {
+ $constraint = $constraintObjects[0];
+ } else {
+ $constraint = new MultiConstraint($constraintObjects);
+ }
+
+ $orGroups[] = $constraint;
+ }
+
+ if (1 === count($orGroups)) {
+ $constraint = $orGroups[0];
+ } else {
+ $constraint = new MultiConstraint($orGroups, false);
+ }
+
+ $constraint->setPrettyString($prettyConstraint);
+
+ return $constraint;
+ }
+
+ /**
+ * @param string $constraint
+ *
+ * @throws \UnexpectedValueException
+ *
+ * @return array
+ */
+ private function parseConstraint($constraint)
+ {
+ if (preg_match('{^([^,\s]+?)@(' . implode('|', self::$stabilities) . ')$}i', $constraint, $match)) {
+ $constraint = $match[1];
+ if ($match[2] !== 'stable') {
+ $stabilityModifier = $match[2];
+ }
+ }
+
+ if (preg_match('{^[xX*](\.[xX*])*$}i', $constraint)) {
+ return array(new EmptyConstraint());
+ }
+
+ $versionRegex = 'v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.(\d+))?' . self::$modifierRegex . '(?:\+[^\s]+)?';
+
+ // Tilde Range
+ //
+ // Like wildcard constraints, unsuffixed tilde constraints say that they must be greater than the previous
+ // version, to ensure that unstable instances of the current version are allowed. However, if a stability
+ // suffix is added to the constraint, then a >= match on the current version is used instead.
+ if (preg_match('{^~>?' . $versionRegex . '$}i', $constraint, $matches)) {
+ if (substr($constraint, 0, 2) === '~>') {
+ throw new \UnexpectedValueException(
+ 'Could not parse version constraint ' . $constraint . ': ' .
+ 'Invalid operator "~>", you probably meant to use the "~" operator'
+ );
+ }
+
+ // Work out which position in the version we are operating at
+ if (isset($matches[4]) && '' !== $matches[4]) {
+ $position = 4;
+ } elseif (isset($matches[3]) && '' !== $matches[3]) {
+ $position = 3;
+ } elseif (isset($matches[2]) && '' !== $matches[2]) {
+ $position = 2;
+ } else {
+ $position = 1;
+ }
+
+ // Calculate the stability suffix
+ $stabilitySuffix = '';
+ if (!empty($matches[5])) {
+ $stabilitySuffix .= '-' . $this->expandStability($matches[5]) . (!empty($matches[6]) ? $matches[6] : '');
+ }
+
+ if (!empty($matches[7])) {
+ $stabilitySuffix .= '-dev';
+ }
+
+ if (!$stabilitySuffix) {
+ $stabilitySuffix = '-dev';
+ }
+
+ $lowVersion = $this->manipulateVersionString($matches, $position, 0) . $stabilitySuffix;
+ $lowerBound = new Constraint('>=', $lowVersion);
+
+ // For upper bound, we increment the position of one more significance,
+ // but highPosition = 0 would be illegal
+ $highPosition = max(1, $position - 1);
+ $highVersion = $this->manipulateVersionString($matches, $highPosition, 1) . '-dev';
+ $upperBound = new Constraint('<', $highVersion);
+
+ return array(
+ $lowerBound,
+ $upperBound,
+ );
+ }
+
+ // Caret Range
+ //
+ // Allows changes that do not modify the left-most non-zero digit in the [major, minor, patch] tuple.
+ // In other words, this allows patch and minor updates for versions 1.0.0 and above, patch updates for
+ // versions 0.X >=0.1.0, and no updates for versions 0.0.X
+ if (preg_match('{^\^' . $versionRegex . '($)}i', $constraint, $matches)) {
+ // Work out which position in the version we are operating at
+ if ('0' !== $matches[1] || '' === $matches[2]) {
+ $position = 1;
+ } elseif ('0' !== $matches[2] || '' === $matches[3]) {
+ $position = 2;
+ } else {
+ $position = 3;
+ }
+
+ // Calculate the stability suffix
+ $stabilitySuffix = '';
+ if (empty($matches[5]) && empty($matches[7])) {
+ $stabilitySuffix .= '-dev';
+ }
+
+ $lowVersion = $this->normalize(substr($constraint . $stabilitySuffix, 1));
+ $lowerBound = new Constraint('>=', $lowVersion);
+
+ // For upper bound, we increment the position of one more significance,
+ // but highPosition = 0 would be illegal
+ $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev';
+ $upperBound = new Constraint('<', $highVersion);
+
+ return array(
+ $lowerBound,
+ $upperBound,
+ );
+ }
+
+ // X Range
+ //
+ // Any of X, x, or * may be used to "stand in" for one of the numeric values in the [major, minor, patch] tuple.
+ // A partial version range is treated as an X-Range, so the special character is in fact optional.
+ if (preg_match('{^(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.[xX*])+$}', $constraint, $matches)) {
+ if (isset($matches[3]) && '' !== $matches[3]) {
+ $position = 3;
+ } elseif (isset($matches[2]) && '' !== $matches[2]) {
+ $position = 2;
+ } else {
+ $position = 1;
+ }
+
+ $lowVersion = $this->manipulateVersionString($matches, $position) . '-dev';
+ $highVersion = $this->manipulateVersionString($matches, $position, 1) . '-dev';
+
+ if ($lowVersion === '0.0.0.0-dev') {
+ return array(new Constraint('<', $highVersion));
+ }
+
+ return array(
+ new Constraint('>=', $lowVersion),
+ new Constraint('<', $highVersion),
+ );
+ }
+
+ // Hyphen Range
+ //
+ // Specifies an inclusive set. If a partial version is provided as the first version in the inclusive range,
+ // then the missing pieces are replaced with zeroes. If a partial version is provided as the second version in
+ // the inclusive range, then all versions that start with the supplied parts of the tuple are accepted, but
+ // nothing that would be greater than the provided tuple parts.
+ if (preg_match('{^(?P' . $versionRegex . ') +- +(?P' . $versionRegex . ')($)}i', $constraint, $matches)) {
+ // Calculate the stability suffix
+ $lowStabilitySuffix = '';
+ if (empty($matches[6]) && empty($matches[8])) {
+ $lowStabilitySuffix = '-dev';
+ }
+
+ $lowVersion = $this->normalize($matches['from']);
+ $lowerBound = new Constraint('>=', $lowVersion . $lowStabilitySuffix);
+
+ $empty = function ($x) {
+ return ($x === 0 || $x === '0') ? false : empty($x);
+ };
+
+ if ((!$empty($matches[11]) && !$empty($matches[12])) || !empty($matches[14]) || !empty($matches[16])) {
+ $highVersion = $this->normalize($matches['to']);
+ $upperBound = new Constraint('<=', $highVersion);
+ } else {
+ $highMatch = array('', $matches[10], $matches[11], $matches[12], $matches[13]);
+ $highVersion = $this->manipulateVersionString($highMatch, $empty($matches[11]) ? 1 : 2, 1) . '-dev';
+ $upperBound = new Constraint('<', $highVersion);
+ }
+
+ return array(
+ $lowerBound,
+ $upperBound,
+ );
+ }
+
+ // Basic Comparators
+ if (preg_match('{^(<>|!=|>=?|<=?|==?)?\s*(.*)}', $constraint, $matches)) {
+ try {
+ $version = $this->normalize($matches[2]);
+
+ if (!empty($stabilityModifier) && $this->parseStability($version) === 'stable') {
+ $version .= '-' . $stabilityModifier;
+ } elseif ('<' === $matches[1] || '>=' === $matches[1]) {
+ if (!preg_match('/-' . self::$modifierRegex . '$/', strtolower($matches[2]))) {
+ if (substr($matches[2], 0, 4) !== 'dev-') {
+ $version .= '-dev';
+ }
+ }
+ }
+
+ return array(new Constraint($matches[1] ?: '=', $version));
+ } catch (\Exception $e) {
+ }
+ }
+
+ $message = 'Could not parse version constraint ' . $constraint;
+ if (isset($e)) {
+ $message .= ': ' . $e->getMessage();
+ }
+
+ throw new \UnexpectedValueException($message);
+ }
+
+ /**
+ * Increment, decrement, or simply pad a version number.
+ *
+ * Support function for {@link parseConstraint()}
+ *
+ * @param array $matches Array with version parts in array indexes 1,2,3,4
+ * @param int $position 1,2,3,4 - which segment of the version to increment/decrement
+ * @param int $increment
+ * @param string $pad The string to pad version parts after $position
+ *
+ * @return string The new version
+ */
+ private function manipulateVersionString($matches, $position, $increment = 0, $pad = '0')
+ {
+ for ($i = 4; $i > 0; --$i) {
+ if ($i > $position) {
+ $matches[$i] = $pad;
+ } elseif ($i === $position && $increment) {
+ $matches[$i] += $increment;
+ // If $matches[$i] was 0, carry the decrement
+ if ($matches[$i] < 0) {
+ $matches[$i] = $pad;
+ --$position;
+
+ // Return null on a carry overflow
+ if ($i === 1) {
+ return;
+ }
+ }
+ }
+ }
+
+ return $matches[1] . '.' . $matches[2] . '.' . $matches[3] . '.' . $matches[4];
+ }
+
+ /**
+ * Expand shorthand stability string to long version.
+ *
+ * @param string $stability
+ *
+ * @return string
+ */
+ private function expandStability($stability)
+ {
+ $stability = strtolower($stability);
+
+ switch ($stability) {
+ case 'a':
+ return 'alpha';
+ case 'b':
+ return 'beta';
+ case 'p':
+ case 'pl':
+ return 'patch';
+ case 'rc':
+ return 'RC';
+ default:
+ return $stability;
+ }
+ }
+}
diff --git a/vendor/doctrine/annotations/LICENSE b/vendor/doctrine/annotations/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..5e781fce4bb504715ba0ec0188715b18a198ca6b
--- /dev/null
+++ b/vendor/doctrine/annotations/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2006-2013 Doctrine Project
+
+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/doctrine/annotations/README.md b/vendor/doctrine/annotations/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..ebb30e0bca4b9dea65df67ba437e24e3d50d7fbb
--- /dev/null
+++ b/vendor/doctrine/annotations/README.md
@@ -0,0 +1,19 @@
+# Doctrine Annotations
+
+[![Build Status](https://travis-ci.org/doctrine/annotations.png?branch=master)](https://travis-ci.org/doctrine/annotations)
+
+Docblock Annotations Parser library (extracted from [Doctrine Common](https://github.com/doctrine/common)).
+
+## Changelog
+
+### v1.2.0
+
+ * HHVM support
+ * Allowing dangling comma in annotations
+ * Excluded annotations are no longer autoloaded
+ * Importing namespaces also in traits
+ * Added support for `::class` 5.5-style constant, works also in 5.3 and 5.4
+
+### v1.1
+
+ * Add Exception when ZendOptimizer+ or Opcache is configured to drop comments
diff --git a/vendor/doctrine/annotations/composer.json b/vendor/doctrine/annotations/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..1c65f6cd35a71e555f901d575911bf519003080e
--- /dev/null
+++ b/vendor/doctrine/annotations/composer.json
@@ -0,0 +1,31 @@
+{
+ "name": "doctrine/annotations",
+ "type": "library",
+ "description": "Docblock Annotations Parser",
+ "keywords": ["annotations", "docblock", "parser"],
+ "homepage": "http://www.doctrine-project.org",
+ "license": "MIT",
+ "authors": [
+ {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"},
+ {"name": "Roman Borschel", "email": "roman@code-factory.org"},
+ {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
+ {"name": "Jonathan Wage", "email": "jonwage@gmail.com"},
+ {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
+ ],
+ "require": {
+ "php": ">=5.3.2",
+ "doctrine/lexer": "1.*"
+ },
+ "require-dev": {
+ "doctrine/cache": "1.*",
+ "phpunit/phpunit": "4.*"
+ },
+ "autoload": {
+ "psr-0": { "Doctrine\\Common\\Annotations\\": "lib/" }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php
new file mode 100644
index 0000000000000000000000000000000000000000..a79a0f8f0a18da1d0066c94bac1b605031e27be0
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation.php
@@ -0,0 +1,79 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+/**
+ * Annotations class.
+ *
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+class Annotation
+{
+ /**
+ * Value property. Common among all derived classes.
+ *
+ * @var string
+ */
+ public $value;
+
+ /**
+ * Constructor.
+ *
+ * @param array $data Key-value for properties to be defined in this class.
+ */
+ public final function __construct(array $data)
+ {
+ foreach ($data as $key => $value) {
+ $this->$key = $value;
+ }
+ }
+
+ /**
+ * Error handler for unknown property accessor in Annotation class.
+ *
+ * @param string $name Unknown property name.
+ *
+ * @throws \BadMethodCallException
+ */
+ public function __get($name)
+ {
+ throw new \BadMethodCallException(
+ sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this))
+ );
+ }
+
+ /**
+ * Error handler for unknown property mutator in Annotation class.
+ *
+ * @param string $name Unknown property name.
+ * @param mixed $value Property value.
+ *
+ * @throws \BadMethodCallException
+ */
+ public function __set($name, $value)
+ {
+ throw new \BadMethodCallException(
+ sprintf("Unknown property '%s' on annotation '%s'.", $name, get_class($this))
+ );
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php
new file mode 100644
index 0000000000000000000000000000000000000000..dbef6df087497cecf043dcdac40f95ffb5551fa0
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attribute.php
@@ -0,0 +1,47 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations\Annotation;
+
+/**
+ * Annotation that can be used to signal to the parser
+ * to check the attribute type during the parsing process.
+ *
+ * @author Fabio B. Silva
+ *
+ * @Annotation
+ */
+final class Attribute
+{
+ /**
+ * @var string
+ */
+ public $name;
+
+ /**
+ * @var string
+ */
+ public $type;
+
+ /**
+ * @var boolean
+ */
+ public $required = false;
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php
new file mode 100644
index 0000000000000000000000000000000000000000..53134e3097af6c5dc95695b478d53282f2455604
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Attributes.php
@@ -0,0 +1,37 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations\Annotation;
+
+/**
+ * Annotation that can be used to signal to the parser
+ * to check the types of all declared attributes during the parsing process.
+ *
+ * @author Fabio B. Silva
+ *
+ * @Annotation
+ */
+final class Attributes
+{
+ /**
+ * @var array
+ */
+ public $value;
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php
new file mode 100644
index 0000000000000000000000000000000000000000..e122a7535881db3599a6d99b7292f49eaa9b4bc0
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Enum.php
@@ -0,0 +1,84 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations\Annotation;
+
+/**
+ * Annotation that can be used to signal to the parser
+ * to check the available values during the parsing process.
+ *
+ * @since 2.4
+ * @author Fabio B. Silva
+ *
+ * @Annotation
+ * @Attributes({
+ * @Attribute("value", required = true, type = "array"),
+ * @Attribute("literal", required = false, type = "array")
+ * })
+ */
+final class Enum
+{
+ /**
+ * @var array
+ */
+ public $value;
+
+ /**
+ * Literal target declaration.
+ *
+ * @var array
+ */
+ public $literal;
+
+ /**
+ * Annotation constructor.
+ *
+ * @param array $values
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function __construct(array $values)
+ {
+ if ( ! isset($values['literal'])) {
+ $values['literal'] = array();
+ }
+
+ foreach ($values['value'] as $var) {
+ if( ! is_scalar($var)) {
+ throw new \InvalidArgumentException(sprintf(
+ '@Enum supports only scalar values "%s" given.',
+ is_object($var) ? get_class($var) : gettype($var)
+ ));
+ }
+ }
+
+ foreach ($values['literal'] as $key => $var) {
+ if( ! in_array($key, $values['value'])) {
+ throw new \InvalidArgumentException(sprintf(
+ 'Undefined enumerator value "%s" for literal "%s".',
+ $key , $var
+ ));
+ }
+ }
+
+ $this->value = $values['value'];
+ $this->literal = $values['literal'];
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php
new file mode 100644
index 0000000000000000000000000000000000000000..175226a67152c0dde61a9afcde55220adb2bbb65
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/IgnoreAnnotation.php
@@ -0,0 +1,54 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations\Annotation;
+
+/**
+ * Annotation that can be used to signal to the parser to ignore specific
+ * annotations during the parsing process.
+ *
+ * @Annotation
+ * @author Johannes M. Schmitt
+ */
+final class IgnoreAnnotation
+{
+ /**
+ * @var array
+ */
+ public $names;
+
+ /**
+ * Constructor.
+ *
+ * @param array $values
+ *
+ * @throws \RuntimeException
+ */
+ public function __construct(array $values)
+ {
+ if (is_string($values['value'])) {
+ $values['value'] = array($values['value']);
+ }
+ if (!is_array($values['value'])) {
+ throw new \RuntimeException(sprintf('@IgnoreAnnotation expects either a string name, or an array of strings, but got %s.', json_encode($values['value'])));
+ }
+
+ $this->names = $values['value'];
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php
new file mode 100644
index 0000000000000000000000000000000000000000..d67f9606879fdaa1bf1f9181ee90081a839b6510
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Required.php
@@ -0,0 +1,33 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations\Annotation;
+
+/**
+ * Annotation that can be used to signal to the parser
+ * to check if that attribute is required during the parsing process.
+ *
+ * @author Fabio B. Silva
+ *
+ * @Annotation
+ */
+final class Required
+{
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php
new file mode 100644
index 0000000000000000000000000000000000000000..f6c544535934c2368c5c2482b9a3260a2547e901
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Annotation/Target.php
@@ -0,0 +1,107 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations\Annotation;
+
+/**
+ * Annotation that can be used to signal to the parser
+ * to check the annotation target during the parsing process.
+ *
+ * @author Fabio B. Silva
+ *
+ * @Annotation
+ */
+final class Target
+{
+ const TARGET_CLASS = 1;
+ const TARGET_METHOD = 2;
+ const TARGET_PROPERTY = 4;
+ const TARGET_ANNOTATION = 8;
+ const TARGET_ALL = 15;
+
+ /**
+ * @var array
+ */
+ private static $map = array(
+ 'ALL' => self::TARGET_ALL,
+ 'CLASS' => self::TARGET_CLASS,
+ 'METHOD' => self::TARGET_METHOD,
+ 'PROPERTY' => self::TARGET_PROPERTY,
+ 'ANNOTATION' => self::TARGET_ANNOTATION,
+ );
+
+ /**
+ * @var array
+ */
+ public $value;
+
+ /**
+ * Targets as bitmask.
+ *
+ * @var integer
+ */
+ public $targets;
+
+ /**
+ * Literal target declaration.
+ *
+ * @var integer
+ */
+ public $literal;
+
+ /**
+ * Annotation constructor.
+ *
+ * @param array $values
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function __construct(array $values)
+ {
+ if (!isset($values['value'])){
+ $values['value'] = null;
+ }
+ if (is_string($values['value'])){
+ $values['value'] = array($values['value']);
+ }
+ if (!is_array($values['value'])){
+ throw new \InvalidArgumentException(
+ sprintf('@Target expects either a string value, or an array of strings, "%s" given.',
+ is_object($values['value']) ? get_class($values['value']) : gettype($values['value'])
+ )
+ );
+ }
+
+ $bitmask = 0;
+ foreach ($values['value'] as $literal) {
+ if(!isset(self::$map[$literal])){
+ throw new \InvalidArgumentException(
+ sprintf('Invalid Target "%s". Available targets: [%s]',
+ $literal, implode(', ', array_keys(self::$map)))
+ );
+ }
+ $bitmask |= self::$map[$literal];
+ }
+
+ $this->targets = $bitmask;
+ $this->value = $values['value'];
+ $this->literal = implode(', ', $this->value);
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php
new file mode 100644
index 0000000000000000000000000000000000000000..d06fe663c26964be98aba634890638e246eada84
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationException.php
@@ -0,0 +1,197 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+/**
+ * Description of AnnotationException
+ *
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+class AnnotationException extends \Exception
+{
+ /**
+ * Creates a new AnnotationException describing a Syntax error.
+ *
+ * @param string $message Exception message
+ *
+ * @return AnnotationException
+ */
+ public static function syntaxError($message)
+ {
+ return new self('[Syntax Error] ' . $message);
+ }
+
+ /**
+ * Creates a new AnnotationException describing a Semantical error.
+ *
+ * @param string $message Exception message
+ *
+ * @return AnnotationException
+ */
+ public static function semanticalError($message)
+ {
+ return new self('[Semantical Error] ' . $message);
+ }
+
+ /**
+ * Creates a new AnnotationException describing an error which occurred during
+ * the creation of the annotation.
+ *
+ * @since 2.2
+ *
+ * @param string $message
+ *
+ * @return AnnotationException
+ */
+ public static function creationError($message)
+ {
+ return new self('[Creation Error] ' . $message);
+ }
+
+ /**
+ * Creates a new AnnotationException describing a type error.
+ *
+ * @since 1.1
+ *
+ * @param string $message
+ *
+ * @return AnnotationException
+ */
+ public static function typeError($message)
+ {
+ return new self('[Type Error] ' . $message);
+ }
+
+ /**
+ * Creates a new AnnotationException describing a constant semantical error.
+ *
+ * @since 2.3
+ *
+ * @param string $identifier
+ * @param string $context
+ *
+ * @return AnnotationException
+ */
+ public static function semanticalErrorConstants($identifier, $context = null)
+ {
+ return self::semanticalError(sprintf(
+ "Couldn't find constant %s%s.",
+ $identifier,
+ $context ? ', ' . $context : ''
+ ));
+ }
+
+ /**
+ * Creates a new AnnotationException describing an type error of an attribute.
+ *
+ * @since 2.2
+ *
+ * @param string $attributeName
+ * @param string $annotationName
+ * @param string $context
+ * @param string $expected
+ * @param mixed $actual
+ *
+ * @return AnnotationException
+ */
+ public static function attributeTypeError($attributeName, $annotationName, $context, $expected, $actual)
+ {
+ return self::typeError(sprintf(
+ 'Attribute "%s" of @%s declared on %s expects %s, but got %s.',
+ $attributeName,
+ $annotationName,
+ $context,
+ $expected,
+ is_object($actual) ? 'an instance of ' . get_class($actual) : gettype($actual)
+ ));
+ }
+
+ /**
+ * Creates a new AnnotationException describing an required error of an attribute.
+ *
+ * @since 2.2
+ *
+ * @param string $attributeName
+ * @param string $annotationName
+ * @param string $context
+ * @param string $expected
+ *
+ * @return AnnotationException
+ */
+ public static function requiredError($attributeName, $annotationName, $context, $expected)
+ {
+ return self::typeError(sprintf(
+ 'Attribute "%s" of @%s declared on %s expects %s. This value should not be null.',
+ $attributeName,
+ $annotationName,
+ $context,
+ $expected
+ ));
+ }
+
+ /**
+ * Creates a new AnnotationException describing a invalid enummerator.
+ *
+ * @since 2.4
+ *
+ * @param string $attributeName
+ * @param string $annotationName
+ * @param string $context
+ * @param array $available
+ * @param mixed $given
+ *
+ * @return AnnotationException
+ */
+ public static function enumeratorError($attributeName, $annotationName, $context, $available, $given)
+ {
+ return new self(sprintf(
+ '[Enum Error] Attribute "%s" of @%s declared on %s accept only [%s], but got %s.',
+ $attributeName,
+ $annotationName,
+ $context,
+ implode(', ', $available),
+ is_object($given) ? get_class($given) : $given
+ ));
+ }
+
+ /**
+ * @return AnnotationException
+ */
+ public static function optimizerPlusSaveComments()
+ {
+ return new self(
+ "You have to enable opcache.save_comments=1 or zend_optimizerplus.save_comments=1."
+ );
+ }
+
+ /**
+ * @return AnnotationException
+ */
+ public static function optimizerPlusLoadComments()
+ {
+ return new self(
+ "You have to enable opcache.load_comments=1 or zend_optimizerplus.load_comments=1."
+ );
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php
new file mode 100644
index 0000000000000000000000000000000000000000..4ebd1fb4a00c50d2493f89733b3a1590fabc1e11
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationReader.php
@@ -0,0 +1,394 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+use Doctrine\Common\Annotations\Annotation\IgnoreAnnotation;
+use Doctrine\Common\Annotations\Annotation\Target;
+use ReflectionClass;
+use ReflectionMethod;
+use ReflectionProperty;
+
+/**
+ * A reader for docblock annotations.
+ *
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author Johannes M. Schmitt
+ */
+class AnnotationReader implements Reader
+{
+ /**
+ * Global map for imports.
+ *
+ * @var array
+ */
+ private static $globalImports = array(
+ 'ignoreannotation' => 'Doctrine\Common\Annotations\Annotation\IgnoreAnnotation',
+ );
+
+ /**
+ * A list with annotations that are not causing exceptions when not resolved to an annotation class.
+ *
+ * The names are case sensitive.
+ *
+ * @var array
+ */
+ private static $globalIgnoredNames = array(
+ // Annotation tags
+ 'Annotation' => true, 'Attribute' => true, 'Attributes' => true,
+ /* Can we enable this? 'Enum' => true, */
+ 'Required' => true,
+ 'Target' => true,
+ // Widely used tags (but not existent in phpdoc)
+ 'fix' => true , 'fixme' => true,
+ 'override' => true,
+ // PHPDocumentor 1 tags
+ 'abstract'=> true, 'access'=> true,
+ 'code' => true,
+ 'deprec'=> true,
+ 'endcode' => true, 'exception'=> true,
+ 'final'=> true,
+ 'ingroup' => true, 'inheritdoc'=> true, 'inheritDoc'=> true,
+ 'magic' => true,
+ 'name'=> true,
+ 'toc' => true, 'tutorial'=> true,
+ 'private' => true,
+ 'static'=> true, 'staticvar'=> true, 'staticVar'=> true,
+ 'throw' => true,
+ // PHPDocumentor 2 tags.
+ 'api' => true, 'author'=> true,
+ 'category'=> true, 'copyright'=> true,
+ 'deprecated'=> true,
+ 'example'=> true,
+ 'filesource'=> true,
+ 'global'=> true,
+ 'ignore'=> true, /* Can we enable this? 'index' => true, */ 'internal'=> true,
+ 'license'=> true, 'link'=> true,
+ 'method' => true,
+ 'package'=> true, 'param'=> true, 'property' => true, 'property-read' => true, 'property-write' => true,
+ 'return'=> true,
+ 'see'=> true, 'since'=> true, 'source' => true, 'subpackage'=> true,
+ 'throws'=> true, 'todo'=> true, 'TODO'=> true,
+ 'usedby'=> true, 'uses' => true,
+ 'var'=> true, 'version'=> true,
+ // PHPUnit tags
+ 'codeCoverageIgnore' => true, 'codeCoverageIgnoreStart' => true, 'codeCoverageIgnoreEnd' => true,
+ // PHPCheckStyle
+ 'SuppressWarnings' => true,
+ // PHPStorm
+ 'noinspection' => true,
+ // PEAR
+ 'package_version' => true,
+ // PlantUML
+ 'startuml' => true, 'enduml' => true,
+ );
+
+ /**
+ * Add a new annotation to the globally ignored annotation names with regard to exception handling.
+ *
+ * @param string $name
+ */
+ static public function addGlobalIgnoredName($name)
+ {
+ self::$globalIgnoredNames[$name] = true;
+ }
+
+ /**
+ * Annotations parser.
+ *
+ * @var \Doctrine\Common\Annotations\DocParser
+ */
+ private $parser;
+
+ /**
+ * Annotations parser used to collect parsing metadata.
+ *
+ * @var \Doctrine\Common\Annotations\DocParser
+ */
+ private $preParser;
+
+ /**
+ * PHP parser used to collect imports.
+ *
+ * @var \Doctrine\Common\Annotations\PhpParser
+ */
+ private $phpParser;
+
+ /**
+ * In-memory cache mechanism to store imported annotations per class.
+ *
+ * @var array
+ */
+ private $imports = array();
+
+ /**
+ * In-memory cache mechanism to store ignored annotations per class.
+ *
+ * @var array
+ */
+ private $ignoredAnnotationNames = array();
+
+ /**
+ * Constructor.
+ *
+ * Initializes a new AnnotationReader.
+ */
+ public function __construct()
+ {
+ if (extension_loaded('Zend Optimizer+') && (ini_get('zend_optimizerplus.save_comments') === "0" || ini_get('opcache.save_comments') === "0")) {
+ throw AnnotationException::optimizerPlusSaveComments();
+ }
+
+ if (extension_loaded('Zend OPcache') && ini_get('opcache.save_comments') == 0) {
+ throw AnnotationException::optimizerPlusSaveComments();
+ }
+
+ if (PHP_VERSION_ID < 70000) {
+ if (extension_loaded('Zend Optimizer+') && (ini_get('zend_optimizerplus.load_comments') === "0" || ini_get('opcache.load_comments') === "0")) {
+ throw AnnotationException::optimizerPlusLoadComments();
+ }
+
+ if (extension_loaded('Zend OPcache') && ini_get('opcache.load_comments') == 0) {
+ throw AnnotationException::optimizerPlusLoadComments();
+ }
+ }
+
+ AnnotationRegistry::registerFile(__DIR__ . '/Annotation/IgnoreAnnotation.php');
+
+ $this->parser = new DocParser;
+ $this->preParser = new DocParser;
+
+ $this->preParser->setImports(self::$globalImports);
+ $this->preParser->setIgnoreNotImportedAnnotations(true);
+
+ $this->phpParser = new PhpParser;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotations(ReflectionClass $class)
+ {
+ $this->parser->setTarget(Target::TARGET_CLASS);
+ $this->parser->setImports($this->getClassImports($class));
+ $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class));
+
+ return $this->parser->parse($class->getDocComment(), 'class ' . $class->getName());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotation(ReflectionClass $class, $annotationName)
+ {
+ $annotations = $this->getClassAnnotations($class);
+
+ foreach ($annotations as $annotation) {
+ if ($annotation instanceof $annotationName) {
+ return $annotation;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotations(ReflectionProperty $property)
+ {
+ $class = $property->getDeclaringClass();
+ $context = 'property ' . $class->getName() . "::\$" . $property->getName();
+
+ $this->parser->setTarget(Target::TARGET_PROPERTY);
+ $this->parser->setImports($this->getPropertyImports($property));
+ $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class));
+
+ return $this->parser->parse($property->getDocComment(), $context);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotation(ReflectionProperty $property, $annotationName)
+ {
+ $annotations = $this->getPropertyAnnotations($property);
+
+ foreach ($annotations as $annotation) {
+ if ($annotation instanceof $annotationName) {
+ return $annotation;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotations(ReflectionMethod $method)
+ {
+ $class = $method->getDeclaringClass();
+ $context = 'method ' . $class->getName() . '::' . $method->getName() . '()';
+
+ $this->parser->setTarget(Target::TARGET_METHOD);
+ $this->parser->setImports($this->getMethodImports($method));
+ $this->parser->setIgnoredAnnotationNames($this->getIgnoredAnnotationNames($class));
+
+ return $this->parser->parse($method->getDocComment(), $context);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotation(ReflectionMethod $method, $annotationName)
+ {
+ $annotations = $this->getMethodAnnotations($method);
+
+ foreach ($annotations as $annotation) {
+ if ($annotation instanceof $annotationName) {
+ return $annotation;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Returns the ignored annotations for the given class.
+ *
+ * @param \ReflectionClass $class
+ *
+ * @return array
+ */
+ private function getIgnoredAnnotationNames(ReflectionClass $class)
+ {
+ if (isset($this->ignoredAnnotationNames[$name = $class->getName()])) {
+ return $this->ignoredAnnotationNames[$name];
+ }
+
+ $this->collectParsingMetadata($class);
+
+ return $this->ignoredAnnotationNames[$name];
+ }
+
+ /**
+ * Retrieves imports.
+ *
+ * @param \ReflectionClass $class
+ *
+ * @return array
+ */
+ private function getClassImports(ReflectionClass $class)
+ {
+ if (isset($this->imports[$name = $class->getName()])) {
+ return $this->imports[$name];
+ }
+
+ $this->collectParsingMetadata($class);
+
+ return $this->imports[$name];
+ }
+
+ /**
+ * Retrieves imports for methods.
+ *
+ * @param \ReflectionMethod $method
+ *
+ * @return array
+ */
+ private function getMethodImports(ReflectionMethod $method)
+ {
+ $class = $method->getDeclaringClass();
+ $classImports = $this->getClassImports($class);
+ if (!method_exists($class, 'getTraits')) {
+ return $classImports;
+ }
+
+ $traitImports = array();
+
+ foreach ($class->getTraits() as $trait) {
+ if ($trait->hasMethod($method->getName())
+ && $trait->getFileName() === $method->getFileName()
+ ) {
+ $traitImports = array_merge($traitImports, $this->phpParser->parseClass($trait));
+ }
+ }
+
+ return array_merge($classImports, $traitImports);
+ }
+
+ /**
+ * Retrieves imports for properties.
+ *
+ * @param \ReflectionProperty $property
+ *
+ * @return array
+ */
+ private function getPropertyImports(ReflectionProperty $property)
+ {
+ $class = $property->getDeclaringClass();
+ $classImports = $this->getClassImports($class);
+ if (!method_exists($class, 'getTraits')) {
+ return $classImports;
+ }
+
+ $traitImports = array();
+
+ foreach ($class->getTraits() as $trait) {
+ if ($trait->hasProperty($property->getName())) {
+ $traitImports = array_merge($traitImports, $this->phpParser->parseClass($trait));
+ }
+ }
+
+ return array_merge($classImports, $traitImports);
+ }
+
+ /**
+ * Collects parsing metadata for a given class.
+ *
+ * @param \ReflectionClass $class
+ */
+ private function collectParsingMetadata(ReflectionClass $class)
+ {
+ $ignoredAnnotationNames = self::$globalIgnoredNames;
+ $annotations = $this->preParser->parse($class->getDocComment(), 'class ' . $class->name);
+
+ foreach ($annotations as $annotation) {
+ if ($annotation instanceof IgnoreAnnotation) {
+ foreach ($annotation->names AS $annot) {
+ $ignoredAnnotationNames[$annot] = true;
+ }
+ }
+ }
+
+ $name = $class->getName();
+
+ $this->imports[$name] = array_merge(
+ self::$globalImports,
+ $this->phpParser->parseClass($class),
+ array('__NAMESPACE__' => $class->getNamespaceName())
+ );
+
+ $this->ignoredAnnotationNames[$name] = $ignoredAnnotationNames;
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php
new file mode 100644
index 0000000000000000000000000000000000000000..13ceb6348b33593a7de16fd2600d9e408ce8c3c3
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/AnnotationRegistry.php
@@ -0,0 +1,151 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+/**
+ * AnnotationRegistry.
+ */
+final class AnnotationRegistry
+{
+ /**
+ * A map of namespaces to use for autoloading purposes based on a PSR-0 convention.
+ *
+ * Contains the namespace as key and an array of directories as value. If the value is NULL
+ * the include path is used for checking for the corresponding file.
+ *
+ * This autoloading mechanism does not utilize the PHP autoloading but implements autoloading on its own.
+ *
+ * @var array
+ */
+ static private $autoloadNamespaces = array();
+
+ /**
+ * A map of autoloader callables.
+ *
+ * @var array
+ */
+ static private $loaders = array();
+
+ /**
+ * @return void
+ */
+ static public function reset()
+ {
+ self::$autoloadNamespaces = array();
+ self::$loaders = array();
+ }
+
+ /**
+ * Registers file.
+ *
+ * @param string $file
+ *
+ * @return void
+ */
+ static public function registerFile($file)
+ {
+ require_once $file;
+ }
+
+ /**
+ * Adds a namespace with one or many directories to look for files or null for the include path.
+ *
+ * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm.
+ *
+ * @param string $namespace
+ * @param string|array|null $dirs
+ *
+ * @return void
+ */
+ static public function registerAutoloadNamespace($namespace, $dirs = null)
+ {
+ self::$autoloadNamespaces[$namespace] = $dirs;
+ }
+
+ /**
+ * Registers multiple namespaces.
+ *
+ * Loading of this namespaces will be done with a PSR-0 namespace loading algorithm.
+ *
+ * @param array $namespaces
+ *
+ * @return void
+ */
+ static public function registerAutoloadNamespaces(array $namespaces)
+ {
+ self::$autoloadNamespaces = array_merge(self::$autoloadNamespaces, $namespaces);
+ }
+
+ /**
+ * Registers an autoloading callable for annotations, much like spl_autoload_register().
+ *
+ * NOTE: These class loaders HAVE to be silent when a class was not found!
+ * IMPORTANT: Loaders have to return true if they loaded a class that could contain the searched annotation class.
+ *
+ * @param callable $callable
+ *
+ * @return void
+ *
+ * @throws \InvalidArgumentException
+ */
+ static public function registerLoader($callable)
+ {
+ if (!is_callable($callable)) {
+ throw new \InvalidArgumentException("A callable is expected in AnnotationRegistry::registerLoader().");
+ }
+ self::$loaders[] = $callable;
+ }
+
+ /**
+ * Autoloads an annotation class silently.
+ *
+ * @param string $class
+ *
+ * @return boolean
+ */
+ static public function loadAnnotationClass($class)
+ {
+ foreach (self::$autoloadNamespaces AS $namespace => $dirs) {
+ if (strpos($class, $namespace) === 0) {
+ $file = str_replace("\\", DIRECTORY_SEPARATOR, $class) . ".php";
+ if ($dirs === null) {
+ if ($path = stream_resolve_include_path($file)) {
+ require $path;
+ return true;
+ }
+ } else {
+ foreach((array)$dirs AS $dir) {
+ if (is_file($dir . DIRECTORY_SEPARATOR . $file)) {
+ require $dir . DIRECTORY_SEPARATOR . $file;
+ return true;
+ }
+ }
+ }
+ }
+ }
+
+ foreach (self::$loaders AS $loader) {
+ if (call_user_func($loader, $class) === true) {
+ return true;
+ }
+ }
+ return false;
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php
new file mode 100644
index 0000000000000000000000000000000000000000..e6dc59329a5fd2d2376b6417fde08e55b474b9b7
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/CachedReader.php
@@ -0,0 +1,235 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+use Doctrine\Common\Cache\Cache;
+
+/**
+ * A cache aware annotation reader.
+ *
+ * @author Johannes M. Schmitt
+ * @author Benjamin Eberlei
+ */
+final class CachedReader implements Reader
+{
+ /**
+ * @var string
+ */
+ private static $CACHE_SALT = '@[Annot]';
+
+ /**
+ * @var Reader
+ */
+ private $delegate;
+
+ /**
+ * @var Cache
+ */
+ private $cache;
+
+ /**
+ * @var boolean
+ */
+ private $debug;
+
+ /**
+ * @var array
+ */
+ private $loadedAnnotations = array();
+
+ /**
+ * Constructor.
+ *
+ * @param Reader $reader
+ * @param Cache $cache
+ * @param bool $debug
+ */
+ public function __construct(Reader $reader, Cache $cache, $debug = false)
+ {
+ $this->delegate = $reader;
+ $this->cache = $cache;
+ $this->debug = (boolean) $debug;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotations(\ReflectionClass $class)
+ {
+ $cacheKey = $class->getName();
+
+ if (isset($this->loadedAnnotations[$cacheKey])) {
+ return $this->loadedAnnotations[$cacheKey];
+ }
+
+ if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) {
+ $annots = $this->delegate->getClassAnnotations($class);
+ $this->saveToCache($cacheKey, $annots);
+ }
+
+ return $this->loadedAnnotations[$cacheKey] = $annots;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotation(\ReflectionClass $class, $annotationName)
+ {
+ foreach ($this->getClassAnnotations($class) as $annot) {
+ if ($annot instanceof $annotationName) {
+ return $annot;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotations(\ReflectionProperty $property)
+ {
+ $class = $property->getDeclaringClass();
+ $cacheKey = $class->getName().'$'.$property->getName();
+
+ if (isset($this->loadedAnnotations[$cacheKey])) {
+ return $this->loadedAnnotations[$cacheKey];
+ }
+
+ if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) {
+ $annots = $this->delegate->getPropertyAnnotations($property);
+ $this->saveToCache($cacheKey, $annots);
+ }
+
+ return $this->loadedAnnotations[$cacheKey] = $annots;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName)
+ {
+ foreach ($this->getPropertyAnnotations($property) as $annot) {
+ if ($annot instanceof $annotationName) {
+ return $annot;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotations(\ReflectionMethod $method)
+ {
+ $class = $method->getDeclaringClass();
+ $cacheKey = $class->getName().'#'.$method->getName();
+
+ if (isset($this->loadedAnnotations[$cacheKey])) {
+ return $this->loadedAnnotations[$cacheKey];
+ }
+
+ if (false === ($annots = $this->fetchFromCache($cacheKey, $class))) {
+ $annots = $this->delegate->getMethodAnnotations($method);
+ $this->saveToCache($cacheKey, $annots);
+ }
+
+ return $this->loadedAnnotations[$cacheKey] = $annots;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotation(\ReflectionMethod $method, $annotationName)
+ {
+ foreach ($this->getMethodAnnotations($method) as $annot) {
+ if ($annot instanceof $annotationName) {
+ return $annot;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Clears loaded annotations.
+ *
+ * @return void
+ */
+ public function clearLoadedAnnotations()
+ {
+ $this->loadedAnnotations = array();
+ }
+
+ /**
+ * Fetches a value from the cache.
+ *
+ * @param string $rawCacheKey The cache key.
+ * @param \ReflectionClass $class The related class.
+ *
+ * @return mixed The cached value or false when the value is not in cache.
+ */
+ private function fetchFromCache($rawCacheKey, \ReflectionClass $class)
+ {
+ $cacheKey = $rawCacheKey . self::$CACHE_SALT;
+ if (($data = $this->cache->fetch($cacheKey)) !== false) {
+ if (!$this->debug || $this->isCacheFresh($cacheKey, $class)) {
+ return $data;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Saves a value to the cache.
+ *
+ * @param string $rawCacheKey The cache key.
+ * @param mixed $value The value.
+ *
+ * @return void
+ */
+ private function saveToCache($rawCacheKey, $value)
+ {
+ $cacheKey = $rawCacheKey . self::$CACHE_SALT;
+ $this->cache->save($cacheKey, $value);
+ if ($this->debug) {
+ $this->cache->save('[C]'.$cacheKey, time());
+ }
+ }
+
+ /**
+ * Checks if the cache is fresh.
+ *
+ * @param string $cacheKey
+ * @param \ReflectionClass $class
+ *
+ * @return boolean
+ */
+ private function isCacheFresh($cacheKey, \ReflectionClass $class)
+ {
+ if (false === $filename = $class->getFilename()) {
+ return true;
+ }
+
+ return $this->cache->fetch('[C]'.$cacheKey) >= filemtime($filename);
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php
new file mode 100644
index 0000000000000000000000000000000000000000..d864540e002fb1a5244d4ac23366571a40d232b4
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocLexer.php
@@ -0,0 +1,134 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+use Doctrine\Common\Lexer\AbstractLexer;
+
+/**
+ * Simple lexer for docblock annotations.
+ *
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author Johannes M. Schmitt
+ */
+final class DocLexer extends AbstractLexer
+{
+ const T_NONE = 1;
+ const T_INTEGER = 2;
+ const T_STRING = 3;
+ const T_FLOAT = 4;
+
+ // All tokens that are also identifiers should be >= 100
+ const T_IDENTIFIER = 100;
+ const T_AT = 101;
+ const T_CLOSE_CURLY_BRACES = 102;
+ const T_CLOSE_PARENTHESIS = 103;
+ const T_COMMA = 104;
+ const T_EQUALS = 105;
+ const T_FALSE = 106;
+ const T_NAMESPACE_SEPARATOR = 107;
+ const T_OPEN_CURLY_BRACES = 108;
+ const T_OPEN_PARENTHESIS = 109;
+ const T_TRUE = 110;
+ const T_NULL = 111;
+ const T_COLON = 112;
+
+ /**
+ * @var array
+ */
+ protected $noCase = array(
+ '@' => self::T_AT,
+ ',' => self::T_COMMA,
+ '(' => self::T_OPEN_PARENTHESIS,
+ ')' => self::T_CLOSE_PARENTHESIS,
+ '{' => self::T_OPEN_CURLY_BRACES,
+ '}' => self::T_CLOSE_CURLY_BRACES,
+ '=' => self::T_EQUALS,
+ ':' => self::T_COLON,
+ '\\' => self::T_NAMESPACE_SEPARATOR
+ );
+
+ /**
+ * @var array
+ */
+ protected $withCase = array(
+ 'true' => self::T_TRUE,
+ 'false' => self::T_FALSE,
+ 'null' => self::T_NULL
+ );
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getCatchablePatterns()
+ {
+ return array(
+ '[a-z_\\\][a-z0-9_\:\\\]*[a-z_][a-z0-9_]*',
+ '(?:[+-]?[0-9]+(?:[\.][0-9]+)*)(?:[eE][+-]?[0-9]+)?',
+ '"(?:""|[^"])*+"',
+ );
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getNonCatchablePatterns()
+ {
+ return array('\s+', '\*+', '(.)');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function getType(&$value)
+ {
+ $type = self::T_NONE;
+
+ if ($value[0] === '"') {
+ $value = str_replace('""', '"', substr($value, 1, strlen($value) - 2));
+
+ return self::T_STRING;
+ }
+
+ if (isset($this->noCase[$value])) {
+ return $this->noCase[$value];
+ }
+
+ if ($value[0] === '_' || $value[0] === '\\' || ctype_alpha($value[0])) {
+ return self::T_IDENTIFIER;
+ }
+
+ $lowerValue = strtolower($value);
+
+ if (isset($this->withCase[$lowerValue])) {
+ return $this->withCase[$lowerValue];
+ }
+
+ // Checking numeric value
+ if (is_numeric($value)) {
+ return (strpos($value, '.') !== false || stripos($value, 'e') !== false)
+ ? self::T_FLOAT : self::T_INTEGER;
+ }
+
+ return $type;
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..db668460ee14e06ff41748b17ae8aa44ceae5979
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/DocParser.php
@@ -0,0 +1,1138 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+use Doctrine\Common\Annotations\Annotation\Attribute;
+use ReflectionClass;
+use Doctrine\Common\Annotations\Annotation\Enum;
+use Doctrine\Common\Annotations\Annotation\Target;
+use Doctrine\Common\Annotations\Annotation\Attributes;
+
+/**
+ * A parser for docblock annotations.
+ *
+ * It is strongly discouraged to change the default annotation parsing process.
+ *
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author Johannes M. Schmitt
+ * @author Fabio B. Silva
+ */
+final class DocParser
+{
+ /**
+ * An array of all valid tokens for a class name.
+ *
+ * @var array
+ */
+ private static $classIdentifiers = array(
+ DocLexer::T_IDENTIFIER,
+ DocLexer::T_TRUE,
+ DocLexer::T_FALSE,
+ DocLexer::T_NULL
+ );
+
+ /**
+ * The lexer.
+ *
+ * @var \Doctrine\Common\Annotations\DocLexer
+ */
+ private $lexer;
+
+ /**
+ * Current target context.
+ *
+ * @var string
+ */
+ private $target;
+
+ /**
+ * Doc parser used to collect annotation target.
+ *
+ * @var \Doctrine\Common\Annotations\DocParser
+ */
+ private static $metadataParser;
+
+ /**
+ * Flag to control if the current annotation is nested or not.
+ *
+ * @var boolean
+ */
+ private $isNestedAnnotation = false;
+
+ /**
+ * Hashmap containing all use-statements that are to be used when parsing
+ * the given doc block.
+ *
+ * @var array
+ */
+ private $imports = array();
+
+ /**
+ * This hashmap is used internally to cache results of class_exists()
+ * look-ups.
+ *
+ * @var array
+ */
+ private $classExists = array();
+
+ /**
+ * Whether annotations that have not been imported should be ignored.
+ *
+ * @var boolean
+ */
+ private $ignoreNotImportedAnnotations = false;
+
+ /**
+ * An array of default namespaces if operating in simple mode.
+ *
+ * @var array
+ */
+ private $namespaces = array();
+
+ /**
+ * A list with annotations that are not causing exceptions when not resolved to an annotation class.
+ *
+ * The names must be the raw names as used in the class, not the fully qualified
+ * class names.
+ *
+ * @var array
+ */
+ private $ignoredAnnotationNames = array();
+
+ /**
+ * @var string
+ */
+ private $context = '';
+
+ /**
+ * Hash-map for caching annotation metadata.
+ *
+ * @var array
+ */
+ private static $annotationMetadata = array(
+ 'Doctrine\Common\Annotations\Annotation\Target' => array(
+ 'is_annotation' => true,
+ 'has_constructor' => true,
+ 'properties' => array(),
+ 'targets_literal' => 'ANNOTATION_CLASS',
+ 'targets' => Target::TARGET_CLASS,
+ 'default_property' => 'value',
+ 'attribute_types' => array(
+ 'value' => array(
+ 'required' => false,
+ 'type' =>'array',
+ 'array_type'=>'string',
+ 'value' =>'array'
+ )
+ ),
+ ),
+ 'Doctrine\Common\Annotations\Annotation\Attribute' => array(
+ 'is_annotation' => true,
+ 'has_constructor' => false,
+ 'targets_literal' => 'ANNOTATION_ANNOTATION',
+ 'targets' => Target::TARGET_ANNOTATION,
+ 'default_property' => 'name',
+ 'properties' => array(
+ 'name' => 'name',
+ 'type' => 'type',
+ 'required' => 'required'
+ ),
+ 'attribute_types' => array(
+ 'value' => array(
+ 'required' => true,
+ 'type' =>'string',
+ 'value' =>'string'
+ ),
+ 'type' => array(
+ 'required' =>true,
+ 'type' =>'string',
+ 'value' =>'string'
+ ),
+ 'required' => array(
+ 'required' =>false,
+ 'type' =>'boolean',
+ 'value' =>'boolean'
+ )
+ ),
+ ),
+ 'Doctrine\Common\Annotations\Annotation\Attributes' => array(
+ 'is_annotation' => true,
+ 'has_constructor' => false,
+ 'targets_literal' => 'ANNOTATION_CLASS',
+ 'targets' => Target::TARGET_CLASS,
+ 'default_property' => 'value',
+ 'properties' => array(
+ 'value' => 'value'
+ ),
+ 'attribute_types' => array(
+ 'value' => array(
+ 'type' =>'array',
+ 'required' =>true,
+ 'array_type'=>'Doctrine\Common\Annotations\Annotation\Attribute',
+ 'value' =>'array'
+ )
+ ),
+ ),
+ 'Doctrine\Common\Annotations\Annotation\Enum' => array(
+ 'is_annotation' => true,
+ 'has_constructor' => true,
+ 'targets_literal' => 'ANNOTATION_PROPERTY',
+ 'targets' => Target::TARGET_PROPERTY,
+ 'default_property' => 'value',
+ 'properties' => array(
+ 'value' => 'value'
+ ),
+ 'attribute_types' => array(
+ 'value' => array(
+ 'type' => 'array',
+ 'required' => true,
+ ),
+ 'literal' => array(
+ 'type' => 'array',
+ 'required' => false,
+ ),
+ ),
+ ),
+ );
+
+ /**
+ * Hash-map for handle types declaration.
+ *
+ * @var array
+ */
+ private static $typeMap = array(
+ 'float' => 'double',
+ 'bool' => 'boolean',
+ // allow uppercase Boolean in honor of George Boole
+ 'Boolean' => 'boolean',
+ 'int' => 'integer',
+ );
+
+ /**
+ * Constructs a new DocParser.
+ */
+ public function __construct()
+ {
+ $this->lexer = new DocLexer;
+ }
+
+ /**
+ * Sets the annotation names that are ignored during the parsing process.
+ *
+ * The names are supposed to be the raw names as used in the class, not the
+ * fully qualified class names.
+ *
+ * @param array $names
+ *
+ * @return void
+ */
+ public function setIgnoredAnnotationNames(array $names)
+ {
+ $this->ignoredAnnotationNames = $names;
+ }
+
+ /**
+ * Sets ignore on not-imported annotations.
+ *
+ * @param boolean $bool
+ *
+ * @return void
+ */
+ public function setIgnoreNotImportedAnnotations($bool)
+ {
+ $this->ignoreNotImportedAnnotations = (boolean) $bool;
+ }
+
+ /**
+ * Sets the default namespaces.
+ *
+ * @param array $namespace
+ *
+ * @return void
+ *
+ * @throws \RuntimeException
+ */
+ public function addNamespace($namespace)
+ {
+ if ($this->imports) {
+ throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.');
+ }
+
+ $this->namespaces[] = $namespace;
+ }
+
+ /**
+ * Sets the imports.
+ *
+ * @param array $imports
+ *
+ * @return void
+ *
+ * @throws \RuntimeException
+ */
+ public function setImports(array $imports)
+ {
+ if ($this->namespaces) {
+ throw new \RuntimeException('You must either use addNamespace(), or setImports(), but not both.');
+ }
+
+ $this->imports = $imports;
+ }
+
+ /**
+ * Sets current target context as bitmask.
+ *
+ * @param integer $target
+ *
+ * @return void
+ */
+ public function setTarget($target)
+ {
+ $this->target = $target;
+ }
+
+ /**
+ * Parses the given docblock string for annotations.
+ *
+ * @param string $input The docblock string to parse.
+ * @param string $context The parsing context.
+ *
+ * @return array Array of annotations. If no annotations are found, an empty array is returned.
+ */
+ public function parse($input, $context = '')
+ {
+ $pos = $this->findInitialTokenPosition($input);
+ if ($pos === null) {
+ return array();
+ }
+
+ $this->context = $context;
+
+ $this->lexer->setInput(trim(substr($input, $pos), '* /'));
+ $this->lexer->moveNext();
+
+ return $this->Annotations();
+ }
+
+ /**
+ * Finds the first valid annotation
+ *
+ * @param string $input The docblock string to parse
+ *
+ * @return int|null
+ */
+ private function findInitialTokenPosition($input)
+ {
+ $pos = 0;
+
+ // search for first valid annotation
+ while (($pos = strpos($input, '@', $pos)) !== false) {
+ // if the @ is preceded by a space or * it is valid
+ if ($pos === 0 || $input[$pos - 1] === ' ' || $input[$pos - 1] === '*') {
+ return $pos;
+ }
+
+ $pos++;
+ }
+
+ return null;
+ }
+
+ /**
+ * Attempts to match the given token with the current lookahead token.
+ * If they match, updates the lookahead token; otherwise raises a syntax error.
+ *
+ * @param integer $token Type of token.
+ *
+ * @return boolean True if tokens match; false otherwise.
+ */
+ private function match($token)
+ {
+ if ( ! $this->lexer->isNextToken($token) ) {
+ $this->syntaxError($this->lexer->getLiteral($token));
+ }
+
+ return $this->lexer->moveNext();
+ }
+
+ /**
+ * Attempts to match the current lookahead token with any of the given tokens.
+ *
+ * If any of them matches, this method updates the lookahead token; otherwise
+ * a syntax error is raised.
+ *
+ * @param array $tokens
+ *
+ * @return boolean
+ */
+ private function matchAny(array $tokens)
+ {
+ if ( ! $this->lexer->isNextTokenAny($tokens)) {
+ $this->syntaxError(implode(' or ', array_map(array($this->lexer, 'getLiteral'), $tokens)));
+ }
+
+ return $this->lexer->moveNext();
+ }
+
+ /**
+ * Generates a new syntax error.
+ *
+ * @param string $expected Expected string.
+ * @param array|null $token Optional token.
+ *
+ * @return void
+ *
+ * @throws AnnotationException
+ */
+ private function syntaxError($expected, $token = null)
+ {
+ if ($token === null) {
+ $token = $this->lexer->lookahead;
+ }
+
+ $message = sprintf('Expected %s, got ', $expected);
+ $message .= ($this->lexer->lookahead === null)
+ ? 'end of string'
+ : sprintf("'%s' at position %s", $token['value'], $token['position']);
+
+ if (strlen($this->context)) {
+ $message .= ' in ' . $this->context;
+ }
+
+ $message .= '.';
+
+ throw AnnotationException::syntaxError($message);
+ }
+
+ /**
+ * Attempts to check if a class exists or not. This never goes through the PHP autoloading mechanism
+ * but uses the {@link AnnotationRegistry} to load classes.
+ *
+ * @param string $fqcn
+ *
+ * @return boolean
+ */
+ private function classExists($fqcn)
+ {
+ if (isset($this->classExists[$fqcn])) {
+ return $this->classExists[$fqcn];
+ }
+
+ // first check if the class already exists, maybe loaded through another AnnotationReader
+ if (class_exists($fqcn, false)) {
+ return $this->classExists[$fqcn] = true;
+ }
+
+ // final check, does this class exist?
+ return $this->classExists[$fqcn] = AnnotationRegistry::loadAnnotationClass($fqcn);
+ }
+
+ /**
+ * Collects parsing metadata for a given annotation class
+ *
+ * @param string $name The annotation name
+ *
+ * @return void
+ */
+ private function collectAnnotationMetadata($name)
+ {
+ if (self::$metadataParser === null) {
+ self::$metadataParser = new self();
+
+ self::$metadataParser->setIgnoreNotImportedAnnotations(true);
+ self::$metadataParser->setIgnoredAnnotationNames($this->ignoredAnnotationNames);
+ self::$metadataParser->setImports(array(
+ 'enum' => 'Doctrine\Common\Annotations\Annotation\Enum',
+ 'target' => 'Doctrine\Common\Annotations\Annotation\Target',
+ 'attribute' => 'Doctrine\Common\Annotations\Annotation\Attribute',
+ 'attributes' => 'Doctrine\Common\Annotations\Annotation\Attributes'
+ ));
+
+ AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Enum.php');
+ AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Target.php');
+ AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attribute.php');
+ AnnotationRegistry::registerFile(__DIR__ . '/Annotation/Attributes.php');
+ }
+
+ $class = new \ReflectionClass($name);
+ $docComment = $class->getDocComment();
+
+ // Sets default values for annotation metadata
+ $metadata = array(
+ 'default_property' => null,
+ 'has_constructor' => (null !== $constructor = $class->getConstructor()) && $constructor->getNumberOfParameters() > 0,
+ 'properties' => array(),
+ 'property_types' => array(),
+ 'attribute_types' => array(),
+ 'targets_literal' => null,
+ 'targets' => Target::TARGET_ALL,
+ 'is_annotation' => false !== strpos($docComment, '@Annotation'),
+ );
+
+ // verify that the class is really meant to be an annotation
+ if ($metadata['is_annotation']) {
+ self::$metadataParser->setTarget(Target::TARGET_CLASS);
+
+ foreach (self::$metadataParser->parse($docComment, 'class @' . $name) as $annotation) {
+ if ($annotation instanceof Target) {
+ $metadata['targets'] = $annotation->targets;
+ $metadata['targets_literal'] = $annotation->literal;
+
+ continue;
+ }
+
+ if ($annotation instanceof Attributes) {
+ foreach ($annotation->value as $attribute) {
+ $this->collectAttributeTypeMetadata($metadata, $attribute);
+ }
+ }
+ }
+
+ // if not has a constructor will inject values into public properties
+ if (false === $metadata['has_constructor']) {
+ // collect all public properties
+ foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
+ $metadata['properties'][$property->name] = $property->name;
+
+ if (false === ($propertyComment = $property->getDocComment())) {
+ continue;
+ }
+
+ $attribute = new Attribute();
+
+ $attribute->required = (false !== strpos($propertyComment, '@Required'));
+ $attribute->name = $property->name;
+ $attribute->type = (false !== strpos($propertyComment, '@var') && preg_match('/@var\s+([^\s]+)/',$propertyComment, $matches))
+ ? $matches[1]
+ : 'mixed';
+
+ $this->collectAttributeTypeMetadata($metadata, $attribute);
+
+ // checks if the property has @Enum
+ if (false !== strpos($propertyComment, '@Enum')) {
+ $context = 'property ' . $class->name . "::\$" . $property->name;
+
+ self::$metadataParser->setTarget(Target::TARGET_PROPERTY);
+
+ foreach (self::$metadataParser->parse($propertyComment, $context) as $annotation) {
+ if ( ! $annotation instanceof Enum) {
+ continue;
+ }
+
+ $metadata['enum'][$property->name]['value'] = $annotation->value;
+ $metadata['enum'][$property->name]['literal'] = ( ! empty($annotation->literal))
+ ? $annotation->literal
+ : $annotation->value;
+ }
+ }
+ }
+
+ // choose the first property as default property
+ $metadata['default_property'] = reset($metadata['properties']);
+ }
+ }
+
+ self::$annotationMetadata[$name] = $metadata;
+ }
+
+ /**
+ * Collects parsing metadata for a given attribute.
+ *
+ * @param array $metadata
+ * @param Attribute $attribute
+ *
+ * @return void
+ */
+ private function collectAttributeTypeMetadata(&$metadata, Attribute $attribute)
+ {
+ // handle internal type declaration
+ $type = isset(self::$typeMap[$attribute->type])
+ ? self::$typeMap[$attribute->type]
+ : $attribute->type;
+
+ // handle the case if the property type is mixed
+ if ('mixed' === $type) {
+ return;
+ }
+
+ // Evaluate type
+ switch (true) {
+ // Checks if the property has array
+ case (false !== $pos = strpos($type, '<')):
+ $arrayType = substr($type, $pos + 1, -1);
+ $type = 'array';
+
+ if (isset(self::$typeMap[$arrayType])) {
+ $arrayType = self::$typeMap[$arrayType];
+ }
+
+ $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType;
+ break;
+
+ // Checks if the property has type[]
+ case (false !== $pos = strrpos($type, '[')):
+ $arrayType = substr($type, 0, $pos);
+ $type = 'array';
+
+ if (isset(self::$typeMap[$arrayType])) {
+ $arrayType = self::$typeMap[$arrayType];
+ }
+
+ $metadata['attribute_types'][$attribute->name]['array_type'] = $arrayType;
+ break;
+ }
+
+ $metadata['attribute_types'][$attribute->name]['type'] = $type;
+ $metadata['attribute_types'][$attribute->name]['value'] = $attribute->type;
+ $metadata['attribute_types'][$attribute->name]['required'] = $attribute->required;
+ }
+
+ /**
+ * Annotations ::= Annotation {[ "*" ]* [Annotation]}*
+ *
+ * @return array
+ */
+ private function Annotations()
+ {
+ $annotations = array();
+
+ while (null !== $this->lexer->lookahead) {
+ if (DocLexer::T_AT !== $this->lexer->lookahead['type']) {
+ $this->lexer->moveNext();
+ continue;
+ }
+
+ // make sure the @ is preceded by non-catchable pattern
+ if (null !== $this->lexer->token && $this->lexer->lookahead['position'] === $this->lexer->token['position'] + strlen($this->lexer->token['value'])) {
+ $this->lexer->moveNext();
+ continue;
+ }
+
+ // make sure the @ is followed by either a namespace separator, or
+ // an identifier token
+ if ((null === $peek = $this->lexer->glimpse())
+ || (DocLexer::T_NAMESPACE_SEPARATOR !== $peek['type'] && !in_array($peek['type'], self::$classIdentifiers, true))
+ || $peek['position'] !== $this->lexer->lookahead['position'] + 1) {
+ $this->lexer->moveNext();
+ continue;
+ }
+
+ $this->isNestedAnnotation = false;
+ if (false !== $annot = $this->Annotation()) {
+ $annotations[] = $annot;
+ }
+ }
+
+ return $annotations;
+ }
+
+ /**
+ * Annotation ::= "@" AnnotationName MethodCall
+ * AnnotationName ::= QualifiedName | SimpleName
+ * QualifiedName ::= NameSpacePart "\" {NameSpacePart "\"}* SimpleName
+ * NameSpacePart ::= identifier | null | false | true
+ * SimpleName ::= identifier | null | false | true
+ *
+ * @return mixed False if it is not a valid annotation.
+ *
+ * @throws AnnotationException
+ */
+ private function Annotation()
+ {
+ $this->match(DocLexer::T_AT);
+
+ // check if we have an annotation
+ $name = $this->Identifier();
+
+ // only process names which are not fully qualified, yet
+ // fully qualified names must start with a \
+ $originalName = $name;
+
+ if ('\\' !== $name[0]) {
+ $alias = (false === $pos = strpos($name, '\\'))? $name : substr($name, 0, $pos);
+ $found = false;
+
+ if ($this->namespaces) {
+ foreach ($this->namespaces as $namespace) {
+ if ($this->classExists($namespace.'\\'.$name)) {
+ $name = $namespace.'\\'.$name;
+ $found = true;
+ break;
+ }
+ }
+ } elseif (isset($this->imports[$loweredAlias = strtolower($alias)])) {
+ $found = true;
+ $name = (false !== $pos)
+ ? $this->imports[$loweredAlias] . substr($name, $pos)
+ : $this->imports[$loweredAlias];
+ } elseif ( ! isset($this->ignoredAnnotationNames[$name])
+ && isset($this->imports['__NAMESPACE__'])
+ && $this->classExists($this->imports['__NAMESPACE__'] . '\\' . $name)
+ ) {
+ $name = $this->imports['__NAMESPACE__'].'\\'.$name;
+ $found = true;
+ } elseif (! isset($this->ignoredAnnotationNames[$name]) && $this->classExists($name)) {
+ $found = true;
+ }
+
+ if ( ! $found) {
+ if ($this->ignoreNotImportedAnnotations || isset($this->ignoredAnnotationNames[$name])) {
+ return false;
+ }
+
+ throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s was never imported. Did you maybe forget to add a "use" statement for this annotation?', $name, $this->context));
+ }
+ }
+
+ if ( ! $this->classExists($name)) {
+ throw AnnotationException::semanticalError(sprintf('The annotation "@%s" in %s does not exist, or could not be auto-loaded.', $name, $this->context));
+ }
+
+ // at this point, $name contains the fully qualified class name of the
+ // annotation, and it is also guaranteed that this class exists, and
+ // that it is loaded
+
+
+ // collects the metadata annotation only if there is not yet
+ if ( ! isset(self::$annotationMetadata[$name])) {
+ $this->collectAnnotationMetadata($name);
+ }
+
+ // verify that the class is really meant to be an annotation and not just any ordinary class
+ if (self::$annotationMetadata[$name]['is_annotation'] === false) {
+ if (isset($this->ignoredAnnotationNames[$originalName])) {
+ return false;
+ }
+
+ throw AnnotationException::semanticalError(sprintf('The class "%s" is not annotated with @Annotation. Are you sure this class can be used as annotation? If so, then you need to add @Annotation to the _class_ doc comment of "%s". If it is indeed no annotation, then you need to add @IgnoreAnnotation("%s") to the _class_ doc comment of %s.', $name, $name, $originalName, $this->context));
+ }
+
+ //if target is nested annotation
+ $target = $this->isNestedAnnotation ? Target::TARGET_ANNOTATION : $this->target;
+
+ // Next will be nested
+ $this->isNestedAnnotation = true;
+
+ //if annotation does not support current target
+ if (0 === (self::$annotationMetadata[$name]['targets'] & $target) && $target) {
+ throw AnnotationException::semanticalError(
+ sprintf('Annotation @%s is not allowed to be declared on %s. You may only use this annotation on these code elements: %s.',
+ $originalName, $this->context, self::$annotationMetadata[$name]['targets_literal'])
+ );
+ }
+
+ $values = $this->MethodCall();
+
+ if (isset(self::$annotationMetadata[$name]['enum'])) {
+ // checks all declared attributes
+ foreach (self::$annotationMetadata[$name]['enum'] as $property => $enum) {
+ // checks if the attribute is a valid enumerator
+ if (isset($values[$property]) && ! in_array($values[$property], $enum['value'])) {
+ throw AnnotationException::enumeratorError($property, $name, $this->context, $enum['literal'], $values[$property]);
+ }
+ }
+ }
+
+ // checks all declared attributes
+ foreach (self::$annotationMetadata[$name]['attribute_types'] as $property => $type) {
+ if ($property === self::$annotationMetadata[$name]['default_property']
+ && !isset($values[$property]) && isset($values['value'])) {
+ $property = 'value';
+ }
+
+ // handle a not given attribute or null value
+ if (!isset($values[$property])) {
+ if ($type['required']) {
+ throw AnnotationException::requiredError($property, $originalName, $this->context, 'a(n) '.$type['value']);
+ }
+
+ continue;
+ }
+
+ if ($type['type'] === 'array') {
+ // handle the case of a single value
+ if ( ! is_array($values[$property])) {
+ $values[$property] = array($values[$property]);
+ }
+
+ // checks if the attribute has array type declaration, such as "array"
+ if (isset($type['array_type'])) {
+ foreach ($values[$property] as $item) {
+ if (gettype($item) !== $type['array_type'] && !$item instanceof $type['array_type']) {
+ throw AnnotationException::attributeTypeError($property, $originalName, $this->context, 'either a(n) '.$type['array_type'].', or an array of '.$type['array_type'].'s', $item);
+ }
+ }
+ }
+ } elseif (gettype($values[$property]) !== $type['type'] && !$values[$property] instanceof $type['type']) {
+ throw AnnotationException::attributeTypeError($property, $originalName, $this->context, 'a(n) '.$type['value'], $values[$property]);
+ }
+ }
+
+ // check if the annotation expects values via the constructor,
+ // or directly injected into public properties
+ if (self::$annotationMetadata[$name]['has_constructor'] === true) {
+ return new $name($values);
+ }
+
+ $instance = new $name();
+
+ foreach ($values as $property => $value) {
+ if (!isset(self::$annotationMetadata[$name]['properties'][$property])) {
+ if ('value' !== $property) {
+ throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not have a property named "%s". Available properties: %s', $originalName, $this->context, $property, implode(', ', self::$annotationMetadata[$name]['properties'])));
+ }
+
+ // handle the case if the property has no annotations
+ if ( ! $property = self::$annotationMetadata[$name]['default_property']) {
+ throw AnnotationException::creationError(sprintf('The annotation @%s declared on %s does not accept any values, but got %s.', $originalName, $this->context, json_encode($values)));
+ }
+ }
+
+ $instance->{$property} = $value;
+ }
+
+ return $instance;
+ }
+
+ /**
+ * MethodCall ::= ["(" [Values] ")"]
+ *
+ * @return array
+ */
+ private function MethodCall()
+ {
+ $values = array();
+
+ if ( ! $this->lexer->isNextToken(DocLexer::T_OPEN_PARENTHESIS)) {
+ return $values;
+ }
+
+ $this->match(DocLexer::T_OPEN_PARENTHESIS);
+
+ if ( ! $this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) {
+ $values = $this->Values();
+ }
+
+ $this->match(DocLexer::T_CLOSE_PARENTHESIS);
+
+ return $values;
+ }
+
+ /**
+ * Values ::= Array | Value {"," Value}* [","]
+ *
+ * @return array
+ */
+ private function Values()
+ {
+ $values = array($this->Value());
+
+ while ($this->lexer->isNextToken(DocLexer::T_COMMA)) {
+ $this->match(DocLexer::T_COMMA);
+
+ if ($this->lexer->isNextToken(DocLexer::T_CLOSE_PARENTHESIS)) {
+ break;
+ }
+
+ $token = $this->lexer->lookahead;
+ $value = $this->Value();
+
+ if ( ! is_object($value) && ! is_array($value)) {
+ $this->syntaxError('Value', $token);
+ }
+
+ $values[] = $value;
+ }
+
+ foreach ($values as $k => $value) {
+ if (is_object($value) && $value instanceof \stdClass) {
+ $values[$value->name] = $value->value;
+ } else if ( ! isset($values['value'])){
+ $values['value'] = $value;
+ } else {
+ if ( ! is_array($values['value'])) {
+ $values['value'] = array($values['value']);
+ }
+
+ $values['value'][] = $value;
+ }
+
+ unset($values[$k]);
+ }
+
+ return $values;
+ }
+
+ /**
+ * Constant ::= integer | string | float | boolean
+ *
+ * @return mixed
+ *
+ * @throws AnnotationException
+ */
+ private function Constant()
+ {
+ $identifier = $this->Identifier();
+
+ if ( ! defined($identifier) && false !== strpos($identifier, '::') && '\\' !== $identifier[0]) {
+ list($className, $const) = explode('::', $identifier);
+
+ $alias = (false === $pos = strpos($className, '\\')) ? $className : substr($className, 0, $pos);
+ $found = false;
+
+ switch (true) {
+ case !empty ($this->namespaces):
+ foreach ($this->namespaces as $ns) {
+ if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) {
+ $className = $ns.'\\'.$className;
+ $found = true;
+ break;
+ }
+ }
+ break;
+
+ case isset($this->imports[$loweredAlias = strtolower($alias)]):
+ $found = true;
+ $className = (false !== $pos)
+ ? $this->imports[$loweredAlias] . substr($className, $pos)
+ : $this->imports[$loweredAlias];
+ break;
+
+ default:
+ if(isset($this->imports['__NAMESPACE__'])) {
+ $ns = $this->imports['__NAMESPACE__'];
+
+ if (class_exists($ns.'\\'.$className) || interface_exists($ns.'\\'.$className)) {
+ $className = $ns.'\\'.$className;
+ $found = true;
+ }
+ }
+ break;
+ }
+
+ if ($found) {
+ $identifier = $className . '::' . $const;
+ }
+ }
+
+ // checks if identifier ends with ::class, \strlen('::class') === 7
+ $classPos = stripos($identifier, '::class');
+ if ($classPos === strlen($identifier) - 7) {
+ return substr($identifier, 0, $classPos);
+ }
+
+ if (!defined($identifier)) {
+ throw AnnotationException::semanticalErrorConstants($identifier, $this->context);
+ }
+
+ return constant($identifier);
+ }
+
+ /**
+ * Identifier ::= string
+ *
+ * @return string
+ */
+ private function Identifier()
+ {
+ // check if we have an annotation
+ if ( ! $this->lexer->isNextTokenAny(self::$classIdentifiers)) {
+ $this->syntaxError('namespace separator or identifier');
+ }
+
+ $this->lexer->moveNext();
+
+ $className = $this->lexer->token['value'];
+
+ while ($this->lexer->lookahead['position'] === ($this->lexer->token['position'] + strlen($this->lexer->token['value']))
+ && $this->lexer->isNextToken(DocLexer::T_NAMESPACE_SEPARATOR)) {
+
+ $this->match(DocLexer::T_NAMESPACE_SEPARATOR);
+ $this->matchAny(self::$classIdentifiers);
+
+ $className .= '\\' . $this->lexer->token['value'];
+ }
+
+ return $className;
+ }
+
+ /**
+ * Value ::= PlainValue | FieldAssignment
+ *
+ * @return mixed
+ */
+ private function Value()
+ {
+ $peek = $this->lexer->glimpse();
+
+ if (DocLexer::T_EQUALS === $peek['type']) {
+ return $this->FieldAssignment();
+ }
+
+ return $this->PlainValue();
+ }
+
+ /**
+ * PlainValue ::= integer | string | float | boolean | Array | Annotation
+ *
+ * @return mixed
+ */
+ private function PlainValue()
+ {
+ if ($this->lexer->isNextToken(DocLexer::T_OPEN_CURLY_BRACES)) {
+ return $this->Arrayx();
+ }
+
+ if ($this->lexer->isNextToken(DocLexer::T_AT)) {
+ return $this->Annotation();
+ }
+
+ if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) {
+ return $this->Constant();
+ }
+
+ switch ($this->lexer->lookahead['type']) {
+ case DocLexer::T_STRING:
+ $this->match(DocLexer::T_STRING);
+ return $this->lexer->token['value'];
+
+ case DocLexer::T_INTEGER:
+ $this->match(DocLexer::T_INTEGER);
+ return (int)$this->lexer->token['value'];
+
+ case DocLexer::T_FLOAT:
+ $this->match(DocLexer::T_FLOAT);
+ return (float)$this->lexer->token['value'];
+
+ case DocLexer::T_TRUE:
+ $this->match(DocLexer::T_TRUE);
+ return true;
+
+ case DocLexer::T_FALSE:
+ $this->match(DocLexer::T_FALSE);
+ return false;
+
+ case DocLexer::T_NULL:
+ $this->match(DocLexer::T_NULL);
+ return null;
+
+ default:
+ $this->syntaxError('PlainValue');
+ }
+ }
+
+ /**
+ * FieldAssignment ::= FieldName "=" PlainValue
+ * FieldName ::= identifier
+ *
+ * @return array
+ */
+ private function FieldAssignment()
+ {
+ $this->match(DocLexer::T_IDENTIFIER);
+ $fieldName = $this->lexer->token['value'];
+
+ $this->match(DocLexer::T_EQUALS);
+
+ $item = new \stdClass();
+ $item->name = $fieldName;
+ $item->value = $this->PlainValue();
+
+ return $item;
+ }
+
+ /**
+ * Array ::= "{" ArrayEntry {"," ArrayEntry}* [","] "}"
+ *
+ * @return array
+ */
+ private function Arrayx()
+ {
+ $array = $values = array();
+
+ $this->match(DocLexer::T_OPEN_CURLY_BRACES);
+
+ // If the array is empty, stop parsing and return.
+ if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) {
+ $this->match(DocLexer::T_CLOSE_CURLY_BRACES);
+
+ return $array;
+ }
+
+ $values[] = $this->ArrayEntry();
+
+ while ($this->lexer->isNextToken(DocLexer::T_COMMA)) {
+ $this->match(DocLexer::T_COMMA);
+
+ // optional trailing comma
+ if ($this->lexer->isNextToken(DocLexer::T_CLOSE_CURLY_BRACES)) {
+ break;
+ }
+
+ $values[] = $this->ArrayEntry();
+ }
+
+ $this->match(DocLexer::T_CLOSE_CURLY_BRACES);
+
+ foreach ($values as $value) {
+ list ($key, $val) = $value;
+
+ if ($key !== null) {
+ $array[$key] = $val;
+ } else {
+ $array[] = $val;
+ }
+ }
+
+ return $array;
+ }
+
+ /**
+ * ArrayEntry ::= Value | KeyValuePair
+ * KeyValuePair ::= Key ("=" | ":") PlainValue | Constant
+ * Key ::= string | integer | Constant
+ *
+ * @return array
+ */
+ private function ArrayEntry()
+ {
+ $peek = $this->lexer->glimpse();
+
+ if (DocLexer::T_EQUALS === $peek['type']
+ || DocLexer::T_COLON === $peek['type']) {
+
+ if ($this->lexer->isNextToken(DocLexer::T_IDENTIFIER)) {
+ $key = $this->Constant();
+ } else {
+ $this->matchAny(array(DocLexer::T_INTEGER, DocLexer::T_STRING));
+ $key = $this->lexer->token['value'];
+ }
+
+ $this->matchAny(array(DocLexer::T_EQUALS, DocLexer::T_COLON));
+
+ return array($key, $this->PlainValue());
+ }
+
+ return array(null, $this->Value());
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php
new file mode 100644
index 0000000000000000000000000000000000000000..24add1b3ba83a46abaedbc393758c0f9fd8d924f
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/FileCacheReader.php
@@ -0,0 +1,288 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+/**
+ * File cache reader for annotations.
+ *
+ * @author Johannes M. Schmitt
+ * @author Benjamin Eberlei
+ *
+ * @deprecated the FileCacheReader is deprecated and will be removed
+ * in version 2.0.0 of doctrine/annotations. Please use the
+ * {@see \Doctrine\Common\Annotations\CachedReader} instead.
+ */
+class FileCacheReader implements Reader
+{
+ /**
+ * @var Reader
+ */
+ private $reader;
+
+ /**
+ * @var string
+ */
+ private $dir;
+
+ /**
+ * @var bool
+ */
+ private $debug;
+
+ /**
+ * @var array
+ */
+ private $loadedAnnotations = array();
+
+ /**
+ * @var array
+ */
+ private $classNameHashes = array();
+
+ /**
+ * @var int
+ */
+ private $umask;
+
+ /**
+ * Constructor.
+ *
+ * @param Reader $reader
+ * @param string $cacheDir
+ * @param boolean $debug
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function __construct(Reader $reader, $cacheDir, $debug = false, $umask = 0002)
+ {
+ if ( ! is_int($umask)) {
+ throw new \InvalidArgumentException(sprintf(
+ 'The parameter umask must be an integer, was: %s',
+ gettype($umask)
+ ));
+ }
+
+ $this->reader = $reader;
+ $this->umask = $umask;
+
+ if (!is_dir($cacheDir) && !@mkdir($cacheDir, 0777 & (~$this->umask), true)) {
+ throw new \InvalidArgumentException(sprintf('The directory "%s" does not exist and could not be created.', $cacheDir));
+ }
+
+ $this->dir = rtrim($cacheDir, '\\/');
+ $this->debug = $debug;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotations(\ReflectionClass $class)
+ {
+ if ( ! isset($this->classNameHashes[$class->name])) {
+ $this->classNameHashes[$class->name] = sha1($class->name);
+ }
+ $key = $this->classNameHashes[$class->name];
+
+ if (isset($this->loadedAnnotations[$key])) {
+ return $this->loadedAnnotations[$key];
+ }
+
+ $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php';
+ if (!is_file($path)) {
+ $annot = $this->reader->getClassAnnotations($class);
+ $this->saveCacheFile($path, $annot);
+ return $this->loadedAnnotations[$key] = $annot;
+ }
+
+ if ($this->debug
+ && (false !== $filename = $class->getFilename())
+ && filemtime($path) < filemtime($filename)) {
+ @unlink($path);
+
+ $annot = $this->reader->getClassAnnotations($class);
+ $this->saveCacheFile($path, $annot);
+ return $this->loadedAnnotations[$key] = $annot;
+ }
+
+ return $this->loadedAnnotations[$key] = include $path;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotations(\ReflectionProperty $property)
+ {
+ $class = $property->getDeclaringClass();
+ if ( ! isset($this->classNameHashes[$class->name])) {
+ $this->classNameHashes[$class->name] = sha1($class->name);
+ }
+ $key = $this->classNameHashes[$class->name].'$'.$property->getName();
+
+ if (isset($this->loadedAnnotations[$key])) {
+ return $this->loadedAnnotations[$key];
+ }
+
+ $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php';
+ if (!is_file($path)) {
+ $annot = $this->reader->getPropertyAnnotations($property);
+ $this->saveCacheFile($path, $annot);
+ return $this->loadedAnnotations[$key] = $annot;
+ }
+
+ if ($this->debug
+ && (false !== $filename = $class->getFilename())
+ && filemtime($path) < filemtime($filename)) {
+ @unlink($path);
+
+ $annot = $this->reader->getPropertyAnnotations($property);
+ $this->saveCacheFile($path, $annot);
+ return $this->loadedAnnotations[$key] = $annot;
+ }
+
+ return $this->loadedAnnotations[$key] = include $path;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotations(\ReflectionMethod $method)
+ {
+ $class = $method->getDeclaringClass();
+ if ( ! isset($this->classNameHashes[$class->name])) {
+ $this->classNameHashes[$class->name] = sha1($class->name);
+ }
+ $key = $this->classNameHashes[$class->name].'#'.$method->getName();
+
+ if (isset($this->loadedAnnotations[$key])) {
+ return $this->loadedAnnotations[$key];
+ }
+
+ $path = $this->dir.'/'.strtr($key, '\\', '-').'.cache.php';
+ if (!is_file($path)) {
+ $annot = $this->reader->getMethodAnnotations($method);
+ $this->saveCacheFile($path, $annot);
+ return $this->loadedAnnotations[$key] = $annot;
+ }
+
+ if ($this->debug
+ && (false !== $filename = $class->getFilename())
+ && filemtime($path) < filemtime($filename)) {
+ @unlink($path);
+
+ $annot = $this->reader->getMethodAnnotations($method);
+ $this->saveCacheFile($path, $annot);
+ return $this->loadedAnnotations[$key] = $annot;
+ }
+
+ return $this->loadedAnnotations[$key] = include $path;
+ }
+
+ /**
+ * Saves the cache file.
+ *
+ * @param string $path
+ * @param mixed $data
+ *
+ * @return void
+ */
+ private function saveCacheFile($path, $data)
+ {
+ if (!is_writable($this->dir)) {
+ throw new \InvalidArgumentException(sprintf('The directory "%s" is not writable. Both, the webserver and the console user need access. You can manage access rights for multiple users with "chmod +a". If your system does not support this, check out the acl package.', $this->dir));
+ }
+
+ $tempfile = tempnam($this->dir, uniqid('', true));
+
+ if (false === $tempfile) {
+ throw new \RuntimeException(sprintf('Unable to create tempfile in directory: %s', $this->dir));
+ }
+
+ $written = file_put_contents($tempfile, 'umask));
+
+ if (false === rename($tempfile, $path)) {
+ @unlink($tempfile);
+ throw new \RuntimeException(sprintf('Unable to rename %s to %s', $tempfile, $path));
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotation(\ReflectionClass $class, $annotationName)
+ {
+ $annotations = $this->getClassAnnotations($class);
+
+ foreach ($annotations as $annotation) {
+ if ($annotation instanceof $annotationName) {
+ return $annotation;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotation(\ReflectionMethod $method, $annotationName)
+ {
+ $annotations = $this->getMethodAnnotations($method);
+
+ foreach ($annotations as $annotation) {
+ if ($annotation instanceof $annotationName) {
+ return $annotation;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName)
+ {
+ $annotations = $this->getPropertyAnnotations($property);
+
+ foreach ($annotations as $annotation) {
+ if ($annotation instanceof $annotationName) {
+ return $annotation;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Clears loaded annotations.
+ *
+ * @return void
+ */
+ public function clearLoadedAnnotations()
+ {
+ $this->loadedAnnotations = array();
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php
new file mode 100644
index 0000000000000000000000000000000000000000..bf7fbdcdd3def3bce57c2da607fb114dc9809229
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/IndexedReader.php
@@ -0,0 +1,119 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+/**
+ * Allows the reader to be used in-place of Doctrine's reader.
+ *
+ * @author Johannes M. Schmitt
+ */
+class IndexedReader implements Reader
+{
+ /**
+ * @var Reader
+ */
+ private $delegate;
+
+ /**
+ * Constructor.
+ *
+ * @param Reader $reader
+ */
+ public function __construct(Reader $reader)
+ {
+ $this->delegate = $reader;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotations(\ReflectionClass $class)
+ {
+ $annotations = array();
+ foreach ($this->delegate->getClassAnnotations($class) as $annot) {
+ $annotations[get_class($annot)] = $annot;
+ }
+
+ return $annotations;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotation(\ReflectionClass $class, $annotation)
+ {
+ return $this->delegate->getClassAnnotation($class, $annotation);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotations(\ReflectionMethod $method)
+ {
+ $annotations = array();
+ foreach ($this->delegate->getMethodAnnotations($method) as $annot) {
+ $annotations[get_class($annot)] = $annot;
+ }
+
+ return $annotations;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotation(\ReflectionMethod $method, $annotation)
+ {
+ return $this->delegate->getMethodAnnotation($method, $annotation);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotations(\ReflectionProperty $property)
+ {
+ $annotations = array();
+ foreach ($this->delegate->getPropertyAnnotations($property) as $annot) {
+ $annotations[get_class($annot)] = $annot;
+ }
+
+ return $annotations;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotation(\ReflectionProperty $property, $annotation)
+ {
+ return $this->delegate->getPropertyAnnotation($property, $annotation);
+ }
+
+ /**
+ * Proxies all methods to the delegate.
+ *
+ * @param string $method
+ * @param array $args
+ *
+ * @return mixed
+ */
+ public function __call($method, $args)
+ {
+ return call_user_func_array(array($this->delegate, $method), $args);
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..21ee7cc9030178addfce1aee66195a2786549f2c
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/PhpParser.php
@@ -0,0 +1,91 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+use SplFileObject;
+
+/**
+ * Parses a file for namespaces/use/class declarations.
+ *
+ * @author Fabien Potencier
+ * @author Christian Kaps
+ */
+final class PhpParser
+{
+ /**
+ * Parses a class.
+ *
+ * @param \ReflectionClass $class A ReflectionClass
object.
+ *
+ * @return array A list with use statements in the form (Alias => FQN).
+ */
+ public function parseClass(\ReflectionClass $class)
+ {
+ if (method_exists($class, 'getUseStatements')) {
+ return $class->getUseStatements();
+ }
+
+ if (false === $filename = $class->getFilename()) {
+ return array();
+ }
+
+ $content = $this->getFileContent($filename, $class->getStartLine());
+
+ if (null === $content) {
+ return array();
+ }
+
+ $namespace = preg_quote($class->getNamespaceName());
+ $content = preg_replace('/^.*?(\bnamespace\s+' . $namespace . '\s*[;{].*)$/s', '\\1', $content);
+ $tokenizer = new TokenParser('parseUseStatements($class->getNamespaceName());
+
+ return $statements;
+ }
+
+ /**
+ * Gets the content of the file right up to the given line number.
+ *
+ * @param string $filename The name of the file to load.
+ * @param integer $lineNumber The number of lines to read from file.
+ *
+ * @return string The content of the file.
+ */
+ private function getFileContent($filename, $lineNumber)
+ {
+ if ( ! is_file($filename)) {
+ return null;
+ }
+
+ $content = '';
+ $lineCnt = 0;
+ $file = new SplFileObject($filename);
+ while (!$file->eof()) {
+ if ($lineCnt++ == $lineNumber) {
+ break;
+ }
+
+ $content .= $file->fgets();
+ }
+
+ return $content;
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php
new file mode 100644
index 0000000000000000000000000000000000000000..4774f87312bfc6e8526ea5b6c508fceef7ffdc91
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/Reader.php
@@ -0,0 +1,89 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+/**
+ * Interface for annotation readers.
+ *
+ * @author Johannes M. Schmitt
+ */
+interface Reader
+{
+ /**
+ * Gets the annotations applied to a class.
+ *
+ * @param \ReflectionClass $class The ReflectionClass of the class from which
+ * the class annotations should be read.
+ *
+ * @return array An array of Annotations.
+ */
+ function getClassAnnotations(\ReflectionClass $class);
+
+ /**
+ * Gets a class annotation.
+ *
+ * @param \ReflectionClass $class The ReflectionClass of the class from which
+ * the class annotations should be read.
+ * @param string $annotationName The name of the annotation.
+ *
+ * @return object|null The Annotation or NULL, if the requested annotation does not exist.
+ */
+ function getClassAnnotation(\ReflectionClass $class, $annotationName);
+
+ /**
+ * Gets the annotations applied to a method.
+ *
+ * @param \ReflectionMethod $method The ReflectionMethod of the method from which
+ * the annotations should be read.
+ *
+ * @return array An array of Annotations.
+ */
+ function getMethodAnnotations(\ReflectionMethod $method);
+
+ /**
+ * Gets a method annotation.
+ *
+ * @param \ReflectionMethod $method The ReflectionMethod to read the annotations from.
+ * @param string $annotationName The name of the annotation.
+ *
+ * @return object|null The Annotation or NULL, if the requested annotation does not exist.
+ */
+ function getMethodAnnotation(\ReflectionMethod $method, $annotationName);
+
+ /**
+ * Gets the annotations applied to a property.
+ *
+ * @param \ReflectionProperty $property The ReflectionProperty of the property
+ * from which the annotations should be read.
+ *
+ * @return array An array of Annotations.
+ */
+ function getPropertyAnnotations(\ReflectionProperty $property);
+
+ /**
+ * Gets a property annotation.
+ *
+ * @param \ReflectionProperty $property The ReflectionProperty to read the annotations from.
+ * @param string $annotationName The name of the annotation.
+ *
+ * @return object|null The Annotation or NULL, if the requested annotation does not exist.
+ */
+ function getPropertyAnnotation(\ReflectionProperty $property, $annotationName);
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php
new file mode 100644
index 0000000000000000000000000000000000000000..d4757eea2fb59a064b25c3869d453d803dc03a91
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/SimpleAnnotationReader.php
@@ -0,0 +1,127 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+/**
+ * Simple Annotation Reader.
+ *
+ * This annotation reader is intended to be used in projects where you have
+ * full-control over all annotations that are available.
+ *
+ * @since 2.2
+ * @author Johannes M. Schmitt
+ * @author Fabio B. Silva
+ */
+class SimpleAnnotationReader implements Reader
+{
+ /**
+ * @var DocParser
+ */
+ private $parser;
+
+ /**
+ * Constructor.
+ *
+ * Initializes a new SimpleAnnotationReader.
+ */
+ public function __construct()
+ {
+ $this->parser = new DocParser();
+ $this->parser->setIgnoreNotImportedAnnotations(true);
+ }
+
+ /**
+ * Adds a namespace in which we will look for annotations.
+ *
+ * @param string $namespace
+ *
+ * @return void
+ */
+ public function addNamespace($namespace)
+ {
+ $this->parser->addNamespace($namespace);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotations(\ReflectionClass $class)
+ {
+ return $this->parser->parse($class->getDocComment(), 'class '.$class->getName());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotations(\ReflectionMethod $method)
+ {
+ return $this->parser->parse($method->getDocComment(), 'method '.$method->getDeclaringClass()->name.'::'.$method->getName().'()');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotations(\ReflectionProperty $property)
+ {
+ return $this->parser->parse($property->getDocComment(), 'property '.$property->getDeclaringClass()->name.'::$'.$property->getName());
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassAnnotation(\ReflectionClass $class, $annotationName)
+ {
+ foreach ($this->getClassAnnotations($class) as $annot) {
+ if ($annot instanceof $annotationName) {
+ return $annot;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getMethodAnnotation(\ReflectionMethod $method, $annotationName)
+ {
+ foreach ($this->getMethodAnnotations($method) as $annot) {
+ if ($annot instanceof $annotationName) {
+ return $annot;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPropertyAnnotation(\ReflectionProperty $property, $annotationName)
+ {
+ foreach ($this->getPropertyAnnotations($property) as $annot) {
+ if ($annot instanceof $annotationName) {
+ return $annot;
+ }
+ }
+
+ return null;
+ }
+}
diff --git a/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bdcccec92d21bfeb445ca34cea091fb93e89a91
--- /dev/null
+++ b/vendor/doctrine/annotations/lib/Doctrine/Common/Annotations/TokenParser.php
@@ -0,0 +1,187 @@
+.
+ */
+
+namespace Doctrine\Common\Annotations;
+
+/**
+ * Parses a file for namespaces/use/class declarations.
+ *
+ * @author Fabien Potencier
+ * @author Christian Kaps
+ */
+class TokenParser
+{
+ /**
+ * The token list.
+ *
+ * @var array
+ */
+ private $tokens;
+
+ /**
+ * The number of tokens.
+ *
+ * @var int
+ */
+ private $numTokens;
+
+ /**
+ * The current array pointer.
+ *
+ * @var int
+ */
+ private $pointer = 0;
+
+ /**
+ * @param string $contents
+ */
+ public function __construct($contents)
+ {
+ $this->tokens = token_get_all($contents);
+
+ // The PHP parser sets internal compiler globals for certain things. Annoyingly, the last docblock comment it
+ // saw gets stored in doc_comment. When it comes to compile the next thing to be include()d this stored
+ // doc_comment becomes owned by the first thing the compiler sees in the file that it considers might have a
+ // docblock. If the first thing in the file is a class without a doc block this would cause calls to
+ // getDocBlock() on said class to return our long lost doc_comment. Argh.
+ // To workaround, cause the parser to parse an empty docblock. Sure getDocBlock() will return this, but at least
+ // it's harmless to us.
+ token_get_all("numTokens = count($this->tokens);
+ }
+
+ /**
+ * Gets the next non whitespace and non comment token.
+ *
+ * @param boolean $docCommentIsComment If TRUE then a doc comment is considered a comment and skipped.
+ * If FALSE then only whitespace and normal comments are skipped.
+ *
+ * @return array|null The token if exists, null otherwise.
+ */
+ public function next($docCommentIsComment = TRUE)
+ {
+ for ($i = $this->pointer; $i < $this->numTokens; $i++) {
+ $this->pointer++;
+ if ($this->tokens[$i][0] === T_WHITESPACE ||
+ $this->tokens[$i][0] === T_COMMENT ||
+ ($docCommentIsComment && $this->tokens[$i][0] === T_DOC_COMMENT)) {
+
+ continue;
+ }
+
+ return $this->tokens[$i];
+ }
+
+ return null;
+ }
+
+ /**
+ * Parses a single use statement.
+ *
+ * @return array A list with all found class names for a use statement.
+ */
+ public function parseUseStatement()
+ {
+ $class = '';
+ $alias = '';
+ $statements = array();
+ $explicitAlias = false;
+ while (($token = $this->next())) {
+ $isNameToken = $token[0] === T_STRING || $token[0] === T_NS_SEPARATOR;
+ if (!$explicitAlias && $isNameToken) {
+ $class .= $token[1];
+ $alias = $token[1];
+ } else if ($explicitAlias && $isNameToken) {
+ $alias .= $token[1];
+ } else if ($token[0] === T_AS) {
+ $explicitAlias = true;
+ $alias = '';
+ } else if ($token === ',') {
+ $statements[strtolower($alias)] = $class;
+ $class = '';
+ $alias = '';
+ $explicitAlias = false;
+ } else if ($token === ';') {
+ $statements[strtolower($alias)] = $class;
+ break;
+ } else {
+ break;
+ }
+ }
+
+ return $statements;
+ }
+
+ /**
+ * Gets all use statements.
+ *
+ * @param string $namespaceName The namespace name of the reflected class.
+ *
+ * @return array A list with all found use statements.
+ */
+ public function parseUseStatements($namespaceName)
+ {
+ $statements = array();
+ while (($token = $this->next())) {
+ if ($token[0] === T_USE) {
+ $statements = array_merge($statements, $this->parseUseStatement());
+ continue;
+ }
+ if ($token[0] !== T_NAMESPACE || $this->parseNamespace() != $namespaceName) {
+ continue;
+ }
+
+ // Get fresh array for new namespace. This is to prevent the parser to collect the use statements
+ // for a previous namespace with the same name. This is the case if a namespace is defined twice
+ // or if a namespace with the same name is commented out.
+ $statements = array();
+ }
+
+ return $statements;
+ }
+
+ /**
+ * Gets the namespace.
+ *
+ * @return string The found namespace.
+ */
+ public function parseNamespace()
+ {
+ $name = '';
+ while (($token = $this->next()) && ($token[0] === T_STRING || $token[0] === T_NS_SEPARATOR)) {
+ $name .= $token[1];
+ }
+
+ return $name;
+ }
+
+ /**
+ * Gets the class name.
+ *
+ * @return string The found class name.
+ */
+ public function parseClass()
+ {
+ // Namespaces and class names are tokenized the same: T_STRINGs
+ // separated by T_NS_SEPARATOR so we can use one function to provide
+ // both.
+ return $this->parseNamespace();
+ }
+}
diff --git a/vendor/doctrine/cache/.coveralls.yml b/vendor/doctrine/cache/.coveralls.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0c082336063962b929699aee563aa668c8f46604
--- /dev/null
+++ b/vendor/doctrine/cache/.coveralls.yml
@@ -0,0 +1,4 @@
+# for php-coveralls
+service_name: travis-ci
+src_dir: lib
+coverage_clover: build/logs/clover.xml
diff --git a/vendor/doctrine/cache/.gitignore b/vendor/doctrine/cache/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..ca2302312b4be0b1cd665ff506436a2b8bce1d0d
--- /dev/null
+++ b/vendor/doctrine/cache/.gitignore
@@ -0,0 +1,4 @@
+vendor/
+build/
+phpunit.xml
+composer.lock
\ No newline at end of file
diff --git a/vendor/doctrine/cache/.travis.yml b/vendor/doctrine/cache/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2952a4817bd92c35b17d78f9031707fd0a5e38f5
--- /dev/null
+++ b/vendor/doctrine/cache/.travis.yml
@@ -0,0 +1,33 @@
+language: php
+
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - hhvm
+
+services:
+ - riak
+ - mongodb
+ - memcached
+ - redis-server
+
+before_install:
+ - sh -c "if [ $TRAVIS_PHP_VERSION != 'hhvm' ]; then pecl install riak-beta; fi"
+ - sh -c "if [[ $TRAVIS_PHP_VERSION != 'hhvm' && `php-config --vernum` -ge 50500 ]] ; then pecl config-set preferred_state beta; printf "yes\n" | pecl install apcu ; else echo 'extension="apc.so"' >> ./tests/travis/php.ini ;fi"
+ - composer self-update
+ - sh -c "if [ $TRAVIS_PHP_VERSION != 'hhvm' ]; then phpenv config-add ./tests/travis/php.ini; fi"
+
+install:
+ - composer --prefer-source --dev install
+
+script:
+ - ./vendor/bin/phpunit -c ./tests/travis/phpunit.travis.xml -v
+
+after_script:
+ - php vendor/bin/coveralls -v
+
+matrix:
+ allow_failures:
+ - php: hhvm
diff --git a/vendor/doctrine/cache/LICENSE b/vendor/doctrine/cache/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..4a91f0bf2803d308cce8010164548a811127bc27
--- /dev/null
+++ b/vendor/doctrine/cache/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2006-2012 Doctrine Project
+
+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/doctrine/cache/README.md b/vendor/doctrine/cache/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..94f80a30ee959b10151b0811763896847ae1393a
--- /dev/null
+++ b/vendor/doctrine/cache/README.md
@@ -0,0 +1,14 @@
+# Doctrine Cache
+
+Master: [![Build Status](https://secure.travis-ci.org/doctrine/cache.png?branch=master)](http://travis-ci.org/doctrine/cache) [![Coverage Status](https://coveralls.io/repos/doctrine/cache/badge.png?branch=master)](https://coveralls.io/r/doctrine/cache?branch=master)
+
+[![Latest Stable Version](https://poser.pugx.org/doctrine/cache/v/stable.png)](https://packagist.org/packages/doctrine/cache) [![Total Downloads](https://poser.pugx.org/doctrine/cache/downloads.png)](https://packagist.org/packages/doctrine/cache)
+
+Cache component extracted from the Doctrine Common project.
+
+## Changelog
+
+### v1.2
+
+* Added support for MongoDB as Cache Provider
+* Fix namespace version reset
diff --git a/vendor/doctrine/cache/UPGRADE.md b/vendor/doctrine/cache/UPGRADE.md
new file mode 100644
index 0000000000000000000000000000000000000000..e1f8a503eef6291b95ac104d8091586f099311fc
--- /dev/null
+++ b/vendor/doctrine/cache/UPGRADE.md
@@ -0,0 +1,16 @@
+# Upgrade to 1.4
+
+## Minor BC Break: `Doctrine\Common\Cache\FileCache#$extension` is now `private`.
+
+If you need to override the value of `Doctrine\Common\Cache\FileCache#$extension`, then use the
+second parameter of `Doctrine\Common\Cache\FileCache#__construct()` instead of overriding
+the property in your own implementation.
+
+## Minor BC Break: file based caches paths changed
+
+`Doctrine\Common\Cache\FileCache`, `Doctrine\Common\Cache\PhpFileCache` and
+`Doctrine\Common\Cache\FilesystemCache` are using a different cache paths structure.
+
+If you rely on warmed up caches for deployments, consider that caches generated
+with `doctrine/cache` `<1.4` are not compatible with the new directory structure,
+and will be ignored.
diff --git a/vendor/doctrine/cache/build.properties b/vendor/doctrine/cache/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2d98c360aae2c117551ed77f376962f5a1597f37
--- /dev/null
+++ b/vendor/doctrine/cache/build.properties
@@ -0,0 +1,3 @@
+# Version class and file
+project.version_class = Doctrine\\Common\\Cache\\Version
+project.version_file = lib/Doctrine/Common/Cache/Version.php
diff --git a/vendor/doctrine/cache/build.xml b/vendor/doctrine/cache/build.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a7c52e3cf3c047d3aecf8e6ae5cb8ffbcb65b626
--- /dev/null
+++ b/vendor/doctrine/cache/build.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vendor/doctrine/cache/composer.json b/vendor/doctrine/cache/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..f3caa7a883ac40303a41c20823b881f57673c16a
--- /dev/null
+++ b/vendor/doctrine/cache/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "doctrine/cache",
+ "type": "library",
+ "description": "Caching library offering an object-oriented API for many cache backends",
+ "keywords": ["cache", "caching"],
+ "homepage": "http://www.doctrine-project.org",
+ "license": "MIT",
+ "authors": [
+ {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"},
+ {"name": "Roman Borschel", "email": "roman@code-factory.org"},
+ {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
+ {"name": "Jonathan Wage", "email": "jonwage@gmail.com"},
+ {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
+ ],
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": ">=3.7",
+ "satooshi/php-coveralls": "~0.6",
+ "predis/predis": "~1.0"
+ },
+ "conflict": {
+ "doctrine/common": ">2.2,<2.4"
+ },
+ "autoload": {
+ "psr-0": { "Doctrine\\Common\\Cache\\": "lib/" }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.5.x-dev"
+ }
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..abd5e71c2a5366dd011fced7d4f8c480a54c986e
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ApcCache.php
@@ -0,0 +1,106 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * APC cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class ApcCache extends CacheProvider
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return apc_fetch($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return apc_exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return (bool) apc_store($id, $data, (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return apc_delete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return apc_clear_cache() && apc_clear_cache('user');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ return apc_fetch($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $info = apc_cache_info('', true);
+ $sma = apc_sma_info();
+
+ // @TODO - Temporary fix @see https://github.com/krakjoe/apcu/pull/42
+ if (PHP_VERSION_ID >= 50500) {
+ $info['num_hits'] = isset($info['num_hits']) ? $info['num_hits'] : $info['nhits'];
+ $info['num_misses'] = isset($info['num_misses']) ? $info['num_misses'] : $info['nmisses'];
+ $info['start_time'] = isset($info['start_time']) ? $info['start_time'] : $info['stime'];
+ }
+
+ return array(
+ Cache::STATS_HITS => $info['num_hits'],
+ Cache::STATS_MISSES => $info['num_misses'],
+ Cache::STATS_UPTIME => $info['start_time'],
+ Cache::STATS_MEMORY_USAGE => $info['mem_size'],
+ Cache::STATS_MEMORY_AVAILABLE => $sma['avail_mem'],
+ );
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..31a0729011f67f0db585b8b9c68929f773b57429
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ArrayCache.php
@@ -0,0 +1,94 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Array cache driver.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class ArrayCache extends CacheProvider
+{
+ /**
+ * @var array $data
+ */
+ private $data = array();
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->doContains($id) ? $this->data[$id] : false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ // isset() is required for performance optimizations, to avoid unnecessary function calls to array_key_exists.
+ return isset($this->data[$id]) || array_key_exists($id, $this->data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $this->data[$id] = $data;
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ unset($this->data[$id]);
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ $this->data = array();
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ return null;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php
new file mode 100644
index 0000000000000000000000000000000000000000..205a12327ef93fbe160cadfffd402fed17573020
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Cache.php
@@ -0,0 +1,112 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache drivers.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author Fabio B. Silva
+ * @author Kévin Dunglas
+ */
+interface Cache
+{
+ const STATS_HITS = 'hits';
+ const STATS_MISSES = 'misses';
+ const STATS_UPTIME = 'uptime';
+ const STATS_MEMORY_USAGE = 'memory_usage';
+ const STATS_MEMORY_AVAILABLE = 'memory_available';
+ /**
+ * Only for backward compatibility (may be removed in next major release)
+ *
+ * @deprecated
+ */
+ const STATS_MEMORY_AVAILIABLE = 'memory_available';
+
+ /**
+ * Fetches an entry from the cache.
+ *
+ * @param string $id The id of the cache entry to fetch.
+ *
+ * @return mixed The cached data or FALSE, if no cache entry exists for the given id.
+ */
+ public function fetch($id);
+
+ /**
+ * Tests if an entry exists in the cache.
+ *
+ * @param string $id The cache id of the entry to check for.
+ *
+ * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise.
+ */
+ public function contains($id);
+
+ /**
+ * Puts data into the cache.
+ *
+ * @param string $id The cache id.
+ * @param mixed $data The cache entry/data.
+ * @param int $lifeTime The cache lifetime.
+ * If != 0, sets a specific lifetime for this cache entry (0 => infinite lifeTime).
+ *
+ * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise.
+ */
+ public function save($id, $data, $lifeTime = 0);
+
+ /**
+ * Deletes a cache entry.
+ *
+ * @param string $id The cache id.
+ *
+ * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise.
+ */
+ public function delete($id);
+
+ /**
+ * Retrieves cached information from the data store.
+ *
+ * The server's statistics array has the following values:
+ *
+ * - hits
+ * Number of keys that have been requested and found present.
+ *
+ * - misses
+ * Number of items that have been requested and not found.
+ *
+ * - uptime
+ * Time that the server is running.
+ *
+ * - memory_usage
+ * Memory used by this server to store items.
+ *
+ * - memory_available
+ * Memory allowed to use for storage.
+ *
+ * @since 2.2
+ *
+ * @return array|null An associative array with server's statistics if available, NULL otherwise.
+ */
+ public function getStats();
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php
new file mode 100644
index 0000000000000000000000000000000000000000..a172a4ceba079bca049ab76b5fa2857697340426
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CacheProvider.php
@@ -0,0 +1,277 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Base class for cache provider implementations.
+ *
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author Fabio B. Silva
+ */
+abstract class CacheProvider implements Cache, FlushableCache, ClearableCache, MultiGetCache
+{
+ const DOCTRINE_NAMESPACE_CACHEKEY = 'DoctrineNamespaceCacheKey[%s]';
+
+ /**
+ * The namespace to prefix all cache ids with.
+ *
+ * @var string
+ */
+ private $namespace = '';
+
+ /**
+ * The namespace version.
+ *
+ * @var integer|null
+ */
+ private $namespaceVersion;
+
+ /**
+ * Sets the namespace to prefix all cache ids with.
+ *
+ * @param string $namespace
+ *
+ * @return void
+ */
+ public function setNamespace($namespace)
+ {
+ $this->namespace = (string) $namespace;
+ $this->namespaceVersion = null;
+ }
+
+ /**
+ * Retrieves the namespace that prefixes all cache ids.
+ *
+ * @return string
+ */
+ public function getNamespace()
+ {
+ return $this->namespace;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function fetch($id)
+ {
+ return $this->doFetch($this->getNamespacedId($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function fetchMultiple(array $keys)
+ {
+ // note: the array_combine() is in place to keep an association between our $keys and the $namespacedKeys
+ $namespacedKeys = array_combine($keys, array_map(array($this, 'getNamespacedId'), $keys));
+ $items = $this->doFetchMultiple($namespacedKeys);
+ $foundItems = array();
+
+ // no internal array function supports this sort of mapping: needs to be iterative
+ // this filters and combines keys in one pass
+ foreach ($namespacedKeys as $requestedKey => $namespacedKey) {
+ if (isset($items[$namespacedKey])) {
+ $foundItems[$requestedKey] = $items[$namespacedKey];
+ }
+ }
+
+ return $foundItems;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function contains($id)
+ {
+ return $this->doContains($this->getNamespacedId($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function save($id, $data, $lifeTime = 0)
+ {
+ return $this->doSave($this->getNamespacedId($id), $data, $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function delete($id)
+ {
+ return $this->doDelete($this->getNamespacedId($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getStats()
+ {
+ return $this->doGetStats();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function flushAll()
+ {
+ return $this->doFlush();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function deleteAll()
+ {
+ $namespaceCacheKey = $this->getNamespaceCacheKey();
+ $namespaceVersion = $this->getNamespaceVersion() + 1;
+
+ $this->namespaceVersion = $namespaceVersion;
+
+ return $this->doSave($namespaceCacheKey, $namespaceVersion);
+ }
+
+ /**
+ * Prefixes the passed id with the configured namespace value.
+ *
+ * @param string $id The id to namespace.
+ *
+ * @return string The namespaced id.
+ */
+ private function getNamespacedId($id)
+ {
+ $namespaceVersion = $this->getNamespaceVersion();
+
+ return sprintf('%s[%s][%s]', $this->namespace, $id, $namespaceVersion);
+ }
+
+ /**
+ * Returns the namespace cache key.
+ *
+ * @return string
+ */
+ private function getNamespaceCacheKey()
+ {
+ return sprintf(self::DOCTRINE_NAMESPACE_CACHEKEY, $this->namespace);
+ }
+
+ /**
+ * Returns the namespace version.
+ *
+ * @return integer
+ */
+ private function getNamespaceVersion()
+ {
+ if (null !== $this->namespaceVersion) {
+ return $this->namespaceVersion;
+ }
+
+ $namespaceCacheKey = $this->getNamespaceCacheKey();
+ $namespaceVersion = $this->doFetch($namespaceCacheKey);
+
+ if (false === $namespaceVersion) {
+ $namespaceVersion = 1;
+
+ $this->doSave($namespaceCacheKey, $namespaceVersion);
+ }
+
+ $this->namespaceVersion = $namespaceVersion;
+
+ return $this->namespaceVersion;
+ }
+
+ /**
+ * Default implementation of doFetchMultiple. Each driver that supports multi-get should owerwrite it.
+ *
+ * @param array $keys Array of keys to retrieve from cache
+ * @return array Array of values retrieved for the given keys.
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ $returnValues = array();
+
+ foreach ($keys as $index => $key) {
+ if (false !== ($item = $this->doFetch($key))) {
+ $returnValues[$key] = $item;
+ }
+ }
+
+ return $returnValues;
+ }
+
+ /**
+ * Fetches an entry from the cache.
+ *
+ * @param string $id The id of the cache entry to fetch.
+ *
+ * @return mixed|boolean The cached data or FALSE, if no cache entry exists for the given id.
+ */
+ abstract protected function doFetch($id);
+
+ /**
+ * Tests if an entry exists in the cache.
+ *
+ * @param string $id The cache id of the entry to check for.
+ *
+ * @return boolean TRUE if a cache entry exists for the given cache id, FALSE otherwise.
+ */
+ abstract protected function doContains($id);
+
+ /**
+ * Puts data into the cache.
+ *
+ * @param string $id The cache id.
+ * @param string $data The cache entry/data.
+ * @param int $lifeTime The lifetime. If != 0, sets a specific lifetime for this
+ * cache entry (0 => infinite lifeTime).
+ *
+ * @return boolean TRUE if the entry was successfully stored in the cache, FALSE otherwise.
+ */
+ abstract protected function doSave($id, $data, $lifeTime = 0);
+
+ /**
+ * Deletes a cache entry.
+ *
+ * @param string $id The cache id.
+ *
+ * @return boolean TRUE if the cache entry was successfully deleted, FALSE otherwise.
+ */
+ abstract protected function doDelete($id);
+
+ /**
+ * Flushes all cache entries.
+ *
+ * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise.
+ */
+ abstract protected function doFlush();
+
+ /**
+ * Retrieves cached information from the data store.
+ *
+ * @since 2.2
+ *
+ * @return array|null An associative array with server's statistics if available, NULL otherwise.
+ */
+ abstract protected function doGetStats();
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..96c9b5479fbec039c1c883f6dceac00cf4a4c269
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ChainCache.php
@@ -0,0 +1,147 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Cache provider that allows to easily chain multiple cache providers
+ *
+ * @author Michaël Gallego
+ */
+class ChainCache extends CacheProvider
+{
+ /**
+ * @var CacheProvider[]
+ */
+ private $cacheProviders = array();
+
+ /**
+ * Constructor
+ *
+ * @param CacheProvider[] $cacheProviders
+ */
+ public function __construct($cacheProviders = array())
+ {
+ $this->cacheProviders = $cacheProviders;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function setNamespace($namespace)
+ {
+ parent::setNamespace($namespace);
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $cacheProvider->setNamespace($namespace);
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doFetch($id)
+ {
+ foreach ($this->cacheProviders as $key => $cacheProvider) {
+ if ($cacheProvider->doContains($id)) {
+ $value = $cacheProvider->doFetch($id);
+
+ // We populate all the previous cache layers (that are assumed to be faster)
+ for ($subKey = $key - 1 ; $subKey >= 0 ; $subKey--) {
+ $this->cacheProviders[$subKey]->doSave($id, $value);
+ }
+
+ return $value;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doContains($id)
+ {
+ foreach ($this->cacheProviders as $cacheProvider) {
+ if ($cacheProvider->doContains($id)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $stored = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $stored = $cacheProvider->doSave($id, $data, $lifeTime) && $stored;
+ }
+
+ return $stored;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doDelete($id)
+ {
+ $deleted = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $deleted = $cacheProvider->doDelete($id) && $deleted;
+ }
+
+ return $deleted;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doFlush()
+ {
+ $flushed = true;
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $flushed = $cacheProvider->doFlush() && $flushed;
+ }
+
+ return $flushed;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doGetStats()
+ {
+ // We return all the stats from all adapters
+ $stats = array();
+
+ foreach ($this->cacheProviders as $cacheProvider) {
+ $stats[] = $cacheProvider->doGetStats();
+ }
+
+ return $stats;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..d7b4358debac9ed1e9cc17b647085e8cd04f2884
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ClearableCache.php
@@ -0,0 +1,40 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache that can be flushed.
+ *
+ * Intended to be used for partial clearing of a cache namespace. For a more
+ * global "flushing", see {@see FlushableCache}.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.4
+ * @author Adirelle
+ */
+interface ClearableCache
+{
+ /**
+ * Deletes all cache entries in the current cache namespace.
+ *
+ * @return boolean TRUE if the cache entries were successfully deleted, FALSE otherwise.
+ */
+ public function deleteAll();
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..c21691df96290b96eaa77e9c0faab5646c228a6a
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/CouchbaseCache.php
@@ -0,0 +1,121 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use \Couchbase;
+
+/**
+ * Couchbase cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.4
+ * @author Michael Nitschinger
+ */
+class CouchbaseCache extends CacheProvider
+{
+ /**
+ * @var Couchbase|null
+ */
+ private $couchbase;
+
+ /**
+ * Sets the Couchbase instance to use.
+ *
+ * @param Couchbase $couchbase
+ *
+ * @return void
+ */
+ public function setCouchbase(Couchbase $couchbase)
+ {
+ $this->couchbase = $couchbase;
+ }
+
+ /**
+ * Gets the Couchbase instance used by the cache.
+ *
+ * @return Couchbase|null
+ */
+ public function getCouchbase()
+ {
+ return $this->couchbase;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->couchbase->get($id) ?: false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return (null !== $this->couchbase->get($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 30 * 24 * 3600) {
+ $lifeTime = time() + $lifeTime;
+ }
+ return $this->couchbase->set($id, $data, (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->couchbase->delete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->couchbase->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $stats = $this->couchbase->getStats();
+ $servers = $this->couchbase->getServers();
+ $server = explode(":", $servers[0]);
+ $key = $server[0] . ":" . "11210";
+ $stats = $stats[$key];
+ return array(
+ Cache::STATS_HITS => $stats['get_hits'],
+ Cache::STATS_MISSES => $stats['get_misses'],
+ Cache::STATS_UPTIME => $stats['uptime'],
+ Cache::STATS_MEMORY_USAGE => $stats['bytes'],
+ Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
+ );
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..9ad3ce2c0c736b35a18013aca0b817bdc42342c1
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FileCache.php
@@ -0,0 +1,237 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Base file cache driver.
+ *
+ * @since 2.3
+ * @author Fabio B. Silva
+ */
+abstract class FileCache extends CacheProvider
+{
+ /**
+ * The cache directory.
+ *
+ * @var string
+ */
+ protected $directory;
+
+ /**
+ * The cache file extension.
+ *
+ * @var string
+ */
+ private $extension;
+
+ /**
+ * @var string[] regular expressions for replacing disallowed characters in file name
+ */
+ private $disallowedCharacterPatterns = array(
+ '/\-/', // replaced to disambiguate original `-` and `-` derived from replacements
+ '/[^a-zA-Z0-9\-_\[\]]/' // also excludes non-ascii chars (not supported, depending on FS)
+ );
+
+ /**
+ * @var string[] replacements for disallowed file characters
+ */
+ private $replacementCharacters = array('__', '-');
+
+ /**
+ * @var int
+ */
+ private $umask;
+
+ /**
+ * Constructor.
+ *
+ * @param string $directory The cache directory.
+ * @param string $extension The cache file extension.
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function __construct($directory, $extension = '', $umask = 0002)
+ {
+ // YES, this needs to be *before* createPathIfNeeded()
+ if ( ! is_int($umask)) {
+ throw new \InvalidArgumentException(sprintf(
+ 'The umask parameter is required to be integer, was: %s',
+ gettype($umask)
+ ));
+ }
+ $this->umask = $umask;
+
+ if ( ! $this->createPathIfNeeded($directory)) {
+ throw new \InvalidArgumentException(sprintf(
+ 'The directory "%s" does not exist and could not be created.',
+ $directory
+ ));
+ }
+
+ if ( ! is_writable($directory)) {
+ throw new \InvalidArgumentException(sprintf(
+ 'The directory "%s" is not writable.',
+ $directory
+ ));
+ }
+
+ // YES, this needs to be *after* createPathIfNeeded()
+ $this->directory = realpath($directory);
+ $this->extension = (string) $extension;
+ }
+
+ /**
+ * Gets the cache directory.
+ *
+ * @return string
+ */
+ public function getDirectory()
+ {
+ return $this->directory;
+ }
+
+ /**
+ * Gets the cache file extension.
+ *
+ * @return string|null
+ */
+ public function getExtension()
+ {
+ return $this->extension;
+ }
+
+ /**
+ * @param string $id
+ *
+ * @return string
+ */
+ protected function getFilename($id)
+ {
+ return $this->directory
+ . DIRECTORY_SEPARATOR
+ . implode(str_split(hash('sha256', $id), 2), DIRECTORY_SEPARATOR)
+ . DIRECTORY_SEPARATOR
+ . preg_replace($this->disallowedCharacterPatterns, $this->replacementCharacters, $id)
+ . $this->extension;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return @unlink($this->getFilename($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ foreach ($this->getIterator() as $name => $file) {
+ @unlink($name);
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $usage = 0;
+ foreach ($this->getIterator() as $file) {
+ $usage += $file->getSize();
+ }
+
+ $free = disk_free_space($this->directory);
+
+ return array(
+ Cache::STATS_HITS => null,
+ Cache::STATS_MISSES => null,
+ Cache::STATS_UPTIME => null,
+ Cache::STATS_MEMORY_USAGE => $usage,
+ Cache::STATS_MEMORY_AVAILABLE => $free,
+ );
+ }
+
+ /**
+ * Create path if needed.
+ *
+ * @param string $path
+ * @return bool TRUE on success or if path already exists, FALSE if path cannot be created.
+ */
+ private function createPathIfNeeded($path)
+ {
+ if ( ! is_dir($path)) {
+ if (false === @mkdir($path, 0777 & (~$this->umask), true) && !is_dir($path)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Writes a string content to file in an atomic way.
+ *
+ * @param string $filename Path to the file where to write the data.
+ * @param string $content The content to write
+ *
+ * @return bool TRUE on success, FALSE if path cannot be created, if path is not writable or an any other error.
+ */
+ protected function writeFile($filename, $content)
+ {
+ $filepath = pathinfo($filename, PATHINFO_DIRNAME);
+
+ if ( ! $this->createPathIfNeeded($filepath)) {
+ return false;
+ }
+
+ if ( ! is_writable($filepath)) {
+ return false;
+ }
+
+ $tmpFile = tempnam($filepath, 'swap');
+ @chmod($tmpFile, 0666 & (~$this->umask));
+
+ if (file_put_contents($tmpFile, $content) !== false) {
+ if (@rename($tmpFile, $filename)) {
+ return true;
+ }
+
+ @unlink($tmpFile);
+ }
+
+ return false;
+ }
+
+ /**
+ * @return \Iterator
+ */
+ private function getIterator()
+ {
+ return new \RegexIterator(
+ new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($this->directory)),
+ '/^.+' . preg_quote($this->extension, '/') . '$/i'
+ );
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..29d5e07460c6099d7e2dc37a4dde71d781b1adb5
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FilesystemCache.php
@@ -0,0 +1,111 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Filesystem cache driver.
+ *
+ * @since 2.3
+ * @author Fabio B. Silva
+ */
+class FilesystemCache extends FileCache
+{
+ const EXTENSION = '.doctrinecache.data';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct($directory, $extension = self::EXTENSION, $umask = 0002)
+ {
+ parent::__construct($directory, $extension, $umask);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $data = '';
+ $lifetime = -1;
+ $filename = $this->getFilename($id);
+
+ if ( ! is_file($filename)) {
+ return false;
+ }
+
+ $resource = fopen($filename, "r");
+
+ if (false !== ($line = fgets($resource))) {
+ $lifetime = (integer) $line;
+ }
+
+ if ($lifetime !== 0 && $lifetime < time()) {
+ fclose($resource);
+
+ return false;
+ }
+
+ while (false !== ($line = fgets($resource))) {
+ $data .= $line;
+ }
+
+ fclose($resource);
+
+ return unserialize($data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $lifetime = -1;
+ $filename = $this->getFilename($id);
+
+ if ( ! is_file($filename)) {
+ return false;
+ }
+
+ $resource = fopen($filename, "r");
+
+ if (false !== ($line = fgets($resource))) {
+ $lifetime = (integer) $line;
+ }
+
+ fclose($resource);
+
+ return $lifetime === 0 || $lifetime > time();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 0) {
+ $lifeTime = time() + $lifeTime;
+ }
+
+ $data = serialize($data);
+ $filename = $this->getFilename($id);
+
+ return $this->writeFile($filename, $lifeTime . PHP_EOL . $data);
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..e4e606b17281ebf088cd695816d52216ea76ed27
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/FlushableCache.php
@@ -0,0 +1,37 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache that can be flushed.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.4
+ * @author Adirelle
+ */
+interface FlushableCache
+{
+ /**
+ * Flushes all cache entries, globally.
+ *
+ * @return boolean TRUE if the cache entries were successfully flushed, FALSE otherwise.
+ */
+ public function flushAll();
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5098fd97b86010ce1adcae22239804d58f0ffe3
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcacheCache.php
@@ -0,0 +1,125 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use \Memcache;
+
+/**
+ * Memcache cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class MemcacheCache extends CacheProvider
+{
+ /**
+ * @var Memcache|null
+ */
+ private $memcache;
+
+ /**
+ * Sets the memcache instance to use.
+ *
+ * @param Memcache $memcache
+ *
+ * @return void
+ */
+ public function setMemcache(Memcache $memcache)
+ {
+ $this->memcache = $memcache;
+ }
+
+ /**
+ * Gets the memcache instance used by the cache.
+ *
+ * @return Memcache|null
+ */
+ public function getMemcache()
+ {
+ return $this->memcache;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->memcache->get($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $flags = null;
+ $this->memcache->get($id, $flags);
+
+ //if memcache has changed the value of "flags", it means the value exists
+ return ($flags !== null);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 30 * 24 * 3600) {
+ $lifeTime = time() + $lifeTime;
+ }
+ return $this->memcache->set($id, $data, 0, (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->memcache->delete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->memcache->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $stats = $this->memcache->getStats();
+ return array(
+ Cache::STATS_HITS => $stats['get_hits'],
+ Cache::STATS_MISSES => $stats['get_misses'],
+ Cache::STATS_UPTIME => $stats['uptime'],
+ Cache::STATS_MEMORY_USAGE => $stats['bytes'],
+ Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
+ );
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..040c26c02c7d8ade6ea20da7111f016e4c69f1ee
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MemcachedCache.php
@@ -0,0 +1,132 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use \Memcached;
+
+/**
+ * Memcached cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class MemcachedCache extends CacheProvider
+{
+ /**
+ * @var Memcached|null
+ */
+ private $memcached;
+
+ /**
+ * Sets the memcache instance to use.
+ *
+ * @param Memcached $memcached
+ *
+ * @return void
+ */
+ public function setMemcached(Memcached $memcached)
+ {
+ $this->memcached = $memcached;
+ }
+
+ /**
+ * Gets the memcached instance used by the cache.
+ *
+ * @return Memcached|null
+ */
+ public function getMemcached()
+ {
+ return $this->memcached;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->memcached->get($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ return $this->memcached->getMulti($keys);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return (false !== $this->memcached->get($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 30 * 24 * 3600) {
+ $lifeTime = time() + $lifeTime;
+ }
+ return $this->memcached->set($id, $data, (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->memcached->delete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->memcached->flush();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $stats = $this->memcached->getStats();
+ $servers = $this->memcached->getServerList();
+ $key = $servers[0]['host'] . ':' . $servers[0]['port'];
+ $stats = $stats[$key];
+ return array(
+ Cache::STATS_HITS => $stats['get_hits'],
+ Cache::STATS_MISSES => $stats['get_misses'],
+ Cache::STATS_UPTIME => $stats['uptime'],
+ Cache::STATS_MEMORY_USAGE => $stats['bytes'],
+ Cache::STATS_MEMORY_AVAILABLE => $stats['limit_maxbytes'],
+ );
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..0c7ac0a093941a409b99493d270aaf6a1d2a558a
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MongoDBCache.php
@@ -0,0 +1,191 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use MongoBinData;
+use MongoCollection;
+use MongoDate;
+
+/**
+ * MongoDB cache provider.
+ *
+ * @since 1.1
+ * @author Jeremy Mikola
+ */
+class MongoDBCache extends CacheProvider
+{
+ /**
+ * The data field will store the serialized PHP value.
+ */
+ const DATA_FIELD = 'd';
+
+ /**
+ * The expiration field will store a MongoDate value indicating when the
+ * cache entry should expire.
+ *
+ * With MongoDB 2.2+, entries can be automatically deleted by MongoDB by
+ * indexing this field wit the "expireAfterSeconds" option equal to zero.
+ * This will direct MongoDB to regularly query for and delete any entries
+ * whose date is older than the current time. Entries without a date value
+ * in this field will be ignored.
+ *
+ * The cache provider will also check dates on its own, in case expired
+ * entries are fetched before MongoDB's TTLMonitor pass can expire them.
+ *
+ * @see http://docs.mongodb.org/manual/tutorial/expire-data/
+ */
+ const EXPIRATION_FIELD = 'e';
+
+ /**
+ * @var MongoCollection
+ */
+ private $collection;
+
+ /**
+ * Constructor.
+ *
+ * This provider will default to the write concern and read preference
+ * options set on the MongoCollection instance (or inherited from MongoDB or
+ * MongoClient). Using an unacknowledged write concern (< 1) may make the
+ * return values of delete() and save() unreliable. Reading from secondaries
+ * may make contain() and fetch() unreliable.
+ *
+ * @see http://www.php.net/manual/en/mongo.readpreferences.php
+ * @see http://www.php.net/manual/en/mongo.writeconcerns.php
+ * @param MongoCollection $collection
+ */
+ public function __construct(MongoCollection $collection)
+ {
+ $this->collection = $collection;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $document = $this->collection->findOne(array('_id' => $id), array(self::DATA_FIELD, self::EXPIRATION_FIELD));
+
+ if ($document === null) {
+ return false;
+ }
+
+ if ($this->isExpired($document)) {
+ $this->doDelete($id);
+ return false;
+ }
+
+ return unserialize($document[self::DATA_FIELD]->bin);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $document = $this->collection->findOne(array('_id' => $id), array(self::EXPIRATION_FIELD));
+
+ if ($document === null) {
+ return false;
+ }
+
+ if ($this->isExpired($document)) {
+ $this->doDelete($id);
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $result = $this->collection->update(
+ array('_id' => $id),
+ array('$set' => array(
+ self::EXPIRATION_FIELD => ($lifeTime > 0 ? new MongoDate(time() + $lifeTime) : null),
+ self::DATA_FIELD => new MongoBinData(serialize($data), MongoBinData::BYTE_ARRAY),
+ )),
+ array('upsert' => true, 'multiple' => false)
+ );
+
+ return isset($result['ok']) ? $result['ok'] == 1 : true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ $result = $this->collection->remove(array('_id' => $id));
+
+ return isset($result['n']) ? $result['n'] == 1 : true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ // Use remove() in lieu of drop() to maintain any collection indexes
+ $result = $this->collection->remove();
+
+ return isset($result['ok']) ? $result['ok'] == 1 : true;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $serverStatus = $this->collection->db->command(array(
+ 'serverStatus' => 1,
+ 'locks' => 0,
+ 'metrics' => 0,
+ 'recordStats' => 0,
+ 'repl' => 0,
+ ));
+
+ $collStats = $this->collection->db->command(array('collStats' => 1));
+
+ return array(
+ Cache::STATS_HITS => null,
+ Cache::STATS_MISSES => null,
+ Cache::STATS_UPTIME => (isset($serverStatus['uptime']) ? (integer) $serverStatus['uptime'] : null),
+ Cache::STATS_MEMORY_USAGE => (isset($collStats['size']) ? (integer) $collStats['size'] : null),
+ Cache::STATS_MEMORY_AVAILABLE => null,
+ );
+ }
+
+ /**
+ * Check if the document is expired.
+ *
+ * @param array $document
+ * @return boolean
+ */
+ private function isExpired(array $document)
+ {
+ return isset($document[self::EXPIRATION_FIELD]) &&
+ $document[self::EXPIRATION_FIELD] instanceof MongoDate &&
+ $document[self::EXPIRATION_FIELD]->sec < time();
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..df7146d78efde37f6bac097a9445b90dd749d2f5
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/MultiGetCache.php
@@ -0,0 +1,39 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Interface for cache drivers that allows to get many items at once.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.4
+ * @author Asmir Mustafic
+ */
+interface MultiGetCache
+{
+ /**
+ * Returns an associative array of values for keys is found in cache.
+ *
+ * @param string[] $keys Array of keys to retrieve from cache
+ * @return mixed[] Array of retrieved values, indexed by the specified keys.
+ * Values that couldn't be retrieved are not contained in this array.
+ */
+ function fetchMultiple(array $keys);
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..5e7519674e3e50414772f5bd3473870f53595d12
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PhpFileCache.php
@@ -0,0 +1,120 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Php file cache driver.
+ *
+ * @since 2.3
+ * @author Fabio B. Silva
+ */
+class PhpFileCache extends FileCache
+{
+ const EXTENSION = '.doctrinecache.php';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __construct($directory, $extension = self::EXTENSION, $umask = 0002)
+ {
+ parent::__construct($directory, $extension, $umask);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $value = $this->includeFileForId($id);
+
+ if (! $value) {
+ return false;
+ }
+
+ if ($value['lifetime'] !== 0 && $value['lifetime'] < time()) {
+ return false;
+ }
+
+ return $value['data'];
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ $value = $this->includeFileForId($id);
+
+ if (! $value) {
+ return false;
+ }
+
+ return $value['lifetime'] === 0 || $value['lifetime'] > time();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 0) {
+ $lifeTime = time() + $lifeTime;
+ }
+
+ if (is_object($data) && ! method_exists($data, '__set_state')) {
+ throw new \InvalidArgumentException(
+ "Invalid argument given, PhpFileCache only allows objects that implement __set_state() " .
+ "and fully support var_export(). You can use the FilesystemCache to save arbitrary object " .
+ "graphs using serialize()/deserialize()."
+ );
+ }
+
+ $filename = $this->getFilename($id);
+
+ $value = array(
+ 'lifetime' => $lifeTime,
+ 'data' => $data
+ );
+
+ $value = var_export($value, true);
+ $code = sprintf('writeFile($filename, $code);
+ }
+
+ /**
+ * @param string $id
+ *
+ * @return array|false
+ */
+ private function includeFileForId($id)
+ {
+ $fileName = $this->getFilename($id);
+
+ // note: error suppression is still faster than `file_exists`, `is_file` and `is_readable`
+ $value = @include $fileName;
+
+ if (! isset($value['lifetime'])) {
+ return false;
+ }
+
+ return $value;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..823477e6c40198724f6eb7d5b5c77f71bfa8467e
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/PredisCache.php
@@ -0,0 +1,107 @@
+
+ */
+class PredisCache extends CacheProvider
+{
+ /**
+ * @var Client
+ */
+ private $client;
+
+ /**
+ * @param Client $client
+ *
+ * @return void
+ */
+ public function __construct(Client $client)
+ {
+ $this->client = $client;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ $result = $this->client->get($id);
+ if (null === $result) {
+ return false;
+ }
+
+ return unserialize($result);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ $fetchedItems = call_user_func_array(array($this->client, 'mget'), $keys);
+
+ return array_filter(array_combine($keys, array_map('unserialize', $fetchedItems)));
+ }
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return $this->client->exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $data = serialize($data);
+ if ($lifeTime > 0) {
+ $response = $this->client->setex($id, $lifeTime, $data);
+ } else {
+ $response = $this->client->set($id, $data);
+ }
+
+ return $response === true || $response == 'OK';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->client->del($id) > 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ $response = $this->client->flushdb();
+
+ return $response === true || $response == 'OK';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $info = $this->client->info();
+
+ return array(
+ Cache::STATS_HITS => $info['Stats']['keyspace_hits'],
+ Cache::STATS_MISSES => $info['Stats']['keyspace_misses'],
+ Cache::STATS_UPTIME => $info['Server']['uptime_in_seconds'],
+ Cache::STATS_MEMORY_USAGE => $info['Memory']['used_memory'],
+ Cache::STATS_MEMORY_AVAILABLE => false
+ );
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..50d7c917e07bb0408bef1b27837363e42f769602
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RedisCache.php
@@ -0,0 +1,142 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use Redis;
+
+/**
+ * Redis cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Osman Ungur
+ */
+class RedisCache extends CacheProvider
+{
+ /**
+ * @var Redis|null
+ */
+ private $redis;
+
+ /**
+ * Sets the redis instance to use.
+ *
+ * @param Redis $redis
+ *
+ * @return void
+ */
+ public function setRedis(Redis $redis)
+ {
+ $redis->setOption(Redis::OPT_SERIALIZER, $this->getSerializerValue());
+ $this->redis = $redis;
+ }
+
+ /**
+ * Gets the redis instance used by the cache.
+ *
+ * @return Redis|null
+ */
+ public function getRedis()
+ {
+ return $this->redis;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->redis->get($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetchMultiple(array $keys)
+ {
+ return array_filter(array_combine($keys, $this->redis->mget($keys)));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return $this->redis->exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ if ($lifeTime > 0) {
+ return $this->redis->setex($id, $lifeTime, $data);
+ }
+
+ return $this->redis->set($id, $data);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return $this->redis->delete($id) > 0;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->redis->flushDB();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $info = $this->redis->info();
+ return array(
+ Cache::STATS_HITS => $info['keyspace_hits'],
+ Cache::STATS_MISSES => $info['keyspace_misses'],
+ Cache::STATS_UPTIME => $info['uptime_in_seconds'],
+ Cache::STATS_MEMORY_USAGE => $info['used_memory'],
+ Cache::STATS_MEMORY_AVAILABLE => false
+ );
+ }
+
+ /**
+ * Returns the serializer constant to use. If Redis is compiled with
+ * igbinary support, that is used. Otherwise the default PHP serializer is
+ * used.
+ *
+ * @return integer One of the Redis::SERIALIZER_* constants
+ */
+ protected function getSerializerValue()
+ {
+ if (defined('HHVM_VERSION')) {
+ return Redis::SERIALIZER_PHP;
+ }
+ return defined('Redis::SERIALIZER_IGBINARY') ? Redis::SERIALIZER_IGBINARY : Redis::SERIALIZER_PHP;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..8bb6b4bf99e3af9603037aff0de52898854a9df6
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/RiakCache.php
@@ -0,0 +1,250 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use Riak\Bucket;
+use Riak\Connection;
+use Riak\Input;
+use Riak\Exception;
+use Riak\Object;
+
+/**
+ * Riak cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.1
+ * @author Guilherme Blanco
+ */
+class RiakCache extends CacheProvider
+{
+ const EXPIRES_HEADER = 'X-Riak-Meta-Expires';
+
+ /**
+ * @var \Riak\Bucket
+ */
+ private $bucket;
+
+ /**
+ * Sets the riak bucket instance to use.
+ *
+ * @param \Riak\Bucket $bucket
+ */
+ public function __construct(Bucket $bucket)
+ {
+ $this->bucket = $bucket;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ try {
+ $response = $this->bucket->get($id);
+
+ // No objects found
+ if ( ! $response->hasObject()) {
+ return false;
+ }
+
+ // Check for attempted siblings
+ $object = ($response->hasSiblings())
+ ? $this->resolveConflict($id, $response->getVClock(), $response->getObjectList())
+ : $response->getFirstObject();
+
+ // Check for expired object
+ if ($this->isExpired($object)) {
+ $this->bucket->delete($object);
+
+ return false;
+ }
+
+ return unserialize($object->getContent());
+ } catch (Exception\RiakException $e) {
+ // Covers:
+ // - Riak\ConnectionException
+ // - Riak\CommunicationException
+ // - Riak\UnexpectedResponseException
+ // - Riak\NotFoundException
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ try {
+ // We only need the HEAD, not the entire object
+ $input = new Input\GetInput();
+
+ $input->setReturnHead(true);
+
+ $response = $this->bucket->get($id, $input);
+
+ // No objects found
+ if ( ! $response->hasObject()) {
+ return false;
+ }
+
+ $object = $response->getFirstObject();
+
+ // Check for expired object
+ if ($this->isExpired($object)) {
+ $this->bucket->delete($object);
+
+ return false;
+ }
+
+ return true;
+ } catch (Exception\RiakException $e) {
+ // Do nothing
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ try {
+ $object = new Object($id);
+
+ $object->setContent(serialize($data));
+
+ if ($lifeTime > 0) {
+ $object->addMetadata(self::EXPIRES_HEADER, (string) (time() + $lifeTime));
+ }
+
+ $this->bucket->put($object);
+
+ return true;
+ } catch (Exception\RiakException $e) {
+ // Do nothing
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ try {
+ $this->bucket->delete($id);
+
+ return true;
+ } catch (Exception\BadArgumentsException $e) {
+ // Key did not exist on cluster already
+ } catch (Exception\RiakException $e) {
+ // Covers:
+ // - Riak\Exception\ConnectionException
+ // - Riak\Exception\CommunicationException
+ // - Riak\Exception\UnexpectedResponseException
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ try {
+ $keyList = $this->bucket->getKeyList();
+
+ foreach ($keyList as $key) {
+ $this->bucket->delete($key);
+ }
+
+ return true;
+ } catch (Exception\RiakException $e) {
+ // Do nothing
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ // Only exposed through HTTP stats API, not Protocol Buffers API
+ return null;
+ }
+
+ /**
+ * Check if a given Riak Object have expired.
+ *
+ * @param \Riak\Object $object
+ *
+ * @return boolean
+ */
+ private function isExpired(Object $object)
+ {
+ $metadataMap = $object->getMetadataMap();
+
+ return isset($metadataMap[self::EXPIRES_HEADER])
+ && $metadataMap[self::EXPIRES_HEADER] < time();
+ }
+
+ /**
+ * On-read conflict resolution. Applied approach here is last write wins.
+ * Specific needs may override this method to apply alternate conflict resolutions.
+ *
+ * {@internal Riak does not attempt to resolve a write conflict, and store
+ * it as sibling of conflicted one. By following this approach, it is up to
+ * the next read to resolve the conflict. When this happens, your fetched
+ * object will have a list of siblings (read as a list of objects).
+ * In our specific case, we do not care about the intermediate ones since
+ * they are all the same read from storage, and we do apply a last sibling
+ * (last write) wins logic.
+ * If by any means our resolution generates another conflict, it'll up to
+ * next read to properly solve it.}
+ *
+ * @param string $id
+ * @param string $vClock
+ * @param array $objectList
+ *
+ * @return \Riak\Object
+ */
+ protected function resolveConflict($id, $vClock, array $objectList)
+ {
+ // Our approach here is last-write wins
+ $winner = $objectList[count($objectList)];
+
+ $putInput = new Input\PutInput();
+ $putInput->setVClock($vClock);
+
+ $mergedObject = new Object($id);
+ $mergedObject->setContent($winner->getContent());
+
+ $this->bucket->put($mergedObject, $putInput);
+
+ return $mergedObject;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php
new file mode 100644
index 0000000000000000000000000000000000000000..b12978c49a1c135719d486d02f55e988b3b6ed86
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/SQLite3Cache.php
@@ -0,0 +1,219 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+use SQLite3;
+use SQLite3Result;
+
+/**
+ * SQLite3 cache provider.
+ *
+ * @since 1.4
+ * @author Jake Bell
+ */
+class SQLite3Cache extends CacheProvider
+{
+ /**
+ * The ID field will store the cache key.
+ */
+ const ID_FIELD = 'k';
+
+ /**
+ * The data field will store the serialized PHP value.
+ */
+ const DATA_FIELD = 'd';
+
+ /**
+ * The expiration field will store a date value indicating when the
+ * cache entry should expire.
+ */
+ const EXPIRATION_FIELD = 'e';
+
+ /**
+ * @var SQLite3
+ */
+ private $sqlite;
+
+ /**
+ * @var string
+ */
+ private $table;
+
+ /**
+ * Constructor.
+ *
+ * Calling the constructor will ensure that the database file and table
+ * exist and will create both if they don't.
+ *
+ * @param SQLite3 $sqlite
+ * @param string $table
+ */
+ public function __construct(SQLite3 $sqlite, $table)
+ {
+ $this->sqlite = $sqlite;
+ $this->table = (string) $table;
+
+ list($id, $data, $exp) = $this->getFields();
+
+ return $this->sqlite->exec(sprintf(
+ 'CREATE TABLE IF NOT EXISTS %s(%s TEXT PRIMARY KEY NOT NULL, %s BLOB, %s INTEGER)',
+ $table,
+ $id,
+ $data,
+ $exp
+ ));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ if ($item = $this->findById($id)) {
+ return unserialize($item[self::DATA_FIELD]);
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return (boolean) $this->findById($id, false);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ $statement = $this->sqlite->prepare(sprintf(
+ 'INSERT OR REPLACE INTO %s (%s) VALUES (:id, :data, :expire)',
+ $this->table,
+ implode(',', $this->getFields())
+ ));
+
+ $statement->bindValue(':id', $id);
+ $statement->bindValue(':data', serialize($data), SQLITE3_BLOB);
+ $statement->bindValue(':expire', $lifeTime > 0 ? time() + $lifeTime : null);
+
+ return $statement->execute() instanceof SQLite3Result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ list($idField) = $this->getFields();
+
+ $statement = $this->sqlite->prepare(sprintf(
+ 'DELETE FROM %s WHERE %s = :id',
+ $this->table,
+ $idField
+ ));
+
+ $statement->bindValue(':id', $id);
+
+ return $statement->execute() instanceof SQLite3Result;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return $this->sqlite->exec(sprintf('DELETE FROM %s', $this->table));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ // no-op.
+ }
+
+ /**
+ * Find a single row by ID.
+ *
+ * @param mixed $id
+ * @param boolean $includeData
+ *
+ * @return array|null
+ */
+ private function findById($id, $includeData = true)
+ {
+ list($idField) = $fields = $this->getFields();
+
+ if (!$includeData) {
+ $key = array_search(static::DATA_FIELD, $fields);
+ unset($fields[$key]);
+ }
+
+ $statement = $this->sqlite->prepare(sprintf(
+ 'SELECT %s FROM %s WHERE %s = :id LIMIT 1',
+ implode(',', $fields),
+ $this->table,
+ $idField
+ ));
+
+ $statement->bindValue(':id', $id, SQLITE3_TEXT);
+
+ $item = $statement->execute()->fetchArray(SQLITE3_ASSOC);
+
+ if ($item === false) {
+ return null;
+ }
+
+ if ($this->isExpired($item)) {
+ $this->doDelete($id);
+
+ return null;
+ }
+
+ return $item;
+ }
+
+ /**
+ * Gets an array of the fields in our table.
+ *
+ * @return array
+ */
+ private function getFields()
+ {
+ return array(static::ID_FIELD, static::DATA_FIELD, static::EXPIRATION_FIELD);
+ }
+
+ /**
+ * Check if the item is expired.
+ *
+ * @param array $item
+ * @return boolean
+ */
+ private function isExpired(array $item)
+ {
+ return isset($item[static::EXPIRATION_FIELD]) &&
+ $item[self::EXPIRATION_FIELD] !== null &&
+ $item[self::EXPIRATION_FIELD] < time();
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php
new file mode 100644
index 0000000000000000000000000000000000000000..d742fa080f0dc59c51e57c0a918c460e74685e5e
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/Version.php
@@ -0,0 +1,25 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+class Version
+{
+ const VERSION = '1.4.0-DEV';
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..65e8456faad0e80b29a5bb3026c5f90f11b9e7f1
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/VoidCache.php
@@ -0,0 +1,78 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Void cache driver. The cache could be of use in tests where you don`t need to cache anything.
+ *
+ * @link www.doctrine-project.org
+ * @since 1.5
+ * @author Kotlyar Maksim
+ */
+class VoidCache extends CacheProvider
+{
+ /**
+ * {@inheritDoc}
+ */
+ protected function doFetch($id)
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doContains($id)
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doDelete($id)
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doFlush()
+ {
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function doGetStats()
+ {
+ return;
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..ae32772930046d19e28334a2485193f1c2c7c9da
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/WinCacheCache.php
@@ -0,0 +1,91 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * WinCache cache provider.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class WinCacheCache extends CacheProvider
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return wincache_ucache_get($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return wincache_ucache_exists($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return (bool) wincache_ucache_set($id, $data, (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return wincache_ucache_delete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ return wincache_ucache_clear();
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $info = wincache_ucache_info();
+ $meminfo = wincache_ucache_meminfo();
+
+ return array(
+ Cache::STATS_HITS => $info['total_hit_count'],
+ Cache::STATS_MISSES => $info['total_miss_count'],
+ Cache::STATS_UPTIME => $info['total_cache_uptime'],
+ Cache::STATS_MEMORY_USAGE => $meminfo['memory_total'],
+ Cache::STATS_MEMORY_AVAILABLE => $meminfo['memory_free'],
+ );
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..a2c4ca5662e2502e0db2c4f130387545192be5aa
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/XcacheCache.php
@@ -0,0 +1,112 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Xcache cache driver.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ * @author David Abdemoulaie
+ */
+class XcacheCache extends CacheProvider
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return $this->doContains($id) ? unserialize(xcache_get($id)) : false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return xcache_isset($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return xcache_set($id, serialize($data), (int) $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return xcache_unset($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ $this->checkAuthorization();
+
+ xcache_clear_cache(XC_TYPE_VAR);
+
+ return true;
+ }
+
+ /**
+ * Checks that xcache.admin.enable_auth is Off.
+ *
+ * @return void
+ *
+ * @throws \BadMethodCallException When xcache.admin.enable_auth is On.
+ */
+ protected function checkAuthorization()
+ {
+ if (ini_get('xcache.admin.enable_auth')) {
+ throw new \BadMethodCallException(
+ 'To use all features of \Doctrine\Common\Cache\XcacheCache, '
+ . 'you must set "xcache.admin.enable_auth" to "Off" in your php.ini.'
+ );
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ $this->checkAuthorization();
+
+ $info = xcache_info(XC_TYPE_VAR, 0);
+ return array(
+ Cache::STATS_HITS => $info['hits'],
+ Cache::STATS_MISSES => $info['misses'],
+ Cache::STATS_UPTIME => null,
+ Cache::STATS_MEMORY_USAGE => $info['size'],
+ Cache::STATS_MEMORY_AVAILABLE => $info['avail'],
+ );
+ }
+}
diff --git a/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e35ac82369ebef6c8de49806181e59145ab4600
--- /dev/null
+++ b/vendor/doctrine/cache/lib/Doctrine/Common/Cache/ZendDataCache.php
@@ -0,0 +1,83 @@
+.
+ */
+
+namespace Doctrine\Common\Cache;
+
+/**
+ * Zend Data Cache cache driver.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Ralph Schindler
+ * @author Guilherme Blanco
+ */
+class ZendDataCache extends CacheProvider
+{
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFetch($id)
+ {
+ return zend_shm_cache_fetch($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doContains($id)
+ {
+ return (false !== zend_shm_cache_fetch($id));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doSave($id, $data, $lifeTime = 0)
+ {
+ return zend_shm_cache_store($id, $data, $lifeTime);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doDelete($id)
+ {
+ return zend_shm_cache_delete($id);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doFlush()
+ {
+ $namespace = $this->getNamespace();
+ if (empty($namespace)) {
+ return zend_shm_cache_clear();
+ }
+ return zend_shm_cache_clear($namespace);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function doGetStats()
+ {
+ return null;
+ }
+}
diff --git a/vendor/doctrine/cache/phpunit.xml.dist b/vendor/doctrine/cache/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..34d7f4c879799941987a7e2d77641e1a8df2356a
--- /dev/null
+++ b/vendor/doctrine/cache/phpunit.xml.dist
@@ -0,0 +1,25 @@
+
+
+
+
+
+ ./tests/Doctrine/
+
+
+
+
+
+ ./lib/Doctrine/
+
+
+
diff --git a/vendor/doctrine/collections/.gitignore b/vendor/doctrine/collections/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..48b8bf9072d8716346ec810e5a1808305c97d50f
--- /dev/null
+++ b/vendor/doctrine/collections/.gitignore
@@ -0,0 +1 @@
+vendor/
diff --git a/vendor/doctrine/collections/.travis.yml b/vendor/doctrine/collections/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..60f479277d085b2cdd592668bde86132503c69b3
--- /dev/null
+++ b/vendor/doctrine/collections/.travis.yml
@@ -0,0 +1,21 @@
+language: php
+
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+ - hhvm-nightly
+
+matrix:
+ fast_finish: true
+ allow_failures:
+ - php: 7.0
+
+before_script:
+ - composer --prefer-source install
+
+script:
+ - phpunit
diff --git a/vendor/doctrine/collections/LICENSE b/vendor/doctrine/collections/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..5e781fce4bb504715ba0ec0188715b18a198ca6b
--- /dev/null
+++ b/vendor/doctrine/collections/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2006-2013 Doctrine Project
+
+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/doctrine/collections/README.md b/vendor/doctrine/collections/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..161cab63c73a9fc6706f8591af9682e6c016715b
--- /dev/null
+++ b/vendor/doctrine/collections/README.md
@@ -0,0 +1,25 @@
+# Doctrine Collections
+
+[![Build Status](https://travis-ci.org/doctrine/collections.svg?branch=master)](https://travis-ci.org/doctrine/collections)
+
+Collections Abstraction library
+
+## Changelog
+
+### v1.3.0
+
+* [Explicit casting of first and max results in criteria API](https://github.com/doctrine/collections/pull/26)
+* [Keep keys when using `ArrayCollection#matching()` with sorting](https://github.com/doctrine/collections/pull/49)
+* [Made `AbstractLazyCollection#$initialized` protected for extensibility](https://github.com/doctrine/collections/pull/52)
+
+### v1.2.0
+
+* Add a new ``AbstractLazyCollection``
+
+### v1.1.0
+
+* Deprecated ``Comparison::IS``, because it's only there for SQL semantics.
+ These are fixed in the ORM instead.
+* Add ``Comparison::CONTAINS`` to perform partial string matches:
+
+ $criteria->andWhere($criteria->expr()->contains('property', 'Foo'));
diff --git a/vendor/doctrine/collections/composer.json b/vendor/doctrine/collections/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..155cac48f97a53a29e82275b1dfcba56fc737b64
--- /dev/null
+++ b/vendor/doctrine/collections/composer.json
@@ -0,0 +1,29 @@
+{
+ "name": "doctrine/collections",
+ "type": "library",
+ "description": "Collections Abstraction library",
+ "keywords": ["collections", "array", "iterator"],
+ "homepage": "http://www.doctrine-project.org",
+ "license": "MIT",
+ "authors": [
+ {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"},
+ {"name": "Roman Borschel", "email": "roman@code-factory.org"},
+ {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
+ {"name": "Jonathan Wage", "email": "jonwage@gmail.com"},
+ {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
+ ],
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "autoload": {
+ "psr-0": { "Doctrine\\Common\\Collections\\": "lib/" }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ }
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php
new file mode 100644
index 0000000000000000000000000000000000000000..b907f8b02a00cf7fec00672e375aca29be1e039f
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/AbstractLazyCollection.php
@@ -0,0 +1,343 @@
+.
+ */
+
+namespace Doctrine\Common\Collections;
+
+use Closure;
+
+/**
+ * Lazy collection that is backed by a concrete collection
+ *
+ * @author Michaël Gallego
+ * @since 1.2
+ */
+abstract class AbstractLazyCollection implements Collection
+{
+ /**
+ * The backed collection to use
+ *
+ * @var Collection
+ */
+ protected $collection;
+
+ /**
+ * @var boolean
+ */
+ protected $initialized = false;
+
+ /**
+ * {@inheritDoc}
+ */
+ public function count()
+ {
+ $this->initialize();
+ return $this->collection->count();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function add($element)
+ {
+ $this->initialize();
+ return $this->collection->add($element);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clear()
+ {
+ $this->initialize();
+ $this->collection->clear();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function contains($element)
+ {
+ $this->initialize();
+ return $this->collection->contains($element);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function isEmpty()
+ {
+ $this->initialize();
+ return $this->collection->isEmpty();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function remove($key)
+ {
+ $this->initialize();
+ return $this->collection->remove($key);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function removeElement($element)
+ {
+ $this->initialize();
+ return $this->collection->removeElement($element);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function containsKey($key)
+ {
+ $this->initialize();
+ return $this->collection->containsKey($key);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function get($key)
+ {
+ $this->initialize();
+ return $this->collection->get($key);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getKeys()
+ {
+ $this->initialize();
+ return $this->collection->getKeys();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getValues()
+ {
+ $this->initialize();
+ return $this->collection->getValues();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function set($key, $value)
+ {
+ $this->initialize();
+ $this->collection->set($key, $value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function toArray()
+ {
+ $this->initialize();
+ return $this->collection->toArray();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function first()
+ {
+ $this->initialize();
+ return $this->collection->first();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function last()
+ {
+ $this->initialize();
+ return $this->collection->last();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function key()
+ {
+ $this->initialize();
+ return $this->collection->key();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function current()
+ {
+ $this->initialize();
+ return $this->collection->current();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function next()
+ {
+ $this->initialize();
+ return $this->collection->next();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function exists(Closure $p)
+ {
+ $this->initialize();
+ return $this->collection->exists($p);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function filter(Closure $p)
+ {
+ $this->initialize();
+ return $this->collection->filter($p);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function forAll(Closure $p)
+ {
+ $this->initialize();
+ return $this->collection->forAll($p);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function map(Closure $func)
+ {
+ $this->initialize();
+ return $this->collection->map($func);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function partition(Closure $p)
+ {
+ $this->initialize();
+ return $this->collection->partition($p);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function indexOf($element)
+ {
+ $this->initialize();
+ return $this->collection->indexOf($element);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function slice($offset, $length = null)
+ {
+ $this->initialize();
+ return $this->collection->slice($offset, $length);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getIterator()
+ {
+ $this->initialize();
+ return $this->collection->getIterator();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function offsetExists($offset)
+ {
+ $this->initialize();
+ return $this->collection->offsetExists($offset);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function offsetGet($offset)
+ {
+ $this->initialize();
+ return $this->collection->offsetGet($offset);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function offsetSet($offset, $value)
+ {
+ $this->initialize();
+ $this->collection->offsetSet($offset, $value);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function offsetUnset($offset)
+ {
+ $this->initialize();
+ $this->collection->offsetUnset($offset);
+ }
+
+ /**
+ * Is the lazy collection already initialized?
+ *
+ * @return bool
+ */
+ public function isInitialized()
+ {
+ return $this->initialized;
+ }
+
+ /**
+ * Initialize the collection
+ *
+ * @return void
+ */
+ protected function initialize()
+ {
+ if ( ! $this->initialized) {
+ $this->doInitialize();
+ $this->initialized = true;
+ }
+ }
+
+ /**
+ * Do the initialization logic
+ *
+ * @return void
+ */
+ abstract protected function doInitialize();
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php
new file mode 100644
index 0000000000000000000000000000000000000000..bce575120ea794a29004b51749252c8a63e6cc8c
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ArrayCollection.php
@@ -0,0 +1,387 @@
+.
+ */
+
+namespace Doctrine\Common\Collections;
+
+use ArrayIterator;
+use Closure;
+use Doctrine\Common\Collections\Expr\ClosureExpressionVisitor;
+
+/**
+ * An ArrayCollection is a Collection implementation that wraps a regular PHP array.
+ *
+ * @since 2.0
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+class ArrayCollection implements Collection, Selectable
+{
+ /**
+ * An array containing the entries of this collection.
+ *
+ * @var array
+ */
+ private $elements;
+
+ /**
+ * Initializes a new ArrayCollection.
+ *
+ * @param array $elements
+ */
+ public function __construct(array $elements = array())
+ {
+ $this->elements = $elements;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function toArray()
+ {
+ return $this->elements;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function first()
+ {
+ return reset($this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function last()
+ {
+ return end($this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function key()
+ {
+ return key($this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function next()
+ {
+ return next($this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function current()
+ {
+ return current($this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function remove($key)
+ {
+ if ( ! isset($this->elements[$key]) && ! array_key_exists($key, $this->elements)) {
+ return null;
+ }
+
+ $removed = $this->elements[$key];
+ unset($this->elements[$key]);
+
+ return $removed;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function removeElement($element)
+ {
+ $key = array_search($element, $this->elements, true);
+
+ if ($key === false) {
+ return false;
+ }
+
+ unset($this->elements[$key]);
+
+ return true;
+ }
+
+ /**
+ * Required by interface ArrayAccess.
+ *
+ * {@inheritDoc}
+ */
+ public function offsetExists($offset)
+ {
+ return $this->containsKey($offset);
+ }
+
+ /**
+ * Required by interface ArrayAccess.
+ *
+ * {@inheritDoc}
+ */
+ public function offsetGet($offset)
+ {
+ return $this->get($offset);
+ }
+
+ /**
+ * Required by interface ArrayAccess.
+ *
+ * {@inheritDoc}
+ */
+ public function offsetSet($offset, $value)
+ {
+ if ( ! isset($offset)) {
+ return $this->add($value);
+ }
+
+ $this->set($offset, $value);
+ }
+
+ /**
+ * Required by interface ArrayAccess.
+ *
+ * {@inheritDoc}
+ */
+ public function offsetUnset($offset)
+ {
+ return $this->remove($offset);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function containsKey($key)
+ {
+ return isset($this->elements[$key]) || array_key_exists($key, $this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function contains($element)
+ {
+ return in_array($element, $this->elements, true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function exists(Closure $p)
+ {
+ foreach ($this->elements as $key => $element) {
+ if ($p($key, $element)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function indexOf($element)
+ {
+ return array_search($element, $this->elements, true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function get($key)
+ {
+ return isset($this->elements[$key]) ? $this->elements[$key] : null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getKeys()
+ {
+ return array_keys($this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getValues()
+ {
+ return array_values($this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function count()
+ {
+ return count($this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function set($key, $value)
+ {
+ $this->elements[$key] = $value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function add($value)
+ {
+ $this->elements[] = $value;
+
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function isEmpty()
+ {
+ return empty($this->elements);
+ }
+
+ /**
+ * Required by interface IteratorAggregate.
+ *
+ * {@inheritDoc}
+ */
+ public function getIterator()
+ {
+ return new ArrayIterator($this->elements);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function map(Closure $func)
+ {
+ return new static(array_map($func, $this->elements));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function filter(Closure $p)
+ {
+ return new static(array_filter($this->elements, $p));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function forAll(Closure $p)
+ {
+ foreach ($this->elements as $key => $element) {
+ if ( ! $p($key, $element)) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function partition(Closure $p)
+ {
+ $matches = $noMatches = array();
+
+ foreach ($this->elements as $key => $element) {
+ if ($p($key, $element)) {
+ $matches[$key] = $element;
+ } else {
+ $noMatches[$key] = $element;
+ }
+ }
+
+ return array(new static($matches), new static($noMatches));
+ }
+
+ /**
+ * Returns a string representation of this object.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return __CLASS__ . '@' . spl_object_hash($this);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function clear()
+ {
+ $this->elements = array();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function slice($offset, $length = null)
+ {
+ return array_slice($this->elements, $offset, $length, true);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function matching(Criteria $criteria)
+ {
+ $expr = $criteria->getWhereExpression();
+ $filtered = $this->elements;
+
+ if ($expr) {
+ $visitor = new ClosureExpressionVisitor();
+ $filter = $visitor->dispatch($expr);
+ $filtered = array_filter($filtered, $filter);
+ }
+
+ if ($orderings = $criteria->getOrderings()) {
+ foreach (array_reverse($orderings) as $field => $ordering) {
+ $next = ClosureExpressionVisitor::sortByField($field, $ordering == Criteria::DESC ? -1 : 1);
+ }
+
+ uasort($filtered, $next);
+ }
+
+ $offset = $criteria->getFirstResult();
+ $length = $criteria->getMaxResults();
+
+ if ($offset || $length) {
+ $filtered = array_slice($filtered, (int)$offset, $length);
+ }
+
+ return new static($filtered);
+ }
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php
new file mode 100644
index 0000000000000000000000000000000000000000..8792f7a5b6634896bc607b42b83a66294cffc7ec
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Collection.php
@@ -0,0 +1,263 @@
+.
+ */
+
+namespace Doctrine\Common\Collections;
+
+use ArrayAccess;
+use Closure;
+use Countable;
+use IteratorAggregate;
+
+/**
+ * The missing (SPL) Collection/Array/OrderedMap interface.
+ *
+ * A Collection resembles the nature of a regular PHP array. That is,
+ * it is essentially an ordered map that can also be used
+ * like a list.
+ *
+ * A Collection has an internal iterator just like a PHP array. In addition,
+ * a Collection can be iterated with external iterators, which is preferable.
+ * To use an external iterator simply use the foreach language construct to
+ * iterate over the collection (which calls {@link getIterator()} internally) or
+ * explicitly retrieve an iterator though {@link getIterator()} which can then be
+ * used to iterate over the collection.
+ * You can not rely on the internal iterator of the collection being at a certain
+ * position unless you explicitly positioned it before. Prefer iteration with
+ * external iterators.
+ *
+ * @since 2.0
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+interface Collection extends Countable, IteratorAggregate, ArrayAccess
+{
+ /**
+ * Adds an element at the end of the collection.
+ *
+ * @param mixed $element The element to add.
+ *
+ * @return boolean Always TRUE.
+ */
+ public function add($element);
+
+ /**
+ * Clears the collection, removing all elements.
+ *
+ * @return void
+ */
+ public function clear();
+
+ /**
+ * Checks whether an element is contained in the collection.
+ * This is an O(n) operation, where n is the size of the collection.
+ *
+ * @param mixed $element The element to search for.
+ *
+ * @return boolean TRUE if the collection contains the element, FALSE otherwise.
+ */
+ public function contains($element);
+
+ /**
+ * Checks whether the collection is empty (contains no elements).
+ *
+ * @return boolean TRUE if the collection is empty, FALSE otherwise.
+ */
+ public function isEmpty();
+
+ /**
+ * Removes the element at the specified index from the collection.
+ *
+ * @param string|integer $key The kex/index of the element to remove.
+ *
+ * @return mixed The removed element or NULL, if the collection did not contain the element.
+ */
+ public function remove($key);
+
+ /**
+ * Removes the specified element from the collection, if it is found.
+ *
+ * @param mixed $element The element to remove.
+ *
+ * @return boolean TRUE if this collection contained the specified element, FALSE otherwise.
+ */
+ public function removeElement($element);
+
+ /**
+ * Checks whether the collection contains an element with the specified key/index.
+ *
+ * @param string|integer $key The key/index to check for.
+ *
+ * @return boolean TRUE if the collection contains an element with the specified key/index,
+ * FALSE otherwise.
+ */
+ public function containsKey($key);
+
+ /**
+ * Gets the element at the specified key/index.
+ *
+ * @param string|integer $key The key/index of the element to retrieve.
+ *
+ * @return mixed
+ */
+ public function get($key);
+
+ /**
+ * Gets all keys/indices of the collection.
+ *
+ * @return array The keys/indices of the collection, in the order of the corresponding
+ * elements in the collection.
+ */
+ public function getKeys();
+
+ /**
+ * Gets all values of the collection.
+ *
+ * @return array The values of all elements in the collection, in the order they
+ * appear in the collection.
+ */
+ public function getValues();
+
+ /**
+ * Sets an element in the collection at the specified key/index.
+ *
+ * @param string|integer $key The key/index of the element to set.
+ * @param mixed $value The element to set.
+ *
+ * @return void
+ */
+ public function set($key, $value);
+
+ /**
+ * Gets a native PHP array representation of the collection.
+ *
+ * @return array
+ */
+ public function toArray();
+
+ /**
+ * Sets the internal iterator to the first element in the collection and returns this element.
+ *
+ * @return mixed
+ */
+ public function first();
+
+ /**
+ * Sets the internal iterator to the last element in the collection and returns this element.
+ *
+ * @return mixed
+ */
+ public function last();
+
+ /**
+ * Gets the key/index of the element at the current iterator position.
+ *
+ * @return int|string
+ */
+ public function key();
+
+ /**
+ * Gets the element of the collection at the current iterator position.
+ *
+ * @return mixed
+ */
+ public function current();
+
+ /**
+ * Moves the internal iterator position to the next element and returns this element.
+ *
+ * @return mixed
+ */
+ public function next();
+
+ /**
+ * Tests for the existence of an element that satisfies the given predicate.
+ *
+ * @param Closure $p The predicate.
+ *
+ * @return boolean TRUE if the predicate is TRUE for at least one element, FALSE otherwise.
+ */
+ public function exists(Closure $p);
+
+ /**
+ * Returns all the elements of this collection that satisfy the predicate p.
+ * The order of the elements is preserved.
+ *
+ * @param Closure $p The predicate used for filtering.
+ *
+ * @return Collection A collection with the results of the filter operation.
+ */
+ public function filter(Closure $p);
+
+ /**
+ * Tests whether the given predicate p holds for all elements of this collection.
+ *
+ * @param Closure $p The predicate.
+ *
+ * @return boolean TRUE, if the predicate yields TRUE for all elements, FALSE otherwise.
+ */
+ public function forAll(Closure $p);
+
+ /**
+ * Applies the given function to each element in the collection and returns
+ * a new collection with the elements returned by the function.
+ *
+ * @param Closure $func
+ *
+ * @return Collection
+ */
+ public function map(Closure $func);
+
+ /**
+ * Partitions this collection in two collections according to a predicate.
+ * Keys are preserved in the resulting collections.
+ *
+ * @param Closure $p The predicate on which to partition.
+ *
+ * @return array An array with two elements. The first element contains the collection
+ * of elements where the predicate returned TRUE, the second element
+ * contains the collection of elements where the predicate returned FALSE.
+ */
+ public function partition(Closure $p);
+
+ /**
+ * Gets the index/key of a given element. The comparison of two elements is strict,
+ * that means not only the value but also the type must match.
+ * For objects this means reference equality.
+ *
+ * @param mixed $element The element to search for.
+ *
+ * @return int|string|bool The key/index of the element or FALSE if the element was not found.
+ */
+ public function indexOf($element);
+
+ /**
+ * Extracts a slice of $length elements starting at position $offset from the Collection.
+ *
+ * If $length is null it returns all elements from $offset to the end of the Collection.
+ * Keys have to be preserved by this method. Calling this method will only return the
+ * selected slice and NOT change the elements contained in the collection slice is called on.
+ *
+ * @param int $offset The offset to start from.
+ * @param int|null $length The maximum number of elements to return, or null for no limit.
+ *
+ * @return array
+ */
+ public function slice($offset, $length = null);
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Criteria.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Criteria.php
new file mode 100644
index 0000000000000000000000000000000000000000..3f9d43a8294e7ccce12a7ec137c48c3d9854108a
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Criteria.php
@@ -0,0 +1,259 @@
+.
+ */
+
+namespace Doctrine\Common\Collections;
+
+use Doctrine\Common\Collections\Expr\Expression;
+use Doctrine\Common\Collections\Expr\CompositeExpression;
+
+/**
+ * Criteria for filtering Selectable collections.
+ *
+ * @author Benjamin Eberlei
+ * @since 2.3
+ */
+class Criteria
+{
+ /**
+ * @var string
+ */
+ const ASC = 'ASC';
+
+ /**
+ * @var string
+ */
+ const DESC = 'DESC';
+
+ /**
+ * @var \Doctrine\Common\Collections\ExpressionBuilder|null
+ */
+ private static $expressionBuilder;
+
+ /**
+ * @var \Doctrine\Common\Collections\Expr\Expression|null
+ */
+ private $expression;
+
+ /**
+ * @var string[]
+ */
+ private $orderings = array();
+
+ /**
+ * @var int|null
+ */
+ private $firstResult;
+
+ /**
+ * @var int|null
+ */
+ private $maxResults;
+
+ /**
+ * Creates an instance of the class.
+ *
+ * @return Criteria
+ */
+ public static function create()
+ {
+ return new static();
+ }
+
+ /**
+ * Returns the expression builder.
+ *
+ * @return \Doctrine\Common\Collections\ExpressionBuilder
+ */
+ public static function expr()
+ {
+ if (self::$expressionBuilder === null) {
+ self::$expressionBuilder = new ExpressionBuilder();
+ }
+
+ return self::$expressionBuilder;
+ }
+
+ /**
+ * Construct a new Criteria.
+ *
+ * @param Expression $expression
+ * @param string[]|null $orderings
+ * @param int|null $firstResult
+ * @param int|null $maxResults
+ */
+ public function __construct(Expression $expression = null, array $orderings = null, $firstResult = null, $maxResults = null)
+ {
+ $this->expression = $expression;
+
+ $this->setFirstResult($firstResult);
+ $this->setMaxResults($maxResults);
+
+ if (null !== $orderings) {
+ $this->orderBy($orderings);
+ }
+ }
+
+ /**
+ * Sets the where expression to evaluate when this Criteria is searched for.
+ *
+ * @param Expression $expression
+ *
+ * @return Criteria
+ */
+ public function where(Expression $expression)
+ {
+ $this->expression = $expression;
+
+ return $this;
+ }
+
+ /**
+ * Appends the where expression to evaluate when this Criteria is searched for
+ * using an AND with previous expression.
+ *
+ * @param Expression $expression
+ *
+ * @return Criteria
+ */
+ public function andWhere(Expression $expression)
+ {
+ if ($this->expression === null) {
+ return $this->where($expression);
+ }
+
+ $this->expression = new CompositeExpression(CompositeExpression::TYPE_AND, array(
+ $this->expression, $expression
+ ));
+
+ return $this;
+ }
+
+ /**
+ * Appends the where expression to evaluate when this Criteria is searched for
+ * using an OR with previous expression.
+ *
+ * @param Expression $expression
+ *
+ * @return Criteria
+ */
+ public function orWhere(Expression $expression)
+ {
+ if ($this->expression === null) {
+ return $this->where($expression);
+ }
+
+ $this->expression = new CompositeExpression(CompositeExpression::TYPE_OR, array(
+ $this->expression, $expression
+ ));
+
+ return $this;
+ }
+
+ /**
+ * Gets the expression attached to this Criteria.
+ *
+ * @return Expression|null
+ */
+ public function getWhereExpression()
+ {
+ return $this->expression;
+ }
+
+ /**
+ * Gets the current orderings of this Criteria.
+ *
+ * @return string[]
+ */
+ public function getOrderings()
+ {
+ return $this->orderings;
+ }
+
+ /**
+ * Sets the ordering of the result of this Criteria.
+ *
+ * Keys are field and values are the order, being either ASC or DESC.
+ *
+ * @see Criteria::ASC
+ * @see Criteria::DESC
+ *
+ * @param string[] $orderings
+ *
+ * @return Criteria
+ */
+ public function orderBy(array $orderings)
+ {
+ $this->orderings = array_map(
+ function ($ordering) {
+ return strtoupper($ordering) === Criteria::ASC ? Criteria::ASC : Criteria::DESC;
+ },
+ $orderings
+ );
+
+ return $this;
+ }
+
+ /**
+ * Gets the current first result option of this Criteria.
+ *
+ * @return int|null
+ */
+ public function getFirstResult()
+ {
+ return $this->firstResult;
+ }
+
+ /**
+ * Set the number of first result that this Criteria should return.
+ *
+ * @param int|null $firstResult The value to set.
+ *
+ * @return Criteria
+ */
+ public function setFirstResult($firstResult)
+ {
+ $this->firstResult = null === $firstResult ? null : (int) $firstResult;
+
+ return $this;
+ }
+
+ /**
+ * Gets maxResults.
+ *
+ * @return int|null
+ */
+ public function getMaxResults()
+ {
+ return $this->maxResults;
+ }
+
+ /**
+ * Sets maxResults.
+ *
+ * @param int|null $maxResults The value to set.
+ *
+ * @return Criteria
+ */
+ public function setMaxResults($maxResults)
+ {
+ $this->maxResults = null === $maxResults ? null : (int) $maxResults;
+
+ return $this;
+ }
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php
new file mode 100644
index 0000000000000000000000000000000000000000..994085f914f0006660b7923f2502397178b182d5
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ClosureExpressionVisitor.php
@@ -0,0 +1,227 @@
+.
+ */
+
+namespace Doctrine\Common\Collections\Expr;
+
+/**
+ * Walks an expression graph and turns it into a PHP closure.
+ *
+ * This closure can be used with {@Collection#filter()} and is used internally
+ * by {@ArrayCollection#select()}.
+ *
+ * @author Benjamin Eberlei
+ * @since 2.3
+ */
+class ClosureExpressionVisitor extends ExpressionVisitor
+{
+ /**
+ * Accesses the field of a given object. This field has to be public
+ * directly or indirectly (through an accessor get*, is*, or a magic
+ * method, __get, __call).
+ *
+ * @param object $object
+ * @param string $field
+ *
+ * @return mixed
+ */
+ public static function getObjectFieldValue($object, $field)
+ {
+ if (is_array($object)) {
+ return $object[$field];
+ }
+
+ $accessors = array('get', 'is');
+
+ foreach ($accessors as $accessor) {
+ $accessor .= $field;
+
+ if ( ! method_exists($object, $accessor)) {
+ continue;
+ }
+
+ return $object->$accessor();
+ }
+
+ // __call should be triggered for get.
+ $accessor = $accessors[0] . $field;
+
+ if (method_exists($object, '__call')) {
+ return $object->$accessor();
+ }
+
+ if ($object instanceof \ArrayAccess) {
+ return $object[$field];
+ }
+
+ return $object->$field;
+ }
+
+ /**
+ * Helper for sorting arrays of objects based on multiple fields + orientations.
+ *
+ * @param string $name
+ * @param int $orientation
+ * @param \Closure $next
+ *
+ * @return \Closure
+ */
+ public static function sortByField($name, $orientation = 1, \Closure $next = null)
+ {
+ if ( ! $next) {
+ $next = function() {
+ return 0;
+ };
+ }
+
+ return function ($a, $b) use ($name, $next, $orientation) {
+ $aValue = ClosureExpressionVisitor::getObjectFieldValue($a, $name);
+ $bValue = ClosureExpressionVisitor::getObjectFieldValue($b, $name);
+
+ if ($aValue === $bValue) {
+ return $next($a, $b);
+ }
+
+ return (($aValue > $bValue) ? 1 : -1) * $orientation;
+ };
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function walkComparison(Comparison $comparison)
+ {
+ $field = $comparison->getField();
+ $value = $comparison->getValue()->getValue(); // shortcut for walkValue()
+
+ switch ($comparison->getOperator()) {
+ case Comparison::EQ:
+ return function ($object) use ($field, $value) {
+ return ClosureExpressionVisitor::getObjectFieldValue($object, $field) === $value;
+ };
+
+ case Comparison::NEQ:
+ return function ($object) use ($field, $value) {
+ return ClosureExpressionVisitor::getObjectFieldValue($object, $field) !== $value;
+ };
+
+ case Comparison::LT:
+ return function ($object) use ($field, $value) {
+ return ClosureExpressionVisitor::getObjectFieldValue($object, $field) < $value;
+ };
+
+ case Comparison::LTE:
+ return function ($object) use ($field, $value) {
+ return ClosureExpressionVisitor::getObjectFieldValue($object, $field) <= $value;
+ };
+
+ case Comparison::GT:
+ return function ($object) use ($field, $value) {
+ return ClosureExpressionVisitor::getObjectFieldValue($object, $field) > $value;
+ };
+
+ case Comparison::GTE:
+ return function ($object) use ($field, $value) {
+ return ClosureExpressionVisitor::getObjectFieldValue($object, $field) >= $value;
+ };
+
+ case Comparison::IN:
+ return function ($object) use ($field, $value) {
+ return in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value);
+ };
+
+ case Comparison::NIN:
+ return function ($object) use ($field, $value) {
+ return ! in_array(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value);
+ };
+
+ case Comparison::CONTAINS:
+ return function ($object) use ($field, $value) {
+ return false !== strpos(ClosureExpressionVisitor::getObjectFieldValue($object, $field), $value);
+ };
+
+ default:
+ throw new \RuntimeException("Unknown comparison operator: " . $comparison->getOperator());
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function walkValue(Value $value)
+ {
+ return $value->getValue();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function walkCompositeExpression(CompositeExpression $expr)
+ {
+ $expressionList = array();
+
+ foreach ($expr->getExpressionList() as $child) {
+ $expressionList[] = $this->dispatch($child);
+ }
+
+ switch($expr->getType()) {
+ case CompositeExpression::TYPE_AND:
+ return $this->andExpressions($expressionList);
+
+ case CompositeExpression::TYPE_OR:
+ return $this->orExpressions($expressionList);
+
+ default:
+ throw new \RuntimeException("Unknown composite " . $expr->getType());
+ }
+ }
+
+ /**
+ * @param array $expressions
+ *
+ * @return callable
+ */
+ private function andExpressions($expressions)
+ {
+ return function ($object) use ($expressions) {
+ foreach ($expressions as $expression) {
+ if ( ! $expression($object)) {
+ return false;
+ }
+ }
+ return true;
+ };
+ }
+
+ /**
+ * @param array $expressions
+ *
+ * @return callable
+ */
+ private function orExpressions($expressions)
+ {
+ return function ($object) use ($expressions) {
+ foreach ($expressions as $expression) {
+ if ($expression($object)) {
+ return true;
+ }
+ }
+ return false;
+ };
+ }
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Comparison.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Comparison.php
new file mode 100644
index 0000000000000000000000000000000000000000..d54ecf25c7d5af7bde342427fc8dd370b0b79d35
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Comparison.php
@@ -0,0 +1,103 @@
+.
+ */
+
+namespace Doctrine\Common\Collections\Expr;
+
+/**
+ * Comparison of a field with a value by the given operator.
+ *
+ * @author Benjamin Eberlei
+ * @since 2.3
+ */
+class Comparison implements Expression
+{
+ const EQ = '=';
+ const NEQ = '<>';
+ const LT = '<';
+ const LTE = '<=';
+ const GT = '>';
+ const GTE = '>=';
+ const IS = '='; // no difference with EQ
+ const IN = 'IN';
+ const NIN = 'NIN';
+ const CONTAINS = 'CONTAINS';
+
+ /**
+ * @var string
+ */
+ private $field;
+
+ /**
+ * @var string
+ */
+ private $op;
+
+ /**
+ * @var Value
+ */
+ private $value;
+
+ /**
+ * @param string $field
+ * @param string $operator
+ * @param mixed $value
+ */
+ public function __construct($field, $operator, $value)
+ {
+ if ( ! ($value instanceof Value)) {
+ $value = new Value($value);
+ }
+
+ $this->field = $field;
+ $this->op = $operator;
+ $this->value = $value;
+ }
+
+ /**
+ * @return string
+ */
+ public function getField()
+ {
+ return $this->field;
+ }
+
+ /**
+ * @return Value
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * @return string
+ */
+ public function getOperator()
+ {
+ return $this->op;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function visit(ExpressionVisitor $visitor)
+ {
+ return $visitor->walkComparison($this);
+ }
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php
new file mode 100644
index 0000000000000000000000000000000000000000..3613c027457791a8cf3d5273ebbdf1aa3c459aec
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/CompositeExpression.php
@@ -0,0 +1,90 @@
+.
+ */
+
+namespace Doctrine\Common\Collections\Expr;
+
+/**
+ * Expression of Expressions combined by AND or OR operation.
+ *
+ * @author Benjamin Eberlei
+ * @since 2.3
+ */
+class CompositeExpression implements Expression
+{
+ const TYPE_AND = 'AND';
+ const TYPE_OR = 'OR';
+
+ /**
+ * @var string
+ */
+ private $type;
+
+ /**
+ * @var Expression[]
+ */
+ private $expressions = array();
+
+ /**
+ * @param string $type
+ * @param array $expressions
+ *
+ * @throws \RuntimeException
+ */
+ public function __construct($type, array $expressions)
+ {
+ $this->type = $type;
+
+ foreach ($expressions as $expr) {
+ if ($expr instanceof Value) {
+ throw new \RuntimeException("Values are not supported expressions as children of and/or expressions.");
+ }
+ if ( ! ($expr instanceof Expression)) {
+ throw new \RuntimeException("No expression given to CompositeExpression.");
+ }
+
+ $this->expressions[] = $expr;
+ }
+ }
+
+ /**
+ * Returns the list of expressions nested in this composite.
+ *
+ * @return Expression[]
+ */
+ public function getExpressionList()
+ {
+ return $this->expressions;
+ }
+
+ /**
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function visit(ExpressionVisitor $visitor)
+ {
+ return $visitor->walkCompositeExpression($this);
+ }
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Expression.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Expression.php
new file mode 100644
index 0000000000000000000000000000000000000000..68db767c0716981fcfd07182ab14dd6f0a7a507b
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Expression.php
@@ -0,0 +1,35 @@
+.
+ */
+
+namespace Doctrine\Common\Collections\Expr;
+
+/**
+ * Expression for the {@link Selectable} interface.
+ *
+ * @author Benjamin Eberlei
+ */
+interface Expression
+{
+ /**
+ * @param ExpressionVisitor $visitor
+ *
+ * @return mixed
+ */
+ public function visit(ExpressionVisitor $visitor);
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php
new file mode 100644
index 0000000000000000000000000000000000000000..080afdc6df56b654ade75a3831d83c8a4ed0e5c8
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/ExpressionVisitor.php
@@ -0,0 +1,82 @@
+.
+ */
+
+namespace Doctrine\Common\Collections\Expr;
+
+/**
+ * An Expression visitor walks a graph of expressions and turns them into a
+ * query for the underlying implementation.
+ *
+ * @author Benjamin Eberlei
+ */
+abstract class ExpressionVisitor
+{
+ /**
+ * Converts a comparison expression into the target query language output.
+ *
+ * @param Comparison $comparison
+ *
+ * @return mixed
+ */
+ abstract public function walkComparison(Comparison $comparison);
+
+ /**
+ * Converts a value expression into the target query language part.
+ *
+ * @param Value $value
+ *
+ * @return mixed
+ */
+ abstract public function walkValue(Value $value);
+
+ /**
+ * Converts a composite expression into the target query language output.
+ *
+ * @param CompositeExpression $expr
+ *
+ * @return mixed
+ */
+ abstract public function walkCompositeExpression(CompositeExpression $expr);
+
+ /**
+ * Dispatches walking an expression to the appropriate handler.
+ *
+ * @param Expression $expr
+ *
+ * @return mixed
+ *
+ * @throws \RuntimeException
+ */
+ public function dispatch(Expression $expr)
+ {
+ switch (true) {
+ case ($expr instanceof Comparison):
+ return $this->walkComparison($expr);
+
+ case ($expr instanceof Value):
+ return $this->walkValue($expr);
+
+ case ($expr instanceof CompositeExpression):
+ return $this->walkCompositeExpression($expr);
+
+ default:
+ throw new \RuntimeException("Unknown Expression " . get_class($expr));
+ }
+ }
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Value.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Value.php
new file mode 100644
index 0000000000000000000000000000000000000000..7f6e83143b57505c1ac889b87b4824766c3b9c45
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Expr/Value.php
@@ -0,0 +1,52 @@
+.
+ */
+
+namespace Doctrine\Common\Collections\Expr;
+
+class Value implements Expression
+{
+ /**
+ * @var mixed
+ */
+ private $value;
+
+ /**
+ * @param mixed $value
+ */
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function visit(ExpressionVisitor $visitor)
+ {
+ return $visitor->walkValue($this);
+ }
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ExpressionBuilder.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ExpressionBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..6539e3c75fd44f27b38e81e6bec5f5f7a76e92ab
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/ExpressionBuilder.php
@@ -0,0 +1,166 @@
+.
+ */
+
+namespace Doctrine\Common\Collections;
+
+use Doctrine\Common\Collections\Expr\Comparison;
+use Doctrine\Common\Collections\Expr\CompositeExpression;
+use Doctrine\Common\Collections\Expr\Value;
+
+/**
+ * Builder for Expressions in the {@link Selectable} interface.
+ *
+ * Important Notice for interoperable code: You have to use scalar
+ * values only for comparisons, otherwise the behavior of the comparision
+ * may be different between implementations (Array vs ORM vs ODM).
+ *
+ * @author Benjamin Eberlei
+ * @since 2.3
+ */
+class ExpressionBuilder
+{
+ /**
+ * @param mixed $x
+ *
+ * @return CompositeExpression
+ */
+ public function andX($x = null)
+ {
+ return new CompositeExpression(CompositeExpression::TYPE_AND, func_get_args());
+ }
+
+ /**
+ * @param mixed $x
+ *
+ * @return CompositeExpression
+ */
+ public function orX($x = null)
+ {
+ return new CompositeExpression(CompositeExpression::TYPE_OR, func_get_args());
+ }
+
+ /**
+ * @param string $field
+ * @param mixed $value
+ *
+ * @return Comparison
+ */
+ public function eq($field, $value)
+ {
+ return new Comparison($field, Comparison::EQ, new Value($value));
+ }
+
+ /**
+ * @param string $field
+ * @param mixed $value
+ *
+ * @return Comparison
+ */
+ public function gt($field, $value)
+ {
+ return new Comparison($field, Comparison::GT, new Value($value));
+ }
+
+ /**
+ * @param string $field
+ * @param mixed $value
+ *
+ * @return Comparison
+ */
+ public function lt($field, $value)
+ {
+ return new Comparison($field, Comparison::LT, new Value($value));
+ }
+
+ /**
+ * @param string $field
+ * @param mixed $value
+ *
+ * @return Comparison
+ */
+ public function gte($field, $value)
+ {
+ return new Comparison($field, Comparison::GTE, new Value($value));
+ }
+
+ /**
+ * @param string $field
+ * @param mixed $value
+ *
+ * @return Comparison
+ */
+ public function lte($field, $value)
+ {
+ return new Comparison($field, Comparison::LTE, new Value($value));
+ }
+
+ /**
+ * @param string $field
+ * @param mixed $value
+ *
+ * @return Comparison
+ */
+ public function neq($field, $value)
+ {
+ return new Comparison($field, Comparison::NEQ, new Value($value));
+ }
+
+ /**
+ * @param string $field
+ *
+ * @return Comparison
+ */
+ public function isNull($field)
+ {
+ return new Comparison($field, Comparison::EQ, new Value(null));
+ }
+
+ /**
+ * @param string $field
+ * @param mixed $values
+ *
+ * @return Comparison
+ */
+ public function in($field, array $values)
+ {
+ return new Comparison($field, Comparison::IN, new Value($values));
+ }
+
+ /**
+ * @param string $field
+ * @param mixed $values
+ *
+ * @return Comparison
+ */
+ public function notIn($field, array $values)
+ {
+ return new Comparison($field, Comparison::NIN, new Value($values));
+ }
+
+ /**
+ * @param string $field
+ * @param mixed $value
+ *
+ * @return Comparison
+ */
+ public function contains($field, $value)
+ {
+ return new Comparison($field, Comparison::CONTAINS, new Value($value));
+ }
+}
diff --git a/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Selectable.php b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Selectable.php
new file mode 100644
index 0000000000000000000000000000000000000000..57660ed7fcb0a2fc2f5f4380067eda6c5467aa28
--- /dev/null
+++ b/vendor/doctrine/collections/lib/Doctrine/Common/Collections/Selectable.php
@@ -0,0 +1,48 @@
+.
+ */
+
+namespace Doctrine\Common\Collections;
+
+/**
+ * Interface for collections that allow efficient filtering with an expression API.
+ *
+ * Goal of this interface is a backend independent method to fetch elements
+ * from a collections. {@link Expression} is crafted in a way that you can
+ * implement queries from both in-memory and database-backed collections.
+ *
+ * For database backed collections this allows very efficient access by
+ * utilizing the query APIs, for example SQL in the ORM. Applications using
+ * this API can implement efficient database access without having to ask the
+ * EntityManager or Repositories.
+ *
+ * @author Benjamin Eberlei
+ * @since 2.3
+ */
+interface Selectable
+{
+ /**
+ * Selects all elements from a selectable that match the expression and
+ * returns a new collection containing these elements.
+ *
+ * @param Criteria $criteria
+ *
+ * @return Collection
+ */
+ public function matching(Criteria $criteria);
+}
diff --git a/vendor/doctrine/collections/phpunit.xml.dist b/vendor/doctrine/collections/phpunit.xml.dist
new file mode 100644
index 0000000000000000000000000000000000000000..36968e99c30a8d01b2742eb300a20967111d76f7
--- /dev/null
+++ b/vendor/doctrine/collections/phpunit.xml.dist
@@ -0,0 +1,31 @@
+
+
+
+
+
+ ./tests/Doctrine/
+
+
+
+
+
+ ./lib/Doctrine/
+
+
+
+
+
+ performance
+
+
+
diff --git a/vendor/doctrine/common/.gitignore b/vendor/doctrine/common/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b15c686b462d9405a91ec46ead3c058a230e4d68
--- /dev/null
+++ b/vendor/doctrine/common/.gitignore
@@ -0,0 +1,10 @@
+build/
+logs/
+reports/
+dist/
+tests/Doctrine/Tests/Common/Proxy/generated/
+vendor/
+.idea
+composer.lock
+doctrine-common-*.tar
+doctrine-common-*.tar.gz
diff --git a/vendor/doctrine/common/.gitmodules b/vendor/doctrine/common/.gitmodules
new file mode 100644
index 0000000000000000000000000000000000000000..51f0843511c8fc363f83634ff1063d9f969c3e86
--- /dev/null
+++ b/vendor/doctrine/common/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "lib/vendor/doctrine-build-common"]
+ path = lib/vendor/doctrine-build-common
+ url = git://github.com/doctrine/doctrine-build-common.git
diff --git a/vendor/doctrine/common/.travis.yml b/vendor/doctrine/common/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9c20a84b43fb390697b035e2b51fcc063c396eb7
--- /dev/null
+++ b/vendor/doctrine/common/.travis.yml
@@ -0,0 +1,26 @@
+language: php
+
+sudo: false
+
+cache:
+ directory:
+ - $HOME/.composer/cache
+
+php:
+ - 5.3.3
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+
+before_script:
+ - composer --prefer-source install
+
+script:
+ - ./vendor/bin/phpunit
+
+matrix:
+ allow_failures:
+ - php: 7.0
diff --git a/vendor/doctrine/common/LICENSE b/vendor/doctrine/common/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..4a91f0bf2803d308cce8010164548a811127bc27
--- /dev/null
+++ b/vendor/doctrine/common/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2006-2012 Doctrine Project
+
+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/doctrine/common/README.md b/vendor/doctrine/common/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..30a080f722d13406748d1f057c37c82c8d89b60f
--- /dev/null
+++ b/vendor/doctrine/common/README.md
@@ -0,0 +1,12 @@
+# Doctrine Common
+
+[![Build Status](https://secure.travis-ci.org/doctrine/common.png)](http://travis-ci.org/doctrine/common)
+
+The Doctrine Common project is a library that provides extensions to core PHP functionality.
+
+## More resources:
+
+* [Website](http://www.doctrine-project.org)
+* [Documentation](http://docs.doctrine-project.org/projects/doctrine-common/en/latest/)
+* [Issue Tracker](http://www.doctrine-project.org/jira/browse/DCOM)
+* [Downloads](http://github.com/doctrine/common/downloads)
diff --git a/vendor/doctrine/common/UPGRADE_TO_2_1 b/vendor/doctrine/common/UPGRADE_TO_2_1
new file mode 100644
index 0000000000000000000000000000000000000000..891a2e5c2bb46c160429c436def2dfb813ca78c6
--- /dev/null
+++ b/vendor/doctrine/common/UPGRADE_TO_2_1
@@ -0,0 +1,39 @@
+This document details all the possible changes that you should investigate when updating
+your project from Doctrine Common 2.0.x to 2.1
+
+## AnnotationReader changes
+
+The annotation reader was heavily refactored between 2.0 and 2.1-RC1. In theory the operation of the new reader should be backwards compatible, but it has to be setup differently to work that way:
+
+ $reader = new \Doctrine\Common\Annotations\AnnotationReader();
+ $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\');
+ // new code necessary starting here
+ $reader->setIgnoreNotImportedAnnotations(true);
+ $reader->setEnableParsePhpImports(false);
+ $reader = new \Doctrine\Common\Annotations\CachedReader(
+ new \Doctrine\Common\Annotations\IndexedReader($reader), new ArrayCache()
+ );
+
+## Annotation Base class or @Annotation
+
+Beginning after 2.1-RC2 you have to either extend ``Doctrine\Common\Annotations\Annotation`` or add @Annotation to your annotations class-level docblock, otherwise the class will simply be ignored.
+
+## Removed methods on AnnotationReader
+
+* AnnotationReader::setAutoloadAnnotations()
+* AnnotationReader::getAutoloadAnnotations()
+* AnnotationReader::isAutoloadAnnotations()
+
+## AnnotationRegistry
+
+Autoloading through the PHP autoloader is removed from the 2.1 AnnotationReader. Instead you have to use the global AnnotationRegistry for loading purposes:
+
+ \Doctrine\Common\Annotations\AnnotationRegistry::registerFile($fileWithAnnotations);
+ \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespace($namespace, $dirs = null);
+ \Doctrine\Common\Annotations\AnnotationRegistry::registerAutoloadNamespaces($namespaces);
+ \Doctrine\Common\Annotations\AnnotationRegistry::registerLoader($callable);
+
+The $callable for registering a loader accepts a class as first and only parameter and must try to silently autoload it. On success true has to be returned.
+The registerAutoloadNamespace function registers a PSR-0 compatible silent autoloader for all classes with the given namespace in the given directories.
+If null is passed as directory the include path will be used.
+
diff --git a/vendor/doctrine/common/UPGRADE_TO_2_2 b/vendor/doctrine/common/UPGRADE_TO_2_2
new file mode 100644
index 0000000000000000000000000000000000000000..1d93a131ed192a113c8b7436210bd1c02794486b
--- /dev/null
+++ b/vendor/doctrine/common/UPGRADE_TO_2_2
@@ -0,0 +1,61 @@
+This document details all the possible changes that you should investigate when
+updating your project from Doctrine Common 2.1 to 2.2:
+
+## Annotation Changes
+
+- AnnotationReader::setIgnoreNotImportedAnnotations has been removed, you need to
+ add ignore annotation names which are supposed to be ignored via
+ AnnotationReader::addGlobalIgnoredName
+
+- AnnotationReader::setAutoloadAnnotations was deprecated by the AnnotationRegistry
+ in 2.1 and has been removed in 2.2
+
+- AnnotationReader::setEnableParsePhpImports was added to ease transition to the new
+ annotation mechanism in 2.1 and is removed in 2.2
+
+- AnnotationReader::isParsePhpImportsEnabled is removed (see above)
+
+- AnnotationReader::setDefaultAnnotationNamespace was deprecated in favor of explicit
+ configuration in 2.1 and will be removed in 2.2 (for isolated projects where you
+ have full-control over _all_ available annotations, we offer a dedicated reader
+ class ``SimpleAnnotationReader``)
+
+- AnnotationReader::setAnnotationCreationFunction was deprecated in 2.1 and will be
+ removed in 2.2. We only offer two creation mechanisms which cannot be changed
+ anymore to allow the same reader instance to work with all annotations regardless
+ of which library they are coming from.
+
+- AnnotationReader::setAnnotationNamespaceAlias was deprecated in 2.1 and will be
+ removed in 2.2 (see setDefaultAnnotationNamespace)
+
+- If you use a class as annotation which has not the @Annotation marker in it's
+ class block, we will now throw an exception instead of silently ignoring it. You
+ can however still achieve the previous behavior using the @IgnoreAnnotation, or
+ AnnotationReader::addGlobalIgnoredName (the exception message will contain detailed
+ instructions when you run into this problem).
+
+## Cache Changes
+
+- Renamed old AbstractCache to CacheProvider
+
+- Dropped the support to the following functions of all cache providers:
+
+ - CacheProvider::deleteByWildcard
+
+ - CacheProvider::deleteByRegEx
+
+ - CacheProvider::deleteByPrefix
+
+ - CacheProvider::deleteBySuffix
+
+- CacheProvider::deleteAll will not remove ALL entries, it will only mark them as invalid
+
+- CacheProvider::flushAll will remove ALL entries, namespaced or not
+
+- Added support to MemcachedCache
+
+- Added support to WincacheCache
+
+## ClassLoader Changes
+
+- ClassLoader::fileExistsInIncludePath() no longer exists. Use the native stream_resolve_include_path() PHP function
\ No newline at end of file
diff --git a/vendor/doctrine/common/build.properties b/vendor/doctrine/common/build.properties
new file mode 100644
index 0000000000000000000000000000000000000000..ef51d207f65448cc27f5511a19525b834dccfebb
--- /dev/null
+++ b/vendor/doctrine/common/build.properties
@@ -0,0 +1,3 @@
+# Version class and file
+project.version_class = Doctrine\\Common\\Version
+project.version_file = lib/Doctrine/Common/Version.php
diff --git a/vendor/doctrine/common/build.xml b/vendor/doctrine/common/build.xml
new file mode 100644
index 0000000000000000000000000000000000000000..429b7688fe307747806460497dfa75426df3dff0
--- /dev/null
+++ b/vendor/doctrine/common/build.xml
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/vendor/doctrine/common/composer.json b/vendor/doctrine/common/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..be42e7fed958076ce02bd9ba3037712895e2121a
--- /dev/null
+++ b/vendor/doctrine/common/composer.json
@@ -0,0 +1,38 @@
+{
+ "name": "doctrine/common",
+ "type": "library",
+ "description": "Common Library for Doctrine projects",
+ "keywords": ["collections", "spl", "eventmanager", "annotations", "persistence"],
+ "homepage": "http://www.doctrine-project.org",
+ "license": "MIT",
+ "authors": [
+ {"name": "Guilherme Blanco", "email": "guilhermeblanco@gmail.com"},
+ {"name": "Roman Borschel", "email": "roman@code-factory.org"},
+ {"name": "Benjamin Eberlei", "email": "kontakt@beberlei.de"},
+ {"name": "Jonathan Wage", "email": "jonwage@gmail.com"},
+ {"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
+ ],
+ "require": {
+ "php": ">=5.3.2",
+ "doctrine/inflector": "1.*",
+ "doctrine/cache": "1.*",
+ "doctrine/collections": "1.*",
+ "doctrine/lexer": "1.*",
+ "doctrine/annotations": "1.*"
+ },
+ "minimum-stability": "dev",
+ "require-dev": {
+ "phpunit/phpunit": "~3.7"
+ },
+ "autoload": {
+ "psr-0": { "Doctrine\\Common\\": "lib/" }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.6.x-dev"
+ }
+ },
+ "archive": {
+ "exclude": ["!vendor", "tests", "*phpunit.xml", ".travis.yml", "build.xml", "build.properties", "composer.phar"]
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php
new file mode 100644
index 0000000000000000000000000000000000000000..d65b9a631fa946f66efc362f2de2759c9d529913
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php
@@ -0,0 +1,280 @@
+.
+ */
+
+namespace Doctrine\Common;
+
+/**
+ * A ClassLoader is an autoloader for class files that can be
+ * installed on the SPL autoload stack. It is a class loader that either loads only classes
+ * of a specific namespace or all namespaces and it is suitable for working together
+ * with other autoloaders in the SPL autoload stack.
+ *
+ * If no include path is configured through the constructor or {@link setIncludePath}, a ClassLoader
+ * relies on the PHP include_path
.
+ *
+ * @author Roman Borschel
+ * @since 2.0
+ *
+ * @deprecated the ClassLoader is deprecated and will be removed in version 3.0 of doctrine/common.
+ */
+class ClassLoader
+{
+ /**
+ * PHP file extension.
+ *
+ * @var string
+ */
+ protected $fileExtension = '.php';
+
+ /**
+ * Current namespace.
+ *
+ * @var string|null
+ */
+ protected $namespace;
+
+ /**
+ * Current include path.
+ *
+ * @var string|null
+ */
+ protected $includePath;
+
+ /**
+ * PHP namespace separator.
+ *
+ * @var string
+ */
+ protected $namespaceSeparator = '\\';
+
+ /**
+ * Creates a new ClassLoader that loads classes of the
+ * specified namespace from the specified include path.
+ *
+ * If no include path is given, the ClassLoader relies on the PHP include_path.
+ * If neither a namespace nor an include path is given, the ClassLoader will
+ * be responsible for loading all classes, thereby relying on the PHP include_path.
+ *
+ * @param string|null $ns The namespace of the classes to load.
+ * @param string|null $includePath The base include path to use.
+ */
+ public function __construct($ns = null, $includePath = null)
+ {
+ $this->namespace = $ns;
+ $this->includePath = $includePath;
+ }
+
+ /**
+ * Sets the namespace separator used by classes in the namespace of this ClassLoader.
+ *
+ * @param string $sep The separator to use.
+ *
+ * @return void
+ */
+ public function setNamespaceSeparator($sep)
+ {
+ $this->namespaceSeparator = $sep;
+ }
+
+ /**
+ * Gets the namespace separator used by classes in the namespace of this ClassLoader.
+ *
+ * @return string
+ */
+ public function getNamespaceSeparator()
+ {
+ return $this->namespaceSeparator;
+ }
+
+ /**
+ * Sets the base include path for all class files in the namespace of this ClassLoader.
+ *
+ * @param string|null $includePath
+ *
+ * @return void
+ */
+ public function setIncludePath($includePath)
+ {
+ $this->includePath = $includePath;
+ }
+
+ /**
+ * Gets the base include path for all class files in the namespace of this ClassLoader.
+ *
+ * @return string|null
+ */
+ public function getIncludePath()
+ {
+ return $this->includePath;
+ }
+
+ /**
+ * Sets the file extension of class files in the namespace of this ClassLoader.
+ *
+ * @param string $fileExtension
+ *
+ * @return void
+ */
+ public function setFileExtension($fileExtension)
+ {
+ $this->fileExtension = $fileExtension;
+ }
+
+ /**
+ * Gets the file extension of class files in the namespace of this ClassLoader.
+ *
+ * @return string
+ */
+ public function getFileExtension()
+ {
+ return $this->fileExtension;
+ }
+
+ /**
+ * Registers this ClassLoader on the SPL autoload stack.
+ *
+ * @return void
+ */
+ public function register()
+ {
+ spl_autoload_register(array($this, 'loadClass'));
+ }
+
+ /**
+ * Removes this ClassLoader from the SPL autoload stack.
+ *
+ * @return void
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $className The name of the class to load.
+ *
+ * @return boolean TRUE if the class has been successfully loaded, FALSE otherwise.
+ */
+ public function loadClass($className)
+ {
+ if (self::typeExists($className)) {
+ return true;
+ }
+
+ if (! $this->canLoadClass($className)) {
+ return false;
+ }
+
+ require ($this->includePath !== null ? $this->includePath . DIRECTORY_SEPARATOR : '')
+ . str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className)
+ . $this->fileExtension;
+
+ return self::typeExists($className);
+ }
+
+ /**
+ * Asks this ClassLoader whether it can potentially load the class (file) with
+ * the given name.
+ *
+ * @param string $className The fully-qualified name of the class.
+ *
+ * @return boolean TRUE if this ClassLoader can load the class, FALSE otherwise.
+ */
+ public function canLoadClass($className)
+ {
+ if ($this->namespace !== null && strpos($className, $this->namespace.$this->namespaceSeparator) !== 0) {
+ return false;
+ }
+
+ $file = str_replace($this->namespaceSeparator, DIRECTORY_SEPARATOR, $className) . $this->fileExtension;
+
+ if ($this->includePath !== null) {
+ return is_file($this->includePath . DIRECTORY_SEPARATOR . $file);
+ }
+
+ return (false !== stream_resolve_include_path($file));
+ }
+
+ /**
+ * Checks whether a class with a given name exists. A class "exists" if it is either
+ * already defined in the current request or if there is an autoloader on the SPL
+ * autoload stack that is a) responsible for the class in question and b) is able to
+ * load a class file in which the class definition resides.
+ *
+ * If the class is not already defined, each autoloader in the SPL autoload stack
+ * is asked whether it is able to tell if the class exists. If the autoloader is
+ * a ClassLoader , {@link canLoadClass} is used, otherwise the autoload
+ * function of the autoloader is invoked and expected to return a value that
+ * evaluates to TRUE if the class (file) exists. As soon as one autoloader reports
+ * that the class exists, TRUE is returned.
+ *
+ * Note that, depending on what kinds of autoloaders are installed on the SPL
+ * autoload stack, the class (file) might already be loaded as a result of checking
+ * for its existence. This is not the case with a ClassLoader , who separates
+ * these responsibilities.
+ *
+ * @param string $className The fully-qualified name of the class.
+ *
+ * @return boolean TRUE if the class exists as per the definition given above, FALSE otherwise.
+ */
+ public static function classExists($className)
+ {
+ return self::typeExists($className, true);
+ }
+
+ /**
+ * Gets the ClassLoader from the SPL autoload stack that is responsible
+ * for (and is able to load) the class with the given name.
+ *
+ * @param string $className The name of the class.
+ *
+ * @return ClassLoader The ClassLoader for the class or NULL if no such ClassLoader exists.
+ */
+ public static function getClassLoader($className)
+ {
+ foreach (spl_autoload_functions() as $loader) {
+ if (is_array($loader)
+ && ($classLoader = reset($loader))
+ && $classLoader instanceof ClassLoader
+ && $classLoader->canLoadClass($className)
+ ) {
+ return $classLoader;
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * Checks whether a given type exists
+ *
+ * @param string $type
+ * @param bool $autoload
+ *
+ * @return bool
+ */
+ private static function typeExists($type, $autoload = false)
+ {
+ return class_exists($type, $autoload)
+ || interface_exists($type, $autoload)
+ || (function_exists('trait_exists') && trait_exists($type, $autoload));
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php
new file mode 100644
index 0000000000000000000000000000000000000000..2a1a08e7ef588b9fbc3a65c1b1b5569d0a421d71
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/CommonException.php
@@ -0,0 +1,29 @@
+.
+ */
+
+namespace Doctrine\Common;
+
+/**
+ * Base exception class for package Doctrine\Common.
+ *
+ * @author heinrich
+ */
+class CommonException extends \Exception
+{
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php
new file mode 100644
index 0000000000000000000000000000000000000000..8cd02c9f2936d3f2a40734eefdde760cec7bdb1e
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Comparable.php
@@ -0,0 +1,46 @@
+.
+ */
+
+namespace Doctrine\Common;
+
+/**
+ * Comparable interface that allows to compare two value objects to each other for similarity.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ */
+interface Comparable
+{
+ /**
+ * Compares the current object to the passed $other.
+ *
+ * Returns 0 if they are semantically equal, 1 if the other object
+ * is less than the current one, or -1 if its more than the current one.
+ *
+ * This method should not check for identity using ===, only for semantical equality for example
+ * when two different DateTime instances point to the exact same Date + TZ.
+ *
+ * @param mixed $other
+ *
+ * @return int
+ */
+ public function compareTo($other);
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php
new file mode 100644
index 0000000000000000000000000000000000000000..75506e6acff591beb8feea3f620b33784d8290e6
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/EventArgs.php
@@ -0,0 +1,67 @@
+.
+ */
+
+namespace Doctrine\Common;
+
+/**
+ * EventArgs is the base class for classes containing event data.
+ *
+ * This class contains no event data. It is used by events that do not pass state
+ * information to an event handler when an event is raised. The single empty EventArgs
+ * instance can be obtained through {@link getEmptyInstance}.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+class EventArgs
+{
+ /**
+ * Single instance of EventArgs.
+ *
+ * @var EventArgs
+ */
+ private static $_emptyEventArgsInstance;
+
+ /**
+ * Gets the single, empty and immutable EventArgs instance.
+ *
+ * This instance will be used when events are dispatched without any parameter,
+ * like this: EventManager::dispatchEvent('eventname');
+ *
+ * The benefit from this is that only one empty instance is instantiated and shared
+ * (otherwise there would be instances for every dispatched in the abovementioned form).
+ *
+ * @see EventManager::dispatchEvent
+ *
+ * @link http://msdn.microsoft.com/en-us/library/system.eventargs.aspx
+ *
+ * @return EventArgs
+ */
+ public static function getEmptyInstance()
+ {
+ if ( ! self::$_emptyEventArgsInstance) {
+ self::$_emptyEventArgsInstance = new EventArgs;
+ }
+
+ return self::$_emptyEventArgsInstance;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..69eb17ec693ff00b89c583405b73aef128a0da5d
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/EventManager.php
@@ -0,0 +1,154 @@
+.
+ */
+
+namespace Doctrine\Common;
+
+/**
+ * The EventManager is the central point of Doctrine's event listener system.
+ * Listeners are registered on the manager and events are dispatched through the
+ * manager.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+class EventManager
+{
+ /**
+ * Map of registered listeners.
+ * =>
+ *
+ * @var array
+ */
+ private $_listeners = array();
+
+ /**
+ * Dispatches an event to all registered listeners.
+ *
+ * @param string $eventName The name of the event to dispatch. The name of the event is
+ * the name of the method that is invoked on listeners.
+ * @param EventArgs|null $eventArgs The event arguments to pass to the event handlers/listeners.
+ * If not supplied, the single empty EventArgs instance is used.
+ *
+ * @return boolean
+ */
+ public function dispatchEvent($eventName, EventArgs $eventArgs = null)
+ {
+ if (isset($this->_listeners[$eventName])) {
+ $eventArgs = $eventArgs === null ? EventArgs::getEmptyInstance() : $eventArgs;
+
+ foreach ($this->_listeners[$eventName] as $listener) {
+ $listener->$eventName($eventArgs);
+ }
+ }
+ }
+
+ /**
+ * Gets the listeners of a specific event or all listeners.
+ *
+ * @param string|null $event The name of the event.
+ *
+ * @return array The event listeners for the specified event, or all event listeners.
+ */
+ public function getListeners($event = null)
+ {
+ return $event ? $this->_listeners[$event] : $this->_listeners;
+ }
+
+ /**
+ * Checks whether an event has any registered listeners.
+ *
+ * @param string $event
+ *
+ * @return boolean TRUE if the specified event has any listeners, FALSE otherwise.
+ */
+ public function hasListeners($event)
+ {
+ return isset($this->_listeners[$event]) && $this->_listeners[$event];
+ }
+
+ /**
+ * Adds an event listener that listens on the specified events.
+ *
+ * @param string|array $events The event(s) to listen on.
+ * @param object $listener The listener object.
+ *
+ * @return void
+ */
+ public function addEventListener($events, $listener)
+ {
+ // Picks the hash code related to that listener
+ $hash = spl_object_hash($listener);
+
+ foreach ((array) $events as $event) {
+ // Overrides listener if a previous one was associated already
+ // Prevents duplicate listeners on same event (same instance only)
+ $this->_listeners[$event][$hash] = $listener;
+ }
+ }
+
+ /**
+ * Removes an event listener from the specified events.
+ *
+ * @param string|array $events
+ * @param object $listener
+ *
+ * @return void
+ */
+ public function removeEventListener($events, $listener)
+ {
+ // Picks the hash code related to that listener
+ $hash = spl_object_hash($listener);
+
+ foreach ((array) $events as $event) {
+ // Check if actually have this listener associated
+ if (isset($this->_listeners[$event][$hash])) {
+ unset($this->_listeners[$event][$hash]);
+ }
+ }
+ }
+
+ /**
+ * Adds an EventSubscriber. The subscriber is asked for all the events it is
+ * interested in and added as a listener for these events.
+ *
+ * @param \Doctrine\Common\EventSubscriber $subscriber The subscriber.
+ *
+ * @return void
+ */
+ public function addEventSubscriber(EventSubscriber $subscriber)
+ {
+ $this->addEventListener($subscriber->getSubscribedEvents(), $subscriber);
+ }
+
+ /**
+ * Removes an EventSubscriber. The subscriber is asked for all the events it is
+ * interested in and removed as a listener for these events.
+ *
+ * @param \Doctrine\Common\EventSubscriber $subscriber The subscriber.
+ *
+ * @return void
+ */
+ public function removeEventSubscriber(EventSubscriber $subscriber)
+ {
+ $this->removeEventListener($subscriber->getSubscribedEvents(), $subscriber);
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php
new file mode 100644
index 0000000000000000000000000000000000000000..55d0f7d0ef393c90d63c7100be9704dd2374ac69
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/EventSubscriber.php
@@ -0,0 +1,42 @@
+.
+ */
+
+namespace Doctrine\Common;
+
+/**
+ * An EventSubscriber knows himself what events he is interested in.
+ * If an EventSubscriber is added to an EventManager, the manager invokes
+ * {@link getSubscribedEvents} and registers the subscriber as a listener for all
+ * returned events.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+interface EventSubscriber
+{
+ /**
+ * Returns an array of events this subscriber wants to listen to.
+ *
+ * @return array
+ */
+ public function getSubscribedEvents();
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php
new file mode 100644
index 0000000000000000000000000000000000000000..0aa07f85641420b6b4c05e32baf84dd7175901b8
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Lexer.php
@@ -0,0 +1,37 @@
+.
+ */
+
+namespace Doctrine\Common;
+
+use Doctrine\Common\Lexer\AbstractLexer;
+
+/**
+ * Base class for writing simple lexers, i.e. for creating small DSLs.
+ *
+ * Lexer moved into its own Component Doctrine\Common\Lexer. This class
+ * only stays for being BC.
+ *
+ * @since 2.0
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+abstract class Lexer extends AbstractLexer
+{
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php
new file mode 100644
index 0000000000000000000000000000000000000000..e25e99970813bd6e86306a462091ff4df5234501
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/NotifyPropertyChanged.php
@@ -0,0 +1,42 @@
+.
+ */
+
+namespace Doctrine\Common;
+
+/**
+ * Contract for classes that provide the service of notifying listeners of
+ * changes to their properties.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+interface NotifyPropertyChanged
+{
+ /**
+ * Adds a listener that wants to be notified about property changes.
+ *
+ * @param PropertyChangedListener $listener
+ *
+ * @return void
+ */
+ public function addPropertyChangedListener(PropertyChangedListener $listener);
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php
new file mode 100644
index 0000000000000000000000000000000000000000..33770f9010e7a1d07c691b4a1b398c5207342171
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php
@@ -0,0 +1,257 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence;
+
+/**
+ * Abstract implementation of the ManagerRegistry contract.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Fabien Potencier
+ * @author Benjamin Eberlei
+ * @author Lukas Kahwe Smith
+ */
+abstract class AbstractManagerRegistry implements ManagerRegistry
+{
+ /**
+ * @var string
+ */
+ private $name;
+
+ /**
+ * @var array
+ */
+ private $connections;
+
+ /**
+ * @var array
+ */
+ private $managers;
+
+ /**
+ * @var string
+ */
+ private $defaultConnection;
+
+ /**
+ * @var string
+ */
+ private $defaultManager;
+
+ /**
+ * @var string
+ */
+ private $proxyInterfaceName;
+
+ /**
+ * Constructor.
+ *
+ * @param string $name
+ * @param array $connections
+ * @param array $managers
+ * @param string $defaultConnection
+ * @param string $defaultManager
+ * @param string $proxyInterfaceName
+ */
+ public function __construct($name, array $connections, array $managers, $defaultConnection, $defaultManager, $proxyInterfaceName)
+ {
+ $this->name = $name;
+ $this->connections = $connections;
+ $this->managers = $managers;
+ $this->defaultConnection = $defaultConnection;
+ $this->defaultManager = $defaultManager;
+ $this->proxyInterfaceName = $proxyInterfaceName;
+ }
+
+ /**
+ * Fetches/creates the given services.
+ *
+ * A service in this context is connection or a manager instance.
+ *
+ * @param string $name The name of the service.
+ *
+ * @return object The instance of the given service.
+ */
+ abstract protected function getService($name);
+
+ /**
+ * Resets the given services.
+ *
+ * A service in this context is connection or a manager instance.
+ *
+ * @param string $name The name of the service.
+ *
+ * @return void
+ */
+ abstract protected function resetService($name);
+
+ /**
+ * Gets the name of the registry.
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getConnection($name = null)
+ {
+ if (null === $name) {
+ $name = $this->defaultConnection;
+ }
+
+ if (!isset($this->connections[$name])) {
+ throw new \InvalidArgumentException(sprintf('Doctrine %s Connection named "%s" does not exist.', $this->name, $name));
+ }
+
+ return $this->getService($this->connections[$name]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getConnectionNames()
+ {
+ return $this->connections;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getConnections()
+ {
+ $connections = array();
+ foreach ($this->connections as $name => $id) {
+ $connections[$name] = $this->getService($id);
+ }
+
+ return $connections;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDefaultConnectionName()
+ {
+ return $this->defaultConnection;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getDefaultManagerName()
+ {
+ return $this->defaultManager;
+ }
+
+ /**
+ * {@inheritdoc}
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function getManager($name = null)
+ {
+ if (null === $name) {
+ $name = $this->defaultManager;
+ }
+
+ if (!isset($this->managers[$name])) {
+ throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name));
+ }
+
+ return $this->getService($this->managers[$name]);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getManagerForClass($class)
+ {
+ // Check for namespace alias
+ if (strpos($class, ':') !== false) {
+ list($namespaceAlias, $simpleClassName) = explode(':', $class, 2);
+ $class = $this->getAliasNamespace($namespaceAlias) . '\\' . $simpleClassName;
+ }
+
+ $proxyClass = new \ReflectionClass($class);
+ if ($proxyClass->implementsInterface($this->proxyInterfaceName)) {
+ $class = $proxyClass->getParentClass()->getName();
+ }
+
+ foreach ($this->managers as $id) {
+ $manager = $this->getService($id);
+
+ if (!$manager->getMetadataFactory()->isTransient($class)) {
+ return $manager;
+ }
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getManagerNames()
+ {
+ return $this->managers;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getManagers()
+ {
+ $dms = array();
+ foreach ($this->managers as $name => $id) {
+ $dms[$name] = $this->getService($id);
+ }
+
+ return $dms;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getRepository($persistentObjectName, $persistentManagerName = null)
+ {
+ return $this->getManager($persistentManagerName)->getRepository($persistentObjectName);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function resetManager($name = null)
+ {
+ if (null === $name) {
+ $name = $this->defaultManager;
+ }
+
+ if (!isset($this->managers[$name])) {
+ throw new \InvalidArgumentException(sprintf('Doctrine %s Manager named "%s" does not exist.', $this->name, $name));
+ }
+
+ // force the creation of a new document manager
+ // if the current one is closed
+ $this->resetService($this->managers[$name]);
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php
new file mode 100644
index 0000000000000000000000000000000000000000..7c25e98aad050be5bd446bdacbeab57bcbb82c89
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ConnectionRegistry.php
@@ -0,0 +1,62 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence;
+
+/**
+ * Contract covering connection for a Doctrine persistence layer ManagerRegistry class to implement.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Fabien Potencier
+ * @author Benjamin Eberlei
+ * @author Lukas Kahwe Smith
+ */
+interface ConnectionRegistry
+{
+ /**
+ * Gets the default connection name.
+ *
+ * @return string The default connection name.
+ */
+ public function getDefaultConnectionName();
+
+ /**
+ * Gets the named connection.
+ *
+ * @param string $name The connection name (null for the default one).
+ *
+ * @return object
+ */
+ public function getConnection($name = null);
+
+ /**
+ * Gets an array of all registered connections.
+ *
+ * @return array An array of Connection instances.
+ */
+ public function getConnections();
+
+ /**
+ * Gets all connection names.
+ *
+ * @return array An array of connection names.
+ */
+ public function getConnectionNames();
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php
new file mode 100644
index 0000000000000000000000000000000000000000..52f41c0e7518ea207059afa93b45bcfff99c360a
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LifecycleEventArgs.php
@@ -0,0 +1,89 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Event;
+
+use Doctrine\Common\EventArgs;
+use Doctrine\Common\Persistence\ObjectManager;
+
+/**
+ * Lifecycle Events are triggered by the UnitOfWork during lifecycle transitions
+ * of entities.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Roman Borschel
+ * @author Benjamin Eberlei
+ */
+class LifecycleEventArgs extends EventArgs
+{
+ /**
+ * @var ObjectManager
+ */
+ private $objectManager;
+
+ /**
+ * @var object
+ */
+ private $object;
+
+ /**
+ * Constructor.
+ *
+ * @param object $object
+ * @param ObjectManager $objectManager
+ */
+ public function __construct($object, ObjectManager $objectManager)
+ {
+ $this->object = $object;
+ $this->objectManager = $objectManager;
+ }
+
+ /**
+ * Retrieves the associated entity.
+ *
+ * @deprecated
+ *
+ * @return object
+ */
+ public function getEntity()
+ {
+ return $this->object;
+ }
+
+ /**
+ * Retrieves the associated object.
+ *
+ * @return object
+ */
+ public function getObject()
+ {
+ return $this->object;
+ }
+
+ /**
+ * Retrieves the associated ObjectManager.
+ *
+ * @return ObjectManager
+ */
+ public function getObjectManager()
+ {
+ return $this->objectManager;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php
new file mode 100644
index 0000000000000000000000000000000000000000..3d8abbe23837748585771587255b25d63de9b666
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/LoadClassMetadataEventArgs.php
@@ -0,0 +1,75 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Event;
+
+use Doctrine\Common\EventArgs;
+use Doctrine\Common\Persistence\Mapping\ClassMetadata;
+use Doctrine\Common\Persistence\ObjectManager;
+
+/**
+ * Class that holds event arguments for a loadMetadata event.
+ *
+ * @author Jonathan H. Wage
+ * @since 2.2
+ */
+class LoadClassMetadataEventArgs extends EventArgs
+{
+ /**
+ * @var ClassMetadata
+ */
+ private $classMetadata;
+
+ /**
+ * @var ObjectManager
+ */
+ private $objectManager;
+
+ /**
+ * Constructor.
+ *
+ * @param ClassMetadata $classMetadata
+ * @param ObjectManager $objectManager
+ */
+ public function __construct(ClassMetadata $classMetadata, ObjectManager $objectManager)
+ {
+ $this->classMetadata = $classMetadata;
+ $this->objectManager = $objectManager;
+ }
+
+ /**
+ * Retrieves the associated ClassMetadata.
+ *
+ * @return ClassMetadata
+ */
+ public function getClassMetadata()
+ {
+ return $this->classMetadata;
+ }
+
+ /**
+ * Retrieves the associated ObjectManager.
+ *
+ * @return ObjectManager
+ */
+ public function getObjectManager()
+ {
+ return $this->objectManager;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php
new file mode 100644
index 0000000000000000000000000000000000000000..5527d4d47b8749d25b14d038fffad17ae40b66c8
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/ManagerEventArgs.php
@@ -0,0 +1,59 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Event;
+
+use Doctrine\Common\EventArgs;
+use Doctrine\Common\Persistence\ObjectManager;
+
+/**
+ * Provides event arguments for the preFlush event.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Roman Borschel
+ * @author Benjamin Eberlei
+ */
+class ManagerEventArgs extends EventArgs
+{
+ /**
+ * @var ObjectManager
+ */
+ private $objectManager;
+
+ /**
+ * Constructor.
+ *
+ * @param ObjectManager $objectManager
+ */
+ public function __construct(ObjectManager $objectManager)
+ {
+ $this->objectManager = $objectManager;
+ }
+
+ /**
+ * Retrieves the associated ObjectManager.
+ *
+ * @return ObjectManager
+ */
+ public function getObjectManager()
+ {
+ return $this->objectManager;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php
new file mode 100644
index 0000000000000000000000000000000000000000..b78bad99207ae2b8713efbb106f28cb1f2ae1cbf
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/OnClearEventArgs.php
@@ -0,0 +1,86 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Event;
+
+use Doctrine\Common\EventArgs;
+use Doctrine\Common\Persistence\ObjectManager;
+
+/**
+ * Provides event arguments for the onClear event.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Roman Borschel
+ * @author Benjamin Eberlei
+ */
+class OnClearEventArgs extends EventArgs
+{
+ /**
+ * @var \Doctrine\Common\Persistence\ObjectManager
+ */
+ private $objectManager;
+
+ /**
+ * @var string|null
+ */
+ private $entityClass;
+
+ /**
+ * Constructor.
+ *
+ * @param ObjectManager $objectManager The object manager.
+ * @param string|null $entityClass The optional entity class.
+ */
+ public function __construct($objectManager, $entityClass = null)
+ {
+ $this->objectManager = $objectManager;
+ $this->entityClass = $entityClass;
+ }
+
+ /**
+ * Retrieves the associated ObjectManager.
+ *
+ * @return \Doctrine\Common\Persistence\ObjectManager
+ */
+ public function getObjectManager()
+ {
+ return $this->objectManager;
+ }
+
+ /**
+ * Returns the name of the entity class that is cleared, or null if all are cleared.
+ *
+ * @return string|null
+ */
+ public function getEntityClass()
+ {
+ return $this->entityClass;
+ }
+
+ /**
+ * Returns whether this event clears all entities.
+ *
+ * @return bool
+ */
+ public function clearsAllEntities()
+ {
+ return ($this->entityClass === null);
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php
new file mode 100644
index 0000000000000000000000000000000000000000..facce64710d59aafc21d0c89ccd86a3ba277a27b
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Event/PreUpdateEventArgs.php
@@ -0,0 +1,137 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Event;
+
+use Doctrine\Common\Persistence\ObjectManager;
+
+/**
+ * Class that holds event arguments for a preUpdate event.
+ *
+ * @author Guilherme Blanco
+ * @author Roman Borschel
+ * @author Benjamin Eberlei
+ * @since 2.2
+ */
+class PreUpdateEventArgs extends LifecycleEventArgs
+{
+ /**
+ * @var array
+ */
+ private $entityChangeSet;
+
+ /**
+ * Constructor.
+ *
+ * @param object $entity
+ * @param ObjectManager $objectManager
+ * @param array $changeSet
+ */
+ public function __construct($entity, ObjectManager $objectManager, array &$changeSet)
+ {
+ parent::__construct($entity, $objectManager);
+
+ $this->entityChangeSet = &$changeSet;
+ }
+
+ /**
+ * Retrieves the entity changeset.
+ *
+ * @return array
+ */
+ public function getEntityChangeSet()
+ {
+ return $this->entityChangeSet;
+ }
+
+ /**
+ * Checks if field has a changeset.
+ *
+ * @param string $field
+ *
+ * @return boolean
+ */
+ public function hasChangedField($field)
+ {
+ return isset($this->entityChangeSet[$field]);
+ }
+
+ /**
+ * Gets the old value of the changeset of the changed field.
+ *
+ * @param string $field
+ *
+ * @return mixed
+ */
+ public function getOldValue($field)
+ {
+ $this->assertValidField($field);
+
+ return $this->entityChangeSet[$field][0];
+ }
+
+ /**
+ * Gets the new value of the changeset of the changed field.
+ *
+ * @param string $field
+ *
+ * @return mixed
+ */
+ public function getNewValue($field)
+ {
+ $this->assertValidField($field);
+
+ return $this->entityChangeSet[$field][1];
+ }
+
+ /**
+ * Sets the new value of this field.
+ *
+ * @param string $field
+ * @param mixed $value
+ *
+ * @return void
+ */
+ public function setNewValue($field, $value)
+ {
+ $this->assertValidField($field);
+
+ $this->entityChangeSet[$field][1] = $value;
+ }
+
+ /**
+ * Asserts the field exists in changeset.
+ *
+ * @param string $field
+ *
+ * @return void
+ *
+ * @throws \InvalidArgumentException
+ */
+ private function assertValidField($field)
+ {
+ if ( ! isset($this->entityChangeSet[$field])) {
+ throw new \InvalidArgumentException(sprintf(
+ 'Field "%s" is not a valid field of the entity "%s" in PreUpdateEventArgs.',
+ $field,
+ get_class($this->getEntity())
+ ));
+ }
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php
new file mode 100644
index 0000000000000000000000000000000000000000..fce854b62c9a6f697fe4bf4449b70378ec3a3c3a
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ManagerRegistry.php
@@ -0,0 +1,111 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence;
+
+/**
+ * Contract covering object managers for a Doctrine persistence layer ManagerRegistry class to implement.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Fabien Potencier
+ * @author Benjamin Eberlei
+ * @author Lukas Kahwe Smith
+ */
+interface ManagerRegistry extends ConnectionRegistry
+{
+ /**
+ * Gets the default object manager name.
+ *
+ * @return string The default object manager name.
+ */
+ public function getDefaultManagerName();
+
+ /**
+ * Gets a named object manager.
+ *
+ * @param string $name The object manager name (null for the default one).
+ *
+ * @return \Doctrine\Common\Persistence\ObjectManager
+ */
+ public function getManager($name = null);
+
+ /**
+ * Gets an array of all registered object managers.
+ *
+ * @return \Doctrine\Common\Persistence\ObjectManager[] An array of ObjectManager instances
+ */
+ public function getManagers();
+
+ /**
+ * Resets a named object manager.
+ *
+ * This method is useful when an object manager has been closed
+ * because of a rollbacked transaction AND when you think that
+ * it makes sense to get a new one to replace the closed one.
+ *
+ * Be warned that you will get a brand new object manager as
+ * the existing one is not useable anymore. This means that any
+ * other object with a dependency on this object manager will
+ * hold an obsolete reference. You can inject the registry instead
+ * to avoid this problem.
+ *
+ * @param string|null $name The object manager name (null for the default one).
+ *
+ * @return \Doctrine\Common\Persistence\ObjectManager
+ */
+ public function resetManager($name = null);
+
+ /**
+ * Resolves a registered namespace alias to the full namespace.
+ *
+ * This method looks for the alias in all registered object managers.
+ *
+ * @param string $alias The alias.
+ *
+ * @return string The full namespace.
+ */
+ public function getAliasNamespace($alias);
+
+ /**
+ * Gets all connection names.
+ *
+ * @return array An array of connection names.
+ */
+ public function getManagerNames();
+
+ /**
+ * Gets the ObjectRepository for an persistent object.
+ *
+ * @param string $persistentObject The name of the persistent object.
+ * @param string $persistentManagerName The object manager name (null for the default one).
+ *
+ * @return \Doctrine\Common\Persistence\ObjectRepository
+ */
+ public function getRepository($persistentObject, $persistentManagerName = null);
+
+ /**
+ * Gets the object manager associated with a given class.
+ *
+ * @param string $class A persistent object class name.
+ *
+ * @return \Doctrine\Common\Persistence\ObjectManager|null
+ */
+ public function getManagerForClass($class);
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..404fea91a30b25569ca33b415126f2714df2a54e
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php
@@ -0,0 +1,429 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping;
+
+use Doctrine\Common\Cache\Cache;
+use Doctrine\Common\Util\ClassUtils;
+use ReflectionException;
+
+/**
+ * The ClassMetadataFactory is used to create ClassMetadata objects that contain all the
+ * metadata mapping informations of a class which describes how a class should be mapped
+ * to a relational database.
+ *
+ * This class was abstracted from the ORM ClassMetadataFactory.
+ *
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan Wage
+ * @author Roman Borschel
+ */
+abstract class AbstractClassMetadataFactory implements ClassMetadataFactory
+{
+ /**
+ * Salt used by specific Object Manager implementation.
+ *
+ * @var string
+ */
+ protected $cacheSalt = '$CLASSMETADATA';
+
+ /**
+ * @var \Doctrine\Common\Cache\Cache|null
+ */
+ private $cacheDriver;
+
+ /**
+ * @var ClassMetadata[]
+ */
+ private $loadedMetadata = array();
+
+ /**
+ * @var bool
+ */
+ protected $initialized = false;
+
+ /**
+ * @var ReflectionService|null
+ */
+ private $reflectionService = null;
+
+ /**
+ * Sets the cache driver used by the factory to cache ClassMetadata instances.
+ *
+ * @param \Doctrine\Common\Cache\Cache $cacheDriver
+ *
+ * @return void
+ */
+ public function setCacheDriver(Cache $cacheDriver = null)
+ {
+ $this->cacheDriver = $cacheDriver;
+ }
+
+ /**
+ * Gets the cache driver used by the factory to cache ClassMetadata instances.
+ *
+ * @return \Doctrine\Common\Cache\Cache|null
+ */
+ public function getCacheDriver()
+ {
+ return $this->cacheDriver;
+ }
+
+ /**
+ * Returns an array of all the loaded metadata currently in memory.
+ *
+ * @return ClassMetadata[]
+ */
+ public function getLoadedMetadata()
+ {
+ return $this->loadedMetadata;
+ }
+
+ /**
+ * Forces the factory to load the metadata of all classes known to the underlying
+ * mapping driver.
+ *
+ * @return array The ClassMetadata instances of all mapped classes.
+ */
+ public function getAllMetadata()
+ {
+ if ( ! $this->initialized) {
+ $this->initialize();
+ }
+
+ $driver = $this->getDriver();
+ $metadata = array();
+ foreach ($driver->getAllClassNames() as $className) {
+ $metadata[] = $this->getMetadataFor($className);
+ }
+
+ return $metadata;
+ }
+
+ /**
+ * Lazy initialization of this stuff, especially the metadata driver,
+ * since these are not needed at all when a metadata cache is active.
+ *
+ * @return void
+ */
+ abstract protected function initialize();
+
+ /**
+ * Gets the fully qualified class-name from the namespace alias.
+ *
+ * @param string $namespaceAlias
+ * @param string $simpleClassName
+ *
+ * @return string
+ */
+ abstract protected function getFqcnFromAlias($namespaceAlias, $simpleClassName);
+
+ /**
+ * Returns the mapping driver implementation.
+ *
+ * @return \Doctrine\Common\Persistence\Mapping\Driver\MappingDriver
+ */
+ abstract protected function getDriver();
+
+ /**
+ * Wakes up reflection after ClassMetadata gets unserialized from cache.
+ *
+ * @param ClassMetadata $class
+ * @param ReflectionService $reflService
+ *
+ * @return void
+ */
+ abstract protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService);
+
+ /**
+ * Initializes Reflection after ClassMetadata was constructed.
+ *
+ * @param ClassMetadata $class
+ * @param ReflectionService $reflService
+ *
+ * @return void
+ */
+ abstract protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService);
+
+ /**
+ * Checks whether the class metadata is an entity.
+ *
+ * This method should return false for mapped superclasses or embedded classes.
+ *
+ * @param ClassMetadata $class
+ *
+ * @return boolean
+ */
+ abstract protected function isEntity(ClassMetadata $class);
+
+ /**
+ * Gets the class metadata descriptor for a class.
+ *
+ * @param string $className The name of the class.
+ *
+ * @return ClassMetadata
+ *
+ * @throws ReflectionException
+ * @throws MappingException
+ */
+ public function getMetadataFor($className)
+ {
+ if (isset($this->loadedMetadata[$className])) {
+ return $this->loadedMetadata[$className];
+ }
+
+ // Check for namespace alias
+ if (strpos($className, ':') !== false) {
+ list($namespaceAlias, $simpleClassName) = explode(':', $className, 2);
+
+ $realClassName = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName);
+ } else {
+ $realClassName = ClassUtils::getRealClass($className);
+ }
+
+ if (isset($this->loadedMetadata[$realClassName])) {
+ // We do not have the alias name in the map, include it
+ return $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName];
+ }
+
+ $loadingException = null;
+
+ try {
+ if ($this->cacheDriver) {
+ if (($cached = $this->cacheDriver->fetch($realClassName . $this->cacheSalt)) !== false) {
+ $this->loadedMetadata[$realClassName] = $cached;
+
+ $this->wakeupReflection($cached, $this->getReflectionService());
+ } else {
+ foreach ($this->loadMetadata($realClassName) as $loadedClassName) {
+ $this->cacheDriver->save(
+ $loadedClassName . $this->cacheSalt,
+ $this->loadedMetadata[$loadedClassName],
+ null
+ );
+ }
+ }
+ } else {
+ $this->loadMetadata($realClassName);
+ }
+ } catch (MappingException $loadingException) {
+ if (! $fallbackMetadataResponse = $this->onNotFoundMetadata($realClassName)) {
+ throw $loadingException;
+ }
+
+ $this->loadedMetadata[$realClassName] = $fallbackMetadataResponse;
+ }
+
+ if ($className !== $realClassName) {
+ // We do not have the alias name in the map, include it
+ $this->loadedMetadata[$className] = $this->loadedMetadata[$realClassName];
+ }
+
+ return $this->loadedMetadata[$className];
+ }
+
+ /**
+ * Checks whether the factory has the metadata for a class loaded already.
+ *
+ * @param string $className
+ *
+ * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise.
+ */
+ public function hasMetadataFor($className)
+ {
+ return isset($this->loadedMetadata[$className]);
+ }
+
+ /**
+ * Sets the metadata descriptor for a specific class.
+ *
+ * NOTE: This is only useful in very special cases, like when generating proxy classes.
+ *
+ * @param string $className
+ * @param ClassMetadata $class
+ *
+ * @return void
+ */
+ public function setMetadataFor($className, $class)
+ {
+ $this->loadedMetadata[$className] = $class;
+ }
+
+ /**
+ * Gets an array of parent classes for the given entity class.
+ *
+ * @param string $name
+ *
+ * @return array
+ */
+ protected function getParentClasses($name)
+ {
+ // Collect parent classes, ignoring transient (not-mapped) classes.
+ $parentClasses = array();
+ foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) {
+ if ( ! $this->getDriver()->isTransient($parentClass)) {
+ $parentClasses[] = $parentClass;
+ }
+ }
+ return $parentClasses;
+ }
+
+ /**
+ * Loads the metadata of the class in question and all it's ancestors whose metadata
+ * is still not loaded.
+ *
+ * Important: The class $name does not necesarily exist at this point here.
+ * Scenarios in a code-generation setup might have access to XML/YAML
+ * Mapping files without the actual PHP code existing here. That is why the
+ * {@see Doctrine\Common\Persistence\Mapping\ReflectionService} interface
+ * should be used for reflection.
+ *
+ * @param string $name The name of the class for which the metadata should get loaded.
+ *
+ * @return array
+ */
+ protected function loadMetadata($name)
+ {
+ if ( ! $this->initialized) {
+ $this->initialize();
+ }
+
+ $loaded = array();
+
+ $parentClasses = $this->getParentClasses($name);
+ $parentClasses[] = $name;
+
+ // Move down the hierarchy of parent classes, starting from the topmost class
+ $parent = null;
+ $rootEntityFound = false;
+ $visited = array();
+ $reflService = $this->getReflectionService();
+ foreach ($parentClasses as $className) {
+ if (isset($this->loadedMetadata[$className])) {
+ $parent = $this->loadedMetadata[$className];
+ if ($this->isEntity($parent)) {
+ $rootEntityFound = true;
+ array_unshift($visited, $className);
+ }
+ continue;
+ }
+
+ $class = $this->newClassMetadataInstance($className);
+ $this->initializeReflection($class, $reflService);
+
+ $this->doLoadMetadata($class, $parent, $rootEntityFound, $visited);
+
+ $this->loadedMetadata[$className] = $class;
+
+ $parent = $class;
+
+ if ($this->isEntity($class)) {
+ $rootEntityFound = true;
+ array_unshift($visited, $className);
+ }
+
+ $this->wakeupReflection($class, $reflService);
+
+ $loaded[] = $className;
+ }
+
+ return $loaded;
+ }
+
+ /**
+ * Provides a fallback hook for loading metadata when loading failed due to reflection/mapping exceptions
+ *
+ * Override this method to implement a fallback strategy for failed metadata loading
+ *
+ * @param string $className
+ *
+ * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata|null
+ */
+ protected function onNotFoundMetadata($className)
+ {
+ return null;
+ }
+
+ /**
+ * Actually loads the metadata from the underlying metadata.
+ *
+ * @param ClassMetadata $class
+ * @param ClassMetadata|null $parent
+ * @param bool $rootEntityFound
+ * @param array $nonSuperclassParents All parent class names
+ * that are not marked as mapped superclasses.
+ *
+ * @return void
+ */
+ abstract protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents);
+
+ /**
+ * Creates a new ClassMetadata instance for the given class name.
+ *
+ * @param string $className
+ *
+ * @return ClassMetadata
+ */
+ abstract protected function newClassMetadataInstance($className);
+
+ /**
+ * {@inheritDoc}
+ */
+ public function isTransient($class)
+ {
+ if ( ! $this->initialized) {
+ $this->initialize();
+ }
+
+ // Check for namespace alias
+ if (strpos($class, ':') !== false) {
+ list($namespaceAlias, $simpleClassName) = explode(':', $class, 2);
+ $class = $this->getFqcnFromAlias($namespaceAlias, $simpleClassName);
+ }
+
+ return $this->getDriver()->isTransient($class);
+ }
+
+ /**
+ * Sets the reflectionService.
+ *
+ * @param ReflectionService $reflectionService
+ *
+ * @return void
+ */
+ public function setReflectionService(ReflectionService $reflectionService)
+ {
+ $this->reflectionService = $reflectionService;
+ }
+
+ /**
+ * Gets the reflection service associated with this metadata factory.
+ *
+ * @return ReflectionService
+ */
+ public function getReflectionService()
+ {
+ if ($this->reflectionService === null) {
+ $this->reflectionService = new RuntimeReflectionService();
+ }
+ return $this->reflectionService;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php
new file mode 100644
index 0000000000000000000000000000000000000000..b8445f1b9fc112b712fe889d2bc8a5c553b3f2a9
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadata.php
@@ -0,0 +1,174 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping;
+
+/**
+ * Contract for a Doctrine persistence layer ClassMetadata class to implement.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.1
+ * @author Benjamin Eberlei
+ * @author Jonathan Wage
+ */
+interface ClassMetadata
+{
+ /**
+ * Gets the fully-qualified class name of this persistent class.
+ *
+ * @return string
+ */
+ public function getName();
+
+ /**
+ * Gets the mapped identifier field name.
+ *
+ * The returned structure is an array of the identifier field names.
+ *
+ * @return array
+ */
+ public function getIdentifier();
+
+ /**
+ * Gets the ReflectionClass instance for this mapped class.
+ *
+ * @return \ReflectionClass
+ */
+ public function getReflectionClass();
+
+ /**
+ * Checks if the given field name is a mapped identifier for this class.
+ *
+ * @param string $fieldName
+ *
+ * @return boolean
+ */
+ public function isIdentifier($fieldName);
+
+ /**
+ * Checks if the given field is a mapped property for this class.
+ *
+ * @param string $fieldName
+ *
+ * @return boolean
+ */
+ public function hasField($fieldName);
+
+ /**
+ * Checks if the given field is a mapped association for this class.
+ *
+ * @param string $fieldName
+ *
+ * @return boolean
+ */
+ public function hasAssociation($fieldName);
+
+ /**
+ * Checks if the given field is a mapped single valued association for this class.
+ *
+ * @param string $fieldName
+ *
+ * @return boolean
+ */
+ public function isSingleValuedAssociation($fieldName);
+
+ /**
+ * Checks if the given field is a mapped collection valued association for this class.
+ *
+ * @param string $fieldName
+ *
+ * @return boolean
+ */
+ public function isCollectionValuedAssociation($fieldName);
+
+ /**
+ * A numerically indexed list of field names of this persistent class.
+ *
+ * This array includes identifier fields if present on this class.
+ *
+ * @return array
+ */
+ public function getFieldNames();
+
+ /**
+ * Returns an array of identifier field names numerically indexed.
+ *
+ * @return array
+ */
+ public function getIdentifierFieldNames();
+
+ /**
+ * Returns a numerically indexed list of association names of this persistent class.
+ *
+ * This array includes identifier associations if present on this class.
+ *
+ * @return array
+ */
+ public function getAssociationNames();
+
+ /**
+ * Returns a type name of this field.
+ *
+ * This type names can be implementation specific but should at least include the php types:
+ * integer, string, boolean, float/double, datetime.
+ *
+ * @param string $fieldName
+ *
+ * @return string
+ */
+ public function getTypeOfField($fieldName);
+
+ /**
+ * Returns the target class name of the given association.
+ *
+ * @param string $assocName
+ *
+ * @return string
+ */
+ public function getAssociationTargetClass($assocName);
+
+ /**
+ * Checks if the association is the inverse side of a bidirectional association.
+ *
+ * @param string $assocName
+ *
+ * @return boolean
+ */
+ public function isAssociationInverseSide($assocName);
+
+ /**
+ * Returns the target field of the owning side of the association.
+ *
+ * @param string $assocName
+ *
+ * @return string
+ */
+ public function getAssociationMappedByTargetField($assocName);
+
+ /**
+ * Returns the identifier of this object as an array with field name as key.
+ *
+ * Has to return an empty array if no identifier isset.
+ *
+ * @param object $object
+ *
+ * @return array
+ */
+ public function getIdentifierValues($object);
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..3d82881195bbcd2183e9f8a027f9ac158534e196
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ClassMetadataFactory.php
@@ -0,0 +1,76 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping;
+
+/**
+ * Contract for a Doctrine persistence layer ClassMetadata class to implement.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.1
+ * @author Benjamin Eberlei
+ * @author Jonathan Wage
+ */
+interface ClassMetadataFactory
+{
+ /**
+ * Forces the factory to load the metadata of all classes known to the underlying
+ * mapping driver.
+ *
+ * @return array The ClassMetadata instances of all mapped classes.
+ */
+ public function getAllMetadata();
+
+ /**
+ * Gets the class metadata descriptor for a class.
+ *
+ * @param string $className The name of the class.
+ *
+ * @return ClassMetadata
+ */
+ public function getMetadataFor($className);
+
+ /**
+ * Checks whether the factory has the metadata for a class loaded already.
+ *
+ * @param string $className
+ *
+ * @return boolean TRUE if the metadata of the class in question is already loaded, FALSE otherwise.
+ */
+ public function hasMetadataFor($className);
+
+ /**
+ * Sets the metadata descriptor for a specific class.
+ *
+ * @param string $className
+ *
+ * @param ClassMetadata $class
+ */
+ public function setMetadataFor($className, $class);
+
+ /**
+ * Returns whether the class with the specified name should have its metadata loaded.
+ * This is only the case if it is either mapped directly or as a MappedSuperclass.
+ *
+ * @param string $className
+ *
+ * @return boolean
+ */
+ public function isTransient($className);
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..8bb574d92e933c6eacc84f86d20caf14007e5879
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php
@@ -0,0 +1,256 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping\Driver;
+
+use Doctrine\Common\Annotations\AnnotationReader;
+use Doctrine\Common\Persistence\Mapping\MappingException;
+
+/**
+ * The AnnotationDriver reads the mapping metadata from docblock annotations.
+ *
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan H. Wage
+ * @author Roman Borschel
+ */
+abstract class AnnotationDriver implements MappingDriver
+{
+ /**
+ * The AnnotationReader.
+ *
+ * @var AnnotationReader
+ */
+ protected $reader;
+
+ /**
+ * The paths where to look for mapping files.
+ *
+ * @var array
+ */
+ protected $paths = array();
+
+ /**
+ * The paths excluded from path where to look for mapping files.
+ *
+ * @var array
+ */
+ protected $excludePaths = array();
+
+ /**
+ * The file extension of mapping documents.
+ *
+ * @var string
+ */
+ protected $fileExtension = '.php';
+
+ /**
+ * Cache for AnnotationDriver#getAllClassNames().
+ *
+ * @var array|null
+ */
+ protected $classNames;
+
+ /**
+ * Name of the entity annotations as keys.
+ *
+ * @var array
+ */
+ protected $entityAnnotationClasses = array();
+
+ /**
+ * Initializes a new AnnotationDriver that uses the given AnnotationReader for reading
+ * docblock annotations.
+ *
+ * @param AnnotationReader $reader The AnnotationReader to use, duck-typed.
+ * @param string|array|null $paths One or multiple paths where mapping classes can be found.
+ */
+ public function __construct($reader, $paths = null)
+ {
+ $this->reader = $reader;
+ if ($paths) {
+ $this->addPaths((array) $paths);
+ }
+ }
+
+ /**
+ * Appends lookup paths to metadata driver.
+ *
+ * @param array $paths
+ *
+ * @return void
+ */
+ public function addPaths(array $paths)
+ {
+ $this->paths = array_unique(array_merge($this->paths, $paths));
+ }
+
+ /**
+ * Retrieves the defined metadata lookup paths.
+ *
+ * @return array
+ */
+ public function getPaths()
+ {
+ return $this->paths;
+ }
+
+ /**
+ * Append exclude lookup paths to metadata driver.
+ *
+ * @param array $paths
+ */
+ public function addExcludePaths(array $paths)
+ {
+ $this->excludePaths = array_unique(array_merge($this->excludePaths, $paths));
+ }
+
+ /**
+ * Retrieve the defined metadata lookup exclude paths.
+ *
+ * @return array
+ */
+ public function getExcludePaths()
+ {
+ return $this->excludePaths;
+ }
+
+ /**
+ * Retrieve the current annotation reader
+ *
+ * @return AnnotationReader
+ */
+ public function getReader()
+ {
+ return $this->reader;
+ }
+
+ /**
+ * Gets the file extension used to look for mapping files under.
+ *
+ * @return string
+ */
+ public function getFileExtension()
+ {
+ return $this->fileExtension;
+ }
+
+ /**
+ * Sets the file extension used to look for mapping files under.
+ *
+ * @param string $fileExtension The file extension to set.
+ *
+ * @return void
+ */
+ public function setFileExtension($fileExtension)
+ {
+ $this->fileExtension = $fileExtension;
+ }
+
+ /**
+ * Returns whether the class with the specified name is transient. Only non-transient
+ * classes, that is entities and mapped superclasses, should have their metadata loaded.
+ *
+ * A class is non-transient if it is annotated with an annotation
+ * from the {@see AnnotationDriver::entityAnnotationClasses}.
+ *
+ * @param string $className
+ *
+ * @return boolean
+ */
+ public function isTransient($className)
+ {
+ $classAnnotations = $this->reader->getClassAnnotations(new \ReflectionClass($className));
+
+ foreach ($classAnnotations as $annot) {
+ if (isset($this->entityAnnotationClasses[get_class($annot)])) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAllClassNames()
+ {
+ if ($this->classNames !== null) {
+ return $this->classNames;
+ }
+
+ if (!$this->paths) {
+ throw MappingException::pathRequired();
+ }
+
+ $classes = array();
+ $includedFiles = array();
+
+ foreach ($this->paths as $path) {
+ if ( ! is_dir($path)) {
+ throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path);
+ }
+
+ $iterator = new \RegexIterator(
+ new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($path, \FilesystemIterator::SKIP_DOTS),
+ \RecursiveIteratorIterator::LEAVES_ONLY
+ ),
+ '/^.+' . preg_quote($this->fileExtension) . '$/i',
+ \RecursiveRegexIterator::GET_MATCH
+ );
+
+ foreach ($iterator as $file) {
+ $sourceFile = $file[0];
+
+ if ( ! preg_match('(^phar:)i', $sourceFile)) {
+ $sourceFile = realpath($sourceFile);
+ }
+
+ foreach ($this->excludePaths as $excludePath) {
+ $exclude = str_replace('\\', '/', realpath($excludePath));
+ $current = str_replace('\\', '/', $sourceFile);
+
+ if (strpos($current, $exclude) !== false) {
+ continue 2;
+ }
+ }
+
+ require_once $sourceFile;
+
+ $includedFiles[] = $sourceFile;
+ }
+ }
+
+ $declared = get_declared_classes();
+
+ foreach ($declared as $className) {
+ $rc = new \ReflectionClass($className);
+ $sourceFile = $rc->getFileName();
+ if (in_array($sourceFile, $includedFiles) && ! $this->isTransient($className)) {
+ $classes[] = $className;
+ }
+ }
+
+ $this->classNames = $classes;
+
+ return $classes;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php
new file mode 100644
index 0000000000000000000000000000000000000000..58a740b5707146b0574d34facd11b706b9c09d99
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php
@@ -0,0 +1,173 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping\Driver;
+
+use Doctrine\Common\Persistence\Mapping\MappingException;
+
+/**
+ * Locates the file that contains the metadata information for a given class name.
+ *
+ * This behavior is independent of the actual content of the file. It just detects
+ * the file which is responsible for the given class name.
+ *
+ * @author Benjamin Eberlei
+ * @author Johannes M. Schmitt
+ */
+class DefaultFileLocator implements FileLocator
+{
+ /**
+ * The paths where to look for mapping files.
+ *
+ * @var array
+ */
+ protected $paths = array();
+
+ /**
+ * The file extension of mapping documents.
+ *
+ * @var string|null
+ */
+ protected $fileExtension;
+
+ /**
+ * Initializes a new FileDriver that looks in the given path(s) for mapping
+ * documents and operates in the specified operating mode.
+ *
+ * @param string|array $paths One or multiple paths where mapping documents can be found.
+ * @param string|null $fileExtension The file extension of mapping documents, usually prefixed with a dot.
+ */
+ public function __construct($paths, $fileExtension = null)
+ {
+ $this->addPaths((array) $paths);
+ $this->fileExtension = $fileExtension;
+ }
+
+ /**
+ * Appends lookup paths to metadata driver.
+ *
+ * @param array $paths
+ *
+ * @return void
+ */
+ public function addPaths(array $paths)
+ {
+ $this->paths = array_unique(array_merge($this->paths, $paths));
+ }
+
+ /**
+ * Retrieves the defined metadata lookup paths.
+ *
+ * @return array
+ */
+ public function getPaths()
+ {
+ return $this->paths;
+ }
+
+ /**
+ * Gets the file extension used to look for mapping files under.
+ *
+ * @return string|null
+ */
+ public function getFileExtension()
+ {
+ return $this->fileExtension;
+ }
+
+ /**
+ * Sets the file extension used to look for mapping files under.
+ *
+ * @param string|null $fileExtension The file extension to set.
+ *
+ * @return void
+ */
+ public function setFileExtension($fileExtension)
+ {
+ $this->fileExtension = $fileExtension;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function findMappingFile($className)
+ {
+ $fileName = str_replace('\\', '.', $className) . $this->fileExtension;
+
+ // Check whether file exists
+ foreach ($this->paths as $path) {
+ if (is_file($path . DIRECTORY_SEPARATOR . $fileName)) {
+ return $path . DIRECTORY_SEPARATOR . $fileName;
+ }
+ }
+
+ throw MappingException::mappingFileNotFound($className, $fileName);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAllClassNames($globalBasename)
+ {
+ $classes = array();
+
+ if ($this->paths) {
+ foreach ($this->paths as $path) {
+ if ( ! is_dir($path)) {
+ throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path);
+ }
+
+ $iterator = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($path),
+ \RecursiveIteratorIterator::LEAVES_ONLY
+ );
+
+ foreach ($iterator as $file) {
+ $fileName = $file->getBasename($this->fileExtension);
+
+ if ($fileName == $file->getBasename() || $fileName == $globalBasename) {
+ continue;
+ }
+
+ // NOTE: All files found here means classes are not transient!
+ $classes[] = str_replace('.', '\\', $fileName);
+ }
+ }
+ }
+
+ return $classes;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function fileExists($className)
+ {
+ $fileName = str_replace('\\', '.', $className) . $this->fileExtension;
+
+ // Check whether file exists
+ foreach ((array) $this->paths as $path) {
+ if (is_file($path . DIRECTORY_SEPARATOR . $fileName)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..ccc64faf8c8b0725a07b1b43ffbe8e2e0269ddc2
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php
@@ -0,0 +1,211 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping\Driver;
+
+use Doctrine\Common\Persistence\Mapping\MappingException;
+
+/**
+ * Base driver for file-based metadata drivers.
+ *
+ * A file driver operates in a mode where it loads the mapping files of individual
+ * classes on demand. This requires the user to adhere to the convention of 1 mapping
+ * file per class and the file names of the mapping files must correspond to the full
+ * class name, including namespace, with the namespace delimiters '\', replaced by dots '.'.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan H. Wage
+ * @author Roman Borschel
+ */
+abstract class FileDriver implements MappingDriver
+{
+ /**
+ * @var FileLocator
+ */
+ protected $locator;
+
+ /**
+ * @var array|null
+ */
+ protected $classCache;
+
+ /**
+ * @var string|null
+ */
+ protected $globalBasename;
+
+ /**
+ * Initializes a new FileDriver that looks in the given path(s) for mapping
+ * documents and operates in the specified operating mode.
+ *
+ * @param string|array|FileLocator $locator A FileLocator or one/multiple paths
+ * where mapping documents can be found.
+ * @param string|null $fileExtension
+ */
+ public function __construct($locator, $fileExtension = null)
+ {
+ if ($locator instanceof FileLocator) {
+ $this->locator = $locator;
+ } else {
+ $this->locator = new DefaultFileLocator((array)$locator, $fileExtension);
+ }
+ }
+
+ /**
+ * Sets the global basename.
+ *
+ * @param string $file
+ *
+ * @return void
+ */
+ public function setGlobalBasename($file)
+ {
+ $this->globalBasename = $file;
+ }
+
+ /**
+ * Retrieves the global basename.
+ *
+ * @return string|null
+ */
+ public function getGlobalBasename()
+ {
+ return $this->globalBasename;
+ }
+
+ /**
+ * Gets the element of schema meta data for the class from the mapping file.
+ * This will lazily load the mapping file if it is not loaded yet.
+ *
+ * @param string $className
+ *
+ * @return array The element of schema meta data.
+ *
+ * @throws MappingException
+ */
+ public function getElement($className)
+ {
+ if ($this->classCache === null) {
+ $this->initialize();
+ }
+
+ if (isset($this->classCache[$className])) {
+ return $this->classCache[$className];
+ }
+
+ $result = $this->loadMappingFile($this->locator->findMappingFile($className));
+ if (!isset($result[$className])) {
+ throw MappingException::invalidMappingFile($className, str_replace('\\', '.', $className) . $this->locator->getFileExtension());
+ }
+
+ return $result[$className];
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function isTransient($className)
+ {
+ if ($this->classCache === null) {
+ $this->initialize();
+ }
+
+ if (isset($this->classCache[$className])) {
+ return false;
+ }
+
+ return !$this->locator->fileExists($className);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAllClassNames()
+ {
+ if ($this->classCache === null) {
+ $this->initialize();
+ }
+
+ $classNames = (array)$this->locator->getAllClassNames($this->globalBasename);
+ if ($this->classCache) {
+ $classNames = array_merge(array_keys($this->classCache), $classNames);
+ }
+ return $classNames;
+ }
+
+ /**
+ * Loads a mapping file with the given name and returns a map
+ * from class/entity names to their corresponding file driver elements.
+ *
+ * @param string $file The mapping file to load.
+ *
+ * @return array
+ */
+ abstract protected function loadMappingFile($file);
+
+ /**
+ * Initializes the class cache from all the global files.
+ *
+ * Using this feature adds a substantial performance hit to file drivers as
+ * more metadata has to be loaded into memory than might actually be
+ * necessary. This may not be relevant to scenarios where caching of
+ * metadata is in place, however hits very hard in scenarios where no
+ * caching is used.
+ *
+ * @return void
+ */
+ protected function initialize()
+ {
+ $this->classCache = array();
+ if (null !== $this->globalBasename) {
+ foreach ($this->locator->getPaths() as $path) {
+ $file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension();
+ if (is_file($file)) {
+ $this->classCache = array_merge(
+ $this->classCache,
+ $this->loadMappingFile($file)
+ );
+ }
+ }
+ }
+ }
+
+ /**
+ * Retrieves the locator used to discover mapping files by className.
+ *
+ * @return FileLocator
+ */
+ public function getLocator()
+ {
+ return $this->locator;
+ }
+
+ /**
+ * Sets the locator used to discover mapping files by className.
+ *
+ * @param FileLocator $locator
+ */
+ public function setLocator(FileLocator $locator)
+ {
+ $this->locator = $locator;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php
new file mode 100644
index 0000000000000000000000000000000000000000..f622856da845a964399c5aad8cb82d72874d77d8
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileLocator.php
@@ -0,0 +1,73 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping\Driver;
+
+/**
+ * Locates the file that contains the metadata information for a given class name.
+ *
+ * This behavior is independent of the actual content of the file. It just detects
+ * the file which is responsible for the given class name.
+ *
+ * @author Benjamin Eberlei
+ * @author Johannes M. Schmitt
+ */
+interface FileLocator
+{
+ /**
+ * Locates mapping file for the given class name.
+ *
+ * @param string $className
+ *
+ * @return string
+ */
+ public function findMappingFile($className);
+
+ /**
+ * Gets all class names that are found with this file locator.
+ *
+ * @param string $globalBasename Passed to allow excluding the basename.
+ *
+ * @return array
+ */
+ public function getAllClassNames($globalBasename);
+
+ /**
+ * Checks if a file can be found for this class name.
+ *
+ * @param string $className
+ *
+ * @return bool
+ */
+ public function fileExists($className);
+
+ /**
+ * Gets all the paths that this file locator looks for mapping files.
+ *
+ * @return array
+ */
+ public function getPaths();
+
+ /**
+ * Gets the file extension that mapping files are suffixed with.
+ *
+ * @return string
+ */
+ public function getFileExtension();
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..b5d7ec03a1c13e5573a738a115016ae9f99dfb91
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriver.php
@@ -0,0 +1,58 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping\Driver;
+
+use Doctrine\Common\Persistence\Mapping\ClassMetadata;
+
+/**
+ * Contract for metadata drivers.
+ *
+ * @since 2.2
+ * @author Jonathan H. Wage
+ */
+interface MappingDriver
+{
+ /**
+ * Loads the metadata for the specified class into the provided container.
+ *
+ * @param string $className
+ * @param ClassMetadata $metadata
+ *
+ * @return void
+ */
+ public function loadMetadataForClass($className, ClassMetadata $metadata);
+
+ /**
+ * Gets the names of all mapped classes known to this driver.
+ *
+ * @return array The names of all mapped classes known to this driver.
+ */
+ public function getAllClassNames();
+
+ /**
+ * Returns whether the class with the specified name should have its metadata loaded.
+ * This is only the case if it is either mapped as an Entity or a MappedSuperclass.
+ *
+ * @param string $className
+ *
+ * @return boolean
+ */
+ public function isTransient($className);
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php
new file mode 100644
index 0000000000000000000000000000000000000000..26a9f3e2cbfd359afa86439e330a5d3f9d38923e
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php
@@ -0,0 +1,165 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping\Driver;
+
+use Doctrine\Common\Persistence\Mapping\ClassMetadata;
+use Doctrine\Common\Persistence\Mapping\MappingException;
+
+/**
+ * The DriverChain allows you to add multiple other mapping drivers for
+ * certain namespaces.
+ *
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan H. Wage
+ * @author Roman Borschel
+ */
+class MappingDriverChain implements MappingDriver
+{
+ /**
+ * The default driver.
+ *
+ * @var MappingDriver|null
+ */
+ private $defaultDriver = null;
+
+ /**
+ * @var array
+ */
+ private $drivers = array();
+
+ /**
+ * Gets the default driver.
+ *
+ * @return MappingDriver|null
+ */
+ public function getDefaultDriver()
+ {
+ return $this->defaultDriver;
+ }
+
+ /**
+ * Set the default driver.
+ *
+ * @param MappingDriver $driver
+ *
+ * @return void
+ */
+ public function setDefaultDriver(MappingDriver $driver)
+ {
+ $this->defaultDriver = $driver;
+ }
+
+ /**
+ * Adds a nested driver.
+ *
+ * @param MappingDriver $nestedDriver
+ * @param string $namespace
+ *
+ * @return void
+ */
+ public function addDriver(MappingDriver $nestedDriver, $namespace)
+ {
+ $this->drivers[$namespace] = $nestedDriver;
+ }
+
+ /**
+ * Gets the array of nested drivers.
+ *
+ * @return array $drivers
+ */
+ public function getDrivers()
+ {
+ return $this->drivers;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function loadMetadataForClass($className, ClassMetadata $metadata)
+ {
+ /* @var $driver MappingDriver */
+ foreach ($this->drivers as $namespace => $driver) {
+ if (strpos($className, $namespace) === 0) {
+ $driver->loadMetadataForClass($className, $metadata);
+ return;
+ }
+ }
+
+ if (null !== $this->defaultDriver) {
+ $this->defaultDriver->loadMetadataForClass($className, $metadata);
+ return;
+ }
+
+ throw MappingException::classNotFoundInNamespaces($className, array_keys($this->drivers));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAllClassNames()
+ {
+ $classNames = array();
+ $driverClasses = array();
+
+ /* @var $driver MappingDriver */
+ foreach ($this->drivers AS $namespace => $driver) {
+ $oid = spl_object_hash($driver);
+
+ if (!isset($driverClasses[$oid])) {
+ $driverClasses[$oid] = $driver->getAllClassNames();
+ }
+
+ foreach ($driverClasses[$oid] AS $className) {
+ if (strpos($className, $namespace) === 0) {
+ $classNames[$className] = true;
+ }
+ }
+ }
+
+ if (null !== $this->defaultDriver) {
+ foreach ($this->defaultDriver->getAllClassNames() as $className) {
+ $classNames[$className] = true;
+ }
+ }
+
+ return array_keys($classNames);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function isTransient($className)
+ {
+ /* @var $driver MappingDriver */
+ foreach ($this->drivers AS $namespace => $driver) {
+ if (strpos($className, $namespace) === 0) {
+ return $driver->isTransient($className);
+ }
+ }
+
+ if ($this->defaultDriver !== null) {
+ return $this->defaultDriver->isTransient($className);
+ }
+
+ return true;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..6df54b0f7a23764d3b24e491d0da80da8244c76d
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php
@@ -0,0 +1,70 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping\Driver;
+
+use Doctrine\Common\Persistence\Mapping\ClassMetadata;
+
+/**
+ * The PHPDriver includes php files which just populate ClassMetadataInfo
+ * instances with plain PHP code.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.0
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan H. Wage
+ * @author Roman Borschel
+ */
+class PHPDriver extends FileDriver
+{
+ /**
+ * @var ClassMetadata
+ */
+ protected $metadata;
+
+ /**
+ * {@inheritDoc}
+ */
+ public function __construct($locator, $fileExtension = null)
+ {
+ $fileExtension = ".php";
+ parent::__construct($locator, $fileExtension);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function loadMetadataForClass($className, ClassMetadata $metadata)
+ {
+ $this->metadata = $metadata;
+ $this->loadMappingFile($this->locator->findMappingFile($className));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function loadMappingFile($file)
+ {
+ $metadata = $this->metadata;
+ include $file;
+
+ return array($metadata->getName() => $metadata);
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php
new file mode 100644
index 0000000000000000000000000000000000000000..df8f47700b92e884a6231f8c0ea388262ea7d354
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php
@@ -0,0 +1,142 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping\Driver;
+
+use Doctrine\Common\Persistence\Mapping\ClassMetadata;
+use Doctrine\Common\Persistence\Mapping\MappingException;
+
+/**
+ * The StaticPHPDriver calls a static loadMetadata() method on your entity
+ * classes where you can manually populate the ClassMetadata instance.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.2
+ * @author Benjamin Eberlei
+ * @author Guilherme Blanco
+ * @author Jonathan H. Wage
+ * @author Roman Borschel
+ */
+class StaticPHPDriver implements MappingDriver
+{
+ /**
+ * Paths of entity directories.
+ *
+ * @var array
+ */
+ private $paths = array();
+
+ /**
+ * Map of all class names.
+ *
+ * @var array
+ */
+ private $classNames;
+
+ /**
+ * Constructor.
+ *
+ * @param array|string $paths
+ */
+ public function __construct($paths)
+ {
+ $this->addPaths((array) $paths);
+ }
+
+ /**
+ * Adds paths.
+ *
+ * @param array $paths
+ *
+ * @return void
+ */
+ public function addPaths(array $paths)
+ {
+ $this->paths = array_unique(array_merge($this->paths, $paths));
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function loadMetadataForClass($className, ClassMetadata $metadata)
+ {
+ $className::loadMetadata($metadata);
+ }
+
+ /**
+ * {@inheritDoc}
+ * @todo Same code exists in AnnotationDriver, should we re-use it somehow or not worry about it?
+ */
+ public function getAllClassNames()
+ {
+ if ($this->classNames !== null) {
+ return $this->classNames;
+ }
+
+ if (!$this->paths) {
+ throw MappingException::pathRequired();
+ }
+
+ $classes = array();
+ $includedFiles = array();
+
+ foreach ($this->paths as $path) {
+ if (!is_dir($path)) {
+ throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path);
+ }
+
+ $iterator = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($path),
+ \RecursiveIteratorIterator::LEAVES_ONLY
+ );
+
+ foreach ($iterator as $file) {
+ if ($file->getBasename('.php') == $file->getBasename()) {
+ continue;
+ }
+
+ $sourceFile = realpath($file->getPathName());
+ require_once $sourceFile;
+ $includedFiles[] = $sourceFile;
+ }
+ }
+
+ $declared = get_declared_classes();
+
+ foreach ($declared as $className) {
+ $rc = new \ReflectionClass($className);
+ $sourceFile = $rc->getFileName();
+ if (in_array($sourceFile, $includedFiles) && !$this->isTransient($className)) {
+ $classes[] = $className;
+ }
+ }
+
+ $this->classNames = $classes;
+
+ return $classes;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isTransient($className)
+ {
+ return ! method_exists($className, 'loadMetadata');
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php
new file mode 100644
index 0000000000000000000000000000000000000000..f334265605b767cb079450b851786eb5c73da12a
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php
@@ -0,0 +1,239 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping\Driver;
+
+use Doctrine\Common\Persistence\Mapping\MappingException;
+
+/**
+ * The Symfony File Locator makes a simplifying assumptions compared
+ * to the DefaultFileLocator. By assuming paths only contain entities of a certain
+ * namespace the mapping files consists of the short classname only.
+ *
+ * @author Fabien Potencier
+ * @author Benjamin Eberlei
+ * @license MIT
+ */
+class SymfonyFileLocator implements FileLocator
+{
+ /**
+ * The paths where to look for mapping files.
+ *
+ * @var array
+ */
+ protected $paths = array();
+
+ /**
+ * A map of mapping directory path to namespace prefix used to expand class shortnames.
+ *
+ * @var array
+ */
+ protected $prefixes = array();
+
+ /**
+ * File extension that is searched for.
+ *
+ * @var string|null
+ */
+ protected $fileExtension;
+
+ /**
+ * Represents PHP namespace delimiters when looking for files
+ *
+ * @var string
+ */
+ private $nsSeparator;
+
+ /**
+ * Constructor.
+ *
+ * @param array $prefixes
+ * @param string|null $fileExtension
+ * @param string $nsSeparator String which would be used when converting FQCN to filename and vice versa. Should not be empty
+ */
+ public function __construct(array $prefixes, $fileExtension = null, $nsSeparator = '.')
+ {
+ $this->addNamespacePrefixes($prefixes);
+ $this->fileExtension = $fileExtension;
+
+ if (empty($nsSeparator)) {
+ throw new \InvalidArgumentException('Namespace separator should not be empty');
+ }
+
+ $this->nsSeparator = (string) $nsSeparator;
+ }
+
+ /**
+ * Adds Namespace Prefixes.
+ *
+ * @param array $prefixes
+ *
+ * @return void
+ */
+ public function addNamespacePrefixes(array $prefixes)
+ {
+ $this->prefixes = array_merge($this->prefixes, $prefixes);
+ $this->paths = array_merge($this->paths, array_keys($prefixes));
+ }
+
+ /**
+ * Gets Namespace Prefixes.
+ *
+ * @return array
+ */
+ public function getNamespacePrefixes()
+ {
+ return $this->prefixes;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getPaths()
+ {
+ return $this->paths;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getFileExtension()
+ {
+ return $this->fileExtension;
+ }
+
+ /**
+ * Sets the file extension used to look for mapping files under.
+ *
+ * @param string $fileExtension The file extension to set.
+ *
+ * @return void
+ */
+ public function setFileExtension($fileExtension)
+ {
+ $this->fileExtension = $fileExtension;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function fileExists($className)
+ {
+ $defaultFileName = str_replace('\\', $this->nsSeparator, $className).$this->fileExtension;
+ foreach ($this->paths as $path) {
+ if (!isset($this->prefixes[$path])) {
+ // global namespace class
+ if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) {
+ return true;
+ }
+
+ continue;
+ }
+
+ $prefix = $this->prefixes[$path];
+
+ if (0 !== strpos($className, $prefix.'\\')) {
+ continue;
+ }
+
+ $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', $this->nsSeparator).$this->fileExtension;
+ return is_file($filename);
+ }
+
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAllClassNames($globalBasename = null)
+ {
+ $classes = array();
+
+ if ($this->paths) {
+ foreach ((array) $this->paths as $path) {
+ if (!is_dir($path)) {
+ throw MappingException::fileMappingDriversRequireConfiguredDirectoryPath($path);
+ }
+
+ $iterator = new \RecursiveIteratorIterator(
+ new \RecursiveDirectoryIterator($path),
+ \RecursiveIteratorIterator::LEAVES_ONLY
+ );
+
+ foreach ($iterator as $file) {
+ $fileName = $file->getBasename($this->fileExtension);
+
+ if ($fileName == $file->getBasename() || $fileName == $globalBasename) {
+ continue;
+ }
+
+ // NOTE: All files found here means classes are not transient!
+ if (isset($this->prefixes[$path])) {
+
+ // Calculate namespace suffix for given prefix as a relative path from basepath to file path
+ $nsSuffix = strtr(
+ substr(realpath($file->getPath()), strlen(realpath($path))),
+ $this->nsSeparator,
+ '\\'
+ );
+
+ $classes[] = $this->prefixes[$path] . $nsSuffix . '\\' .str_replace($this->nsSeparator, '\\', $fileName);
+ } else {
+ $classes[] = str_replace($this->nsSeparator, '\\', $fileName);
+ }
+ }
+ }
+ }
+
+ return $classes;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function findMappingFile($className)
+ {
+ $defaultFileName = str_replace('\\', $this->nsSeparator, $className).$this->fileExtension;
+ foreach ($this->paths as $path) {
+ if (!isset($this->prefixes[$path])) {
+ if (is_file($path.DIRECTORY_SEPARATOR.$defaultFileName)) {
+ return $path.DIRECTORY_SEPARATOR.$defaultFileName;
+ }
+
+ continue;
+ }
+
+ $prefix = $this->prefixes[$path];
+
+ if (0 !== strpos($className, $prefix.'\\')) {
+ continue;
+ }
+
+ $filename = $path.'/'.strtr(substr($className, strlen($prefix)+1), '\\', $this->nsSeparator ).$this->fileExtension;
+ if (is_file($filename)) {
+ return $filename;
+ }
+
+ throw MappingException::mappingFileNotFound($className, $filename);
+ }
+
+ throw MappingException::mappingFileNotFound($className, substr($className, strrpos($className, '\\') + 1).$this->fileExtension);
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php
new file mode 100644
index 0000000000000000000000000000000000000000..6e97485ebe28fe4afad99e165f143cb8f4a3c7a7
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/MappingException.php
@@ -0,0 +1,98 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping;
+
+/**
+ * A MappingException indicates that something is wrong with the mapping setup.
+ *
+ * @since 2.2
+ */
+class MappingException extends \Exception
+{
+ /**
+ * @param string $className
+ * @param array $namespaces
+ *
+ * @return self
+ */
+ public static function classNotFoundInNamespaces($className, $namespaces)
+ {
+ return new self("The class '" . $className . "' was not found in the ".
+ "chain configured namespaces " . implode(", ", $namespaces));
+ }
+
+ /**
+ * @return self
+ */
+ public static function pathRequired()
+ {
+ return new self("Specifying the paths to your entities is required ".
+ "in the AnnotationDriver to retrieve all class names.");
+ }
+
+ /**
+ * @param string|null $path
+ *
+ * @return self
+ */
+ public static function fileMappingDriversRequireConfiguredDirectoryPath($path = null)
+ {
+ if ( ! empty($path)) {
+ $path = '[' . $path . ']';
+ }
+
+ return new self(
+ 'File mapping drivers must have a valid directory path, ' .
+ 'however the given path ' . $path . ' seems to be incorrect!'
+ );
+ }
+
+ /**
+ * @param string $entityName
+ * @param string $fileName
+ *
+ * @return self
+ */
+ public static function mappingFileNotFound($entityName, $fileName)
+ {
+ return new self("No mapping file found named '$fileName' for class '$entityName'.");
+ }
+
+ /**
+ * @param string $entityName
+ * @param string $fileName
+ *
+ * @return self
+ */
+ public static function invalidMappingFile($entityName, $fileName)
+ {
+ return new self("Invalid mapping file '$fileName' for class '$entityName'.");
+ }
+
+ /**
+ * @param string $className
+ *
+ * @return self
+ */
+ public static function nonExistingClass($className)
+ {
+ return new self("Class '$className' does not exist");
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php
new file mode 100644
index 0000000000000000000000000000000000000000..0088ed5ee25109df64b7706c60516b510262fe30
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/ReflectionService.php
@@ -0,0 +1,87 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping;
+
+/**
+ * Very simple reflection service abstraction.
+ *
+ * This is required inside metadata layers that may require either
+ * static or runtime reflection.
+ *
+ * @author Benjamin Eberlei
+ */
+interface ReflectionService
+{
+ /**
+ * Returns an array of the parent classes (not interfaces) for the given class.
+ *
+ * @param string $class
+ *
+ * @throws \Doctrine\Common\Persistence\Mapping\MappingException
+ *
+ * @return array
+ */
+ public function getParentClasses($class);
+
+ /**
+ * Returns the shortname of a class.
+ *
+ * @param string $class
+ *
+ * @return string
+ */
+ public function getClassShortName($class);
+
+ /**
+ * @param string $class
+ *
+ * @return string
+ */
+ public function getClassNamespace($class);
+
+ /**
+ * Returns a reflection class instance or null.
+ *
+ * @param string $class
+ *
+ * @return \ReflectionClass|null
+ */
+ public function getClass($class);
+
+ /**
+ * Returns an accessible property (setAccessible(true)) or null.
+ *
+ * @param string $class
+ * @param string $property
+ *
+ * @return \ReflectionProperty|null
+ */
+ public function getAccessibleProperty($class, $property);
+
+ /**
+ * Checks if the class have a public method with the given name.
+ *
+ * @param mixed $class
+ * @param mixed $method
+ *
+ * @return bool
+ */
+ public function hasPublicMethod($class, $method);
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php
new file mode 100644
index 0000000000000000000000000000000000000000..4598d5aff24cf63c8dfb2a4bb6c48b41f50e6bfc
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/RuntimeReflectionService.php
@@ -0,0 +1,104 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping;
+
+use Doctrine\Common\Reflection\RuntimePublicReflectionProperty;
+use ReflectionClass;
+use ReflectionException;
+use ReflectionMethod;
+use ReflectionProperty;
+
+/**
+ * PHP Runtime Reflection Service.
+ *
+ * @author Benjamin Eberlei
+ */
+class RuntimeReflectionService implements ReflectionService
+{
+ /**
+ * {@inheritDoc}
+ */
+ public function getParentClasses($class)
+ {
+ if ( ! class_exists($class)) {
+ throw MappingException::nonExistingClass($class);
+ }
+
+ return class_parents($class);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassShortName($class)
+ {
+ $reflectionClass = new ReflectionClass($class);
+
+ return $reflectionClass->getShortName();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassNamespace($class)
+ {
+ $reflectionClass = new ReflectionClass($class);
+
+ return $reflectionClass->getNamespaceName();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClass($class)
+ {
+ return new ReflectionClass($class);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAccessibleProperty($class, $property)
+ {
+ $reflectionProperty = new ReflectionProperty($class, $property);
+
+ if ($reflectionProperty->isPublic()) {
+ $reflectionProperty = new RuntimePublicReflectionProperty($class, $property);
+ }
+
+ $reflectionProperty->setAccessible(true);
+
+ return $reflectionProperty;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasPublicMethod($class, $method)
+ {
+ try {
+ $reflectionMethod = new ReflectionMethod($class, $method);
+ } catch (ReflectionException $e) {
+ return false;
+ }
+
+ return $reflectionMethod->isPublic();
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php
new file mode 100644
index 0000000000000000000000000000000000000000..e5bcb06e7c7537f51d6a74a617fe67d9cd7b5e49
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php
@@ -0,0 +1,83 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence\Mapping;
+
+/**
+ * PHP Runtime Reflection Service.
+ *
+ * @author Benjamin Eberlei
+ */
+class StaticReflectionService implements ReflectionService
+{
+ /**
+ * {@inheritDoc}
+ */
+ public function getParentClasses($class)
+ {
+ return array();
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassShortName($className)
+ {
+ if (strpos($className, '\\') !== false) {
+ $className = substr($className, strrpos($className, "\\")+1);
+ }
+ return $className;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClassNamespace($className)
+ {
+ $namespace = '';
+ if (strpos($className, '\\') !== false) {
+ $namespace = strrev(substr( strrev($className), strpos(strrev($className), '\\')+1 ));
+ }
+ return $namespace;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getClass($class)
+ {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function getAccessibleProperty($class, $property)
+ {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function hasPublicMethod($class, $method)
+ {
+ return true;
+ }
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php
new file mode 100644
index 0000000000000000000000000000000000000000..02208c9d5963bd6ad74f1d2de2705f1110f4eaea
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManager.php
@@ -0,0 +1,169 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence;
+
+/**
+ * Contract for a Doctrine persistence layer ObjectManager class to implement.
+ *
+ * @link www.doctrine-project.org
+ * @since 2.1
+ * @author Benjamin Eberlei
+ * @author Jonathan Wage
+ */
+interface ObjectManager
+{
+ /**
+ * Finds an object by its identifier.
+ *
+ * This is just a convenient shortcut for getRepository($className)->find($id).
+ *
+ * @param string $className The class name of the object to find.
+ * @param mixed $id The identity of the object to find.
+ *
+ * @return object The found object.
+ */
+ public function find($className, $id);
+
+ /**
+ * Tells the ObjectManager to make an instance managed and persistent.
+ *
+ * The object will be entered into the database as a result of the flush operation.
+ *
+ * NOTE: The persist operation always considers objects that are not yet known to
+ * this ObjectManager as NEW. Do not pass detached objects to the persist operation.
+ *
+ * @param object $object The instance to make managed and persistent.
+ *
+ * @return void
+ */
+ public function persist($object);
+
+ /**
+ * Removes an object instance.
+ *
+ * A removed object will be removed from the database as a result of the flush operation.
+ *
+ * @param object $object The object instance to remove.
+ *
+ * @return void
+ */
+ public function remove($object);
+
+ /**
+ * Merges the state of a detached object into the persistence context
+ * of this ObjectManager and returns the managed copy of the object.
+ * The object passed to merge will not become associated/managed with this ObjectManager.
+ *
+ * @param object $object
+ *
+ * @return object
+ */
+ public function merge($object);
+
+ /**
+ * Clears the ObjectManager. All objects that are currently managed
+ * by this ObjectManager become detached.
+ *
+ * @param string|null $objectName if given, only objects of this type will get detached.
+ *
+ * @return void
+ */
+ public function clear($objectName = null);
+
+ /**
+ * Detaches an object from the ObjectManager, causing a managed object to
+ * become detached. Unflushed changes made to the object if any
+ * (including removal of the object), will not be synchronized to the database.
+ * Objects which previously referenced the detached object will continue to
+ * reference it.
+ *
+ * @param object $object The object to detach.
+ *
+ * @return void
+ */
+ public function detach($object);
+
+ /**
+ * Refreshes the persistent state of an object from the database,
+ * overriding any local changes that have not yet been persisted.
+ *
+ * @param object $object The object to refresh.
+ *
+ * @return void
+ */
+ public function refresh($object);
+
+ /**
+ * Flushes all changes to objects that have been queued up to now to the database.
+ * This effectively synchronizes the in-memory state of managed objects with the
+ * database.
+ *
+ * @return void
+ */
+ public function flush();
+
+ /**
+ * Gets the repository for a class.
+ *
+ * @param string $className
+ *
+ * @return \Doctrine\Common\Persistence\ObjectRepository
+ */
+ public function getRepository($className);
+
+ /**
+ * Returns the ClassMetadata descriptor for a class.
+ *
+ * The class name must be the fully-qualified class name without a leading backslash
+ * (as it is returned by get_class($obj)).
+ *
+ * @param string $className
+ *
+ * @return \Doctrine\Common\Persistence\Mapping\ClassMetadata
+ */
+ public function getClassMetadata($className);
+
+ /**
+ * Gets the metadata factory used to gather the metadata of classes.
+ *
+ * @return \Doctrine\Common\Persistence\Mapping\ClassMetadataFactory
+ */
+ public function getMetadataFactory();
+
+ /**
+ * Helper method to initialize a lazy loading proxy or persistent collection.
+ *
+ * This method is a no-op for other objects.
+ *
+ * @param object $obj
+ *
+ * @return void
+ */
+ public function initializeObject($obj);
+
+ /**
+ * Checks if the object is part of the current UnitOfWork and therefore managed.
+ *
+ * @param object $object
+ *
+ * @return bool
+ */
+ public function contains($object);
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php
new file mode 100644
index 0000000000000000000000000000000000000000..9bc248a56a31e5c20291db6a212c6702bd343615
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerAware.php
@@ -0,0 +1,51 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence;
+
+use Doctrine\Common\Persistence\Mapping\ClassMetadata;
+
+/**
+ * Makes a Persistent Objects aware of its own object-manager.
+ *
+ * Using this interface the managing object manager and class metadata instances
+ * are injected into the persistent object after construction. This allows
+ * you to implement ActiveRecord functionality on top of the persistence-ignorance
+ * that Doctrine propagates.
+ *
+ * Word of Warning: This is a very powerful hook to change how you can work with your domain models.
+ * Using this hook will break the Single Responsibility Principle inside your Domain Objects
+ * and increase the coupling of database and objects.
+ *
+ * Every ObjectManager has to implement this functionality itself.
+ *
+ * @author Benjamin Eberlei
+ */
+interface ObjectManagerAware
+{
+ /**
+ * Injects responsible ObjectManager and the ClassMetadata into this persistent object.
+ *
+ * @param ObjectManager $objectManager
+ * @param ClassMetadata $classMetadata
+ *
+ * @return void
+ */
+ public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata);
+}
diff --git a/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerDecorator.php b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerDecorator.php
new file mode 100644
index 0000000000000000000000000000000000000000..8946475dbac7901de4d18d73dc227910df09fd71
--- /dev/null
+++ b/vendor/doctrine/common/lib/Doctrine/Common/Persistence/ObjectManagerDecorator.php
@@ -0,0 +1,140 @@
+.
+ */
+
+namespace Doctrine\Common\Persistence;
+
+/**
+ * Base class to simplify ObjectManager decorators
+ *
+ * @license http://opensource.org/licenses/MIT MIT
+ * @link www.doctrine-project.org
+ * @since 2.4
+ * @author Lars Strojny