diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..f4240d7
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,5 @@
+{
+    "require": {
+        "egulias/email-validator": "^1.2"
+    }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..c2a72eb
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,123 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "hash": "33d0837c52b00e562ab35240b78ee9c2",
+    "packages": [
+        {
+            "name": "doctrine/lexer",
+            "version": "v1.0.1",
+            "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"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2014-09-09 13:34:57"
+        },
+        {
+            "name": "egulias/email-validator",
+            "version": "1.2.8",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/egulias/EmailValidator.git",
+                "reference": "5631c3fe2e56cd5a3f79b20fae970d884a5ff951"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/5631c3fe2e56cd5a3f79b20fae970d884a5ff951",
+                "reference": "5631c3fe2e56cd5a3f79b20fae970d884a5ff951",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/lexer": "~1.0,>=1.0.1",
+                "php": ">= 5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4",
+                "satooshi/php-coveralls": "dev-master"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.3.x-dev"
+                }
+            },
+            "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",
+                "validation",
+                "validator"
+            ],
+            "time": "2015-04-26 15:49:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": []
+}
diff --git a/includes/common.inc b/includes/common.inc
index cd30145..9ddc092 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -1202,7 +1202,7 @@ function fix_gpc_magic() {
  * Verifies the syntax of the given e-mail address.
  *
  * This uses the
- * @link http://php.net/manual/filter.filters.validate.php PHP e-mail validation filter. @endlink
+ * @link https://github.com/egulias/EmailValidator Egulias e-mail validation filter. @endlink
  *
  * @param $mail
  *   A string containing an e-mail address.
@@ -1211,7 +1211,9 @@ function fix_gpc_magic() {
  *   TRUE if the address is in a valid format.
  */
 function valid_email_address($mail) {
-  return (bool)filter_var($mail, FILTER_VALIDATE_EMAIL);
+  require_once __DIR__ . '/../vendor/autoload.php';
+  $validator = new Egulias\EmailValidator\EmailValidator;
+  return $validator->isValid($mail);
 }
 
 /**
diff --git a/vendor/autoload.php b/vendor/autoload.php
new file mode 100644
index 0000000..304abe6
--- /dev/null
+++ b/vendor/autoload.php
@@ -0,0 +1,7 @@
+<?php
+
+// autoload.php @generated by Composer
+
+require_once __DIR__ . '/composer' . '/autoload_real.php';
+
+return ComposerAutoloaderInit806d249bae92733987506896e4a66ba8::getLoader();
diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php
new file mode 100644
index 0000000..4e05d3b
--- /dev/null
+++ b/vendor/composer/ClassLoader.php
@@ -0,0 +1,413 @@
+<?php
+
+/*
+ * This file is part of Composer.
+ *
+ * (c) Nils Adermann <naderman@naderman.de>
+ *     Jordi Boggiano <j.boggiano@seld.be>
+ *
+ * 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 class loader
+ *
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+ *
+ *     $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 <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+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 (is_file($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-4 fallback dirs
+        foreach ($this->fallbackDirsPsr4 as $dir) {
+            if (is_file($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 (is_file($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+                            return $file;
+                        }
+                    }
+                }
+            }
+        }
+
+        // PSR-0 fallback dirs
+        foreach ($this->fallbackDirsPsr0 as $dir) {
+            if (is_file($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/autoload_classmap.php b/vendor/composer/autoload_classmap.php
new file mode 100644
index 0000000..7a91153
--- /dev/null
+++ b/vendor/composer/autoload_classmap.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_classmap.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php
new file mode 100644
index 0000000..cf0407a
--- /dev/null
+++ b/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,11 @@
+<?php
+
+// autoload_namespaces.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+    'Egulias\\' => array($vendorDir . '/egulias/email-validator/src'),
+    'Doctrine\\Common\\Lexer\\' => array($vendorDir . '/doctrine/lexer/lib'),
+);
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
new file mode 100644
index 0000000..b265c64
--- /dev/null
+++ b/vendor/composer/autoload_psr4.php
@@ -0,0 +1,9 @@
+<?php
+
+// autoload_psr4.php @generated by Composer
+
+$vendorDir = dirname(dirname(__FILE__));
+$baseDir = dirname($vendorDir);
+
+return array(
+);
diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php
new file mode 100644
index 0000000..9fbbc36
--- /dev/null
+++ b/vendor/composer/autoload_real.php
@@ -0,0 +1,50 @@
+<?php
+
+// autoload_real.php @generated by Composer
+
+class ComposerAutoloaderInit806d249bae92733987506896e4a66ba8
+{
+    private static $loader;
+
+    public static function loadClassLoader($class)
+    {
+        if ('Composer\Autoload\ClassLoader' === $class) {
+            require __DIR__ . '/ClassLoader.php';
+        }
+    }
+
+    public static function getLoader()
+    {
+        if (null !== self::$loader) {
+            return self::$loader;
+        }
+
+        spl_autoload_register(array('ComposerAutoloaderInit806d249bae92733987506896e4a66ba8', 'loadClassLoader'), true, true);
+        self::$loader = $loader = new \Composer\Autoload\ClassLoader();
+        spl_autoload_unregister(array('ComposerAutoloaderInit806d249bae92733987506896e4a66ba8', 'loadClassLoader'));
+
+        $map = require __DIR__ . '/autoload_namespaces.php';
+        foreach ($map as $namespace => $path) {
+            $loader->set($namespace, $path);
+        }
+
+        $map = require __DIR__ . '/autoload_psr4.php';
+        foreach ($map as $namespace => $path) {
+            $loader->setPsr4($namespace, $path);
+        }
+
+        $classMap = require __DIR__ . '/autoload_classmap.php';
+        if ($classMap) {
+            $loader->addClassMap($classMap);
+        }
+
+        $loader->register(true);
+
+        return $loader;
+    }
+}
+
+function composerRequire806d249bae92733987506896e4a66ba8($file)
+{
+    require $file;
+}
diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json
new file mode 100644
index 0000000..30e9549
--- /dev/null
+++ b/vendor/composer/installed.json
@@ -0,0 +1,111 @@
+[
+    {
+        "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": "egulias/email-validator",
+        "version": "1.2.8",
+        "version_normalized": "1.2.8.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/egulias/EmailValidator.git",
+            "reference": "5631c3fe2e56cd5a3f79b20fae970d884a5ff951"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/5631c3fe2e56cd5a3f79b20fae970d884a5ff951",
+            "reference": "5631c3fe2e56cd5a3f79b20fae970d884a5ff951",
+            "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-04-26 15:49:00",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.3.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",
+            "validation",
+            "validator"
+        ]
+    }
+]
diff --git a/vendor/doctrine/lexer/LICENSE b/vendor/doctrine/lexer/LICENSE
new file mode 100644
index 0000000..5e781fc
--- /dev/null
+++ b/vendor/doctrine/lexer/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/lexer/README.md b/vendor/doctrine/lexer/README.md
new file mode 100644
index 0000000..66f4430
--- /dev/null
+++ b/vendor/doctrine/lexer/README.md
@@ -0,0 +1,5 @@
+# Doctrine Lexer
+
+Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.
+
+This lexer is used in Doctrine Annotations and in Doctrine ORM (DQL).
diff --git a/vendor/doctrine/lexer/composer.json b/vendor/doctrine/lexer/composer.json
new file mode 100644
index 0000000..8cd694c
--- /dev/null
+++ b/vendor/doctrine/lexer/composer.json
@@ -0,0 +1,24 @@
+{
+    "name": "doctrine/lexer",
+    "type": "library",
+    "description": "Base library for a lexer that can be used in Top-Down, Recursive Descent Parsers.",
+    "keywords": ["lexer", "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": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
+    ],
+    "require": {
+        "php": ">=5.3.2"
+    },
+    "autoload": {
+        "psr-0": { "Doctrine\\Common\\Lexer\\": "lib/" }
+    },
+    "extra": {
+        "branch-alias": {
+            "dev-master": "1.0.x-dev"
+        }
+    }
+}
diff --git a/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php b/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php
new file mode 100644
index 0000000..399a552
--- /dev/null
+++ b/vendor/doctrine/lexer/lib/Doctrine/Common/Lexer/AbstractLexer.php
@@ -0,0 +1,327 @@
+<?php
+/*
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * This software consists of voluntary contributions made by many individuals
+ * and is licensed under the MIT license. For more information, see
+ * <http://www.doctrine-project.org>.
+ */
+
+namespace Doctrine\Common\Lexer;
+
+/**
+ * Base class for writing simple lexers, i.e. for creating small DSLs.
+ *
+ * @since  2.0
+ * @author Guilherme Blanco <guilhermeblanco@hotmail.com>
+ * @author Jonathan Wage <jonwage@gmail.com>
+ * @author Roman Borschel <roman@code-factory.org>
+ */
+abstract class AbstractLexer
+{
+    /**
+     * Lexer original input string.
+     *
+     * @var string
+     */
+    private $input;
+
+    /**
+     * Array of scanned tokens.
+     *
+     * Each token is an associative array containing three items:
+     *  - 'value'    : the string value of the token in the input string
+     *  - 'type'     : the type of the token (identifier, numeric, string, input
+     *                 parameter, none)
+     *  - 'position' : the position of the token in the input string
+     *
+     * @var array
+     */
+    private $tokens = array();
+
+    /**
+     * Current lexer position in input string.
+     *
+     * @var integer
+     */
+    private $position = 0;
+
+    /**
+     * Current peek of current lexer position.
+     *
+     * @var integer
+     */
+    private $peek = 0;
+
+    /**
+     * The next token in the input.
+     *
+     * @var array
+     */
+    public $lookahead;
+
+    /**
+     * The last matched/seen token.
+     *
+     * @var array
+     */
+    public $token;
+
+    /**
+     * Sets the input data to be tokenized.
+     *
+     * The Lexer is immediately reset and the new input tokenized.
+     * Any unprocessed tokens from any previous input are lost.
+     *
+     * @param string $input The input to be tokenized.
+     *
+     * @return void
+     */
+    public function setInput($input)
+    {
+        $this->input  = $input;
+        $this->tokens = array();
+
+        $this->reset();
+        $this->scan($input);
+    }
+
+    /**
+     * Resets the lexer.
+     *
+     * @return void
+     */
+    public function reset()
+    {
+        $this->lookahead = null;
+        $this->token = null;
+        $this->peek = 0;
+        $this->position = 0;
+    }
+
+    /**
+     * Resets the peek pointer to 0.
+     *
+     * @return void
+     */
+    public function resetPeek()
+    {
+        $this->peek = 0;
+    }
+
+    /**
+     * Resets the lexer position on the input to the given position.
+     *
+     * @param integer $position Position to place the lexical scanner.
+     *
+     * @return void
+     */
+    public function resetPosition($position = 0)
+    {
+        $this->position = $position;
+    }
+
+    /**
+     * Retrieve the original lexer's input until a given position. 
+     *
+     * @param integer $position
+     *
+     * @return string
+     */
+    public function getInputUntilPosition($position)
+    {
+        return substr($this->input, 0, $position);
+    }
+
+    /**
+     * Checks whether a given token matches the current lookahead.
+     *
+     * @param integer|string $token
+     *
+     * @return boolean
+     */
+    public function isNextToken($token)
+    {
+        return null !== $this->lookahead && $this->lookahead['type'] === $token;
+    }
+
+    /**
+     * Checks whether any of the given tokens matches the current lookahead.
+     *
+     * @param array $tokens
+     *
+     * @return boolean
+     */
+    public function isNextTokenAny(array $tokens)
+    {
+        return null !== $this->lookahead && in_array($this->lookahead['type'], $tokens, true);
+    }
+
+    /**
+     * Moves to the next token in the input string.
+     *
+     * @return boolean
+     */
+    public function moveNext()
+    {
+        $this->peek = 0;
+        $this->token = $this->lookahead;
+        $this->lookahead = (isset($this->tokens[$this->position]))
+            ? $this->tokens[$this->position++] : null;
+
+        return $this->lookahead !== null;
+    }
+
+    /**
+     * Tells the lexer to skip input tokens until it sees a token with the given value.
+     *
+     * @param string $type The token type to skip until.
+     *
+     * @return void
+     */
+    public function skipUntil($type)
+    {
+        while ($this->lookahead !== null && $this->lookahead['type'] !== $type) {
+            $this->moveNext();
+        }
+    }
+
+    /**
+     * Checks if given value is identical to the given token.
+     *
+     * @param mixed   $value
+     * @param integer $token
+     *
+     * @return boolean
+     */
+    public function isA($value, $token)
+    {
+        return $this->getType($value) === $token;
+    }
+
+    /**
+     * Moves the lookahead token forward.
+     *
+     * @return array|null The next token or NULL if there are no more tokens ahead.
+     */
+    public function peek()
+    {
+        if (isset($this->tokens[$this->position + $this->peek])) {
+            return $this->tokens[$this->position + $this->peek++];
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Peeks at the next token, returns it and immediately resets the peek.
+     *
+     * @return array|null The next token or NULL if there are no more tokens ahead.
+     */
+    public function glimpse()
+    {
+        $peek = $this->peek();
+        $this->peek = 0;
+        return $peek;
+    }
+
+    /**
+     * Scans the input string for tokens.
+     *
+     * @param string $input A query string.
+     *
+     * @return void
+     */
+    protected function scan($input)
+    {
+        static $regex;
+
+        if ( ! isset($regex)) {
+            $regex = sprintf(
+                '/(%s)|%s/%s',
+                implode(')|(', $this->getCatchablePatterns()),
+                implode('|', $this->getNonCatchablePatterns()),
+                $this->getModifiers()
+            );
+        }
+
+        $flags = PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_OFFSET_CAPTURE;
+        $matches = preg_split($regex, $input, -1, $flags);
+
+        foreach ($matches as $match) {
+            // Must remain before 'value' assignment since it can change content
+            $type = $this->getType($match[0]);
+
+            $this->tokens[] = array(
+                'value' => $match[0],
+                'type'  => $type,
+                'position' => $match[1],
+            );
+        }
+    }
+
+    /**
+     * Gets the literal for a given token.
+     *
+     * @param integer $token
+     *
+     * @return string
+     */
+    public function getLiteral($token)
+    {
+        $className = get_class($this);
+        $reflClass = new \ReflectionClass($className);
+        $constants = $reflClass->getConstants();
+
+        foreach ($constants as $name => $value) {
+            if ($value === $token) {
+                return $className . '::' . $name;
+            }
+        }
+
+        return $token;
+    }
+
+    /**
+     * Regex modifiers
+     *
+     * @return string
+     */
+    protected function getModifiers()
+    {
+        return 'i';
+    }
+
+    /**
+     * Lexical catchable patterns.
+     *
+     * @return array
+     */
+    abstract protected function getCatchablePatterns();
+
+    /**
+     * Lexical non-catchable patterns.
+     *
+     * @return array
+     */
+    abstract protected function getNonCatchablePatterns();
+
+    /**
+     * Retrieve token type. Also processes the token value if necessary.
+     *
+     * @param string $value
+     *
+     * @return integer
+     */
+    abstract protected function getType(&$value);
+}
diff --git a/vendor/egulias/email-validator/.coveralls.yml b/vendor/egulias/email-validator/.coveralls.yml
new file mode 100644
index 0000000..143c197
--- /dev/null
+++ b/vendor/egulias/email-validator/.coveralls.yml
@@ -0,0 +1,3 @@
+service_name: travis-ci
+src_dir:  .
+coverage_clover: build/logs/clover*.xml
diff --git a/vendor/egulias/email-validator/.gitignore b/vendor/egulias/email-validator/.gitignore
new file mode 100644
index 0000000..1630814
--- /dev/null
+++ b/vendor/egulias/email-validator/.gitignore
@@ -0,0 +1,2 @@
+report/
+vendor/
diff --git a/vendor/egulias/email-validator/.travis.yml b/vendor/egulias/email-validator/.travis.yml
new file mode 100644
index 0000000..f25de0f
--- /dev/null
+++ b/vendor/egulias/email-validator/.travis.yml
@@ -0,0 +1,36 @@
+sudo: false
+
+language: php
+
+php:
+  - 5.3
+  - 5.4
+  - 5.5
+  - 5.6
+  - 7.0
+  - hhvm
+
+env:
+  global:
+    - deps=no
+
+matrix:
+  fast_finish: true
+  include:
+    - php: 5.3
+      env: deps=low
+    - php: 5.6
+      env: deps=high
+
+install:
+  - if [ "$deps" = "no" ]; then composer install; fi
+  - if [ "$deps" = "low" ]; then composer update --prefer-lowest; fi
+  - if [ "$deps" = "high" ]; then composer update; fi
+
+script:
+ - mkdir -p build/logs
+ - phpunit --coverage-clover build/logs/clover.xml
+
+after_script:
+ - php vendor/bin/coveralls
+
diff --git a/vendor/egulias/email-validator/LICENSE b/vendor/egulias/email-validator/LICENSE
new file mode 100644
index 0000000..de4a25b
--- /dev/null
+++ b/vendor/egulias/email-validator/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2013 Eduardo Gulias Davis
+
+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/egulias/email-validator/README.md b/vendor/egulias/email-validator/README.md
new file mode 100644
index 0000000..ccda3fc
--- /dev/null
+++ b/vendor/egulias/email-validator/README.md
@@ -0,0 +1,59 @@
+#EmailValidator
+[![Build Status](https://travis-ci.org/egulias/EmailValidator.png?branch=master)](https://travis-ci.org/egulias/EmailValidator) [![Coverage Status](https://coveralls.io/repos/egulias/EmailValidator/badge.png?branch=master)](https://coveralls.io/r/egulias/EmailValidator?branch=master) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/egulias/EmailValidator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/egulias/EmailValidator/?branch=master) [![SensioLabsInsight](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6/small.png)](https://insight.sensiolabs.com/projects/22ba6692-9c02-42e5-a65d-1c5696bfffc6)
+=============================
+With the help of
+
+![Powered by PhpStorm](https://www.jetbrains.com/phpstorm/documentation/docs/logo_phpstorm.png)
+##Installation##
+
+Run the command below to install via Composer
+
+```shell
+composer require egulias/email-validator
+```
+
+##Usage##
+
+Simple example:
+
+```php
+<?php
+
+use Egulias\EmailValidator\EmailValidator;
+
+$validator = new EmailValidator;
+if ($validator->isValid($email)) {
+	echo $email . ' is a valid email address';
+}
+```
+
+More advanced example (returns detailed diagnostic error codes):
+
+```php
+<?php
+
+use Egulias\EmailValidator\EmailValidator;
+
+$validator = new EmailValidator;
+$email = 'dominic@sayers.cc';
+$result = $validator->isValid($email);
+
+if ($result) {
+	echo $email . ' is a valid email address';
+} else if ($validator->hasWarnings()) {
+	echo 'Warning! ' . $email . ' has unusual/deprecated features (result code ' . var_export($validator->getWarnings(), true) . ')';
+} else {
+	echo $email . ' is not a valid email address (result code ' . $validator->getError() . ')';
+}
+```
+
+##Contributors##
+As this is a port from another library and work, here are other people related to the previous:
+
+* Ricard Clau [@ricardclau](http://github.com/ricardclau):      	Performance against PHP built-in filter_var
+* Josepf Bielawski [@stloyd](http://github.com/stloyd):      		For its first re-work of Dominic's lib
+* Dominic Sayers [@dominicsayers](http://github.com/dominicsayers):  	The original isemail function
+
+##License##
+Released under the MIT License attached with this code.
+
diff --git a/vendor/egulias/email-validator/composer.json b/vendor/egulias/email-validator/composer.json
new file mode 100644
index 0000000..05856c4
--- /dev/null
+++ b/vendor/egulias/email-validator/composer.json
@@ -0,0 +1,29 @@
+{
+  "name":         "egulias/email-validator",
+  "description":  "A library for validating emails",
+  "homepage":     "https://github.com/egulias/EmailValidator",
+  "type":         "Library",
+  "keywords":     ["email", "validation", "validator"],
+  "license":      "MIT",
+  "authors": [
+    {"name": "Eduardo Gulias Davis"}
+  ],
+  "extra": {
+    "branch-alias": {
+      "dev-master": "1.3.x-dev"
+    }
+  },
+  "require":      {
+    "php": ">= 5.3.3",
+    "doctrine/lexer": "~1.0,>=1.0.1"
+  },
+  "require-dev" :   {
+    "satooshi/php-coveralls": "dev-master",
+    "phpunit/phpunit": "~4.4"
+  },
+  "autoload": {
+    "psr-0": {
+      "Egulias\\": "src/"
+    }
+  }
+}
diff --git a/vendor/egulias/email-validator/composer.lock b/vendor/egulias/email-validator/composer.lock
new file mode 100644
index 0000000..278d4f5
--- /dev/null
+++ b/vendor/egulias/email-validator/composer.lock
@@ -0,0 +1,1381 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "hash": "72202f3904e996a9dac3aeb9ffc85406",
+    "packages": [
+        {
+            "name": "doctrine/lexer",
+            "version": "v1.0.1",
+            "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"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2014-09-09 13:34:57"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "doctrine/instantiator",
+            "version": "1.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/doctrine/instantiator.git",
+                "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119",
+                "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119",
+                "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.*@ALPHA"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Doctrine\\Instantiator\\": "src"
+                }
+            },
+            "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"
+            ],
+            "time": "2014-10-13 12:58:55"
+        },
+        {
+            "name": "guzzle/guzzle",
+            "version": "v3.9.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle3.git",
+                "reference": "54991459675c1a2924122afbb0e5609ade581155"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/54991459675c1a2924122afbb0e5609ade581155",
+                "reference": "54991459675c1a2924122afbb0e5609ade581155",
+                "shasum": ""
+            },
+            "require": {
+                "ext-curl": "*",
+                "php": ">=5.3.3",
+                "symfony/event-dispatcher": "~2.1"
+            },
+            "replace": {
+                "guzzle/batch": "self.version",
+                "guzzle/cache": "self.version",
+                "guzzle/common": "self.version",
+                "guzzle/http": "self.version",
+                "guzzle/inflection": "self.version",
+                "guzzle/iterator": "self.version",
+                "guzzle/log": "self.version",
+                "guzzle/parser": "self.version",
+                "guzzle/plugin": "self.version",
+                "guzzle/plugin-async": "self.version",
+                "guzzle/plugin-backoff": "self.version",
+                "guzzle/plugin-cache": "self.version",
+                "guzzle/plugin-cookie": "self.version",
+                "guzzle/plugin-curlauth": "self.version",
+                "guzzle/plugin-error-response": "self.version",
+                "guzzle/plugin-history": "self.version",
+                "guzzle/plugin-log": "self.version",
+                "guzzle/plugin-md5": "self.version",
+                "guzzle/plugin-mock": "self.version",
+                "guzzle/plugin-oauth": "self.version",
+                "guzzle/service": "self.version",
+                "guzzle/stream": "self.version"
+            },
+            "require-dev": {
+                "doctrine/cache": "~1.3",
+                "monolog/monolog": "~1.0",
+                "phpunit/phpunit": "3.7.*",
+                "psr/log": "~1.0",
+                "symfony/class-loader": "~2.1",
+                "zendframework/zend-cache": "2.*,<2.3",
+                "zendframework/zend-log": "2.*,<2.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.9-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Guzzle": "src/",
+                    "Guzzle\\Tests": "tests/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Guzzle Community",
+                    "homepage": "https://github.com/guzzle/guzzle/contributors"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "rest",
+                "web service"
+            ],
+            "time": "2014-08-11 04:32:36"
+        },
+        {
+            "name": "phpunit/php-code-coverage",
+            "version": "2.0.15",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+                "reference": "34cc484af1ca149188d0d9e91412191e398e0b67"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/34cc484af1ca149188d0d9e91412191e398e0b67",
+                "reference": "34cc484af1ca149188d0d9e91412191e398e0b67",
+                "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.0",
+                "sebastian/version": "~1.0"
+            },
+            "require-dev": {
+                "ext-xdebug": ">=2.1.4",
+                "phpunit/phpunit": "~4"
+            },
+            "suggest": {
+                "ext-dom": "*",
+                "ext-xdebug": ">=2.2.1",
+                "ext-xmlwriter": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0.x-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2015-01-24 10:06:35"
+        },
+        {
+            "name": "phpunit/php-file-iterator",
+            "version": "1.3.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb",
+                "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "File/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "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"
+            ],
+            "time": "2013-10-10 15:34:57"
+        },
+        {
+            "name": "phpunit/php-text-template",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-text-template.git",
+                "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+                "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "Text/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "license": [
+                "BSD-3-Clause"
+            ],
+            "authors": [
+                {
+                    "name": "Sebastian Bergmann",
+                    "email": "sb@sebastian-bergmann.de",
+                    "role": "lead"
+                }
+            ],
+            "description": "Simple template engine.",
+            "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+            "keywords": [
+                "template"
+            ],
+            "time": "2014-01-30 17:20:04"
+        },
+        {
+            "name": "phpunit/php-timer",
+            "version": "1.0.5",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-timer.git",
+                "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
+                "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "autoload": {
+                "classmap": [
+                    "PHP/"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "include-path": [
+                ""
+            ],
+            "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"
+            ],
+            "time": "2013-08-02 07:42:54"
+        },
+        {
+            "name": "phpunit/php-token-stream",
+            "version": "1.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+                "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/db32c18eba00b121c145575fcbcd4d4d24e6db74",
+                "reference": "db32c18eba00b121c145575fcbcd4d4d24e6db74",
+                "shasum": ""
+            },
+            "require": {
+                "ext-tokenizer": "*",
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2015-01-17 09:51:32"
+        },
+        {
+            "name": "phpunit/phpunit",
+            "version": "4.4.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit.git",
+                "reference": "2047ae17f6e8cfd10fbde0b4535c97eb22d99cbe"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2047ae17f6e8cfd10fbde0b4535c97eb22d99cbe",
+                "reference": "2047ae17f6e8cfd10fbde0b4535c97eb22d99cbe",
+                "shasum": ""
+            },
+            "require": {
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-pcre": "*",
+                "ext-reflection": "*",
+                "ext-spl": "*",
+                "php": ">=5.3.3",
+                "phpunit/php-code-coverage": "~2.0",
+                "phpunit/php-file-iterator": "~1.3.2",
+                "phpunit/php-text-template": "~1.2",
+                "phpunit/php-timer": "~1.0.2",
+                "phpunit/phpunit-mock-objects": "~2.3",
+                "sebastian/comparator": "~1.0",
+                "sebastian/diff": "~1.1",
+                "sebastian/environment": "~1.1",
+                "sebastian/exporter": "~1.0",
+                "sebastian/global-state": "~1.0",
+                "sebastian/version": "~1.0",
+                "symfony/yaml": "~2.0"
+            },
+            "suggest": {
+                "phpunit/php-invoker": "~1.1"
+            },
+            "bin": [
+                "phpunit"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "4.4.x-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2015-01-24 14:23:56"
+        },
+        {
+            "name": "phpunit/phpunit-mock-objects",
+            "version": "2.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+                "reference": "c63d2367247365f688544f0d500af90a11a44c65"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/c63d2367247365f688544f0d500af90a11a44c65",
+                "reference": "c63d2367247365f688544f0d500af90a11a44c65",
+                "shasum": ""
+            },
+            "require": {
+                "doctrine/instantiator": "~1.0,>=1.0.1",
+                "php": ">=5.3.3",
+                "phpunit/php-text-template": "~1.2"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.3"
+            },
+            "suggest": {
+                "ext-soap": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.3.x-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2014-10-03 05:12:11"
+        },
+        {
+            "name": "psr/log",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
+                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Psr\\Log\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2012-12-21 11:40:51"
+        },
+        {
+            "name": "satooshi/php-coveralls",
+            "version": "dev-master",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/satooshi/php-coveralls.git",
+                "reference": "2fbf803803d179ab1082807308a67bbd5a760c70"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/2fbf803803d179ab1082807308a67bbd5a760c70",
+                "reference": "2fbf803803d179ab1082807308a67bbd5a760c70",
+                "shasum": ""
+            },
+            "require": {
+                "ext-json": "*",
+                "ext-simplexml": "*",
+                "guzzle/guzzle": ">=2.7",
+                "php": ">=5.3",
+                "psr/log": "1.0.0",
+                "symfony/config": ">=2.0",
+                "symfony/console": ">=2.0",
+                "symfony/stopwatch": ">=2.2",
+                "symfony/yaml": ">=2.0"
+            },
+            "require-dev": {
+                "apigen/apigen": "2.8.*@stable",
+                "pdepend/pdepend": "dev-master as 2.0.0",
+                "phpmd/phpmd": "dev-master",
+                "phpunit/php-invoker": ">=1.1.0,<1.2.0",
+                "phpunit/phpunit": "3.7.*@stable",
+                "sebastian/finder-facade": "dev-master",
+                "sebastian/phpcpd": "1.4.*@stable",
+                "squizlabs/php_codesniffer": "1.4.*@stable",
+                "theseer/fdomdocument": "dev-master"
+            },
+            "suggest": {
+                "symfony/http-kernel": "Allows Symfony integration"
+            },
+            "bin": [
+                "composer/bin/coveralls"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "0.7-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Satooshi\\Component": "src/",
+                    "Satooshi\\Bundle": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Kitamura Satoshi",
+                    "email": "with.no.parachute@gmail.com",
+                    "homepage": "https://www.facebook.com/satooshi.jp"
+                }
+            ],
+            "description": "PHP client library for Coveralls API",
+            "homepage": "https://github.com/satooshi/php-coveralls",
+            "keywords": [
+                "ci",
+                "coverage",
+                "github",
+                "test"
+            ],
+            "time": "2014-11-11 15:35:34"
+        },
+        {
+            "name": "sebastian/comparator",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/comparator.git",
+                "reference": "c484a80f97573ab934e37826dba0135a3301b26a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c484a80f97573ab934e37826dba0135a3301b26a",
+                "reference": "c484a80f97573ab934e37826dba0135a3301b26a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/diff": "~1.1",
+                "sebastian/exporter": "~1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.1"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2014-11-16 21:32:38"
+        },
+        {
+            "name": "sebastian/diff",
+            "version": "1.2.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/diff.git",
+                "reference": "5843509fed39dee4b356a306401e9dd1a931fec7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5843509fed39dee4b356a306401e9dd1a931fec7",
+                "reference": "5843509fed39dee4b356a306401e9dd1a931fec7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.2"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2014-08-15 10:29:00"
+        },
+        {
+            "name": "sebastian/environment",
+            "version": "1.2.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/environment.git",
+                "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e6c71d918088c251b181ba8b3088af4ac336dd7",
+                "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.2.x-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2014-10-25 08:00:45"
+        },
+        {
+            "name": "sebastian/exporter",
+            "version": "1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/exporter.git",
+                "reference": "35ab8d385eef068186c83e23ae83c96b0288b3ee"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/35ab8d385eef068186c83e23ae83c96b0288b3ee",
+                "reference": "35ab8d385eef068186c83e23ae83c96b0288b3ee",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "sebastian/recursion-context": "~1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2015-01-24 09:57:24"
+        },
+        {
+            "name": "sebastian/global-state",
+            "version": "1.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": "*"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "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"
+            ],
+            "time": "2014-10-06 09:23:50"
+        },
+        {
+            "name": "sebastian/recursion-context",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/recursion-context.git",
+                "reference": "3989662bbb30a29d20d9faa04a846af79b276252"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252",
+                "reference": "3989662bbb30a29d20d9faa04a846af79b276252",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.4"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "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",
+            "time": "2015-01-24 09:48:32"
+        },
+        {
+            "name": "sebastian/version",
+            "version": "1.0.4",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/sebastianbergmann/version.git",
+                "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/a77d9123f8e809db3fbdea15038c27a95da4058b",
+                "reference": "a77d9123f8e809db3fbdea15038c27a95da4058b",
+                "shasum": ""
+            },
+            "type": "library",
+            "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",
+            "time": "2014-12-15 14:25:24"
+        },
+        {
+            "name": "symfony/config",
+            "version": "v2.6.1",
+            "target-dir": "Symfony/Component/Config",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Config.git",
+                "reference": "84c0c150c1520995f09ea9e47e817068b353cb0f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Config/zipball/84c0c150c1520995f09ea9e47e817068b353cb0f",
+                "reference": "84c0c150c1520995f09ea9e47e817068b353cb0f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "symfony/filesystem": "~2.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Config\\": ""
+                }
+            },
+            "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": "Symfony Config Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-12-02 20:19:20"
+        },
+        {
+            "name": "symfony/console",
+            "version": "v2.6.1",
+            "target-dir": "Symfony/Component/Console",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Console.git",
+                "reference": "ef825fd9f809d275926547c9e57cbf14968793e8"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Console/zipball/ef825fd9f809d275926547c9e57cbf14968793e8",
+                "reference": "ef825fd9f809d275926547c9e57cbf14968793e8",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "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": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Console\\": ""
+                }
+            },
+            "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": "Symfony Console Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-12-02 20:19:20"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v2.6.1",
+            "target-dir": "Symfony/Component/EventDispatcher",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/EventDispatcher.git",
+                "reference": "720fe9bca893df7ad1b4546649473b5afddf0216"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/720fe9bca893df7ad1b4546649473b5afddf0216",
+                "reference": "720fe9bca893df7ad1b4546649473b5afddf0216",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "psr/log": "~1.0",
+                "symfony/config": "~2.0",
+                "symfony/dependency-injection": "~2.6",
+                "symfony/expression-language": "~2.6",
+                "symfony/stopwatch": "~2.2"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                }
+            },
+            "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": "Symfony EventDispatcher Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-12-02 20:19:20"
+        },
+        {
+            "name": "symfony/filesystem",
+            "version": "v2.6.1",
+            "target-dir": "Symfony/Component/Filesystem",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Filesystem.git",
+                "reference": "ff6efc95256cb33031933729e68b01d720b5436b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Filesystem/zipball/ff6efc95256cb33031933729e68b01d720b5436b",
+                "reference": "ff6efc95256cb33031933729e68b01d720b5436b",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Filesystem\\": ""
+                }
+            },
+            "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": "Symfony Filesystem Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-12-02 20:19:20"
+        },
+        {
+            "name": "symfony/stopwatch",
+            "version": "v2.6.1",
+            "target-dir": "Symfony/Component/Stopwatch",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Stopwatch.git",
+                "reference": "261abd360cfb6ac65ea93ffd82073e2011d034fc"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Stopwatch/zipball/261abd360cfb6ac65ea93ffd82073e2011d034fc",
+                "reference": "261abd360cfb6ac65ea93ffd82073e2011d034fc",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Stopwatch\\": ""
+                }
+            },
+            "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": "Symfony Stopwatch Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-12-02 20:19:20"
+        },
+        {
+            "name": "symfony/yaml",
+            "version": "v2.6.1",
+            "target-dir": "Symfony/Component/Yaml",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Yaml.git",
+                "reference": "3346fc090a3eb6b53d408db2903b241af51dcb20"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Yaml/zipball/3346fc090a3eb6b53d408db2903b241af51dcb20",
+                "reference": "3346fc090a3eb6b53d408db2903b241af51dcb20",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.6-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Yaml\\": ""
+                }
+            },
+            "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": "Symfony Yaml Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-12-02 20:19:20"
+        }
+    ],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": {
+        "satooshi/php-coveralls": 20
+    },
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": {
+        "php": ">= 5.3.3"
+    },
+    "platform-dev": []
+}
diff --git a/vendor/egulias/email-validator/documentation/Other.md b/vendor/egulias/email-validator/documentation/Other.md
new file mode 100644
index 0000000..9ec4bd9
--- /dev/null
+++ b/vendor/egulias/email-validator/documentation/Other.md
@@ -0,0 +1,69 @@
+Email length
+------------
+http://tools.ietf.org/html/rfc5321#section-4.1.2
+  Forward-path   = Path
+
+  Path           = "<" [ A-d-l ":" ] Mailbox ">"
+
+http://tools.ietf.org/html/rfc5321#section-4.5.3.1.3
+http://tools.ietf.org/html/rfc1035#section-2.3.4
+
+DNS
+---
+
+http://tools.ietf.org/html/rfc5321#section-2.3.5
+  Names that can
+  be resolved to MX RRs or address (i.e., A or AAAA) RRs (as discussed
+  in Section 5) are permitted, as are CNAME RRs whose targets can be
+  resolved, in turn, to MX or address RRs.
+
+http://tools.ietf.org/html/rfc5321#section-5.1
+  The lookup first attempts to locate an MX record associated with the
+  name.  If a CNAME record is found, the resulting name is processed as
+  if it were the initial name. ... If an empty list of MXs is returned,
+  the address is treated as if it was associated with an implicit MX
+  RR, with a preference of 0, pointing to that host.
+
+is_email() author's note: We will regard the existence of a CNAME to be
+sufficient evidence of the domain's existence. For performance reasons
+we will not repeat the DNS lookup for the CNAME's target, but we will
+raise a warning because we didn't immediately find an MX record.
+
+Check for TLD addresses
+-----------------------
+TLD addresses are specifically allowed in RFC 5321 but they are
+unusual to say the least. We will allocate a separate
+status to these addresses on the basis that they are more likely
+to be typos than genuine addresses (unless we've already
+established that the domain does have an MX record)
+
+http://tools.ietf.org/html/rfc5321#section-2.3.5
+  In the case
+  of a top-level domain used by itself in an email address, a single
+  string is used without any dots.  This makes the requirement,
+  described in more detail below, that only fully-qualified domain
+  names appear in SMTP transactions on the public Internet,
+  particularly important where top-level domains are involved.
+
+TLD format
+----------
+The format of TLDs has changed a number of times. The standards
+used by IANA have been largely ignored by ICANN, leading to
+confusion over the standards being followed. These are not defined
+anywhere, except as a general component of a DNS host name (a label).
+However, this could potentially lead to 123.123.123.123 being a
+valid DNS name (rather than an IP address) and thereby creating
+an ambiguity. The most authoritative statement on TLD formats that
+the author can find is in a (rejected!) erratum to RFC 1123
+submitted by John Klensin, the author of RFC 5321:
+
+http://www.rfc-editor.org/errata_search.php?rfc=1123&eid=1353
+  However, a valid host name can never have the dotted-decimal
+  form #.#.#.#, since this change does not permit the highest-level
+  component label to start with a digit even if it is not all-numeric.
+
+Comments
+--------
+Comments at the start of the domain are deprecated in the text
+Comments at the start of a subdomain are obs-domain
+(http://tools.ietf.org/html/rfc5322#section-3.4.1)
diff --git a/vendor/egulias/email-validator/documentation/RFC5321BNF.html b/vendor/egulias/email-validator/documentation/RFC5321BNF.html
new file mode 100644
index 0000000..b8247b7
--- /dev/null
+++ b/vendor/egulias/email-validator/documentation/RFC5321BNF.html
@@ -0,0 +1,89 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<title>The BNF from RFC 5321 defining parts of a valid SMTP address</title>
+</head>
+
+<body>
+<pre style="font-size:11px;">
+   Mailbox        = Local-part "@" ( Domain / address-literal )
+
+   Local-part     = Dot-string / Quoted-string
+                  ; MAY be case-sensitive
+
+
+   Dot-string     = Atom *("."  Atom)
+
+   Atom           = 1*atext
+
+   Quoted-string  = DQUOTE *QcontentSMTP DQUOTE
+
+   QcontentSMTP   = qtextSMTP / quoted-pairSMTP
+
+   quoted-pairSMTP  = %d92 %d32-126
+                    ; i.e., backslash followed by any ASCII
+                    ; graphic (including itself) or SPace
+
+   qtextSMTP      = %d32-33 / %d35-91 / %d93-126
+                  ; i.e., within a quoted string, any
+                  ; ASCII graphic or space is permitted
+                  ; without blackslash-quoting except
+                  ; double-quote and the backslash itself.
+
+   Domain         = sub-domain *("." sub-domain)
+
+   sub-domain     = Let-dig [Ldh-str]
+
+   Let-dig        = ALPHA / DIGIT
+
+   Ldh-str        = *( ALPHA / DIGIT / "-" ) Let-dig
+
+   address-literal  = "[" ( IPv4-address-literal /
+                    IPv6-address-literal /
+                    General-address-literal ) "]"
+                    ; See Section 4.1.3
+
+   IPv4-address-literal  = Snum 3("."  Snum)
+
+   IPv6-address-literal  = "IPv6:" IPv6-addr
+
+   General-address-literal  = Standardized-tag ":" 1*dcontent
+
+   Standardized-tag  = Ldh-str
+                     ; Standardized-tag MUST be specified in a
+                     ; Standards-Track RFC and registered with IANA
+
+   dcontent       = %d33-90 / ; Printable US-ASCII
+                  %d94-126 ; excl. "[", "\", "]"
+
+   Snum           = 1*3DIGIT
+                  ; representing a decimal integer
+                  ; value in the range 0 through 255
+
+   IPv6-addr      = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp
+
+   IPv6-hex       = 1*4HEXDIG
+
+   IPv6-full      = IPv6-hex 7(":" IPv6-hex)
+
+   IPv6-comp      = [IPv6-hex *5(":" IPv6-hex)] "::"
+                  [IPv6-hex *5(":" IPv6-hex)]
+                  ; The "::" represents at least 2 16-bit groups of
+                  ; zeros.  No more than 6 groups in addition to the
+                  ; "::" may be present.
+
+   IPv6v4-full    = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal
+
+   IPv6v4-comp    = [IPv6-hex *3(":" IPv6-hex)] "::"
+                  [IPv6-hex *3(":" IPv6-hex) ":"]
+                  IPv4-address-literal
+                  ; The "::" represents at least 2 16-bit groups of
+                  ; zeros.  No more than 4 groups in addition to the
+                  ; "::" and IPv4-address-literal may be present.
+
+</pre>
+</body>
+
+</html>
diff --git a/vendor/egulias/email-validator/documentation/RFC5322BNF.html b/vendor/egulias/email-validator/documentation/RFC5322BNF.html
new file mode 100644
index 0000000..98bd155
--- /dev/null
+++ b/vendor/egulias/email-validator/documentation/RFC5322BNF.html
@@ -0,0 +1,141 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+<title>The BNF from RFC 5322 defining parts of a valid internet message address</title>
+</head>
+
+<body>
+<pre style="font-size:11px;">
+   addr-spec       =   local-part "@" domain
+
+   local-part      =   dot-atom / quoted-string / obs-local-part
+
+   dot-atom        =   [CFWS] dot-atom-text [CFWS]
+
+   CFWS            =   (1*([FWS] comment) [FWS]) / FWS
+
+   FWS             =   ([*WSP CRLF] 1*WSP) /  obs-FWS
+                                          ; Folding white space
+
+   WSP             =   SP / HTAB          ; white space
+
+   obs-FWS         =   1*([CRLF] WSP)     ; As amended in erratum #1908
+
+   ctext           =   %d33-39 /          ; Printable US-ASCII
+                       %d42-91 /          ;  characters not including
+                       %d93-126 /         ;  "(", ")", or "\"
+                       obs-ctext
+
+   obs-ctext       =   obs-NO-WS-CTL
+   ccontent        =   ctext / quoted-pair / comment
+
+   comment         =   "(" *([FWS] ccontent) [FWS] ")"
+
+   dot-atom-text   =   1*atext *("." 1*atext)
+
+   atext           =   ALPHA / DIGIT /    ; Printable US-ASCII
+                       "!" / "#" /        ;  characters not including
+                       "$" / "%" /        ;  specials.  Used for atoms.
+                       "&amp;" / "'" /
+                       "*" / "+" /
+                       "-" / "/" /
+                       "=" / "?" /
+                       "^" / "_" /
+                       "`" / "{" /
+                       "|" / "}" /
+                       "~"
+
+   specials        =   "(" / ")" /        ; Special characters that do
+                       "&lt;" / "&gt;" /        ;  not appear in atext
+                       "[" / "]" /
+                       ":" / ";" /
+                       "@" / "\" /
+                       "," / "." /
+                       DQUOTE
+
+   quoted-string   =   [CFWS]
+                       DQUOTE *([FWS] qcontent) [FWS] DQUOTE
+                       [CFWS]
+
+   qcontent        =   qtext / quoted-pair
+
+   qtext           =   %d33 /             ; Printable US-ASCII
+                       %d35-91 /          ;  characters not including
+                       %d93-126 /         ;  "\" or the quote character
+                       obs-qtext
+
+   obs-qtext       =   obs-NO-WS-CTL
+
+   obs-NO-WS-CTL   =   %d1-8 /            ; US-ASCII control
+                       %d11 /             ;  characters that do not
+                       %d12 /             ;  include the carriage
+                       %d14-31 /          ;  return, line feed, and
+                       %d127              ;  white space characters
+
+   quoted-pair     =   ("\" (VCHAR / WSP)) / obs-qp
+
+   VCHAR           =   %x21-7E            ; visible (printing) characters
+
+   obs-qp          =   "\" (%d0 / obs-NO-WS-CTL / LF / CR)
+
+   obs-local-part  =   word *("." word)
+
+   word            =   atom / quoted-string
+
+   atom            =   [CFWS] 1*atext [CFWS]
+
+   domain          =   dot-atom / domain-literal / obs-domain
+
+   domain-literal  =   [CFWS] "[" *([FWS] dtext) [FWS] "]" [CFWS]
+
+   dtext           =   %d33-90 /          ; Printable US-ASCII
+                       %d94-126 /         ;  characters not including
+                       obs-dtext          ;  "[", "]", or "\"
+
+   obs-dtext       =   obs-NO-WS-CTL / quoted-pair
+
+   obs-domain      =   atom *("." atom)
+
+NB For SMTP mail, the domain-literal is restricted by RFC5321 as follows:
+
+   Mailbox        = Local-part "@" ( Domain / address-literal )
+
+   address-literal  = "[" ( IPv4-address-literal /
+                    IPv6-address-literal /
+                    General-address-literal ) "]"
+
+   IPv4-address-literal  = Snum 3("."  Snum)
+
+   IPv6-address-literal  = "IPv6:" IPv6-addr
+
+   Snum           = 1*3DIGIT
+                  ; representing a decimal integer
+                  ; value in the range 0 through 255
+
+   IPv6-addr      = IPv6-full / IPv6-comp / IPv6v4-full / IPv6v4-comp
+
+   IPv6-hex       = 1*4HEXDIG
+
+   IPv6-full      = IPv6-hex 7(":" IPv6-hex)
+
+   IPv6-comp      = [IPv6-hex *5(":" IPv6-hex)] "::"
+                  [IPv6-hex *5(":" IPv6-hex)]
+                  ; The "::" represents at least 2 16-bit groups of
+                  ; zeros.  No more than 6 groups in addition to the
+                  ; "::" may be present.
+
+   IPv6v4-full    = IPv6-hex 5(":" IPv6-hex) ":" IPv4-address-literal
+
+   IPv6v4-comp    = [IPv6-hex *3(":" IPv6-hex)] "::"
+                  [IPv6-hex *3(":" IPv6-hex) ":"]
+                  IPv4-address-literal
+                  ; The "::" represents at least 2 16-bit groups of
+                  ; zeros.  No more than 4 groups in addition to the
+                  ; "::" and IPv4-address-literal may be present.
+
+</pre>
+</body>
+
+</html>
diff --git a/vendor/egulias/email-validator/phpunit.xml.dist b/vendor/egulias/email-validator/phpunit.xml.dist
new file mode 100644
index 0000000..f335ec1
--- /dev/null
+++ b/vendor/egulias/email-validator/phpunit.xml.dist
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         backupStaticAttributes="false"
+         colors="true"
+         convertErrorsToExceptions="true"
+         convertNoticesToExceptions="true"
+         convertWarningsToExceptions="true"
+         processIsolation="false"
+         stopOnFailure="false"
+         syntaxCheck="false"
+         bootstrap="tests/bootstrap.php"
+>
+<testsuites>
+  <testsuite name="EmailValidator Test Suite">
+    <directory>./tests/egulias/Tests/</directory>
+    <exclude>./vendor/</exclude>
+  </testsuite>
+</testsuites>
+
+<filter>
+  <blacklist>
+    <directory>./vendor</directory>
+  </blacklist>
+</filter>
+</phpunit>
diff --git a/vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailLexer.php b/vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailLexer.php
new file mode 100644
index 0000000..d8522ff
--- /dev/null
+++ b/vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailLexer.php
@@ -0,0 +1,223 @@
+<?php
+
+namespace Egulias\EmailValidator;
+
+use Doctrine\Common\Lexer\AbstractLexer;
+
+class EmailLexer extends AbstractLexer
+{
+    //ASCII values
+    const C_DEL              = 127;
+    const C_NUL              = 0;
+    const S_AT               = 64;
+    const S_BACKSLASH        = 92;
+    const S_DOT              = 46;
+    const S_DQUOTE           = 34;
+    const S_OPENPARENTHESIS  = 49;
+    const S_CLOSEPARENTHESIS = 261;
+    const S_OPENBRACKET      = 262;
+    const S_CLOSEBRACKET     = 263;
+    const S_HYPHEN           = 264;
+    const S_COLON            = 265;
+    const S_DOUBLECOLON      = 266;
+    const S_SP               = 267;
+    const S_HTAB             = 268;
+    const S_CR               = 269;
+    const S_LF               = 270;
+    const S_IPV6TAG          = 271;
+    const S_LOWERTHAN        = 272;
+    const S_GREATERTHAN      = 273;
+    const S_COMMA            = 274;
+    const S_SEMICOLON        = 275;
+    const S_OPENQBRACKET     = 276;
+    const S_CLOSEQBRACKET    = 277;
+    const S_SLASH            = 278;
+    const S_EMPTY            = null;
+    const GENERIC            = 300;
+    const CRLF               = 301;
+    const INVALID            = 302;
+    const ASCII_INVALID_FROM = 127;
+    const ASCII_INVALID_TO   = 199;
+
+    /**
+     * US-ASCII visible characters not valid for atext (@link http://tools.ietf.org/html/rfc5322#section-3.2.3)
+     *
+     * @var array
+     */
+    protected $charValue = array(
+        '('    => self::S_OPENPARENTHESIS,
+        ')'    => self::S_CLOSEPARENTHESIS,
+        '<'    => self::S_LOWERTHAN,
+        '>'    => self::S_GREATERTHAN,
+        '['    => self::S_OPENBRACKET,
+        ']'    => self::S_CLOSEBRACKET,
+        ':'    => self::S_COLON,
+        ';'    => self::S_SEMICOLON,
+        '@'    => self::S_AT,
+        '\\'   => self::S_BACKSLASH,
+        '/'    => self::S_SLASH,
+        ','    => self::S_COMMA,
+        '.'    => self::S_DOT,
+        '"'    => self::S_DQUOTE,
+        '-'    => self::S_HYPHEN,
+        '::'   => self::S_DOUBLECOLON,
+        ' '    => self::S_SP,
+        "\t"   => self::S_HTAB,
+        "\r"   => self::S_CR,
+        "\n"   => self::S_LF,
+        "\r\n" => self::CRLF,
+        'IPv6' => self::S_IPV6TAG,
+        '<'    => self::S_LOWERTHAN,
+        '>'    => self::S_GREATERTHAN,
+        '{'    => self::S_OPENQBRACKET,
+        '}'    => self::S_CLOSEQBRACKET,
+        ''     => self::S_EMPTY,
+        '\0'   => self::C_NUL,
+    );
+
+    protected $hasInvalidTokens = false;
+
+    protected $previous;
+
+    public function reset()
+    {
+        $this->hasInvalidTokens = false;
+        parent::reset();
+    }
+
+    public function hasInvalidTokens()
+    {
+        return $this->hasInvalidTokens;
+    }
+
+    /**
+     * @param $type
+     * @throws \UnexpectedValueException
+     * @return boolean
+     */
+    public function find($type)
+    {
+        $search = clone $this;
+        $search->skipUntil($type);
+
+        if (!$search->lookahead) {
+            throw new \UnexpectedValueException($type . ' not found');
+        }
+        return true;
+    }
+
+    /**
+     * getPrevious
+     *
+     * @return array token
+     */
+    public function getPrevious()
+    {
+        return $this->previous;
+    }
+
+    /**
+     * moveNext
+     *
+     * @return boolean
+     */
+    public function moveNext()
+    {
+        $this->previous = $this->token;
+
+        return parent::moveNext();
+    }
+
+    /**
+     * Lexical catchable patterns.
+     *
+     * @return string[]
+     */
+    protected function getCatchablePatterns()
+    {
+        return array(
+            '[a-zA-Z_]+[46]?', //ASCII and domain literal
+            '[^\x00-\x7F]',  //UTF-8
+            '[0-9]+',
+            '\r\n',
+            '::',
+            '\s+?',
+            '.',
+            );
+    }
+
+    /**
+     * Lexical non-catchable patterns.
+     *
+     * @return string[]
+     */
+    protected function getNonCatchablePatterns()
+    {
+        return array('[\xA0-\xff]+');
+    }
+
+    /**
+     * Retrieve token type. Also processes the token value if necessary.
+     *
+     * @param string $value
+     * @throws \InvalidArgumentException
+     * @return integer
+     */
+    protected function getType(&$value)
+    {
+        if ($this->isNullType($value)) {
+            return self::C_NUL;
+        }
+
+        if ($this->isValid($value)) {
+            return $this->charValue[$value];
+        }
+
+        if ($this->isUTF8Invalid($value)) {
+            $this->hasInvalidTokens = true;
+            return self::INVALID;
+        }
+
+        return  self::GENERIC;
+    }
+
+    protected function isValid($value)
+    {
+        if (isset($this->charValue[$value])) {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * @param $value
+     * @return bool
+     */
+    protected function isNullType($value)
+    {
+        if ($value === "\0") {
+            return true;
+        }
+
+        return false;
+    }
+
+    /**
+     * @param $value
+     * @return bool
+     */
+    protected function isUTF8Invalid($value)
+    {
+        if (preg_match('/\p{Cc}+/u', $value)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    protected function getModifiers()
+    {
+        return 'iu';
+    }
+}
diff --git a/vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailParser.php b/vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailParser.php
new file mode 100644
index 0000000..5f4c4aa
--- /dev/null
+++ b/vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailParser.php
@@ -0,0 +1,100 @@
+<?php
+
+namespace Egulias\EmailValidator;
+
+use Egulias\EmailValidator\Parser\DomainPart;
+use Egulias\EmailValidator\Parser\LocalPart;
+
+/**
+ * EmailParser
+ *
+ * @author Eduardo Gulias Davis <me@egulias.com>
+ */
+class EmailParser
+{
+    const EMAIL_MAX_LENGTH = 254;
+
+    protected $warnings = array();
+    protected $domainPart = '';
+    protected $localPart = '';
+    protected $lexer;
+    protected $localPartParser;
+    protected $domainPartParser;
+
+    public function __construct(EmailLexer $lexer)
+    {
+        $this->lexer = $lexer;
+        $this->localPartParser = new LocalPart($this->lexer);
+        $this->domainPartParser = new DomainPart($this->lexer);
+    }
+
+    /**
+     * @param $str
+     * @return array
+     */
+    public function parse($str)
+    {
+        $this->lexer->setInput($str);
+
+        if (!$this->hasAtToken()) {
+            throw new \InvalidArgumentException('ERR_NOLOCALPART');
+        }
+
+
+        $this->localPartParser->parse($str);
+        $this->domainPartParser->parse($str);
+
+        $this->setParts($str);
+
+        if ($this->lexer->hasInvalidTokens()) {
+            throw new \InvalidArgumentException('ERR_INVALID_ATEXT');
+        }
+
+        return array('local' => $this->localPart, 'domain' => $this->domainPart);
+    }
+
+    public function getWarnings()
+    {
+        $localPartWarnings = $this->localPartParser->getWarnings();
+        $domainPartWarnings = $this->domainPartParser->getWarnings();
+
+        $this->warnings = array_merge($localPartWarnings, $domainPartWarnings);
+        $this->addLongEmailWarning($this->localPart, $this->domainPart);
+
+        return $this->warnings;
+    }
+
+    public function getParsedDomainPart()
+    {
+        return $this->domainPart;
+    }
+
+    protected function setParts($email)
+    {
+        $parts = explode('@', $email);
+        $this->domainPart = $this->domainPartParser->getDomainPart();
+        $this->localPart = $parts[0];
+    }
+
+    protected function hasAtToken()
+    {
+        $this->lexer->moveNext();
+        $this->lexer->moveNext();
+        if ($this->lexer->token['type'] === EmailLexer::S_AT) {
+            return false;
+        }
+
+        return true;
+    }
+
+    /**
+     * @param string $localPart
+     * @param string $parsedDomainPart
+     */
+    protected function addLongEmailWarning($localPart, $parsedDomainPart)
+    {
+        if (strlen($localPart . '@' . $parsedDomainPart) > self::EMAIL_MAX_LENGTH) {
+            $this->warnings[] = EmailValidator::RFC5322_TOOLONG;
+        }
+    }
+}
diff --git a/vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailValidator.php b/vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailValidator.php
new file mode 100644
index 0000000..d047dec
--- /dev/null
+++ b/vendor/egulias/email-validator/src/Egulias/EmailValidator/EmailValidator.php
@@ -0,0 +1,169 @@
+<?php
+
+namespace Egulias\EmailValidator;
+
+/**
+ * EmailValidator
+ *
+ * @author Eduardo Gulias Davis <me@egulias.com>
+ */
+class EmailValidator
+{
+    const ERR_CONSECUTIVEATS     = 128;
+    const ERR_EXPECTING_DTEXT    = 129;
+    const ERR_NOLOCALPART        = 130;
+    const ERR_NODOMAIN           = 131;
+    const ERR_CONSECUTIVEDOTS    = 132;
+    const ERR_ATEXT_AFTER_CFWS   = 133;
+    const ERR_ATEXT_AFTER_QS     = 134;
+    const ERR_ATEXT_AFTER_DOMLIT = 135;
+    const ERR_EXPECTING_QPAIR    = 136;
+    const ERR_EXPECTING_ATEXT    = 137;
+    const ERR_EXPECTING_QTEXT    = 138;
+    const ERR_EXPECTING_CTEXT    = 139;
+    const ERR_BACKSLASHEND       = 140;
+    const ERR_DOT_START          = 141;
+    const ERR_DOT_END            = 142;
+    const ERR_DOMAINHYPHENSTART  = 143;
+    const ERR_DOMAINHYPHENEND    = 144;
+    const ERR_UNCLOSEDQUOTEDSTR  = 145;
+    const ERR_UNCLOSEDCOMMENT    = 146;
+    const ERR_UNCLOSEDDOMLIT     = 147;
+    const ERR_FWS_CRLF_X2        = 148;
+    const ERR_FWS_CRLF_END       = 149;
+    const ERR_CR_NO_LF           = 150;
+    const ERR_DEPREC_REACHED     = 151;
+    const RFC5321_TLD             = 9;
+    const RFC5321_TLDNUMERIC      = 10;
+    const RFC5321_QUOTEDSTRING    = 11;
+    const RFC5321_ADDRESSLITERAL  = 12;
+    const RFC5321_IPV6DEPRECATED  = 13;
+    const CFWS_COMMENT            = 17;
+    const CFWS_FWS                = 18;
+    const DEPREC_LOCALPART        = 33;
+    const DEPREC_FWS              = 34;
+    const DEPREC_QTEXT            = 35;
+    const DEPREC_QP               = 36;
+    const DEPREC_COMMENT          = 37;
+    const DEPREC_CTEXT            = 38;
+    const DEPREC_CFWS_NEAR_AT     = 49;
+    const RFC5322_LOCAL_TOOLONG   = 64;
+    const RFC5322_LABEL_TOOLONG   = 63;
+    const RFC5322_DOMAIN          = 65;
+    const RFC5322_TOOLONG         = 66;
+    const RFC5322_DOMAIN_TOOLONG  = 255;
+    const RFC5322_DOMAINLITERAL   = 70;
+    const RFC5322_DOMLIT_OBSDTEXT = 71;
+    const RFC5322_IPV6_GRPCOUNT   = 72;
+    const RFC5322_IPV6_2X2XCOLON  = 73;
+    const RFC5322_IPV6_BADCHAR    = 74;
+    const RFC5322_IPV6_MAXGRPS    = 75;
+    const RFC5322_IPV6_COLONSTRT  = 76;
+    const RFC5322_IPV6_COLONEND   = 77;
+    const DNSWARN_NO_MX_RECORD    = 5;
+    const DNSWARN_NO_RECORD       = 6;
+
+    protected $parser;
+    protected $warnings = array();
+    protected $error;
+    protected $threshold = 255;
+
+    public function __construct()
+    {
+        $this->parser = new EmailParser(new EmailLexer());
+    }
+
+    public function isValid($email, $checkDNS = false, $strict = false)
+    {
+        try {
+            $this->parser->parse((string)$email);
+            $this->warnings = $this->parser->getWarnings();
+        } catch (\Exception $e) {
+            $rClass = new \ReflectionClass($this);
+            $this->error = $rClass->getConstant($e->getMessage());
+            return false;
+        }
+
+        $dns = true;
+        if ($checkDNS) {
+            $dns = $this->checkDNS();
+        }
+
+        if ($this->hasWarnings() && ((int) max($this->warnings) > $this->threshold)) {
+            $this->error = self::ERR_DEPREC_REACHED;
+
+            return false;
+        }
+
+        return !$strict || (!$this->hasWarnings() && $dns);
+    }
+
+    /**
+     * @return boolean
+     */
+    public function hasWarnings()
+    {
+        return !empty($this->warnings);
+    }
+
+    /**
+     * @return array
+     */
+    public function getWarnings()
+    {
+        return $this->warnings;
+    }
+
+    /**
+     * @return string
+     */
+    public function getError()
+    {
+        return $this->error;
+    }
+
+    /**
+     * @param int $threshold
+     *
+     * @return EmailValidator
+     */
+    public function setThreshold($threshold)
+    {
+        $this->threshold = (int) $threshold;
+
+        return $this;
+    }
+
+    /**
+     * @return int
+     */
+    public function getThreshold()
+    {
+        return $this->threshold;
+    }
+
+    protected function checkDNS()
+    {
+        $checked = true;
+
+        $result = checkdnsrr(trim($this->parser->getParsedDomainPart()), 'MX');
+
+        if (!$result) {
+            $this->warnings[] = self::DNSWARN_NO_RECORD;
+            $checked = false;
+            $this->addTLDWarnings();
+        }
+
+        return $checked;
+    }
+
+    protected function addTLDWarnings()
+    {
+        if (!in_array(self::DNSWARN_NO_RECORD, $this->warnings) &&
+            !in_array(self::DNSWARN_NO_MX_RECORD, $this->warnings) &&
+            in_array(self::RFC5322_DOMAINLITERAL, $this->warnings)
+        ) {
+            $this->warnings[] = self::RFC5321_TLD;
+        }
+    }
+}
diff --git a/vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/DomainPart.php b/vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/DomainPart.php
new file mode 100644
index 0000000..c4d0cf6
--- /dev/null
+++ b/vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/DomainPart.php
@@ -0,0 +1,317 @@
+<?php
+
+
+namespace Egulias\EmailValidator\Parser;
+
+use Egulias\EmailValidator\EmailLexer;
+use Egulias\EmailValidator\Parser\Parser;
+use Egulias\EmailValidator\EmailValidator;
+
+class DomainPart extends Parser
+{
+    const DOMAIN_MAX_LENGTH = 254;
+    protected $domainPart = '';
+
+    public function parse($domainPart)
+    {
+        $this->lexer->moveNext();
+
+        if ($this->lexer->token['type'] === EmailLexer::S_DOT) {
+            throw new \InvalidArgumentException('ERR_DOT_START');
+        }
+
+        if ($this->lexer->token['type'] === EmailLexer::S_EMPTY) {
+            throw new \InvalidArgumentException('ERR_NODOMAIN');
+        }
+        if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN) {
+            throw new \InvalidArgumentException('ERR_DOMAINHYPHENEND');
+        }
+
+        if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) {
+            $this->warnings[] = EmailValidator::DEPREC_COMMENT;
+            $this->parseDomainComments();
+        }
+
+        $domain = $this->doParseDomainPart();
+
+        $prev = $this->lexer->getPrevious();
+        $length = strlen($domain);
+
+        if ($prev['type'] === EmailLexer::S_DOT) {
+            throw new \InvalidArgumentException('ERR_DOT_END');
+        }
+        if ($prev['type'] === EmailLexer::S_HYPHEN) {
+            throw new \InvalidArgumentException('ERR_DOMAINHYPHENEND');
+        }
+        if ($length > self::DOMAIN_MAX_LENGTH) {
+            $this->warnings[] = EmailValidator::RFC5322_DOMAIN_TOOLONG;
+        }
+        if ($prev['type'] === EmailLexer::S_CR) {
+            throw new \InvalidArgumentException('ERR_FWS_CRLF_END');
+        }
+        $this->domainPart = $domain;
+    }
+
+    public function getDomainPart()
+    {
+        return $this->domainPart;
+    }
+
+    public function checkIPV6Tag($addressLiteral, $maxGroups = 8)
+    {
+        $prev = $this->lexer->getPrevious();
+        if ($prev['type'] === EmailLexer::S_COLON) {
+            $this->warnings[] = EmailValidator::RFC5322_IPV6_COLONEND;
+        }
+
+        $IPv6       = substr($addressLiteral, 5);
+        //Daniel Marschall's new IPv6 testing strategy
+        $matchesIP  = explode(':', $IPv6);
+        $groupCount = count($matchesIP);
+        $colons     = strpos($IPv6, '::');
+
+        if (count(preg_grep('/^[0-9A-Fa-f]{0,4}$/', $matchesIP, PREG_GREP_INVERT)) !== 0) {
+            $this->warnings[] = EmailValidator::RFC5322_IPV6_BADCHAR;
+        }
+
+        if ($colons === false) {
+            // We need exactly the right number of groups
+            if ($groupCount !== $maxGroups) {
+                $this->warnings[] = EmailValidator::RFC5322_IPV6_GRPCOUNT;
+            }
+            return;
+        }
+
+        if ($colons !== strrpos($IPv6, '::')) {
+            $this->warnings[] = EmailValidator::RFC5322_IPV6_2X2XCOLON;
+            return;
+        }
+
+        if ($colons === 0 || $colons === (strlen($IPv6) - 2)) {
+            // RFC 4291 allows :: at the start or end of an address
+            //with 7 other groups in addition
+            ++$maxGroups;
+        }
+
+        if ($groupCount > $maxGroups) {
+            $this->warnings[] = EmailValidator::RFC5322_IPV6_MAXGRPS;
+        } elseif ($groupCount === $maxGroups) {
+            $this->warnings[] = EmailValidator::RFC5321_IPV6DEPRECATED;
+        }
+    }
+
+    protected function doParseDomainPart()
+    {
+        $domain = '';
+        do {
+
+            $prev = $this->lexer->getPrevious();
+
+            if ($this->lexer->token['type'] === EmailLexer::S_SLASH) {
+                throw new \InvalidArgumentException('ERR_DOMAIN_CHAR_NOT_ALLOWED');
+            }
+
+            if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) {
+                $this->parseComments();
+                $this->lexer->moveNext();
+            }
+
+            $this->checkConsecutiveDots();
+            $this->checkDomainPartExceptions($prev);
+
+            if ($this->hasBrackets()) {
+                $this->parseDomainLiteral();
+            }
+
+            $this->checkLabelLength($prev);
+
+            if ($this->isFWS()) {
+                $this->parseFWS();
+            }
+
+            $domain .= $this->lexer->token['value'];
+            $this->lexer->moveNext();
+        } while ($this->lexer->token);
+
+        return $domain;
+    }
+
+    protected function parseDomainLiteral()
+    {
+        if ($this->lexer->isNextToken(EmailLexer::S_COLON)) {
+            $this->warnings[] = EmailValidator::RFC5322_IPV6_COLONSTRT;
+        }
+        if ($this->lexer->isNextToken(EmailLexer::S_IPV6TAG)) {
+            $lexer = clone $this->lexer;
+            $lexer->moveNext();
+            if ($lexer->isNextToken(EmailLexer::S_DOUBLECOLON)) {
+                $this->warnings[] = EmailValidator::RFC5322_IPV6_COLONSTRT;
+            }
+        }
+
+        return $this->doParseDomainLiteral();
+    }
+
+    protected function doParseDomainLiteral()
+    {
+        $IPv6TAG = false;
+        $addressLiteral = '';
+        do {
+            if ($this->lexer->token['type'] === EmailLexer::C_NUL) {
+                throw new \InvalidArgumentException('ERR_EXPECTING_DTEXT');
+            }
+
+            if ($this->lexer->token['type'] === EmailLexer::INVALID ||
+                $this->lexer->token['type'] === EmailLexer::C_DEL   ||
+                $this->lexer->token['type'] === EmailLexer::S_LF
+            ) {
+                $this->warnings[] = EmailValidator::RFC5322_DOMLIT_OBSDTEXT;
+            }
+
+            if ($this->lexer->isNextTokenAny(array(EmailLexer::S_OPENQBRACKET, EmailLexer::S_OPENBRACKET))) {
+                throw new \InvalidArgumentException('ERR_EXPECTING_DTEXT');
+            }
+
+            if ($this->lexer->isNextTokenAny(
+                array(EmailLexer::S_HTAB, EmailLexer::S_SP, $this->lexer->token['type'] === EmailLexer::CRLF)
+            )) {
+                $this->warnings[] = EmailValidator::CFWS_FWS;
+                $this->parseFWS();
+            }
+
+            if ($this->lexer->isNextToken(EmailLexer::S_CR)) {
+                throw new \InvalidArgumentException("ERR_CR_NO_LF");
+            }
+            if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH) {
+                $this->warnings[] = EmailValidator::RFC5322_DOMLIT_OBSDTEXT;
+                $addressLiteral .= $this->lexer->token['value'];
+                $this->lexer->moveNext();
+                $this->validateQuotedPair();
+            }
+            if ($this->lexer->token['type'] === EmailLexer::S_IPV6TAG) {
+                $IPv6TAG = true;
+            }
+            if ($this->lexer->token['type'] === EmailLexer::S_CLOSEQBRACKET) {
+                break;
+            }
+
+            $addressLiteral .= $this->lexer->token['value'];
+
+        } while ($this->lexer->moveNext());
+
+        $addressLiteral = str_replace('[', '', $addressLiteral);
+        $addressLiteral = $this->checkIPV4Tag($addressLiteral);
+
+        if (false === $addressLiteral) {
+            return $addressLiteral;
+        }
+
+        if (!$IPv6TAG) {
+            $this->warnings[] = EmailValidator::RFC5322_DOMAINLITERAL;
+            return $addressLiteral;
+        }
+
+        $this->warnings[] = EmailValidator::RFC5321_ADDRESSLITERAL;
+
+        $this->checkIPV6Tag($addressLiteral);
+
+        return $addressLiteral;
+    }
+
+    protected function checkIPV4Tag($addressLiteral)
+    {
+        $matchesIP  = array();
+
+        // Extract IPv4 part from the end of the address-literal (if there is one)
+        if (preg_match(
+                '/\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/',
+                $addressLiteral,
+                $matchesIP
+            ) > 0
+        ) {
+            $index = strrpos($addressLiteral, $matchesIP[0]);
+            if ($index === 0) {
+                $this->warnings[] = EmailValidator::RFC5321_ADDRESSLITERAL;
+                return false;
+            }
+            // Convert IPv4 part to IPv6 format for further testing
+            $addressLiteral = substr($addressLiteral, 0, $index) . '0:0';
+        }
+
+        return $addressLiteral;
+    }
+
+    protected function checkDomainPartExceptions($prev)
+    {
+        $invalidDomainTokens = array(
+            EmailLexer::S_DQUOTE => true,
+            EmailLexer::S_SEMICOLON => true,
+            EmailLexer::S_GREATERTHAN => true,
+            EmailLexer::S_LOWERTHAN => true,
+        );
+
+        if (isset($invalidDomainTokens[$this->lexer->token['type']])) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT');
+        }
+
+        if ($this->lexer->token['type'] === EmailLexer::S_COMMA) {
+            throw new \InvalidArgumentException('ERR_COMMA_IN_DOMAIN');
+        }
+
+        if ($this->lexer->token['type'] === EmailLexer::S_AT) {
+            throw new \InvalidArgumentException('ERR_CONSECUTIVEATS');
+        }
+
+        if ($this->lexer->token['type'] === EmailLexer::S_OPENQBRACKET && $prev['type'] !== EmailLexer::S_AT) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT');
+        }
+
+        if ($this->lexer->token['type'] === EmailLexer::S_HYPHEN && $this->lexer->isNextToken(EmailLexer::S_DOT)) {
+            throw new \InvalidArgumentException('ERR_DOMAINHYPHENEND');
+        }
+
+        if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH
+            && $this->lexer->isNextToken(EmailLexer::GENERIC)) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT');
+        }
+    }
+
+    protected function hasBrackets()
+    {
+        if ($this->lexer->token['type'] !== EmailLexer::S_OPENBRACKET) {
+            return false;
+        }
+
+        try {
+            $this->lexer->find(EmailLexer::S_CLOSEBRACKET);
+        } catch (\RuntimeException $e) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_DOMLIT_CLOSE');
+        }
+
+        return true;
+    }
+
+    protected function checkLabelLength($prev)
+    {
+        if ($this->lexer->token['type'] === EmailLexer::S_DOT &&
+            $prev['type'] === EmailLexer::GENERIC &&
+            strlen($prev['value']) > 63
+        ) {
+            $this->warnings[] = EmailValidator::RFC5322_LABEL_TOOLONG;
+        }
+    }
+
+    protected function parseDomainComments()
+    {
+        $this->isUnclosedComment();
+        while (!$this->lexer->isNextToken(EmailLexer::S_CLOSEPARENTHESIS)) {
+            $this->warnEscaping();
+            $this->lexer->moveNext();
+        }
+
+        $this->lexer->moveNext();
+        if ($this->lexer->isNextToken(EmailLexer::S_DOT)) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT');
+        }
+    }
+}
diff --git a/vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/LocalPart.php b/vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/LocalPart.php
new file mode 100644
index 0000000..2f77164
--- /dev/null
+++ b/vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/LocalPart.php
@@ -0,0 +1,121 @@
+<?php
+
+namespace Egulias\EmailValidator\Parser;
+
+use Egulias\EmailValidator\EmailLexer;
+use Egulias\EmailValidator\EmailValidator;
+use \InvalidArgumentException;
+
+class LocalPart extends Parser
+{
+    public function parse($localPart)
+    {
+        $parseDQuote = true;
+        $closingQuote = false;
+
+        while ($this->lexer->token['type'] !== EmailLexer::S_AT && $this->lexer->token) {
+
+            if ($this->lexer->token['type'] === EmailLexer::S_DOT && !$this->lexer->getPrevious()) {
+                throw new \InvalidArgumentException('ERR_DOT_START');
+            }
+
+            $closingQuote = $this->checkDQUOTE($closingQuote);
+            if ($closingQuote && $parseDQuote) {
+                $parseDQuote = $this->parseDoubleQuote();
+            }
+
+            if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) {
+                $this->parseComments();
+            }
+
+            $this->checkConsecutiveDots();
+
+            if (
+                $this->lexer->token['type'] === EmailLexer::S_DOT &&
+                $this->lexer->isNextToken(EmailLexer::S_AT)
+            ) {
+                throw new \InvalidArgumentException('ERR_DOT_END');
+            }
+
+            $this->warnEscaping();
+            $this->isInvalidToken($this->lexer->token, $closingQuote);
+
+            if ($this->isFWS()) {
+                $this->parseFWS();
+            }
+
+            $this->lexer->moveNext();
+        }
+
+        $prev = $this->lexer->getPrevious();
+        if (strlen($prev['value']) > EmailValidator::RFC5322_LOCAL_TOOLONG) {
+            $this->warnings[] = EmailValidator::RFC5322_LOCAL_TOOLONG;
+        }
+    }
+
+    protected function parseDoubleQuote()
+    {
+        $parseAgain = true;
+        $special = array(
+            EmailLexer::S_CR => true,
+            EmailLexer::S_HTAB => true,
+            EmailLexer::S_LF => true
+        );
+
+        $invalid = array(
+            EmailLexer::C_NUL => true,
+            EmailLexer::S_HTAB => true,
+            EmailLexer::S_CR => true,
+            EmailLexer::S_LF => true
+        );
+        $setSpecialsWarning = true;
+
+        $this->lexer->moveNext();
+
+        while ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE && $this->lexer->token) {
+            $parseAgain = false;
+            if (isset($special[$this->lexer->token['type']]) && $setSpecialsWarning) {
+                $this->warnings[] = EmailValidator::CFWS_FWS;
+                $setSpecialsWarning = false;
+            }
+
+            $this->lexer->moveNext();
+
+            if (!$this->escaped() && isset($invalid[$this->lexer->token['type']])) {
+                throw new InvalidArgumentException("ERR_EXPECTED_ATEXT");
+            }
+        }
+
+        $prev = $this->lexer->getPrevious();
+
+        if ($prev['type'] === EmailLexer::S_BACKSLASH) {
+            if (!$this->checkDQUOTE(false)) {
+                throw new \InvalidArgumentException("ERR_UNCLOSED_DQUOTE");
+            }
+        }
+
+        if (!$this->lexer->isNextToken(EmailLexer::S_AT) && $prev['type'] !== EmailLexer::S_BACKSLASH) {
+            throw new \InvalidArgumentException("ERR_EXPECED_AT");
+        }
+
+        return $parseAgain;
+    }
+
+    protected function isInvalidToken($token, $closingQuote)
+    {
+        $forbidden = array(
+            EmailLexer::S_COMMA,
+            EmailLexer::S_CLOSEBRACKET,
+            EmailLexer::S_OPENBRACKET,
+            EmailLexer::S_GREATERTHAN,
+            EmailLexer::S_LOWERTHAN,
+            EmailLexer::S_COLON,
+            EmailLexer::S_SEMICOLON,
+            EmailLexer::INVALID
+        );
+
+        if (in_array($token['type'], $forbidden) && !$closingQuote) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT');
+        }
+    }
+}
diff --git a/vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/Parser.php b/vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/Parser.php
new file mode 100644
index 0000000..b66279e
--- /dev/null
+++ b/vendor/egulias/email-validator/src/Egulias/EmailValidator/Parser/Parser.php
@@ -0,0 +1,190 @@
+<?php
+
+namespace Egulias\EmailValidator\Parser;
+
+use Egulias\EmailValidator\EmailLexer;
+use Egulias\EmailValidator\EmailValidator;
+
+abstract class Parser
+{
+    protected $warnings = array();
+    protected $lexer;
+
+    public function __construct(EmailLexer $lexer)
+    {
+        $this->lexer = $lexer;
+    }
+
+    public function getWarnings()
+    {
+        return $this->warnings;
+    }
+
+    abstract function parse($str);
+
+    /**
+     * validateQuotedPair
+     */
+    protected function validateQuotedPair()
+    {
+        if (!($this->lexer->token['type'] === EmailLexer::INVALID
+            || $this->lexer->token['type'] === EmailLexer::C_DEL)) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_QPAIR');
+        }
+
+        $this->warnings[] = EmailValidator::DEPREC_QP;
+    }
+
+    /**
+     * @return string the the comment
+     * @throws \InvalidArgumentException
+     */
+    protected function parseComments()
+    {
+        $this->isUnclosedComment();
+        $this->warnings[] = EmailValidator::CFWS_COMMENT;
+        while (!$this->lexer->isNextToken(EmailLexer::S_CLOSEPARENTHESIS)) {
+            $this->warnEscaping();
+            $this->lexer->moveNext();
+        }
+
+        $this->lexer->moveNext();
+        if ($this->lexer->isNextTokenAny(array(EmailLexer::GENERIC, EmailLexer::S_EMPTY))) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT');
+        }
+
+        if ($this->lexer->isNextToken(EmailLexer::S_AT)) {
+            $this->warnings[] = EmailValidator::DEPREC_CFWS_NEAR_AT;
+        }
+    }
+
+    protected function isUnclosedComment()
+    {
+        try {
+            $this->lexer->find(EmailLexer::S_CLOSEPARENTHESIS);
+            return true;
+        } catch (\RuntimeException $e) {
+            throw new \InvalidArgumentException('ERR_UNCLOSEDCOMMENT');
+        }
+    }
+
+    protected function parseFWS()
+    {
+        $previous = $this->lexer->getPrevious();
+
+        $this->checkCRLFInFWS();
+
+        if ($this->lexer->token['type'] === EmailLexer::S_CR) {
+            throw new \InvalidArgumentException("ERR_CR_NO_LF");
+        }
+
+        if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type']  !== EmailLexer::S_AT) {
+            throw new \InvalidArgumentException("ERR_ATEXT_AFTER_CFWS");
+        }
+
+        if ($this->lexer->token['type'] === EmailLexer::S_LF || $this->lexer->token['type'] === EmailLexer::C_NUL) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_CTEXT');
+        }
+
+        if ($this->lexer->isNextToken(EmailLexer::S_AT) || $previous['type']  === EmailLexer::S_AT) {
+            $this->warnings[] = EmailValidator::DEPREC_CFWS_NEAR_AT;
+        } else {
+            $this->warnings[] = EmailValidator::CFWS_FWS;
+        }
+    }
+
+    protected function checkConsecutiveDots()
+    {
+        if ($this->lexer->token['type'] === EmailLexer::S_DOT && $this->lexer->isNextToken(EmailLexer::S_DOT)) {
+            throw new \InvalidArgumentException('ERR_CONSECUTIVEDOTS');
+        }
+    }
+
+    protected function isFWS()
+    {
+        if ($this->escaped()) {
+            return false;
+        }
+
+        if ($this->lexer->token['type'] === EmailLexer::S_SP ||
+            $this->lexer->token['type'] === EmailLexer::S_HTAB ||
+            $this->lexer->token['type'] === EmailLexer::S_CR ||
+            $this->lexer->token['type'] === EmailLexer::S_LF ||
+            $this->lexer->token['type'] === EmailLexer::CRLF
+        ) {
+            return true;
+        }
+
+        return false;
+    }
+
+    protected function escaped()
+    {
+        $previous = $this->lexer->getPrevious();
+
+        if ($previous['type'] === EmailLexer::S_BACKSLASH
+            &&
+            $this->lexer->token['type'] !== EmailLexer::GENERIC
+        ) {
+            return true;
+        }
+
+        return false;
+    }
+
+    protected function warnEscaping()
+    {
+        if ($this->lexer->token['type'] !== EmailLexer::S_BACKSLASH) {
+            return false;
+        }
+
+        if ($this->lexer->isNextToken(EmailLexer::GENERIC)) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT');
+        }
+
+        if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB, EmailLexer::C_DEL))) {
+            return false;
+        }
+
+        $this->warnings[] = EmailValidator::DEPREC_QP;
+        return true;
+
+    }
+
+    protected function checkDQUOTE($hasClosingQuote)
+    {
+        if ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE) {
+            return $hasClosingQuote;
+        }
+        if ($hasClosingQuote) {
+            return $hasClosingQuote;
+        }
+        $previous = $this->lexer->getPrevious();
+        if ($this->lexer->isNextToken(EmailLexer::GENERIC) && $previous['type'] === EmailLexer::GENERIC) {
+            throw new \InvalidArgumentException('ERR_EXPECTING_ATEXT');
+        }
+
+        $this->warnings[] = EmailValidator::RFC5321_QUOTEDSTRING;
+        try {
+            $this->lexer->find(EmailLexer::S_DQUOTE);
+            $hasClosingQuote = true;
+        } catch (\Exception $e) {
+            throw new \InvalidArgumentException('ERR_UNCLOSEDQUOTEDSTR');
+        }
+
+        return $hasClosingQuote;
+    }
+
+    protected function checkCRLFInFWS()
+    {
+        if ($this->lexer->token['type'] !== EmailLexer::CRLF) {
+            return;
+        }
+        if ($this->lexer->isNextToken(EmailLexer::CRLF)) {
+            throw new \InvalidArgumentException("ERR_FWS_CRLF_X2");
+        }
+        if (!$this->lexer->isNextTokenAny(array(EmailLexer::S_SP, EmailLexer::S_HTAB))) {
+            throw new \InvalidArgumentException("ERR_FWS_CRLF_END");
+        }
+    }
+}
diff --git a/vendor/egulias/email-validator/tests/bootstrap.php b/vendor/egulias/email-validator/tests/bootstrap.php
new file mode 100644
index 0000000..676c4b1
--- /dev/null
+++ b/vendor/egulias/email-validator/tests/bootstrap.php
@@ -0,0 +1,8 @@
+<?php
+
+if ( ! is_file($autoloadFile = __DIR__.'/../vendor/autoload.php')) {
+    echo 'Could not find "vendor/autoload.php". Did you forget to run "composer install --dev"?'.PHP_EOL;
+    exit(1);
+}
+
+require_once $autoloadFile;
diff --git a/vendor/egulias/email-validator/tests/egulias/Performance/AgainstFilterVar.php b/vendor/egulias/email-validator/tests/egulias/Performance/AgainstFilterVar.php
new file mode 100644
index 0000000..3905473
--- /dev/null
+++ b/vendor/egulias/email-validator/tests/egulias/Performance/AgainstFilterVar.php
@@ -0,0 +1,33 @@
+<?php
+
+use Egulias\EmailValidator\EmailValidator;
+
+require __DIR__ . '/../../bootstrap.php';
+
+$iterations = 10000;
+
+$testingMail = 'fabien@symfony.com';
+echo 'Testing ' . $iterations . ' iterations with ' . $testingMail . PHP_EOL;
+
+$a = microtime(true);
+for ($i = 0; $i < $iterations; $i++) {
+    $isValid = filter_var($testingMail, FILTER_VALIDATE_EMAIL);
+}
+$b = microtime(true);
+echo ($b - $a) . ' seconds with filter_var' . PHP_EOL;
+
+$a = microtime(true);
+for ($i = 0; $i < $iterations; $i++) {
+    $validator = new EmailValidator();
+    $isValid = $validator->isValid($testingMail);
+}
+$b = microtime(true);
+echo ($b - $a) . ' seconds with EmailValidator + instantiation' . PHP_EOL;
+
+$a = microtime(true);
+$validator = new EmailValidator();
+for ($i = 0; $i < $iterations; $i++) {
+    $isValid = $validator->isValid($testingMail);
+}
+$b = microtime(true);
+echo ($b - $a) . ' seconds with EmailValidator once instanced' . PHP_EOL;
diff --git a/vendor/egulias/email-validator/tests/egulias/Performance/AgainstOldIsemail.php b/vendor/egulias/email-validator/tests/egulias/Performance/AgainstOldIsemail.php
new file mode 100644
index 0000000..99476c1
--- /dev/null
+++ b/vendor/egulias/email-validator/tests/egulias/Performance/AgainstOldIsemail.php
@@ -0,0 +1,34 @@
+<?php
+
+use Egulias\EmailValidator\EmailValidator;
+
+require __DIR__ . '/../../bootstrap.php';
+require __DIR__ . '/../../../../isemail/is_email.php';
+
+$iterations = 10000;
+
+$testingMail = 'fabien@symfony.com';
+echo 'Testing ' . $iterations . ' iterations with ' . $testingMail . PHP_EOL;
+
+$a = microtime(true);
+for ($i = 0; $i < $iterations; $i++) {
+    $isValid = is_email($testingMail);
+}
+$b = microtime(true);
+echo ($b - $a) . ' seconds with is_email' . PHP_EOL;
+
+$a = microtime(true);
+for ($i = 0; $i < $iterations; $i++) {
+    $validator = new EmailValidator();
+    $isValid = $validator->isValid($testingMail);
+}
+$b = microtime(true);
+echo ($b - $a) . ' seconds with EmailValidator + instantiation' . PHP_EOL;
+
+$a = microtime(true);
+$validator = new EmailValidator();
+for ($i = 0; $i < $iterations; $i++) {
+    $isValid = $validator->isValid($testingMail);
+}
+$b = microtime(true);
+echo ($b - $a) . ' seconds with EmailValidator once instanced' . PHP_EOL;
diff --git a/vendor/egulias/email-validator/tests/egulias/Tests/EmailValidator/EmailLexerTest.php b/vendor/egulias/email-validator/tests/egulias/Tests/EmailValidator/EmailLexerTest.php
new file mode 100644
index 0000000..d5389ef
--- /dev/null
+++ b/vendor/egulias/email-validator/tests/egulias/Tests/EmailValidator/EmailLexerTest.php
@@ -0,0 +1,161 @@
+<?php
+
+namespace Egulias\EmailValidator\Tests;
+
+use Egulias\EmailValidator\EmailLexer;
+
+class EmailLexerTests extends \PHPUnit_Framework_TestCase
+{
+
+    public function testLexerExtendsLib()
+    {
+        $lexer = new EmailLexer();
+        $this->assertInstanceOf('Doctrine\Common\Lexer\AbstractLexer', $lexer);
+    }
+
+    /**
+     *  @dataProvider getTokens
+     *
+     */
+    public function testLexerTokens($str, $token)
+    {
+        $lexer = new EmailLexer();
+        $lexer->setInput($str);
+        $lexer->moveNext();
+        $lexer->moveNext();
+        $this->assertEquals($token, $lexer->token['type']);
+    }
+
+    public function testLexerParsesMultipleSpaces()
+    {
+        $lexer = new EmailLexer();
+        $lexer->setInput('  ');
+        $lexer->moveNext();
+        $lexer->moveNext();
+        $this->assertEquals(EmailLexer::S_SP, $lexer->token['type']);
+        $lexer->moveNext();
+        $this->assertEquals(EmailLexer::S_SP, $lexer->token['type']);
+    }
+
+    /**
+     * @dataProvider invalidUTF8CharsProvider
+     */
+    public function testLexerParsesInvalidUTF8($char)
+    {
+        $lexer = new EmailLexer();
+        $lexer->setInput($char);
+        $lexer->moveNext();
+        $lexer->moveNext();
+
+        $this->assertEquals(EmailLexer::INVALID, $lexer->token['type']);
+    }
+
+    public function invalidUTF8CharsProvider()
+    {
+        $chars = array();
+        for ($i = 0; $i < 0x100; ++$i) {
+            $c = $this->utf8Chr($i);
+            if (preg_match('/(?=\p{Cc})(?=[^\t\n\n\r])/u', $c) && !preg_match('/\x{0000}/u', $c)) {
+                $chars[] = array($c);
+            }
+        }
+
+        return $chars;
+    }
+
+    protected function utf8Chr($code_point)
+    {
+
+        if ($code_point < 0 || 0x10FFFF < $code_point || (0xD800 <= $code_point && $code_point <= 0xDFFF)) {
+            return '';
+        }
+
+        if ($code_point < 0x80) {
+            $hex[0] = $code_point;
+            $ret = chr($hex[0]);
+        } elseif ($code_point < 0x800) {
+            $hex[0] = 0x1C0 | $code_point >> 6;
+            $hex[1] = 0x80  | $code_point & 0x3F;
+            $ret = chr($hex[0]).chr($hex[1]);
+        } elseif ($code_point < 0x10000) {
+            $hex[0] = 0xE0 | $code_point >> 12;
+            $hex[1] = 0x80 | $code_point >> 6 & 0x3F;
+            $hex[2] = 0x80 | $code_point & 0x3F;
+            $ret = chr($hex[0]).chr($hex[1]).chr($hex[2]);
+        } else {
+            $hex[0] = 0xF0 | $code_point >> 18;
+            $hex[1] = 0x80 | $code_point >> 12 & 0x3F;
+            $hex[2] = 0x80 | $code_point >> 6 & 0x3F;
+            $hex[3] = 0x80 | $code_point  & 0x3F;
+            $ret = chr($hex[0]).chr($hex[1]).chr($hex[2]).chr($hex[3]);
+        }
+
+        return $ret;
+    }
+
+    public function testLexerForTab()
+    {
+        $lexer = new EmailLexer();
+        $lexer->setInput("foo\tbar");
+        $lexer->moveNext();
+        $lexer->skipUntil(EmailLexer::S_HTAB);
+        $lexer->moveNext();
+        $this->assertEquals(EmailLexer::S_HTAB, $lexer->token['type']);
+    }
+
+    public function testLexerForUTF8()
+    {
+        $lexer = new EmailLexer();
+        $lexer->setInput("áÇ@bar.com");
+        $lexer->moveNext();
+        $lexer->moveNext();
+        $this->assertEquals(EmailLexer::GENERIC, $lexer->token['type']);
+        $lexer->moveNext();
+        $this->assertEquals(EmailLexer::GENERIC, $lexer->token['type']);
+    }
+
+    public function testLexerSearchToken()
+    {
+        $lexer = new EmailLexer();
+        $lexer->setInput("foo\tbar");
+        $lexer->moveNext();
+        $this->assertTrue($lexer->find(EmailLexer::S_HTAB));
+    }
+
+    public function getTokens()
+    {
+        return array(
+            array("foo", EmailLexer::GENERIC),
+            array("\r", EmailLexer::S_CR),
+            array("\t", EmailLexer::S_HTAB),
+            array("\r\n", EmailLexer::CRLF),
+            array("\n", EmailLexer::S_LF),
+            array(" ", EmailLexer::S_SP),
+            array("@", EmailLexer::S_AT),
+            array("IPv6", EmailLexer::S_IPV6TAG),
+            array("::", EmailLexer::S_DOUBLECOLON),
+            array(":", EmailLexer::S_COLON),
+            array(".", EmailLexer::S_DOT),
+            array("\"", EmailLexer::S_DQUOTE),
+            array("-", EmailLexer::S_HYPHEN),
+            array("\\", EmailLexer::S_BACKSLASH),
+            array("/", EmailLexer::S_SLASH),
+            array("(", EmailLexer::S_OPENPARENTHESIS),
+            array(")", EmailLexer::S_CLOSEPARENTHESIS),
+            array('<', EmailLexer::S_LOWERTHAN),
+            array('>', EmailLexer::S_GREATERTHAN),
+            array('[', EmailLexer::S_OPENBRACKET),
+            array(']', EmailLexer::S_CLOSEBRACKET),
+            array(';', EmailLexer::S_SEMICOLON),
+            array(',', EmailLexer::S_COMMA),
+            array('<', EmailLexer::S_LOWERTHAN),
+            array('>', EmailLexer::S_GREATERTHAN),
+            array('{', EmailLexer::S_OPENQBRACKET),
+            array('}', EmailLexer::S_CLOSEQBRACKET),
+            array('',  EmailLexer::S_EMPTY),
+            array(chr(31),  EmailLexer::INVALID),
+            array(chr(226),  EmailLexer::GENERIC),
+            array(chr(0),  EmailLexer::C_NUL)
+        );
+    }
+}
diff --git a/vendor/egulias/email-validator/tests/egulias/Tests/EmailValidator/EmailValidatorTest.php b/vendor/egulias/email-validator/tests/egulias/Tests/EmailValidator/EmailValidatorTest.php
new file mode 100644
index 0000000..1491df7
--- /dev/null
+++ b/vendor/egulias/email-validator/tests/egulias/Tests/EmailValidator/EmailValidatorTest.php
@@ -0,0 +1,375 @@
+<?php
+
+namespace Egulias\Tests\EmailValidator;
+
+use Egulias\EmailValidator\EmailValidator;
+
+class EmailValidatorTest extends \PHPUnit_Framework_TestCase
+{
+    protected $validator;
+
+    protected function setUp()
+    {
+        $this->validator = new EmailValidator();
+    }
+
+    protected function tearDown()
+    {
+        $this->validator = null;
+    }
+
+    /**
+     * @dataProvider getValidEmails
+     */
+    public function testValidEmails($email)
+    {
+        $this->assertTrue($this->validator->isValid($email));
+    }
+
+    public function testInvalidUTF8Email()
+    {
+        $validator = new EmailValidator;
+        $email     = "\x80\x81\x82@\x83\x84\x85.\x86\x87\x88";
+
+        $this->assertFalse($validator->isValid($email));
+    }
+
+    public function getValidEmails()
+    {
+        return array(
+            array('â@iana.org'),
+            array('fabien@symfony.com'),
+            array('example@example.co.uk'),
+            array('fabien_potencier@example.fr'),
+            array('example@localhost'),
+            array('fab\'ien@symfony.com'),
+            array('fab\ ien@symfony.com'),
+            array('example((example))@fakedfake.co.uk'),
+            array('example@faked(fake).co.uk'),
+            array('fabien+@symfony.com'),
+            array('инфо@письмо.рф'),
+            array('"username"@example.com'),
+            array('"user,name"@example.com'),
+            array('"user name"@example.com'),
+            array('"user@name"@example.com'),
+            array('"\a"@iana.org'),
+            array('"test\ test"@iana.org'),
+            array('""@iana.org'),
+            array('"\""@iana.org'),
+            array('müller@möller.de'),
+            array('test@email*'),
+            array('test@email!'),
+            array('test@email&'),
+            array('test@email^'),
+            array('test@email%'),
+            array('test@email$'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidEmails
+     */
+    public function testInvalidEmails($email)
+    {
+        $this->assertFalse($this->validator->isValid($email));
+    }
+
+    public function getInvalidEmails()
+    {
+        return array(
+            array('test@example.com test'),
+            array('user  name@example.com'),
+            array('user   name@example.com'),
+            array('example.@example.co.uk'),
+            array('example@example@example.co.uk'),
+            array('(test_exampel@example.fr)'),
+            array('example(example)example@example.co.uk'),
+            array('.example@localhost'),
+            array('ex\ample@localhost'),
+            array('example@local\host'),
+            array('example@localhost.'),
+            array('user name@example.com'),
+            array('username@ example . com'),
+            array('example@(fake).com'),
+            array('example@(fake.com'),
+            array('username@example,com'),
+            array('usern,ame@example.com'),
+            array('user[na]me@example.com'),
+            array('"""@iana.org'),
+            array('"\"@iana.org'),
+            array('"test"test@iana.org'),
+            array('"test""test"@iana.org'),
+            array('"test"."test"@iana.org'),
+            array('"test".test@iana.org'),
+            array('"test"' . chr(0) . '@iana.org'),
+            array('"test\"@iana.org'),
+            array(chr(226) . '@iana.org'),
+            array('test@' . chr(226) . '.org'),
+            array('\r\ntest@iana.org'),
+            array('\r\n test@iana.org'),
+            array('\r\n \r\ntest@iana.org'),
+            array('\r\n \r\ntest@iana.org'),
+            array('\r\n \r\n test@iana.org'),
+            array('test@iana.org \r\n'),
+            array('test@iana.org \r\n '),
+            array('test@iana.org \r\n \r\n'),
+            array('test@iana.org \r\n\r\n'),
+            array('test@iana.org  \r\n\r\n '),
+            array('test@iana/icann.org'),
+            array('test@foo;bar.com'),
+            array('test;123@foobar.com'),
+            array('test@example..com'),
+            array('email.email@email."'),
+            array('test@email>'),
+            array('test@email<'),
+            array('test@email{'),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidEmailsWithErrors
+     */
+    public function testInvalidEmailsWithErrorsCheck($errors, $email)
+    {
+        $this->assertFalse($this->validator->isValid($email));
+
+        $this->assertEquals($errors, $this->validator->getError());
+    }
+
+    public function getInvalidEmailsWithErrors()
+    {
+        return array(
+            array(EmailValidator::ERR_NOLOCALPART, '@example.co.uk'),
+            array(EmailValidator::ERR_NODOMAIN, 'example@'),
+            array(EmailValidator::ERR_DOMAINHYPHENEND, 'example@example-.co.uk'),
+            array(EmailValidator::ERR_DOMAINHYPHENEND, 'example@example-'),
+            array(EmailValidator::ERR_CONSECUTIVEATS, 'example@@example.co.uk'),
+            array(EmailValidator::ERR_CONSECUTIVEDOTS, 'example..example@example.co.uk'),
+            array(EmailValidator::ERR_CONSECUTIVEDOTS, 'example@example..co.uk'),
+            array(EmailValidator::ERR_EXPECTING_ATEXT, '<fabien_potencier>@example.fr'),
+            array(EmailValidator::ERR_DOT_START, '.example@localhost'),
+            array(EmailValidator::ERR_DOT_START, 'example@.localhost'),
+            array(EmailValidator::ERR_DOT_END, 'example@localhost.'),
+            array(EmailValidator::ERR_DOT_END, 'example.@example.co.uk'),
+            array(EmailValidator::ERR_UNCLOSEDCOMMENT, '(example@localhost'),
+            array(EmailValidator::ERR_UNCLOSEDQUOTEDSTR, '"example@localhost'),
+            array(EmailValidator::ERR_EXPECTING_ATEXT, 'exa"mple@localhost'),
+            //This was the original. But atext is not allowed after \n
+            //array(EmailValidator::ERR_EXPECTING_ATEXT, "exampl\ne@example.co.uk"),
+            array(EmailValidator::ERR_ATEXT_AFTER_CFWS, "exampl\ne@example.co.uk"),
+            array(EmailValidator::ERR_EXPECTING_DTEXT, "example@[[]"),
+            array(EmailValidator::ERR_ATEXT_AFTER_CFWS, "exampl\te@example.co.uk"),
+            array(EmailValidator::ERR_CR_NO_LF, "example@exa\rmple.co.uk"),
+            array(EmailValidator::ERR_CR_NO_LF, "example@[\r]"),
+            array(EmailValidator::ERR_CR_NO_LF, "exam\rple@example.co.uk"),
+        );
+    }
+
+    /**
+     * @dataProvider getInvalidEmailsWithWarnings
+     */
+    public function testValidEmailsWithWarningsCheck($warnings, $email)
+    {
+        $this->assertTrue($this->validator->isValid($email, true));
+
+        $this->assertEquals($warnings, $this->validator->getWarnings());
+    }
+
+    /**
+     * @dataProvider getInvalidEmailsWithWarnings
+     */
+    public function testInvalidEmailsWithDnsCheckAndStrictMode($warnings, $email)
+    {
+        $this->assertFalse($this->validator->isValid($email, true, true));
+
+        $this->assertEquals($warnings, $this->validator->getWarnings());
+    }
+
+    public function getInvalidEmailsWithWarnings()
+    {
+        return array(
+            array(
+                array(
+                    EmailValidator::DEPREC_CFWS_NEAR_AT,
+                    EmailValidator::DNSWARN_NO_RECORD
+                ),
+                'example @example.co.uk'
+            ),
+            array(
+                array(
+                    EmailValidator::DEPREC_CFWS_NEAR_AT,
+                    EmailValidator::DNSWARN_NO_RECORD
+                ),
+                'example@ example.co.uk'
+            ),
+            array(
+                array(
+                    EmailValidator::CFWS_COMMENT,
+                    EmailValidator::DNSWARN_NO_RECORD
+                ),
+                'example@example(examplecomment).co.uk'
+            ),
+            array(
+                array(
+                    EmailValidator::CFWS_COMMENT,
+                    EmailValidator::DEPREC_CFWS_NEAR_AT,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example(examplecomment)@example.co.uk'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_QUOTEDSTRING,
+                    EmailValidator::CFWS_FWS,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                "\"\t\"@example.co.uk"
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_QUOTEDSTRING,
+                    EmailValidator::CFWS_FWS,
+                    EmailValidator::DNSWARN_NO_RECORD
+                ),
+                "\"\r\"@example.co.uk"
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_ADDRESSLITERAL,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[127.0.0.1]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_ADDRESSLITERAL,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_ADDRESSLITERAL,
+                    EmailValidator::RFC5321_IPV6DEPRECATED,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370::]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_ADDRESSLITERAL,
+                    EmailValidator::RFC5322_IPV6_MAXGRPS,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:7334::]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_ADDRESSLITERAL,
+                    EmailValidator::RFC5322_IPV6_2X2XCOLON,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[IPv6:1::1::1]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5322_DOMLIT_OBSDTEXT,
+                    EmailValidator::RFC5322_DOMAINLITERAL,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                "example@[\n]"
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5322_DOMAINLITERAL,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[::1]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5322_DOMAINLITERAL,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[::123.45.67.178]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5322_IPV6_COLONSTRT,
+                    EmailValidator::RFC5321_ADDRESSLITERAL,
+                    EmailValidator::RFC5322_IPV6_GRPCOUNT,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[IPv6::2001:0db8:85a3:0000:0000:8a2e:0370:7334]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_ADDRESSLITERAL,
+                    EmailValidator::RFC5322_IPV6_BADCHAR,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[IPv6:z001:0db8:85a3:0000:0000:8a2e:0370:7334]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_ADDRESSLITERAL,
+                    EmailValidator::RFC5322_IPV6_COLONEND,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@[IPv6:2001:0db8:85a3:0000:0000:8a2e:0370:]'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5321_QUOTEDSTRING,
+                    EmailValidator::DNSWARN_NO_RECORD
+                ),
+                '"example"@example.co.uk'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5322_LOCAL_TOOLONG,
+                    EmailValidator::DNSWARN_NO_RECORD
+                ),
+                'too_long_localpart_too_long_localpart_too_long_localpart_too_long_localpart@example.co.uk'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5322_LABEL_TOOLONG,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart.co.uk'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5322_DOMAIN_TOOLONG,
+                    EmailValidator::RFC5322_TOOLONG,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'.
+                'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'.
+                'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'
+            ),
+            array(
+                array(
+                    EmailValidator::RFC5322_DOMAIN_TOOLONG,
+                    EmailValidator::RFC5322_TOOLONG,
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'example@toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocal'.
+                'parttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpart'.
+                'toolonglocalparttoolonglocalparttoolonglocalparttoolonglocalpar'
+            ),
+            array(
+                array(
+                    EmailValidator::DNSWARN_NO_RECORD,
+                ),
+                'test@test'
+            ),
+        );
+    }
+
+    public function testInvalidEmailsWithStrict()
+    {
+        $this->assertFalse($this->validator->isValid('"test"@test', false, true));
+    }
+}
