瀏覽代碼

Merge branch 'master' of http://18.167.157.193:1026/guanli/ngds

kevin_zhangl 3 年之前
父節點
當前提交
84d82dc28e
共有 100 個文件被更改,包括 0 次插入13199 次删除
  1. 0 205
      vendor/anlity/yii2-swoole-async-timer/README.md
  2. 0 24
      vendor/anlity/yii2-swoole-async-timer/SocketInterface.php
  3. 0 257
      vendor/anlity/yii2-swoole-async-timer/SwooleAsyncTimerComponent.php
  4. 0 158
      vendor/anlity/yii2-swoole-async-timer/SwooleAsyncTimerController.php
  5. 0 28
      vendor/anlity/yii2-swoole-async-timer/composer.json
  6. 0 34
      vendor/anlity/yii2-swoole-async-timer/params-swoole-default.php
  7. 0 345
      vendor/anlity/yii2-swoole-async-timer/src/SCurl.php
  8. 0 484
      vendor/anlity/yii2-swoole-async-timer/src/SServer.php
  9. 0 504
      vendor/anlity/yii2-swoole-async-timer/src/SWebSocket.php
  10. 0 73
      vendor/anlity/yii2-swoole-async-timer/src/SocketSecurity.php
  11. 0 67
      vendor/anlity/yii2-swoole-async-timer/src/SwooleClient.php
  12. 0 248
      vendor/anlity/yii2-swoole-async-timer/src/SwooleService.php
  13. 0 12
      vendor/autoload.php
  14. 0 47
      vendor/behat/gherkin/.github/workflows/build.yml
  15. 0 49
      vendor/behat/gherkin/.github/workflows/update.yml
  16. 0 442
      vendor/behat/gherkin/CHANGES.md
  17. 0 33
      vendor/behat/gherkin/CONTRIBUTING.md
  18. 0 22
      vendor/behat/gherkin/LICENSE
  19. 0 64
      vendor/behat/gherkin/README.md
  20. 0 67
      vendor/behat/gherkin/composer.json
  21. 0 1245
      vendor/behat/gherkin/i18n.php
  22. 0 3
      vendor/behat/gherkin/libpath.php
  23. 0 48
      vendor/behat/gherkin/src/Behat/Gherkin/Cache/CacheInterface.php
  24. 0 109
      vendor/behat/gherkin/src/Behat/Gherkin/Cache/FileCache.php
  25. 0 66
      vendor/behat/gherkin/src/Behat/Gherkin/Cache/MemoryCache.php
  26. 0 22
      vendor/behat/gherkin/src/Behat/Gherkin/Exception/CacheException.php
  27. 0 15
      vendor/behat/gherkin/src/Behat/Gherkin/Exception/Exception.php
  28. 0 17
      vendor/behat/gherkin/src/Behat/Gherkin/Exception/LexerException.php
  29. 0 17
      vendor/behat/gherkin/src/Behat/Gherkin/Exception/NodeException.php
  30. 0 17
      vendor/behat/gherkin/src/Behat/Gherkin/Exception/ParserException.php
  31. 0 52
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/ComplexFilter.php
  32. 0 32
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/ComplexFilterInterface.php
  33. 0 39
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/FeatureFilterInterface.php
  34. 0 30
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/FilterInterface.php
  35. 0 124
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/LineFilter.php
  36. 0 143
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/LineRangeFilter.php
  37. 0 76
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/NameFilter.php
  38. 0 61
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/NarrativeFilter.php
  39. 0 72
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/PathsFilter.php
  40. 0 63
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/RoleFilter.php
  41. 0 56
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/SimpleFilter.php
  42. 0 159
      vendor/behat/gherkin/src/Behat/Gherkin/Filter/TagFilter.php
  43. 0 142
      vendor/behat/gherkin/src/Behat/Gherkin/Gherkin.php
  44. 0 200
      vendor/behat/gherkin/src/Behat/Gherkin/Keywords/ArrayKeywords.php
  45. 0 31
      vendor/behat/gherkin/src/Behat/Gherkin/Keywords/CachedArrayKeywords.php
  46. 0 121
      vendor/behat/gherkin/src/Behat/Gherkin/Keywords/CucumberKeywords.php
  47. 0 365
      vendor/behat/gherkin/src/Behat/Gherkin/Keywords/KeywordsDumper.php
  48. 0 103
      vendor/behat/gherkin/src/Behat/Gherkin/Keywords/KeywordsInterface.php
  49. 0 653
      vendor/behat/gherkin/src/Behat/Gherkin/Lexer.php
  50. 0 72
      vendor/behat/gherkin/src/Behat/Gherkin/Loader/AbstractFileLoader.php
  51. 0 312
      vendor/behat/gherkin/src/Behat/Gherkin/Loader/ArrayLoader.php
  52. 0 193
      vendor/behat/gherkin/src/Behat/Gherkin/Loader/CucumberNDJsonAstLoader.php
  53. 0 80
      vendor/behat/gherkin/src/Behat/Gherkin/Loader/DirectoryLoader.php
  54. 0 26
      vendor/behat/gherkin/src/Behat/Gherkin/Loader/FileLoaderInterface.php
  55. 0 101
      vendor/behat/gherkin/src/Behat/Gherkin/Loader/GherkinFileLoader.php
  56. 0 39
      vendor/behat/gherkin/src/Behat/Gherkin/Loader/LoaderInterface.php
  57. 0 72
      vendor/behat/gherkin/src/Behat/Gherkin/Loader/YamlFileLoader.php
  58. 0 20
      vendor/behat/gherkin/src/Behat/Gherkin/Node/ArgumentInterface.php
  59. 0 112
      vendor/behat/gherkin/src/Behat/Gherkin/Node/BackgroundNode.php
  60. 0 274
      vendor/behat/gherkin/src/Behat/Gherkin/Node/ExampleNode.php
  61. 0 73
      vendor/behat/gherkin/src/Behat/Gherkin/Node/ExampleTableNode.php
  62. 0 271
      vendor/behat/gherkin/src/Behat/Gherkin/Node/FeatureNode.php
  63. 0 33
      vendor/behat/gherkin/src/Behat/Gherkin/Node/KeywordNodeInterface.php
  64. 0 33
      vendor/behat/gherkin/src/Behat/Gherkin/Node/NodeInterface.php
  65. 0 246
      vendor/behat/gherkin/src/Behat/Gherkin/Node/OutlineNode.php
  66. 0 90
      vendor/behat/gherkin/src/Behat/Gherkin/Node/PyStringNode.php
  67. 0 20
      vendor/behat/gherkin/src/Behat/Gherkin/Node/ScenarioInterface.php
  68. 0 20
      vendor/behat/gherkin/src/Behat/Gherkin/Node/ScenarioLikeInterface.php
  69. 0 150
      vendor/behat/gherkin/src/Behat/Gherkin/Node/ScenarioNode.php
  70. 0 33
      vendor/behat/gherkin/src/Behat/Gherkin/Node/StepContainerInterface.php
  71. 0 152
      vendor/behat/gherkin/src/Behat/Gherkin/Node/StepNode.php
  72. 0 383
      vendor/behat/gherkin/src/Behat/Gherkin/Node/TableNode.php
  73. 0 42
      vendor/behat/gherkin/src/Behat/Gherkin/Node/TaggedNodeInterface.php
  74. 0 771
      vendor/behat/gherkin/src/Behat/Gherkin/Parser.php
  75. 0 117
      vendor/bin/codecept
  76. 0 5
      vendor/bin/codecept.bat
  77. 0 117
      vendor/bin/markdown
  78. 0 5
      vendor/bin/markdown.bat
  79. 0 120
      vendor/bin/phpunit
  80. 0 5
      vendor/bin/phpunit.bat
  81. 0 117
      vendor/bin/yii
  82. 0 5
      vendor/bin/yii.bat
  83. 0 17
      vendor/bower-asset/bootstrap/.editorconfig
  84. 0 15
      vendor/bower-asset/bootstrap/.gitattributes
  85. 0 41
      vendor/bower-asset/bootstrap/.gitignore
  86. 0 12
      vendor/bower-asset/bootstrap/.hound.yml
  87. 0 41
      vendor/bower-asset/bootstrap/.travis.yml
  88. 0 5
      vendor/bower-asset/bootstrap/CHANGELOG.md
  89. 0 1
      vendor/bower-asset/bootstrap/CNAME
  90. 0 271
      vendor/bower-asset/bootstrap/CONTRIBUTING.md
  91. 0 6
      vendor/bower-asset/bootstrap/Gemfile
  92. 0 43
      vendor/bower-asset/bootstrap/Gemfile.lock
  93. 0 511
      vendor/bower-asset/bootstrap/Gruntfile.js
  94. 0 22
      vendor/bower-asset/bootstrap/ISSUE_TEMPLATE.md
  95. 0 21
      vendor/bower-asset/bootstrap/LICENSE
  96. 0 142
      vendor/bower-asset/bootstrap/README.md
  97. 0 40
      vendor/bower-asset/bootstrap/_config.yml
  98. 0 34
      vendor/bower-asset/bootstrap/bower.json
  99. 0 37
      vendor/bower-asset/bootstrap/composer.json
  100. 0 587
      vendor/bower-asset/bootstrap/dist/css/bootstrap-theme.css

+ 0 - 205
vendor/anlity/yii2-swoole-async-timer/README.md

@@ -1,205 +0,0 @@
-yii2-swoole-async-timer
-=======================
-用于异步处理任务和需要定时器完成的任务
-
-Installation
-------------
-
-在mevyen的项目(代码中已保留原作者)的基础上加了一个定时器的功能,也就是打开swoole服务的时候开启一个定时器,来解决一些需要定时完成的任务,2018年4月9日加入了WebSocket的功能,服务端改为了WebSocket,可以监听客户端发来的消息,和向客户端发送消息。
-
-安装
-
-```
-php composer.phar require --prefer-dist anlity/yii2-swoole-async-timer "*"
-```
-
-或者 添加
-
-```
-"anlity/yii2-swoole-async-timer": "*"
-```
-
-到你的 yii2 根目录 `composer.json` 文件里.
-
-
-如何使用
------
-
-1、新增配置文件params-swoole.php
-
-```php
-return [
-    'swooleAsyncTimer' => [
-        'host'             => '127.0.0.1', 		//服务启动IP
-        'port'             => '9512',      		//服务启动端口
-        'process_name'     => 'swooleServ',		//服务进程名
-        'open_tcp_nodelay' => '1',         		//启用open_tcp_nodelay
-        'daemonize'        => '1',				//守护进程化
-        'worker_num'       => '2',				//work进程数目
-        'task_worker_num'  => '2',				//task进程的数量
-        'task_max_request' => '10000',			//work进程最大处理的请求数
-        'task_tmpdir'      => dirname(__DIR__).'/runtime/task',		 //设置task的数据临时目录
-        'log_file'         => dirname(__DIR__).'/runtime/logs/swooleHttp.log', //指定swoole错误日志文件
-        'client_timeout'   => '20',				 //client链接服务器时超时时间(s)
-        'pidfile'          => '/tmp/y.pid', 		 //服务启动进程id文件保存位置
-
-        //--以上配置项均来自swoole-server的同名配置,可随意参考swoole-server配置说明自主增删--
-        'sender_client'    => 'swoole',         //请求服务端的客户端方式(swoole|curl)
-                'auth_key'          => 'xxxxxxxxxxxxxxx', //授权密钥
-                'max_time_diff'      => 0,              //请求服务端允许的最大时间差
-        'debug'            => true,             //是否开启调试模式
-        'with_timer'       => true,            //是否使用定时器
-        'timer_interval'   => 5000,            //定时器时间间隔
-        'log_size'         => 204800000, 			 //运行时日志 单个文件大小
-        'log_dir'          => dirname(__DIR__).'/runtime/logs',			 //运行时日志 存放目录
-    ]
-];
-```
-
-2、console的main.php文件引入新增的配置文件,配置文件参考 params-swoole-default.php
-```php
-$params = array_merge(
-    // ...
-    require __DIR__ . '/../../common/config/params-swoole.php',
-    // ...
-);
-```
-
-3、在站点主配置文件(main.php)controllerMap
-```php
-'controllerMap' => [
-    'swoole_server' => [
-        'class' => 'anlity\swooleAsyncTimer\SwooleAsyncTimerController',
-    ],
-],
-```
-
-4、在站点主配置文件(main.php)中增加components
-```php
-'components' => [
-    'swooleAsyncTimer' => [
-        'class' => 'common\components\SwooleAsyncTimer',
-    ]
-]
-```
-
-5、从目录common/components/新建SwooleAsyncTimer类,类内容:
-```php
-<?php
-namespace common\components;
-
-use anlity\swooleAsyncTimer\SocketInterface;
-use anlity\swooleAsyncTimer\SwooleAsyncTimerComponent;
-
-class SwooleAsyncTimer extends SwooleAsyncTimerComponent implements SocketInterface {
-
-    public function timerCallback($timerId, $server){
-        // 定时器的回调逻辑
-    }
-
-    public function onWorkerStart($server, $workerId){
-    }
-
-    public function onWorkerStop($server, $workerId){
-    }
-
-    public function onOpen($fd){
-        // 与客户端握手时的逻辑,可以把$fd写入到session或者缓存中
-    }
-
-
-    public function onClose($fd){
-        // 与客户端断开连接时的逻辑
-    }
-
-
-    public function onMessage($fd, $data){
-        // 收到客户端的消息的逻辑
-    }
-}
-```
-
-6、服务管理
-```php
-//启动
-./yii swoole_server/run start
- 
-//重启
-./yii swoole_server/run restart
-
-//停止
-./yii swoole_server/run stop
-
-//查看状态
-./yii swoole_server/run stats
-
-//查看进程列表
-./yii swoole_server/run list
-```
-
-7、执行异步任务可以
-````php
-<?php
-
-class TestController extends Controller 
-{  
-	public function actionSwooleasync(){
-		$data = [
-			"data"=>[
-				[
-					"a" => "test/mail",
-					"p" => ["测试邮件1","测试邮件2"]
-				],
-				// ...
-			],
-			"finish" => [
-				[
-					"a" => "test/mail",
-					"p" => ["测试邮件回调1","测试邮件回调2"]
-				],
-				// ...
-			]
-		];
-		\Yii::$app->SwooleAsyncTimer->async(json_encode($data));
-	}
-
-	public function actionMail($a='',$b=''){
-		echo $a.'-'.$b;
-	}  
-}
-````
-
-8、给客户端发送消息可以
-````php
-<?php
-
-class TestController extends Controller 
-{  
-	public function actionPushMsg(){
-		$fd = 1;
-		$data = [];
-		\Yii::$app->SwooleAsyncTimer->pushMsg($fd, $data);
-	}
-
-}
-````
-
-9、从服务端给webSocket客户端发送消息
-````php
-<?php
-
-class TestController extends Controller 
-{  
-	public function actionPushMsg(){
-		$fd = 1;
-		$data = [];
-		\Yii::$app->SwooleAsyncTimer->pushMsgByCli($fd, $data);
-	}
-
-}
-````
-
-10、无人值守
-````shell
-* * * * * /path/to/yii/application/yii swoole_server/run start >> /var/log/console-app.log 2>&1
-````

+ 0 - 24
vendor/anlity/yii2-swoole-async-timer/SocketInterface.php

@@ -1,24 +0,0 @@
-<?php
-/**
- * Created by PhpStorm.
- * User: anlity
- * Date: 2018/3/10
- * Time: 上午11:58
- */
-
-namespace anlity\swooleAsyncTimer;
-
-
-interface SocketInterface
-{
-    public function timerCallback($timerId, $server);
-    public function onWorkerStart($server, $workerId);
-    public function onWorkerStop($server, $workerId);
-    public function onWorkerExit($server, $workerId);
-    public function onOpen($fd);
-    public function onClose($fd);
-    public function onMessage($fd, $data);
-    public function onTaskRunActionStart($server, $workerId, $action, $params);
-    public function onTaskRunActionFinish($server, $workerId, $action, $params);
-    public function onTaskRunActionError($fd, $data, $action, $params, $errorMessage);
-}

+ 0 - 257
vendor/anlity/yii2-swoole-async-timer/SwooleAsyncTimerComponent.php

@@ -1,257 +0,0 @@
-<?php
-/**
- * 异步组件
- * $Id: SwooleAsyncComponent.php 9507 2016-09-29 06:48:44Z mevyen $
- * $Date: 2016-09-29 14:48:44 +0800 (Wed, 07 Sep 2016) $
- * $Author: mevyen $
- */
-namespace anlity\swooleAsyncTimer;
-
-use anlity\swooleAsyncTimer\src\SocketSecurity;
-use anlity\swooleAsyncTimer\src\SwooleClient;
-use Yii;
-use anlity\swooleAsyncTimer\src\SCurl;
-use yii\helpers\Json;
-
-class SwooleAsyncTimerComponent extends \yii\base\Component implements SocketInterface
-{
-
-    public $swooleServer;
-
-    /**
-     * 获取服务端对象
-     * @return mixed
-     */
-    public function getSwooleServer(){
-        return $this->swooleServer;
-    }
-
-    /**
-     * 异步执行入口
-     * $data.data 定义需要执行的任务列表,其中如果指定多个任务(以数组形式),则server将顺序执行
-     * $data.finish 定义了data中的任务执行完成后的回调任务,执行方式同$data.data
-     * @param  [json] $data 结构如下
-     * [
-     *     'data' => [
-     *         [
-     *             'a' => 'test1/mail1' #要执行的console控制器和action
-     *             'p' => ['p1','p2','p3'] // action参数列表
-     *         ],
-     *         [
-     *             'a' => 'test2/mail2' #要执行的console控制器和action
-     *             'p' => ['p1','p2','p3'] // action参数列表
-     *         ]
-     *     ],
-     *     'finish' => [
-     *         [
-     *             'a' => 'test3/mail3' #要执行的console控制器和action
-     *             'p' => ['p1','p2','p3'] // action参数列表
-     *         ],
-     *         [
-     *             'a' => 'test4/mail4' #要执行的console控制器和action
-     *             'p' => ['p1','p2','p3'] // action参数列表
-     *         ]
-     *     ]
-     * ]
-     * @return [type]       [description]
-     */
-    public function async($data)
-    {
-        $data = $this->paresData($data);
-        $data = ['type'=>'async', 'data'=>$data];
-        return $this->requestServer($data);
-    }
-
-    /**
-     * 用于从页面端实现webSocket推送消息
-     * @param $fd
-     * @param $data
-     * @return bool
-     * @throws \Exception
-     */
-    public function pushMsg($fd, $data){
-        if(!$fd){
-            return false;
-        }
-        $data = $this->paresData($data);
-        $data = ['type'=>'pushMsg', 'fd' => $fd, 'data'=>$data];
-        return $this->requestServer($data);
-    }
-
-    /**
-     * 用于从页面端实现webSocket推送消息给所有已连接的会员
-     * @param $data
-     * @return bool
-     * @throws \Exception
-     */
-    public function pushMsgAll($data){
-        $data = $this->paresData($data);
-        $data = ['type'=>'pushMsgAll', 'data'=>$data];
-        return $this->requestServer($data);
-    }
-
-    /**
-     * 从服务端的cli直接推送消息到客户端
-     * @param $fd
-     * @param $data
-     * @return bool
-     */
-    public function pushMsgByCli($fd, $data){
-        if(!$fd){
-            return false;
-        }
-        $data = $this->paresData($data);
-        return $this->swooleServer->push($fd, $data);
-    }
-
-    /**
-     * 广播发送消息
-     * @param $data
-     */
-    public function pushMsgAllByCli($data){
-        $data = $this->paresData($data);
-        foreach($this->swooleServer->connections as $fd){
-            $this->swooleServer->push($fd, $data);
-        }
-    }
-
-    /**
-     * 请求服务端
-     * @param $data
-     * @return bool
-     * @throws \Exception
-     */
-    public function requestServer($data){
-        $settings = Yii::$app->params['swooleAsyncTimer'];
-        $socketSecurity = new SocketSecurity($settings);
-        $data = $socketSecurity->paramsFormat($data);
-        if($settings['sender_client'] == 'swoole'){
-            try {
-                $client = new SwooleClient();
-                $client->setOption('host', $settings['host']);
-                $client->setOption('port', $settings['port']);
-                $client->setOption('timeout', $settings['client_timeout']);
-                $client->setOption('data', Json::encode($data));
-                $response = $client->post();
-            } catch (\Exception $e){
-                $response = false;
-            }
-        } else {
-            $client = new SCurl();
-            $client->setOption(CURLOPT_POSTFIELDS, $data);
-            $client->setOption(CURLOPT_TIMEOUT, $settings['client_timeout']);
-            $response = $client->post("http://".$settings['host'].":".$settings['port']);
-        }
-        if($response === false){
-            return false;
-        }
-        if($response === 'false'){
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * 处理数据
-     * @param $data
-     * @return string
-     */
-    public function paresData($data){
-        if(!is_string($data)){
-            $data = Json::encode($data);
-        }
-        return $data;
-    }
-
-    /**
-     * swoole进程服务开始时的回调
-     * @param $server
-     * @param $workerId
-     */
-    public function onWorkerStart($server, $workerId){
-    }
-
-    /**
-     * swoole进程服务结束时的回调
-     * @param $server
-     * @param $workerId
-     */
-    public function onWorkerStop($server, $workerId){
-    }
-
-    /**
-     * swoole进程退出时的回调
-     * @param $server
-     * @param $workerId
-     */
-    public function onWorkerExit($server, $workerId){
-    }
-
-    /**
-     * 需继承此方法,用于定时器的回调方法
-     * @param $timerId
-     * @param $server
-     */
-    public function timerCallback($timerId, $server){
-
-    }
-
-    /**
-     * 需继承此方法,用于websocket的握手记录fd
-     * @param $fd
-     */
-    public function onOpen($fd){
-    }
-
-    /**
-     * 需继承此方法,用于websocket的清除fd
-     * @param $fd
-     */
-    public function onClose($fd){
-
-    }
-
-    /**
-     * 需继承此方法,用于websocket的接受客户端消息
-     * @param $fd
-     * @param $data
-     */
-    public function onMessage($fd, $data){
-
-    }
-
-    /**
-     * 任务运行开始
-     * @param $server
-     * @param $workerId
-     * @param $action
-     * @param $params
-     */
-    public function onTaskRunActionStart($server, $workerId, $action, $params){
-
-    }
-
-    /**
-     * 任务运行完成
-     * @param $server
-     * @param $workerId
-     * @param $action
-     * @param $params
-     */
-    public function onTaskRunActionFinish($server, $workerId, $action, $params){
-
-    }
-
-    /**
-     * 任务运行发生错误时
-     * @param $fd
-     * @param $data
-     * @param $action
-     * @param $params
-     * @param $errorMessage
-     */
-    public function onTaskRunActionError($fd, $data, $action, $params, $errorMessage){
-
-    }
-    
-}

+ 0 - 158
vendor/anlity/yii2-swoole-async-timer/SwooleAsyncTimerController.php

@@ -1,158 +0,0 @@
-<?php
-/**
- * yii2 基于swoole的异步处理
- * $Id: SwooleAsyncController.php 9507 2016-09-29 06:48:44Z mevyen $
- * $Date: 2016-09-29 14:48:44 +0800 (Wed, 07 Sep 2016) $
- * $Author: mevyen $
- */
-namespace anlity\swooleAsyncTimer;
-
-use Yii;
-use yii\console\Controller;
-use anlity\swooleAsyncTimer\src\SwooleService;
-
-class SwooleAsyncTimerController extends Controller {
-
-    public $versionNumber = '0.9.1';
-    /**
-     * 存储swooleAsync配置中的所有配置项
-     * @var array
-     */
-    public $settings = [];
-    /**
-     * 默认controller
-     * @var string
-     */
-    public $defaultAction = 'run';
-
-    /**
-     * 强制执行的选项
-     * @var
-     */
-    public $force;
-
-    public $version;
-
-    /**
-     * 接收force选项
-     * @param string $actionID
-     * @return array|string[]
-     */
-    public function options($actionID)
-    {
-        return ['force', 'version'];
-    }
-
-    /**
-     * 设置别名
-     * @return array
-     */
-    public function optionAliases()
-    {
-        return [
-            'f' => 'force',
-            'v' => 'version',
-        ];
-    }
-
-
-    /**
-     * 初始化
-     * @throws Yii\base\ErrorException
-     */
-    public function init() {
-
-        parent::init();
-        $this->prepareSettings();
-
-    }
-
-    /**
-     * 默认执行的action
-     */
-    public function actionDefault(){
-        if($this->version){
-            echo($this->versionNumber.PHP_EOL);
-        }
-    }
-
-    /**
-     * 初始化配置信息
-     * @throws Yii\base\ErrorException
-     */
-    protected function prepareSettings()
-    {
-        $runtimePath = Yii::$app->getRuntimePath();
-        $this->settings = [
-            'host'              => '127.0.0.1',
-            'port'              => '9512',
-            'process_name'      => 'swooleServ',
-            'with_timer'        => true,
-            'timer_interval'    => 30000,
-            'open_tcp_nodelay'  => '1',
-            'daemonize'         => '1',
-            'worker_num'        => '2',
-            'task_worker_num'   => '2',
-            'task_max_request'  => '10000',
-            'task_enable_coroutine'  => true,
-            'debug'             => true,
-            'pidfile'           => $runtimePath.'/tmp/yii2-swoole-async-timer.pid',
-            'log_dir'           => $runtimePath.'/yii2-swoole-async-timer/log',
-            'task_tmpdir'       => $runtimePath.'/yii2-swoole-async-timer/task',
-            'log_file'          => $runtimePath.'/yii2-swoole-async-timer/log/http.log',
-            'log_size'          => 204800000,
-            'restartBeforeStartCallback'   => null, //重启服务时的回调方法,重启后并开始服务前的回调
-            'restartAfterStartCallback'   => null, //重启服务时的回调方法,重启后并开始服务后的回调
-        ];
-        try {
-            $settings = Yii::$app->params['swooleAsyncTimer'];
-        }catch (yii\base\ErrorException $e) {
-            throw new yii\base\ErrorException('Empty param swooleAsyncTimer in params. ',8);
-        }
-
-        $this->settings = yii\helpers\ArrayHelper::merge(
-            $this->settings,
-            $settings
-        );
-    }
-
-    /**
-     * 启动服务
-     * @param string $mode
-     */
-    public function actionRun($mode='start'){
-        $swooleService = new SwooleService($this->settings,Yii::$app, $this);
-        switch ($mode) {
-            case 'start':
-                $swooleService->serviceStart();
-                break;
-            case 'restart':
-                $swooleService->serviceStop(!!$this->force, function() use ($swooleService){
-                    $restartBeforeStartCallback = $this->settings['restartBeforeStartCallback'];
-                    if(!is_null($restartBeforeStartCallback) && ($restartBeforeStartCallback instanceof \Closure || is_callable($restartBeforeStartCallback))){
-                        $restartBeforeStartCallback($swooleService, $this);
-                    }
-                    $swooleService->serviceStart();
-                    $restartAfterStartCallback = $this->settings['restartAfterStartCallback'];
-                    if(!is_null($restartAfterStartCallback) && ($restartAfterStartCallback instanceof \Closure || is_callable($restartAfterStartCallback))){
-                        $restartAfterStartCallback($swooleService, $this);
-                    }
-                });
-                break;
-            case 'stop':
-                $swooleService->serviceStop(!!$this->force);
-                break;
-            case 'stats':
-                $swooleService->serviceStats();
-                break;
-            case 'list':
-                $swooleService->serviceList();
-                break;
-            default:
-                exit('error:参数错误');
-                break;
-        }
-    }
-
-
-}

+ 0 - 28
vendor/anlity/yii2-swoole-async-timer/composer.json

@@ -1,28 +0,0 @@
-{
-    "name": "anlity/yii2-swoole-async-timer",
-    "description": "用于异步处理任务和需要定时器完成的任务",
-    "type": "yii2-extension",
-    "keywords": ["yii2","extension","swoole"],
-    "homepage": "https://github.com/anlityli/yii2-swoole-async-timer",
-    "license": "BSD-4-Clause",
-    "authors": [
-        {
-            "name": "anlity",
-            "email": "leo@leocode.net"
-        }
-    ],
-    "require": {
-        "yiisoft/yii2": "~2.0.0"
-    },
-    "autoload": {
-        "psr-4": {
-            "anlity\\swooleAsyncTimer\\": ""
-        }
-    },
-    "repositories":[
-        {
-            "type": "git",
-            "url": "https://github.com/anlityli/yii2-swoole-async-timer"
-        }
-    ]
-}

+ 0 - 34
vendor/anlity/yii2-swoole-async-timer/params-swoole-default.php

@@ -1,34 +0,0 @@
-<?php
-/**
- * Created by PhpStorm.
- * User: leo
- * Date: 2018/3/9
- * Time: 上午9:33
- */
-return [
-    'swooleAsyncTimer' => [
-        'host'             => '127.0.0.1', 		//服务启动IP
-        'port'             => '9512',      		//服务启动端口
-        'process_name'     => 'swooleServ',		//服务进程名
-        'open_tcp_nodelay' => '1',         		//启用open_tcp_nodelay
-        'daemonize'        => '1',				//守护进程化
-        'worker_num'       => '2',				//work进程数目
-        'task_worker_num'  => '2',				//task进程的数量
-        'task_max_request' => '10000',			//work进程最大处理的请求数
-        'task_enable_coroutine' => true,        // task支持协程
-        'task_tmpdir'      => dirname(__DIR__).'/runtime/task',		 //设置task的数据临时目录
-        'log_file'         => dirname(__DIR__).'/runtime/logs/swooleHttp.log', //指定swoole错误日志文件
-        'client_timeout'   => '20',				//client链接服务器时超时时间(s)
-        'pidfile'          => '/tmp/y.pid', 	//服务启动进程id文件保存位置
-
-        //--以上配置项均来自swoole-server的同名配置,可随意参考swoole-server配置说明自主增删--
-        'sender_client'    => 'swoole',         //请求服务端的客户端方式(swoole|curl)
-        'auth_key'          => '4m8s4Pjv9xroqo6D', //授权密钥
-        'max_time_diff'      => 0,              //请求服务端允许的最大时间差
-        'debug'            => true,             //是否开启调试模式
-        'with_timer'       => true,             //是否使用定时器
-        'timer_interval'   => 5000,             //定时器时间间隔
-        'log_size'         => 204800000, 		//运行时日志 单个文件大小
-        'log_dir'          => dirname(__DIR__).'/runtime/logs',			 //运行时日志 存放目录
-    ]
-];

+ 0 - 345
vendor/anlity/yii2-swoole-async-timer/src/SCurl.php

@@ -1,345 +0,0 @@
-<?php
-/**
- * Yii2 cURL wrapper
- * With RESTful support.
- *
- * @category  Web-yii2
- * @package   yii2-curl
- * @author    Nils Gajsek <info@linslin.org>
- * @copyright 2013-2015 Nils Gajsek<info@linslin.org>
- * @license   http://opensource.org/licenses/MIT MIT Public
- * @version   1.0.7
- * @link      http://www.linslin.org
- *
- */
-
-namespace anlity\swooleAsyncTimer\src;
-
-use Yii;
-use yii\base\Exception;
-use yii\helpers\Json;
-use yii\web\HttpException;
-
-/**
- * cURL class
- */
-class SCurl
-{
-
-    // ################################################ class vars // ################################################
-
-
-    /**
-     * @var string
-     * Holds response data right after sending a request.
-     */
-    public $response = null;
-
-    /**
-     * @var integer HTTP-Status Code
-     * This value will hold HTTP-Status Code. False if request was not successful.
-     */
-    public $responseCode = null;
-
-    /**
-     * @var array HTTP-Status Code
-     * Custom options holder
-     */
-    private $_options = array();
-
-
-    /**
-     * @var object
-     * Holds cURL-Handler
-     */
-    private $_curl = null;
-
-
-    /**
-     * @var array default curl options
-     * Default curl options
-     */
-    private $_defaultOptions = array(
-        CURLOPT_USERAGENT      => 'Yii2-Curl-Agent',
-        CURLOPT_TIMEOUT        => 30,
-        CURLOPT_CONNECTTIMEOUT => 30,
-        CURLOPT_RETURNTRANSFER => true,
-        CURLOPT_HEADER         => false,
-    );
-
-
-
-    // ############################################### class methods // ##############################################
-
-    /**
-     * Start performing GET-HTTP-Request
-     *
-     * @param string  $url
-     * @param boolean $raw if response body contains JSON and should be decoded
-     *
-     * @return mixed response
-     */
-    public function get($url, $raw = true)
-    {
-        return $this->_httpRequest('GET', $url, $raw);
-    }
-
-
-    /**
-     * Start performing HEAD-HTTP-Request
-     *
-     * @param string $url
-     *
-     * @return mixed response
-     */
-    public function head($url)
-    {
-        return $this->_httpRequest('HEAD', $url);
-    }
-
-
-    /**
-     * Start performing POST-HTTP-Request
-     *
-     * @param string  $url
-     * @param boolean $raw if response body contains JSON and should be decoded
-     *
-     * @return mixed response
-     */
-    public function post($url, $raw = true)
-    {
-        return $this->_httpRequest('POST', $url, $raw);
-    }
-
-
-    /**
-     * Start performing PUT-HTTP-Request
-     *
-     * @param string  $url
-     * @param boolean $raw if response body contains JSON and should be decoded
-     *
-     * @return mixed response
-     */
-    public function put($url, $raw = true)
-    {
-        return $this->_httpRequest('PUT', $url, $raw);
-    }
-
-
-    /**
-     * Start performing DELETE-HTTP-Request
-     *
-     * @param string  $url
-     * @param boolean $raw if response body contains JSON and should be decoded
-     *
-     * @return mixed response
-     */
-    public function delete($url, $raw = true)
-    {
-        return $this->_httpRequest('DELETE', $url, $raw);
-    }
-
-
-    /**
-     * Set curl option
-     *
-     * @param string $key
-     * @param mixed  $value
-     *
-     * @return $this
-     */
-    public function setOption($key, $value)
-    {
-        //set value
-        if (array_key_exists($key, $this->_defaultOptions) && $key !== CURLOPT_WRITEFUNCTION) {
-            $this->_defaultOptions[$key] = $value;
-        } else {
-            $this->_options[$key] = $value;
-        }
-
-        //return self
-        return $this;
-    }
-
-
-    /**
-     * Set curl options
-     *
-     * @param array $options
-     *
-     * @return $this
-     */
-    public function setOptions($options)
-    {
-        $this->_options = $options + $this->_options;
-
-        return $this;
-    }
-
-
-    /**
-     * Unset a single curl option
-     *
-     * @param string $key
-     *
-     * @return $this
-     */
-    public function unsetOption($key)
-    {
-        //reset a single option if its set already
-        if (isset($this->_options[$key])) {
-            unset($this->_options[$key]);
-        }
-
-        return $this;
-    }
-
-
-    /**
-     * Unset all curl option, excluding default options.
-     *
-     * @return $this
-     */
-    public function unsetOptions()
-    {
-        //reset all options
-        if (isset($this->_options)) {
-            $this->_options = array();
-        }
-
-        return $this;
-    }
-
-
-    /**
-     * Total reset of options, responses, etc.
-     *
-     * @return $this
-     */
-    public function reset()
-    {
-        if ($this->_curl !== null) {
-            curl_close($this->_curl); //stop curl
-        }
-
-        //reset all options
-        if (isset($this->_options)) {
-            $this->_options = array();
-        }
-
-        //reset response & status code
-        $this->_curl = null;
-        $this->response = null;
-        $this->responseCode = null;
-
-        return $this;
-    }
-
-
-    /**
-     * Return a single option
-     *
-     * @param string|integer $key
-     * @return mixed|boolean
-     */
-    public function getOption($key)
-    {
-        //get merged options depends on default and user options
-        $mergesOptions = $this->getOptions();
-
-        //return value or false if key is not set.
-        return isset($mergesOptions[$key]) ? $mergesOptions[$key] : false;
-    }
-
-
-    /**
-     * Return merged curl options and keep keys!
-     *
-     * @return array
-     */
-    public function getOptions()
-    {
-        return $this->_options + $this->_defaultOptions;
-    }
-
-
-    /**
-     * Get curl info according to http://php.net/manual/de/function.curl-getinfo.php
-     *
-     * @return mixed
-     */
-    public function getInfo($opt = null)
-    {
-        if ($this->_curl !== null && $opt === null) {
-            return curl_getinfo($this->_curl);
-        } elseif ($this->_curl !== null && $opt !== null) {
-            return curl_getinfo($this->_curl, $opt);
-        } else {
-            return [];
-        }
-    }
-
-
-    /**
-     * Performs HTTP request
-     *
-     * @param string  $method
-     * @param string  $url
-     * @param boolean $raw if response body contains JSON and should be decoded -> helper.
-     *
-     * @throws Exception if request failed
-     *
-     * @return mixed
-     */
-    private function _httpRequest($method, $url, $raw = false)
-    {
-        //set request type and writer function
-        $this->setOption(CURLOPT_CUSTOMREQUEST, strtoupper($method));
-
-        //check if method is head and set no body
-        if ($method === 'HEAD') {
-            $this->setOption(CURLOPT_NOBODY, true);
-            $this->unsetOption(CURLOPT_WRITEFUNCTION);
-        }
-
-        //setup error reporting and profiling
-        Yii::trace('Start sending cURL-Request: '.$url.'\n', __METHOD__);
-        Yii::beginProfile($method.' '.$url.'#'.md5(serialize($this->getOption(CURLOPT_POSTFIELDS))), __METHOD__);
-
-        /**
-         * proceed curl
-         */
-        $this->_curl = curl_init($url);
-        curl_setopt_array($this->_curl, $this->getOptions());
-        $body = curl_exec($this->_curl);
-
-        //check if curl was successful
-        if ($body === false) {
-            switch (curl_errno($this->_curl)) {
-                case 7:
-                    $this->responseCode = 'timeout';
-                    return false;
-                    break;
-
-                default:
-                    throw new Exception('curl request failed: ' . curl_error($this->_curl), curl_errno($this->_curl));
-                    break;
-            }
-        }
-
-        //retrieve response code
-        $this->responseCode = curl_getinfo($this->_curl, CURLINFO_HTTP_CODE);
-        $this->response = $body;
-
-        //end yii debug profile
-        Yii::endProfile($method.' '.$url .'#'.md5(serialize($this->getOption(CURLOPT_POSTFIELDS))), __METHOD__);
-
-        //check responseCode and return data/status
-        if ($this->getOption(CURLOPT_CUSTOMREQUEST) === 'HEAD') {
-            return true;
-        } else {
-            $this->response = $raw ? $this->response : Json::decode($this->response);
-            return $this->response;
-        }
-    }
-}

+ 0 - 484
vendor/anlity/yii2-swoole-async-timer/src/SServer.php

@@ -1,484 +0,0 @@
-<?php
-/**
- * Swoole 实现的 server,用来处理异步多进程任务
- * $Id: SServer.php 9507 2016-09-29 06:48:44Z mevyen $
- * $Date: 2016-09-29 14:48:44 +0800 (Wed, 07 Sep 2016) $
- * $Author: mevyen $
- * $Modifier: anlity $
- */
-
-namespace anlity\swooleAsyncTimer\src;
-
-use SebastianBergmann\Timer\Timer;
-use yii\base\Exception;
-use yii\helpers\Json;
-
-class SServer {
-    /**
-     * swoole server 实例
-     * @var null|swoole_server
-     */
-    protected $server = null;
-
-    /**
-     * swoole 配置
-     * @var array
-     */
-    private $setting = [];
-
-    /**
-     * Yii::$app 对象
-     * @var array
-     */
-    private $app = null;
-
-    /**
-     * 定时器ID
-     * @var
-     */
-    private $_timerId = false;
-
-    private $_swooleController;
-
-    /**
-     * SServer constructor.
-     * @param $setting
-     * @param $app
-     * @param $swooleController
-     */
-    public function __construct($setting,$app, &$swooleController){
-        $this->setting = $setting;
-        $this->app = $app;
-        $this->_swooleController = $swooleController;
-    }
-
-    /**
-     * 设置swoole进程名称
-     * @param string $name swoole进程名称
-     */
-    private function setProcessName($name){
-        if (function_exists('cli_set_process_title')) {
-            @cli_set_process_title($name);
-        } else {
-            if (function_exists('swoole_set_process_name')) {
-                @swoole_set_process_name($name);
-            } else {
-                trigger_error(__METHOD__. " failed.require cli_set_process_title or swoole_set_process_name.");
-            }
-        }
-    }
-
-    /**
-     * 运行服务
-     * @return mixed
-     */
-    public function run(){
-
-        $this->server = $this->app->swooleAsyncTimer->swooleServer = new \swoole_websocket_server($this->setting['host'], $this->setting['port']);
-        $this->server->set($this->setting);
-        //回调函数
-        $call = [
-            'start',
-            'workerStart',
-            'managerStart',
-            'open',
-            'message',
-            //'receive',
-            'request',
-            'task',
-            'finish',
-            'close',
-            'workerStop',
-            'workerExit',
-            'shutdown',
-        ];
-        //事件回调函数绑定
-        foreach ($call as $v) {
-            $m = 'on' . ucfirst($v);
-            if($this->setting['task_enable_coroutine'] && $v == 'task'){
-                $m = 'onTaskEnableCoroutine';
-            }
-            if (method_exists($this, $m)) {
-                $this->server->on($v, [$this, $m]);
-            }
-        }
-
-        echo "服务成功启动" . PHP_EOL;
-        echo "服务运行名称:{$this->setting['process_name']}" . PHP_EOL;
-        echo "服务运行端口:{$this->setting['host']}:{$this->setting['port']}" . PHP_EOL;
-
-        return $this->server->start();
-    }
-
-    /**
-     * @param $server
-     * @return bool
-     */
-    public function onStart($server){
-        echo '[' . date('Y-m-d H:i:s') . "]\t swoole_server master worker start\n";
-        $this->setProcessName($server->setting['process_name'] . '-master');
-        //记录进程id,脚本实现自动重启
-        $pid = "{$this->server->master_pid}\n{$this->server->manager_pid}";
-        file_put_contents($this->setting['pidfile'], $pid);
-        return true;
-    }
-
-    /**
-     * @param $server
-     */
-    public function onManagerStart($server){
-        echo '[' . date('Y-m-d H:i:s') . "]\t swoole_server manager worker start\n";
-        $this->setProcessName($server->setting['process_name'] . '-manager');
-    }
-
-    /**
-     * @param $server
-     * @param $request
-     */
-    public function onOpen($server, $request){
-        $this->app->swooleAsyncTimer->onOpen($request->fd);
-    }
-
-    /**
-     * @param $server
-     * @param $frame
-     * @return mixed
-     */
-    public function onMessage($server, $frame){
-        // 检测服务是否开启
-        if($frame->data == 'stats'){
-            $websocket_number['websocket_number'] = count($server->connection_list(0,100));
-            array_push($websocket_number,$server->stats());
-            return $server->push($frame->fd,Json::encode($websocket_number));
-        }
-        else {
-            $data = Json::decode($frame->data);
-            if(isset($data['type'])){
-                $socketSecurity = new SocketSecurity($this->setting);
-                if(!$socketSecurity->checkSignature($data['signature'], $data)){
-                    return $server->push($frame->fd, 'false');
-                }
-                // 处理异步任务
-                if($data['type'] == 'async'){
-                    $server->task($data['data']);
-                    return $server->push($frame->fd, 'to task success!');
-                }
-                // 处理消息推送任务
-                elseif ($data['type'] == 'pushMsg'){
-                    if($server->push($data['fd'], $data['data'])){
-                        return $server->push($frame->fd, 'to push message success!');
-                    }
-                }
-                // 处理消息推送全部连接
-                elseif ($data['type'] == 'pushMsgAll'){
-                    $pushMsgAllResult = true;
-                    foreach($server->connections as $fd){
-                        if(!$server->push($fd, $data['data'])) $pushMsgAllResult = false;
-                    }
-                    if($pushMsgAllResult){
-                        return $server->push($frame->fd, 'to push message success!');
-                    }
-                } else {
-                    echo('类型失败'.PHP_EOL);
-                }
-                return $server->push($frame->fd, 'false');
-            } else {
-                return $this->app->swooleAsyncTimer->onMessage($frame->fd, $frame->data);
-            }
-        }
-    }
-
-    /**
-     * @param $server
-     * @param $fd
-     */
-    public function onClose($server, $fd){
-        //unlink($this->setting['pidfile']);
-        $this->app->swooleAsyncTimer->onClose($fd);
-        //echo '[' . date('Y-m-d H:i:s') . "]\t swoole_server shutdown\n";
-    }
-
-    /**
-     * @param $server
-     * @param $workerId
-     */
-    public function onWorkerStart($server, $workerId){
-        if ($workerId >= $this->setting['worker_num']) {
-            $this->setProcessName($server->setting['process_name'] . '-task');
-        } else {
-            $this->setProcessName($server->setting['process_name'] . '-event');
-        }
-        //记录进程id,脚本实现自动重启
-        $pid = "\n{$this->server->worker_pid}";
-        file_put_contents($this->setting['pidfile'], $pid, FILE_APPEND);
-        // 生成一个定时器
-        if ($this->setting['with_timer'] && !$server->taskworker && $workerId == 0) {
-            $server->tick($this->setting['timer_interval'], function($timerId) use($server){
-                $this->_timerId = $timerId;
-                //$this->_swooleController->timerCallback($timerId, $server);
-                $this->app->swooleAsyncTimer->timerCallback($timerId, $server);
-            });
-        }
-        $this->app->swooleAsyncTimer->onWorkerStart($server, $workerId);
-    }
-
-    /**
-     * @param $server
-     * @param $workerId
-     */
-    public function onWorkerStop($server, $workerId){
-        $this->app->swooleAsyncTimer->onWorkerStop($server, $workerId);
-        echo '['. date('Y-m-d H:i:s') ."]\t swoole_server[{$server->setting['process_name']}  worker:{$workerId} shutdown\n";
-    }
-
-    /**
-     * @param $server
-     * @param $workerId
-     */
-    public function onWorkerExit($server, $workerId){
-        // 清空定时器
-        foreach(\Swoole\Timer::list() as $timerId){
-            \Swoole\Timer::clear($timerId);
-        }
-        $this->app->swooleAsyncTimer->onWorkerExit($server, $workerId);
-        echo '['. date('Y-m-d H:i:s') ."]\t swoole_server[{$server->setting['process_name']}  worker:{$workerId} exit\n";
-    }
-
-    // /**
-    //  * 处理请求
-    //  * @param $request
-    //  * @param $response
-    //  *
-    //  * @return mixed
-    //  */
-    // public function onReceive($server, $fd, $from_id, $data){ 
-    //     if($data == 'stats'){
-    //         return $this->server->send($fd,var_export($this->server->stats(),true),$from_id);
-    //     }
-    //     $this->server->task($data); 
-    //     return true;
-
-    // }
-    /**
-     * 请求处理
-     * @param $request
-     * @param $response
-     *
-     * @return mixed
-     */
-    public function onRequest($request, $response)
-    { 
-        //获取swoole服务的当前状态
-        if (isset($request->post['cmd']) && $request->post['cmd'] == 'status') {
-            return $response->end(Json::encode($this->server->stats()));
-        } else {
-            if(isset($request->post['type'])){
-                $socketSecurity = new SocketSecurity($this->setting);
-                if(!$socketSecurity->checkSignature($request->post['signature'], $request->post)){
-                    return $response->end('false');
-                }
-                if($request->post['type'] == 'async'){
-                    $data = $request->post['data'];
-                    $this->server->task($data);
-                }
-                elseif($request->post['type'] == 'pushMsg'){
-                    $this->server->push($request->post['fd'], $request->post['data']);
-                }
-                elseif($request->post['type'] == 'pushMsgAll'){
-                    foreach($this->server->connections as $fd){
-                        $this->server->push($fd, $request->post['data']);
-                    }
-                }
-                else {
-                    return $response->end('false');
-                }
-            } else {
-                return $response->end('false');
-            }
-        }
-        $out = '[' . date('Y-m-d H:i:s') . '] ' . Json::encode($request) . PHP_EOL;
-        $response->end($out);
-
-        return true;
-    }
-
-    /**
-     * 任务处理
-     * @param $serv
-     * @param $task_id
-     * @param $from_id
-     * @param $data
-     * @return array|bool|mixed|void
-     */
-    public function onTask($serv, $task_id, $from_id, $data){
-        $this->logger('[task data] '.$data);
-        $data = $this->parseData($data);
-        if($data === false){
-            return;
-        }
-        foreach ($data['data'] as $param) {
-            if(!isset($param['a']) || empty($param['a'])){
-                continue;
-            }
-            $action = $param["a"];
-            $params = [];
-            if(isset($param['p'])){
-                $params = $param['p'];
-                if(!is_array($params)){
-                    $params = [strval($params)];
-                }
-            }
-            $this->app->swooleAsyncTimer->onTaskRunActionStart($serv, $from_id, $action, $params);
-            try{
-                //print_r($action.PHP_EOL);
-                $parts = $this->app->createController($action);
-                if (is_array($parts)) {
-                    $res = $this->app->runAction($action,$params);
-                    $this->logger('[task result] '.var_export($res,true));
-                }
-                if($this->app->db && $this->app->db->isActive){
-                    $this->app->db->close();
-                }
-            }catch(Exception $e){
-                $this->app->swooleAsyncTimer->onTaskRunActionError($serv, $from_id, $action, $params, $e->getMessage());
-                $this->logger($e->getMessage());
-            }
-            $this->app->swooleAsyncTimer->onTaskRunActionFinish($serv, $from_id, $action, $params);
-        }
-        return $data;
-    }
-
-    /**
-     * 开启了 task_enable_coroutine 的task回调函数
-     * @param $serv
-     * @param \Swoole\Server\Task $task
-     */
-    public function onTaskEnableCoroutine($serv, \Swoole\Server\Task $task){
-        $this->logger('[task data] '.$task->data);
-        $data = $this->parseData($task->data);
-        if($data === false){
-            return;
-        }
-        foreach ($data['data'] as $param) {
-            if(!isset($param['a']) || empty($param['a'])){
-                continue;
-            }
-            $action = $param["a"];
-            $params = [];
-            if(isset($param['p'])){
-                $params = $param['p'];
-                if(!is_array($params)){
-                    $params = [strval($params)];
-                }
-            }
-            $this->app->swooleAsyncTimer->onTaskRunActionStart($serv, $task->worker_id, $action, $params);
-            try{
-                //print_r($action.PHP_EOL);
-                $parts = $this->app->createController($action);
-                if (is_array($parts)) {
-                    $res = $this->app->runAction($action,$params);
-                    $this->logger('[task result] '.var_export($res,true));
-                }
-                if($this->app->db && $this->app->db->isActive){
-                    $this->app->db->close();
-                }
-            }catch(\Exception $e){
-                $this->app->swooleAsyncTimer->onTaskRunActionError($serv, $task->worker_id, $action, $params, $e->getMessage());
-                $this->logger($e->getMessage());
-            }
-            $this->app->swooleAsyncTimer->onTaskRunActionFinish($serv, $task->worker_id, $action, $params);
-        }
-        $task->finish($data);
-    }
-
-    /**
-     * 解析data对象
-     * @param $data
-     * @return array|bool|mixed
-     */
-    private function parseData($data){
-        if(is_string($data)){
-            $data = Json::decode($data);
-        }
-        $data = $data ?: [];
-        if(!isset($data["data"]) || empty($data["data"])){
-            return false;
-        }
-        return $data;
-
-    }
-
-    /**
-     * 解析onfinish数据
-     * @param $data
-     * @return bool|string
-     */
-    private function genFinishData($data){
-        if(!isset($data['finish']) || !is_array($data['finish'])){
-            return false;
-        }
-        return Json::encode(['data'=>$data['finish']]);
-    }
-
-    /**
-     * 任务结束回调函数
-     * @param $server
-     * @param $taskId
-     * @param $data
-     * @return bool
-     */
-    public function onFinish($server, $taskId, $data){
-
-        $data = $this->genFinishData($data);
-        if($data !== false ){
-            return $this->server->task($data);
-        }
-
-        return true;
-
-    }
-
-    /**
-     *
-     */
-    public function onShutdown(){
-        echo '[' . date('Y-m-d H:i:s') . "]\t server shutdown 关闭服务完成\n";
-        unlink($this->setting['pidfile']);
-    }
-
-    /**
-     * 记录日志 日志文件名为当前年月(date("Y-m"))
-     * @param $msg
-     * @param string $logfile
-     */
-    public function logger($msg,$logfile='') {
-        if (empty($msg)) {
-            return;
-        }
-        if (!$this->setting['debug']){
-            return;
-        }
-        if (!is_string($msg)) {
-            if(is_object($msg) || is_array($msg)){
-                $msg = var_export($msg, true);
-            } else {
-                $msg = '未知错误';
-            }
-        }
-        //日志内容
-        $msg = '['. date('Y-m-d H:i:s') .'] '. $msg . PHP_EOL;
-        //日志文件大小
-        $maxSize = $this->setting['log_size'];
-        //日志文件位置
-        $file = $logfile ?: $this->setting['log_dir']."/".date('Y-m').".log";
-        //切割日志
-        if (file_exists($file) && filesize($file) >= $maxSize) {
-            $bak = $file.'-'.time();
-            if (!rename($file, $bak)) {
-                error_log("rename file:{$file} to {$bak} failed", 3, $file);
-            }
-        }
-        error_log($msg, 3, $file);
-    }
-}
-

+ 0 - 504
vendor/anlity/yii2-swoole-async-timer/src/SWebSocket.php

@@ -1,504 +0,0 @@
-<?php
-namespace anlity\swooleAsyncTimer\src;
-
-class SWebSocket
-{
-    const VERSION = '0.1.4';
-    const TOKEN_LENGHT = 16;
-    const TYPE_ID_WELCOME = 0;
-    const TYPE_ID_PREFIX = 1;
-    const TYPE_ID_CALL = 2;
-    const TYPE_ID_CALLRESULT = 3;
-    const TYPE_ID_ERROR = 4;
-    const TYPE_ID_SUBSCRIBE = 5;
-    const TYPE_ID_UNSUBSCRIBE = 6;
-    const TYPE_ID_PUBLISH = 7;
-    const TYPE_ID_EVENT = 8;
-    protected $key;
-    protected $host;
-    protected $port;
-    protected $path;
-    /**
-     * @var TCP
-     */
-    protected $socket;
-    protected $buffer = '';
-    /**
-     * @var bool
-     */
-    protected $connected = false;
-    protected $handshake = false;
-    protected $ssl = false;
-    protected $ssl_key_file;
-    protected $ssl_cert_file;
-    protected $haveSwooleEncoder = false;
-    protected $header;
-
-    const GUID = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11';
-    const UserAgent = 'SwooleWebsocketClient';
-    /**
-     * @param string $host
-     * @param int $port
-     * @param string $path
-     */
-    function __construct($host, $port = 80, $path = '/')
-    {
-        if (empty($host))
-        {
-            throw new \Exception("require websocket server host.");
-        }
-        $this->haveSwooleEncoder = method_exists('swoole_websocket_server', 'pack');
-        $this->host = $host;
-        $this->port = $port;
-        $this->path = $path;
-        $this->key = $this->generateToken(self::TOKEN_LENGHT);
-        $this->parser = new \Exception();
-    }
-    /**
-     * @param string $keyFile
-     * @param string $certFile
-     */
-    function enableCrypto($keyFile = '', $certFile = '')
-    {
-        if (!extension_loaded('swoole'))
-        {
-            throw new \Exception("require swoole extension.");
-        }
-        $this->ssl = true;
-        $this->ssl_key_file = $keyFile;
-        $this->ssl_cert_file = $certFile;
-    }
-    /**
-     * Disconnect on destruct
-     */
-    function __destruct()
-    {
-        if ($this->connected)
-        {
-            $this->disconnect();
-        }
-    }
-    /**
-     * Connect client to server
-     * @param $timeout
-     * @return $this
-     */
-    public function connect($timeout = 0.5)
-    {
-//        if (extension_loaded('swoole'))
-//        {
-            $type = SWOOLE_TCP;
-            if ($this->ssl)
-            {
-                $type |= SWOOLE_SSL;
-            }
-            $this->socket = new \swoole_client($type);
-            if ($this->ssl_key_file)
-            {
-                $this->socket->set(array(
-                    'ssl_key_file' => $this->ssl_key_file,
-                    'ssl_cert_file' => $this->ssl_cert_file
-                ));
-            }
-//        }
-//        else
-//        {
-//            $this->socket = new TCP;
-//        }
-        //建立连接
-        if (!$this->socket->connect($this->host, $this->port, $timeout))
-        {
-            return false;
-        }
-        $this->connected = true;
-        //WebSocket握手
-        if ($this->socket->send($this->createHeader()) === false)
-        {
-            return false;
-        }
-        $headerBuffer = '';
-        while(true)
-        {
-            $_tmp = $this->socket->recv();
-            if ($_tmp)
-            {
-                $headerBuffer .= $_tmp;
-                $offset = stripos($headerBuffer,"\r\n\r\n");
-                if ($offset === false) {
-                    continue;
-                }
-                $header = substr($headerBuffer, 0, $offset+4);
-                $this->buffer = substr($headerBuffer, $offset+4);
-            }
-            else
-            {
-                return false;
-            }
-            return $this->doHandShake($header);
-        }
-        return false;
-    }
-    /**
-     * 握手
-     * @param $headerBuffer
-     * @return bool
-     */
-    function doHandShake($headerBuffer)
-    {
-        $header = self::parseHeader($headerBuffer);
-        if (!isset($header['Sec-WebSocket-Accept']))
-        {
-            $this->disconnect();
-            return false;
-        }
-        if ($header['Sec-WebSocket-Accept'] != base64_encode(pack('H*', sha1($this->key . self::GUID))))
-        {
-            $this->disconnect();
-            return false;
-        }
-        $this->handshake = true;
-        $this->header = $header;
-        return true;
-    }
-    /**
-     * Disconnect from server
-     */
-    public function disconnect()
-    {
-        $this->connected = false;
-        $this->socket->close();
-    }
-    /**
-     * 接收数据
-     */
-    function recv()
-    {
-        if (!$this->handshake)
-        {
-            trigger_error("not complete handshake.");
-            return false;
-        }
-        while (true)
-        {
-            $data = $this->socket->recv();
-            if ($this->buffer) {
-                $data = $this->buffer.$data;
-                $this->buffer = '';
-            }
-            if (!$data)
-            {
-                return false;
-            }
-            //$this->parser->push($data);
-//            $frame = $this->parser->pop($data);
-//            if ($frame)
-//            {
-//                return $frame->data;
-//            }
-            return $data;
-        }
-        return false;
-    }
-    /**
-     * send string data
-     * @param $data
-     * @param string $type
-     * @param bool $masked
-     * @throws \Exception
-     * @return bool
-     */
-    public function send($data, $type = 'text', $masked = true)
-    {
-        if (empty($data))
-        {
-            throw new \Exception("data is empty");
-        }
-        if (!$this->handshake)
-        {
-            trigger_error("not complete handshake.");
-            return false;
-        }
-        if ($this->haveSwooleEncoder)
-        {
-            switch($type)
-            {
-                case 'text':
-                    $_type = WEBSOCKET_OPCODE_TEXT;
-                    break;
-                case 'binary':
-                case 'bin':
-                    $_type = WEBSOCKET_OPCODE_BINARY;
-                    break;
-                default:
-                    return false;
-            }
-            $_send = \swoole_websocket_server::pack($data, $_type);
-        }
-        else
-        {
-            $_send =  $this->hybi10Encode($data, $type, $masked);
-        }
-        return $this->socket->send($_send);
-    }
-    /**
-     * send json object
-     * @param $data
-     * @param bool $masked
-     * @return bool
-     */
-    function sendJson($data, $masked = true)
-    {
-        return $this->send(json_encode($data), 'text', $masked);
-    }
-    /**
-     * Create header for websocket client
-     * @return string
-     */
-    final protected function createHeader()
-    {
-        $host = $this->host;
-        if ($host === '127.0.0.1' || $host === '0.0.0.0')
-        {
-            $host = 'localhost';
-        }
-        return "GET {$this->path} HTTP/1.1" . "\r\n" .
-            "Origin: null" . "\r\n" .
-            "Host: {$host}:{$this->port}" . "\r\n" .
-            "Sec-WebSocket-Key: {$this->key}" . "\r\n" .
-            "User-Agent: ".self::UserAgent."/" . self::VERSION . "\r\n" .
-            "Upgrade: Websocket" . "\r\n" .
-            "Connection: Upgrade" . "\r\n" .
-            "Sec-WebSocket-Protocol: wamp" . "\r\n" .
-            "Sec-WebSocket-Version: 13" . "\r\n" . "\r\n";
-    }
-    /**
-     * Parse raw incoming data
-     *
-     * @param $header
-     * @return array
-     */
-    final protected function parseIncomingRaw($header)
-    {
-        $retval = array();
-        $content = "";
-        $fields = explode("\r\n", preg_replace('/\x0D\x0A[\x09\x20]+/', ' ', $header));
-        foreach ($fields as $field) {
-            if (preg_match('/([^:]+): (.+)/m', $field, $match)) {
-                $match[1] = preg_replace_callback('/(?<=^|[\x09\x20\x2D])./', function ($matches) {
-                    return strtoupper($matches[0]);
-                }, strtolower(trim($match[1])));
-                if (isset($retval[$match[1]])) {
-                    $retval[$match[1]] = array($retval[$match[1]], $match[2]);
-                } else {
-                    $retval[$match[1]] = trim($match[2]);
-                }
-            } else if (preg_match('!HTTP/1\.\d (\d)* .!', $field)) {
-                $retval["status"] = $field;
-            } else {
-                $content .= $field . "\r\n";
-            }
-        }
-        $retval['content'] = $content;
-        return $retval;
-    }
-    /**
-     * Generate token
-     *
-     * @param int $length
-     * @return string
-     */
-    private function generateToken($length)
-    {
-        $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"§$%&/()=[]{}';
-        $useChars = array();
-        // select some random chars:
-        for ($i = 0; $i < $length; $i++) {
-            $useChars[] = $characters[mt_rand(0, strlen($characters) - 1)];
-        }
-        // Add numbers
-        array_push($useChars, rand(0, 9), rand(0, 9), rand(0, 9));
-        shuffle($useChars);
-        $randomString = trim(implode('', $useChars));
-        $randomString = substr($randomString, 0, self::TOKEN_LENGHT);
-        return base64_encode($randomString);
-    }
-    /**
-     * Generate token
-     *
-     * @param int $length
-     * @return string
-     */
-    public function generateAlphaNumToken($length)
-    {
-        $characters = str_split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789');
-        srand((float)microtime() * 1000000);
-        $token = '';
-        do
-        {
-            shuffle($characters);
-            $token .= $characters[mt_rand(0, (count($characters) - 1))];
-        } while (strlen($token) < $length);
-        return $token;
-    }
-    /**
-     * @param $payload
-     * @param string $type
-     * @param bool $masked
-     * @return bool|string
-     */
-    private function hybi10Encode($payload, $type = 'text', $masked = true)
-    {
-        $frameHead = array();
-        $payloadLength = strlen($payload);
-        switch ($type)
-        {
-            //文本内容
-            case 'text':
-                // first byte indicates FIN, Text-Frame (10000001):
-                $frameHead[0] = 129;
-                break;
-            //二进制内容
-            case 'binary':
-            case 'bin':
-                // first byte indicates FIN, Text-Frame (10000010):
-                $frameHead[0] = 130;
-                break;
-            case 'close':
-                // first byte indicates FIN, Close Frame(10001000):
-                $frameHead[0] = 136;
-                break;
-            case 'ping':
-                // first byte indicates FIN, Ping frame (10001001):
-                $frameHead[0] = 137;
-                break;
-            case 'pong':
-                // first byte indicates FIN, Pong frame (10001010):
-                $frameHead[0] = 138;
-                break;
-        }
-        // set mask and payload length (using 1, 3 or 9 bytes)
-        if ($payloadLength > 65535)
-        {
-            $payloadLengthBin = str_split(sprintf('%064b', $payloadLength), 8);
-            $frameHead[1] = ($masked === true) ? 255 : 127;
-            for ($i = 0; $i < 8; $i++)
-            {
-                $frameHead[$i + 2] = bindec($payloadLengthBin[$i]);
-            }
-            // most significant bit MUST be 0 (close connection if frame too big)
-            if ($frameHead[2] > 127)
-            {
-                $this->socket->close();
-                return false;
-            }
-        }
-        elseif ($payloadLength > 125)
-        {
-            $payloadLengthBin = str_split(sprintf('%016b', $payloadLength), 8);
-            $frameHead[1] = ($masked === true) ? 254 : 126;
-            $frameHead[2] = bindec($payloadLengthBin[0]);
-            $frameHead[3] = bindec($payloadLengthBin[1]);
-        }
-        else
-        {
-            $frameHead[1] = ($masked === true) ? $payloadLength + 128 : $payloadLength;
-        }
-        // convert frame-head to string:
-        foreach (array_keys($frameHead) as $i)
-        {
-            $frameHead[$i] = chr($frameHead[$i]);
-        }
-        // generate a random mask:
-        $mask = array();
-        if ($masked === true)
-        {
-            for ($i = 0; $i < 4; $i++)
-            {
-                $mask[$i] = chr(rand(0, 255));
-            }
-            $frameHead = array_merge($frameHead, $mask);
-        }
-        $frame = implode('', $frameHead);
-        // append payload to frame:
-        for ($i = 0; $i < $payloadLength; $i++)
-        {
-            $frame .= $masked ? $payload[$i] ^ $mask[$i % 4] : $payload[$i];
-        }
-        return $frame;
-    }
-    /**
-     * @param $data
-     * @return string
-     */
-    private function hybi10Decode($data)
-    {
-        if (empty($data))
-        {
-            throw new \Exception("data is empty");
-        }
-        $bytes = $data;
-        $secondByte = sprintf('%08b', ord($bytes[1]));
-        $masked = ($secondByte[0] == '1') ? true : false;
-        $dataLength = ($masked === true) ? ord($bytes[1]) & 127 : ord($bytes[1]);
-        //服务器不会设置mask
-        if ($dataLength === 126)
-        {
-            $decodedData = substr($bytes, 4);
-        }
-        elseif ($dataLength === 127)
-        {
-            $decodedData = substr($bytes, 10);
-        }
-        else
-        {
-            $decodedData = substr($bytes, 2);
-        }
-        exit("len=".$dataLength."\n");
-        return $decodedData;
-    }
-
-    public static function parseHeader($data)
-    {
-        $header = array();
-        $header[0] = array();
-        $meta = &$header[0];
-        $parts = explode("\r\n\r\n", $data, 2);
-        // parts[0] = HTTP头;
-        // parts[1] = HTTP主体,GET请求没有body
-        $headerLines = explode("\r\n", $parts[0]);
-        // HTTP协议头,方法,路径,协议[RFC-2616 5.1]
-        list($meta['method'], $meta['uri'], $meta['protocol']) = explode(' ', $headerLines[0], 3);
-        //错误的HTTP请求
-        if (empty($meta['method']) or empty($meta['uri']) or empty($meta['protocol']))
-        {
-            return false;
-        }
-        unset($headerLines[0]);
-        //解析Header
-        $header = array_merge($header, self::parseHeaderLine($headerLines));
-        return $header;
-    }
-
-    public static function parseHeaderLine($headerLines)
-    {
-        if (is_string($headerLines))
-        {
-            $headerLines = explode("\r\n", $headerLines);
-        }
-        $header = array();
-        foreach ($headerLines as $_h)
-        {
-            $_h = trim($_h);
-            if (empty($_h)) continue;
-            $_r = explode(':', $_h, 2);
-            // 头字段名称首字母大写
-            $keys = explode('-', $_r[0]);
-            $keys = array_map("ucfirst", $keys);
-            $key = implode('-', $keys);
-            $value = isset($_r[1])?$_r[1]:'';
-            $header[trim($key)] = trim($value);
-        }
-        return $header;
-    }
-
-}

+ 0 - 73
vendor/anlity/yii2-swoole-async-timer/src/SocketSecurity.php

@@ -1,73 +0,0 @@
-<?php
-/**
- * Created by PhpStorm.
- * User: Leo
- * Date: 2018/5/4
- * Time: 下午10:08
- */
-
-namespace anlity\swooleAsyncTimer\src;
-
-
-class SocketSecurity {
-
-    public $setting;
-
-    public function __construct($setting){
-        $this->setting = $setting;
-    }
-    /**
-     * 获取密钥
-     * @return string
-     */
-    public function getAuthKey(){
-        return $this->setting['auth_key'];
-    }
-
-    /**
-     * 获取允许的时间差
-     * @return string
-     */
-    public function getTimeDiff(){
-        return $this->setting['max_time_diff'];
-    }
-
-    /**
-     * 生成签名
-     * @param array $params
-     * @return array
-     */
-    public function paramsFormat(array $params){
-        if(!isset($params['timestamp'])){
-            $params['timestamp'] = time();
-        }
-        if(isset($params['signature'])){
-            unset($params['signature']);
-        }
-        ksort($params);
-        $string = '';
-        foreach($params as $key=>$value){
-            $string .= $key.'='.$value . '&';
-        }
-        $params['signature'] = sha1(trim($string,'&') . $this->getAuthKey());
-        return $params;
-    }
-
-    /**
-     * 验证签名
-     * @param $signature
-     * @param array $params
-     * @return bool
-     */
-    public function checkSignature($signature, array $params){
-        $params = $this->paramsFormat($params);
-        if($params['signature'] !== $signature){
-            return false;
-        }
-        $timeDiff = (int)$this->getTimeDiff();
-        if($timeDiff > 0 && (time() -> $params['timestamp']) > $timeDiff){
-            return false;
-        }
-        return true;
-    }
-}

+ 0 - 67
vendor/anlity/yii2-swoole-async-timer/src/SwooleClient.php

@@ -1,67 +0,0 @@
-<?php
-/**
- * Created by PhpStorm.
- * User: leo
- * Date: 2018/5/4
- * Time: 上午11:22
- */
-
-namespace anlity\swooleAsyncTimer\src;
-
-
-class SwooleClient
-{
-    public $option = [
-        'host' => '',
-        'port' => '',
-        'timeout' => 30,
-        'data' => '',
-    ];
-
-    private $_client;
-    private $_errors = [];
-
-    public function __construct()
-    {
-    }
-
-    public function setOption($attr, $value){
-        $this->option[$attr] = $value;
-    }
-
-    /**
-     * 发送请求
-     * @return bool|string
-     * @throws \Exception
-     */
-    public function post(){
-        $this->_client = new SWebSocket($this->option['host'], $this->option['port']);
-        if (!$this->_client->connect($this->option['timeout'])) {
-            $this->addError('connect', "服务器连接失败. Error: {$this->_client->errCode}");
-            return false;
-        }
-        $this->_client->send($this->option['data']);
-        $result = $this->_client->recv();
-        $this->_client->disconnect();
-        if($result === false){
-            $this->addError('send', "参数发送失败,Error:{$this->_client->errCode}");
-        }
-        return $result;
-    }
-
-    /**
-     * @param $attr
-     * @param $message
-     */
-    public function addError($attr, $message){
-        $this->_errors[$attr][] = $message;
-    }
-
-    /**
-     * @return array
-     */
-    public function getError(){
-        return $this->_errors;
-    }
-
-}

+ 0 - 248
vendor/anlity/yii2-swoole-async-timer/src/SwooleService.php

@@ -1,248 +0,0 @@
-<?php
-/**
- * 服务管理脚本
- * $Id: SwooleService.php 9507 2016-09-29 06:48:44Z mevyen $
- * $Date: 2016-09-29 14:48:44 +0800 (Wed, 07 Sep 2016) $
- * $Author: mevyen $
- */
-namespace anlity\swooleAsyncTimer\src;
-
-use yii\helpers\Json;
-
-class SwooleService{
-    /**
-     * 配置对象
-     * @var array
-     */
-    protected $settings = [];
-    /**
-     * Yii::$app
-     * @var null
-     */
-    private $app = null;
-
-    private $swooleContorller = null;
-
-    function __construct($settings,$app, &$swooleContorller){
-        $this->check();
-        $this->settings = $settings;
-        $this->app = $app;
-        $this->swooleContorller = $swooleContorller;
-    }
-
-    /**
-     * 检测
-     */
-    private function check(){
-        /**
-        * 检测 PDO_MYSQL
-        */
-        if (!extension_loaded('pdo_mysql')) {
-            exit('error:请安装PDO_MYSQL扩展' . PHP_EOL);
-        }
-        /**
-        * 检查exec 函数是否启用
-        */
-        if (!function_exists('exec')) {
-            exit('error:exec函数不可用' . PHP_EOL);
-        }
-        /**
-        * 检查命令 lsof 命令是否存在
-        */
-        exec("whereis lsof", $out);
-        if (strpos($out[0], "/usr/sbin/lsof") === false ) {
-            exit('error:找不到lsof命令,请确保lsof在/usr/sbin下' . PHP_EOL);
-        }
-    }
-
-    /**
-     * 获取指定端口的服务占用列表
-     * @param $port
-     * @return array
-     */
-    private function bindPort($port) {
-        $res = [];
-        $cmd = "/usr/sbin/lsof -i :{$port}|awk '$1 != \"COMMAND\"  {print $1, $2, $9}'";
-        exec($cmd, $out);
-        if ($out) {
-            foreach ($out as $v) {
-                $a = explode(' ', $v);
-                list($ip, $p) = explode(':', $a[2]);
-                $res[$a[1]] = [
-                    'cmd'  => $a[0],
-                    'ip'   => $ip,
-                    'port' => $p,
-                ];
-            }
-        }
-        return $res;
-    }
-
-    /**
-     * 启动服务
-     */
-    public function serviceStart(){
-
-        $pidfile = $this->settings['pidfile'];
-        $host = $this->settings['host'];
-        $port = $this->settings['port'];
-
-        $this->msg("服务正在启动...");
-
-        if (!is_writable(dirname($pidfile))) {
-            $this->error("pid文件需要写入权限");
-        }
-        if (file_exists($pidfile)) {
-            $pid = explode("\n", file_get_contents($pidfile));
-            $cmd = "ps ax | awk '{ print $1 }' | grep -e \"^{$pid[0]}$\"";
-            exec($cmd, $out);
-            if (!empty($out)) {
-                $this->msg("[warning]:pid文件已存在,服务已经启动,进程id为:{$pid[0]}",true);
-            } else {
-                $this->msg("[warning]:pid文件已存在,可能是服务上次异常退出");
-                unlink($pidfile);
-            }
-        }
-
-        $bind = $this->bindPort($port);
-
-        if ($bind) {
-            foreach ($bind as $k => $v) {
-                if ($v['ip'] == '*' || $v['ip'] == $host) {
-                    $this->error("服务启动失败,{$host}:{$port}端口已经被进程ID:{$k}占用");
-                }
-            }
-        }
-
-        //启动
-        $server = new SServer($this->settings,$this->app,$this->swooleContorller);
-        $server->run();
-        
-    }
-
-    /**
-     * 查看服务状态
-     */
-    public function serviceStats(){
-
-        $client = new \swoole_http_client($this->settings['host'], $this->settings['port']);
-//        if (!$client->connect($this->settings['host'], $this->settings['port'], $this->settings['client_timeout'])){
-//            exit("Error: connect server failed. code[{$client->errCode}]\n");
-//        }
-//        $client->send('stats');
-//
-//        echo $client->recv();
-        $client->on('message', function ($cli, $frame){
-            var_dump($frame);
-            echo(PHP_EOL);
-            $cli->close();
-        });
-        $client->upgrade('/', function ($cli){
-            $cli->push('stats');
-//            $cli->close();
-        });
-    }
-
-    /**
-     * 查看进程列表
-     */
-    public function serviceList(){
-
-        $cmd = "ps aux|grep " . $this->settings['process_name'] . "|grep -v grep|awk '{print $1, $2, $6, $8, $9, $11}'";
-        exec($cmd, $out);
-
-        if (empty($out)) {
-            $this->msg("没有发现正在运行服务",true);
-        }
-
-        $this->msg("本机运行的服务进程列表:");
-        $this->msg("USER PID RSS(kb) STAT START COMMAND");
-
-        foreach ($out as $v) {
-            $this->msg($v);
-        }
-
-    }
-
-    /**
-     * 停止服务
-     * @param bool $isForce
-     * @param callable|null $callback
-     */
-    public function serviceStop($isForce = false, callable $callback = null){
-
-        $pidfile = $this->settings['pidfile'];
-
-        $this->msg("正在停止服务...");
-
-        if (!file_exists($pidfile)) {
-            $this->msg("pid文件:". $pidfile ."不存在");
-        } else {
-            $pid = explode("\n", file_get_contents($pidfile));
-            if($isForce && !empty($pid)){
-                foreach($pid as $id){
-                    if($id){
-                        $this->_kill($id);
-                    }
-                }
-            }
-            if(!$isForce){
-                if ($pid[0]) {
-                    $this->_kill($pid[0]);
-                }
-            }
-
-            //确保停止服务后swoole-task-pid文件被删除
-            if (file_exists($pidfile)) {
-                unlink($pidfile);
-            }
-
-            $this->msg("服务已停止");
-        }
-        if($callback !== null) $callback();
-    }
-
-    /**
-     * 杀进程
-     * @param $pid
-     */
-    private function _kill($pid){
-        $cmd = "kill {$pid}";
-        exec($cmd, $sign);
-        do {
-            $out = [];
-            $c = "ps ax | awk '{ print $1 }' | grep -e \"^{$pid}$\"";
-            exec($c, $out);
-            if (empty($out)) {
-                break;
-            }else{
-                exec("kill -9 {$pid} >/dev/null 2>&1", $killOut);
-            }
-        } while (true);
-    }
-
-    /**
-     * 提示信息
-     * @param $msg
-     * @param bool $exit
-     */
-    private function msg($msg,$exit=false){
-
-        if($exit){
-            exit($msg . PHP_EOL);
-        }else{
-            echo $msg . PHP_EOL;
-        }
-    }
-
-    /**
-     * 提示错误信息
-     * @param $msg
-     */
-    private function error($msg){
-        exit("[error]:".$msg . PHP_EOL);
-    }
-    
-}
-
-

+ 0 - 12
vendor/autoload.php

@@ -1,12 +0,0 @@
-<?php
-
-// autoload.php @generated by Composer
-
-if (PHP_VERSION_ID < 50600) {
-    echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
-    exit(1);
-}
-
-require_once __DIR__ . '/composer/autoload_real.php';
-
-return ComposerAutoloaderInitfefd691d76b71aadb785cf30e72d29ac::getLoader();

+ 0 - 47
vendor/behat/gherkin/.github/workflows/build.yml

@@ -1,47 +0,0 @@
-name: Build
-
-on:
-  push:
-    branches: [master]
-  pull_request:
-  release:
-    types: [created]
-
-jobs:
-  tests:
-    runs-on: ubuntu-latest
-    name: Build and test
-    strategy:
-      fail-fast: false
-      matrix:
-        php: [7.2, 7.3, 7.4, 8.0, 8.1]
-        composer-flags: [ "" ]
-        symfony-version: [ "" ]
-        include:
-          -   php: 7.2
-              symfony-version: '3.*'
-          -   php: 7.3
-              symfony-version: '4.*'
-          -   php: 7.4
-              symfony-version: '5.*'
-          -   php: 8.0
-              symfony-version: '5.*'
-
-    steps:
-      -   uses: actions/checkout@v2
-
-      -   name: Setup PHP
-          uses: shivammathur/setup-php@v2
-          with:
-            php-version: "${{ matrix.php }}"
-            coverage: none
-
-      -   name: Update Symfony version
-          if: matrix.symfony-version != ''
-          run: composer require --no-update "symfony/symfony:${{ matrix.symfony-version }}"
-
-      -   name: Install dependencies
-          run: composer update ${{ matrix.composer-flags }}
-
-      -   name: Run tests (phpunit)
-          run: ./vendor/bin/phpunit

+ 0 - 49
vendor/behat/gherkin/.github/workflows/update.yml

@@ -1,49 +0,0 @@
-name: Update Cucumber
-
-on:
-  schedule:
-    -   cron: '0 7 * * *'
-
-jobs:
-  cucumber-update:
-    runs-on: ubuntu-latest
-    name: Upstream cucumber update
-    steps:
-      - name: Setup PHP
-        uses: shivammathur/setup-php@v2
-        with:
-          php-version: 7.4
-          coverage: none
-
-      - uses: actions/checkout@v2
-
-      - name: Install dependencies
-        run: composer update
-
-      - name: Update cucumber tag
-        id: cucumber
-        run: bin/update_cucumber
-
-      - name: Re-install dependencies
-        run: composer update
-        if: steps.cucumber.outputs.cucumber_version
-
-      - name: Update translations
-        run: bin/update_i18n
-        if: steps.cucumber.outputs.cucumber_version
-
-      - name: Find changelog
-        id: changelog
-        run: bin/cucumber_changelog ${{ steps.cucumber.outputs.cucumber_version }}
-        if: steps.cucumber.outputs.cucumber_version
-
-      - name: Open a PR
-        uses: peter-evans/create-pull-request@v3
-        if: steps.cucumber.outputs.cucumber_version
-        with:
-          commit-message: Automatic Cucumber tag update to ${{ steps.cucumber.outputs.cucumber_version }}
-          branch: cucumber-update-${{ steps.cucumber.outputs.cucumber_version }}
-          delete-branch: true
-          title: Cucumber update ${{ steps.cucumber.outputs.cucumber_version }}
-          body: ${{ steps.changelog.outputs.changelog }}
-          base: 'master'

+ 0 - 442
vendor/behat/gherkin/CHANGES.md

@@ -1,442 +0,0 @@
-4.9.0 / 2021-10-12
-==================
-
-* Simplify the boolean condition for the tag matching by @stof in https://github.com/Behat/Gherkin/pull/219
-* Remove symfony phpunit bridge by @ciaranmcnulty in https://github.com/Behat/Gherkin/pull/220
-* Ignore the bin folder in archives by @stof in https://github.com/Behat/Gherkin/pull/226
-* Cast table node exceptions into ParserExceptions when throwing by @ciaranmcnulty in https://github.com/Behat/Gherkin/pull/216
-* Cucumber changelog in PRs and using correct hash by @ciaranmcnulty in https://github.com/Behat/Gherkin/pull/225
-* Support alternative docstrings format (```) by @ciaranmcnulty in https://github.com/Behat/Gherkin/pull/214
-* Fix DocBlocks (Boolean -> bool) by @simonhammes in https://github.com/Behat/Gherkin/pull/237
-* Tag parsing by @ciaranmcnulty in https://github.com/Behat/Gherkin/pull/215
-* Remove test - cucumber added an example with Rule which is not supported by @ciaranmcnulty in https://github.com/Behat/Gherkin/pull/239
-* Add PHP 8.1 support by @javer in https://github.com/Behat/Gherkin/pull/242
-* Fix main branch alias version by @mvorisek in https://github.com/Behat/Gherkin/pull/244
-
-4.8.0 / 2021-02-04
-==================
-
-* Drop support for PHP before version 7.2
-
-4.7.3 / 2021-02-04
-==================
-
-* Refactored comments parsing to avoid Maximum function nesting level errors
-
-4.7.2 / 2021-02-03
-==================
-
-* Issue where Scenario Outline title was not populated into Examples
-* Updated translations from cucumber 16.0.0
-
-4.7.1 / 2021-01-26
-==================
-
-* Issue parsing comments before scenarios when following an Examples table
-
-4.7.0 / 2021-01-24
-==================
-
- * Provides better messages for TableNode construct errors
- * Now allows single character steps 
- * Supports multiple Example Tables with tags
-
-4.6.2 / 2020-03-17
-==================
-
- * Fixed issues due to incorrect cache key
-
-4.6.1 / 2020-02-27
-==================
-
- * Fix AZ translations
- * Correctly filter features, now that the base path is correctly set 
-
-4.6.0 / 2019-01-16
-==================
-
- * Updated translations (including 'Example' as synonym for 'Scenario' in `en`)
-
-4.5.1 / 2017-08-30
-==================
-
-  * Fix regression in `PathsFilter`
-
-4.5.0 / 2017-08-30
-==================
-
-  * Sync i18n with Cucumber Gherkin
-  * Drop support for HHVM tests on Travis
-  * Add `TableNode::fromList()` method (thanks @TravisCarden)
-  * Add `ExampleNode::getOutlineTitle()` method (thanks @duxet)
-  * Use realpath, so the feature receives the cwd prefixed (thanks @glennunipro)
-  * Explicitly handle non-two-dimensional arrays in TableNode (thanks @TravisCarden)
-  * Fix to line/linefilter scenario runs which take relative paths to files (thanks @generalconsensus)
-
-4.4.5 / 2016-10-30
-==================
-
-  * Fix partial paths matching in `PathsFilter`
-
-4.4.4 / 2016-09-18
-==================
-
-  * Provide clearer exception for non-writeable cache directories
-
-4.4.3 / 2016-09-18
-==================
-
-  * Ensure we reset tags between features
-
-4.4.2 / 2016-09-03
-==================
-
-  * Sync 18n with gherkin 3
-
-4.4.1 / 2015-12-30
-==================
-
-  * Ensure keywords are trimmed when syncing translations
-  * Sync 18n with cucumber
-
-4.4.0 / 2015-09-19
-==================
-
-  * Added validation enforcing that all rows of a `TableNode` have the same number of columns
-  * Added `TableNode::getColumn` to get a column from the table
-  * Sync 18n with cucumber
-
-4.3.0 / 2014-06-06
-==================
-
-  * Added `setFilters(array)` method to `Gherkin` class
-  * Added `NarrativeFilter` for non-english `RoleFilter` lovers
-
-4.2.1 / 2014-06-06
-==================
-
-  * Fix parsing of features without line feed at the end
-
-4.2.0 / 2014-05-27
-==================
-
-  * Added `getKeyword()` and `getKeywordType()` methods to `StepNode`, deprecated `getType()`.
-    Thanks to @kibao
-
-4.1.3 / 2014-05-25
-==================
-
-  * Properly handle tables with rows terminating in whitespace
-
-4.1.2 / 2014-05-14
-==================
-
-  * Handle case where Gherkin cache is broken
-
-4.1.1 / 2014-05-05
-==================
-
-  * Fixed the compatibility with PHP 5.6-beta by avoiding to use the broken PHP array function
-  * The YamlFileLoader no longer extend from ArrayLoader but from AbstractFileLoader
-
-4.1.0 / 2014-04-20
-==================
-
-  * Fixed scenario tag filtering
-  * Do not allow multiple multiline step arguments
-  * Sync 18n with cucumber
-
-4.0.0 / 2014-01-05
-==================
-
-  * Changed the behavior when no loader can be found for the resource. Instead of throwing an exception, the
-    Gherkin class now returns an empty array.
-
-3.1.3 / 2014-01-04
-==================
-
-  * Dropped the dependency on the Symfony Finder by using SPL iterators directly
-  * Added testing on HHVM on Travis. HHVM is officially supported (previous release was actually already compatible)
-
-3.1.2 / 2014-01-01
-==================
-
-  * All paths passed to PathsFilter are converted using realpath
-
-3.1.1 / 2013-12-31
-==================
-
-  * Add `ComplexFilterInterace` that has complex behavior for scenarios and requires to pass
-    feature too
-  * `TagFilter` is an instance of a `ComplexFilterInterace` now
-
-3.1.0 / 2013-12-31
-==================
-
-  * Example node is a scenario
-  * Nodes do not have uprefs (memory usage fix)
-  * Scenario filters do not depend on feature nodes
-
-3.0.5 / 2014-01-01
-==================
-
-  * All paths passed to PathsFilter are converted using realpath
-
-3.0.4 / 2013-12-31
-==================
-
-  * TableNode is now traversable using foreach
-  * All possibly thrown exceptions implement Gherkin\Exception interface
-  * Sync i18n with cucumber
-
-3.0.3 / 2013-09-15
-==================
-
-  * Extend ExampleNode with additional methods
-
-3.0.2 / 2013-09-14
-==================
-
-  * Extract `KeywordNodeInterface` and `ScenarioLikeInterface`
-  * Add `getIndex()` methods to scenarios, outlines, steps and examples
-  * Throw proper exception for fractured node tree
-
-3.0.1 / 2013-09-14
-==================
-
-  * Use versioned subfolder in FileCache
-
-3.0.0 / 2013-09-14
-==================
-
-  * A lot of optimizations in Parser and Lexer
-  * Node tree is now immutable by nature (no setters)
-  * Example nodes are now part of the node tree. They are lazily generated by Outline node
-  * Sync with latest cucumber i18n
-
-2.3.4 / 2013-08-11
-==================
-
-  * Fix leaks in memory cache
-
-2.3.3 / 2013-08-11
-==================
-
-  * Fix encoding bug introduced with previous release
-  * Sync i18n with cucumber
-
-2.3.2 / 2013-08-11
-==================
-
-  * Explicitly use utf8 encoding
-
-2.3.1 / 2013-08-10
-==================
-
-  * Support `an` prefix with RoleFilter
-
-2.3.0 / 2013-08-04
-==================
-
-  * Add RoleFilter
-  * Add PathsFilter
-  * Add MemoryCache
-
-2.2.9 / 2013-03-02
-==================
-
-  * Fix dependency version requirement
-
-2.2.8 / 2013-03-02
-==================
-
-  * Features filtering behavior change. Now emptified (by filtering) features
-    that do not match filter themselves are removed from resultset.
-  * Small potential bug fix in TableNode
-
-2.2.7 / 2013-01-27
-==================
-
-  * Fixed bug in i18n syncing script
-  * Resynced Gherkin i18n
-
-2.2.6 / 2013-01-26
-==================
-
-  * Support long row hashes in tables ([see](https://github.com/Behat/Gherkin/issues/40))
-  * Synced Gherkin i18n
-
-2.2.5 / 2012-09-26
-==================
-
-  * Fixed issue with loading empty features
-  * Synced Gherkin i18n
-
-2.2.4 / 2012-08-03
-==================
-
-  * Fixed exception message for "no loader found"
-
-2.2.3 / 2012-08-03
-==================
-
-  * Fixed minor loader bug with empty base path
-  * Synced Gherkin i18n
-
-2.2.2 / 2012-07-01
-==================
-
-  * Added ability to filter outline scenarios by line and range filters
-  * Synced Gherkin i18n
-  * Refactored table parser to read row line numbers too
-
-2.2.1 / 2012-05-04
-==================
-
-  * Fixed StepNode `getLanguage()` and `getFile()`
-
-2.2.0 / 2012-05-03
-==================
-
-  * Features freeze after parsing
-  * Implemented GherkinDumper (@Halleck45)
-  * Synced i18n with Cucumber
-  * Updated inline documentation
-
-2.1.1 / 2012-03-09
-==================
-
-  * Fixed caching bug, where `isFresh()` always returned false
-
-2.1.0 / 2012-03-09
-==================
-
-  * Added parser caching layer
-  * Added support for table delimiter escaping (use `\|` for that)
-  * Added LineRangeFilter (thanks @headrevision)
-  * Synced i18n dictionary with cucumber/gherkin
-
-2.0.2 / 2012-02-04
-==================
-
-  * Synced i18n dictionary with cucumber/gherkin
-
-2.0.1 / 2012-01-26
-==================
-
-  * Fixed issue about parsing features without indentation
-
-2.0.0 / 2012-01-19
-==================
-
-  * Background titles support
-  * Correct parsing of titles/descriptions (hirarchy lexing)
-  * Migration to the cucumber/gherkin i18n dictionary
-  * Speed optimizations
-  * Refactored KeywordsDumper
-  * New loaders
-  * Bugfixes
-
-1.1.4 / 2012-01-08
-==================
-
-  * Read feature description even if it looks like a step
-
-1.1.3 / 2011-12-14
-==================
-
-  * Removed file loading routines from Parser (fixes `is_file()` issue on some systems - thanks
-    @flodocteurklein)
-
-1.1.2 / 2011-12-01
-==================
-
-  * Updated spanish trasnaltion (@anbotero)
-  * Integration with Composer and Travis CI
-
-1.1.1 / 2011-07-29
-==================
-
-  * Updated pt language step types (@danielcsgomes)
-  * Updated vendors
-
-1.1.0 / 2011-07-16
-==================
-
-  * Return all tags, including inherited in `Scenario::getTags()`
-  * New `Feature::getOwnTags()` and `Scenario::getOwnTags()` method added,
-    which returns only own tags
-
-1.0.8 / 2011-06-29
-==================
-
-  * Fixed comments parsing.
-    You can’t have comments at the end of a line # like this
-    # But you can still have comments at the beginning of a line
-
-1.0.7 / 2011-06-28
-==================
-
-  * Added `getRaw()` method to PyStringNode
-  * Updated vendors
-
-1.0.6 / 2011-06-17
-==================
-
-  * Updated vendors
-
-1.0.5 / 2011-06-10
-==================
-
-  * Fixed bug, introduced with 1.0.4 - hash in PyStrings
-
-1.0.4 / 2011-06-10
-==================
-
-  * Fixed inability to comment pystrings
-
-1.0.3 / 2011-04-21
-==================
-
-  * Fixed introduced with 1.0.2 pystring parsing bug
-
-1.0.2 / 2011-04-18
-==================
-
-  * Fixed bugs in text with comments parsing
-
-1.0.1 / 2011-04-01
-==================
-
-  * Updated vendors
-
-1.0.0 / 2011-03-08
-==================
-
-  * Updated vendors
-
-1.0.0RC2 / 2011-02-25
-=====================
-
-  * Windows support
-  * Missing phpunit config
-
-1.0.0RC1 / 2011-02-15
-=====================
-
-  * Huge optimizations to Lexer & Parser
-  * Additional loaders (Yaml, Array, Directory)
-  * Filters (Tag, Name, Line)
-  * Code refactoring
-  * Nodes optimizations
-  * Additional tests for exceptions and translations
-  * Keywords dumper
-
-0.2.0 / 2011-01-05
-==================
-
-  * New Parser & Lexer (based on AST)
-  * New verbose parsing exception handling
-  * New translation mechanics
-  * 47 brand new translations (see i18n)
-  * Full test suite for everything from AST nodes to translations

+ 0 - 33
vendor/behat/gherkin/CONTRIBUTING.md

@@ -1,33 +0,0 @@
-Contributing
-------------
-
-Gherkin is an open source, community-driven project. If you'd like to contribute, feel free to do this, but remember to follow this few simple rules:
-
-- Make your feature addition or bug fix,
-- Always use the `master` branch as base for your changes (all new development happens in `master`),
-- Add tests for those changes (please look into `tests/` folder for some examples). This is important so we don't break it in a future version unintentionally,
-- Commit your code, but do not mess with `CHANGES.md`,
-- __Remember__: when you create Pull Request, always select `master` branch as target (done by default), otherwise it will be closed.
-
-Running tests
--------------
-
-Make sure that you don't break anything with your changes by running:
-
-```bash
-$> phpunit
-```
-
-Contributing to Gherkin Translations
-------------------------------------
-
-Gherkin supports &rarr;40 different languages and you could add more! You might notice
-`i18n.php` file in the root of the library. This file is downloaded and **autogenerated**
-from original [cucumber/gherkin translations](https://github.com/cucumber/cucumber/blob/master/gherkin/gherkin-languages.json).
-So, in order to fix/update/add some translation, you should send Pull Request to the
-`cucumber/gherkin` repository. `Behat\Gherkin` will redownload/regenerate translations
-from there before each release.
-
-It might sounds difficult, but this way of dictionary sharing gives you ability to
-migrate your `*.feature` files from language to language and library to library without
-the need to rewrite/modify them - same dictionary (Gherkin) used everywhere.

+ 0 - 22
vendor/behat/gherkin/LICENSE

@@ -1,22 +0,0 @@
-Copyright (c) 2011-2013 Konstantin Kudryashov <ever.zet@gmail.com>
-
-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.

+ 0 - 64
vendor/behat/gherkin/README.md

@@ -1,64 +0,0 @@
-Behat Gherkin Parser
-====================
-
-This is the php Gherkin parser for Behat. It comes bundled with more than 40 native languages
-(see `i18n.php`) support & clean architecture.
-
-Useful Links
-------------
-
-- Official Google Group is at [http://groups.google.com/group/behat](http://groups.google.com/group/behat)
-- IRC channel on [#freenode](http://freenode.net/) is `#behat`
-- [Note on Patches/Pull Requests](CONTRIBUTING.md)
-
-Usage Example
--------------
-
-``` php
-<?php
-
-$keywords = new Behat\Gherkin\Keywords\ArrayKeywords(array(
-    'en' => array(
-        'feature'          => 'Feature',
-        'background'       => 'Background',
-        'scenario'         => 'Scenario',
-        'scenario_outline' => 'Scenario Outline|Scenario Template',
-        'examples'         => 'Examples|Scenarios',
-        'given'            => 'Given',
-        'when'             => 'When',
-        'then'             => 'Then',
-        'and'              => 'And',
-        'but'              => 'But'
-    ),
-    'en-pirate' => array(
-        'feature'          => 'Ahoy matey!',
-        'background'       => 'Yo-ho-ho',
-        'scenario'         => 'Heave to',
-        'scenario_outline' => 'Shiver me timbers',
-        'examples'         => 'Dead men tell no tales',
-        'given'            => 'Gangway!',
-        'when'             => 'Blimey!',
-        'then'             => 'Let go and haul',
-        'and'              => 'Aye',
-        'but'              => 'Avast!'
-    )
-));
-$lexer  = new Behat\Gherkin\Lexer($keywords);
-$parser = new Behat\Gherkin\Parser($lexer);
-
-$feature = $parser->parse(file_get_contents('some.feature'));
-```
-
-Installing Dependencies
------------------------
-
-``` bash
-$> curl http://getcomposer.org/installer | php
-$> php composer.phar update
-```
-
-Contributors
-------------
-
-* Konstantin Kudryashov [everzet](http://github.com/everzet) [lead developer]
-* Other [awesome developers](https://github.com/Behat/Gherkin/graphs/contributors)

+ 0 - 67
vendor/behat/gherkin/composer.json

@@ -1,67 +0,0 @@
-{
-    "name":         "behat/gherkin",
-    "description":  "Gherkin DSL parser for PHP",
-    "keywords":     ["BDD", "parser", "DSL", "Behat", "Gherkin", "Cucumber"],
-    "homepage":     "http://behat.org/",
-    "type":         "library",
-    "license":      "MIT",
-    "authors":      [
-        {
-            "name":      "Konstantin Kudryashov",
-            "email":     "ever.zet@gmail.com",
-            "homepage":  "http://everzet.com"
-        }
-    ],
-
-    "require": {
-        "php": "~7.2|~8.0"
-    },
-
-    "require-dev": {
-        "symfony/yaml": "~3|~4|~5",
-        "phpunit/phpunit": "~8|~9",
-        "cucumber/cucumber": "dev-gherkin-22.0.0"
-    },
-
-    "suggest": {
-        "symfony/yaml": "If you want to parse features, represented in YAML files"
-    },
-
-    "autoload": {
-        "psr-0": {
-            "Behat\\Gherkin": "src/"
-        }
-    },
-
-    "autoload-dev": {
-        "psr-4": {
-            "Tests\\Behat\\": "tests/Behat/"
-        }
-    },
-
-    "extra": {
-        "branch-alias": {
-            "dev-master": "4.x-dev"
-        }
-    },
-
-    "repositories": [
-        {
-            "type": "package",
-            "package": {
-                "name": "cucumber/cucumber",
-                "version": "dev-gherkin-22.0.0",
-                "source": {
-                    "type": "git",
-                    "url": "https://github.com/cucumber/cucumber.git",
-                    "reference": "379280b6b98ee9a1bf79444e7c75e23265ccb3e0"
-                },
-                "dist": {
-                    "type": "zip",
-                    "url": "https://api.github.com/repos/cucumber/cucumber/zipball/379280b6b98ee9a1bf79444e7c75e23265ccb3e0",
-                    "reference": "379280b6b98ee9a1bf79444e7c75e23265ccb3e0"
-                }
-            }
-        }
-    ]
-}

+ 0 - 1245
vendor/behat/gherkin/i18n.php

@@ -1,1245 +0,0 @@
-<?php
-
-/*
- * DO NOT TOUCH THIS FILE!
- *
- * This file is automatically generated by `bin/update_i18n`.
- * Actual Gherkin translations live in cucumber/gherkin repo:
- * https://github.com/cucumber/cucumber/blob/master/gherkin/gherkin-languages.json
- * Please send your translation changes there.
- */
-
-return array (
-  'en' => 
-  array (
-    'and' => 'And|*',
-    'background' => 'Background',
-    'but' => 'But|*',
-    'examples' => 'Scenarios|Examples',
-    'feature' => 'Business Need|Ability|Feature',
-    'given' => 'Given|*',
-    'name' => 'English',
-    'native' => 'English',
-    'rule' => 'Rule',
-    'scenario' => 'Scenario|Example',
-    'scenario_outline' => 'Scenario Template|Scenario Outline',
-    'then' => 'Then|*',
-    'when' => 'When|*',
-  ),
-  'af' => 
-  array (
-    'and' => 'En|*',
-    'background' => 'Agtergrond',
-    'but' => 'Maar|*',
-    'examples' => 'Voorbeelde',
-    'feature' => 'Besigheid Behoefte|Funksie|Vermoë',
-    'given' => 'Gegewe|*',
-    'name' => 'Afrikaans',
-    'native' => 'Afrikaans',
-    'rule' => 'Regel',
-    'scenario' => 'Voorbeeld|Situasie',
-    'scenario_outline' => 'Situasie Uiteensetting',
-    'then' => 'Dan|*',
-    'when' => 'Wanneer|*',
-  ),
-  'am' => 
-  array (
-    'and' => 'Եվ|*',
-    'background' => 'Կոնտեքստ',
-    'but' => 'Բայց|*',
-    'examples' => 'Օրինակներ',
-    'feature' => 'Ֆունկցիոնալություն|Հատկություն',
-    'given' => 'Դիցուք|*',
-    'name' => 'Armenian',
-    'native' => 'հայերեն',
-    'rule' => 'Rule',
-    'scenario' => 'Սցենար|Օրինակ',
-    'scenario_outline' => 'Սցենարի կառուցվացքը',
-    'then' => 'Ապա|*',
-    'when' => 'Եթե|Երբ|*',
-  ),
-  'an' => 
-  array (
-    'and' => '*|E|Y',
-    'background' => 'Antecedents',
-    'but' => 'Pero|*',
-    'examples' => 'Eixemplos',
-    'feature' => 'Caracteristica',
-    'given' => 'Dadas|Dada|Daus|Dau|*',
-    'name' => 'Aragonese',
-    'native' => 'Aragonés',
-    'rule' => 'Rule',
-    'scenario' => 'Eixemplo|Caso',
-    'scenario_outline' => 'Esquema del caso',
-    'then' => 'Antonces|Alavez|Allora|*',
-    'when' => 'Cuan|*',
-  ),
-  'ar' => 
-  array (
-    'and' => '*|و',
-    'background' => 'الخلفية',
-    'but' => 'لكن|*',
-    'examples' => 'امثلة',
-    'feature' => 'خاصية',
-    'given' => 'بفرض|*',
-    'name' => 'Arabic',
-    'native' => 'العربية',
-    'rule' => 'Rule',
-    'scenario' => 'سيناريو|مثال',
-    'scenario_outline' => 'سيناريو مخطط',
-    'then' => 'اذاً|ثم|*',
-    'when' => 'عندما|متى|*',
-  ),
-  'ast' => 
-  array (
-    'and' => 'Ya|*|Y',
-    'background' => 'Antecedentes',
-    'but' => 'Peru|*',
-    'examples' => 'Exemplos',
-    'feature' => 'Carauterística',
-    'given' => 'Dada|Daes|Daos|Dáu|*',
-    'name' => 'Asturian',
-    'native' => 'asturianu',
-    'rule' => 'Rule',
-    'scenario' => 'Exemplo|Casu',
-    'scenario_outline' => 'Esbozu del casu',
-    'then' => 'Entós|*',
-    'when' => 'Cuando|*',
-  ),
-  'az' => 
-  array (
-    'and' => 'Həm|Və|*',
-    'background' => 'Kontekst|Keçmiş',
-    'but' => 'Ancaq|Amma|*',
-    'examples' => 'Nümunələr',
-    'feature' => 'Özəllik',
-    'given' => 'Tutaq ki|Verilir|*',
-    'name' => 'Azerbaijani',
-    'native' => 'Azərbaycanca',
-    'rule' => 'Rule',
-    'scenario' => 'Ssenari|Nümunə',
-    'scenario_outline' => 'Ssenarinin strukturu',
-    'then' => 'O halda|*',
-    'when' => 'Nə vaxt ki|Əgər|*',
-  ),
-  'bg' => 
-  array (
-    'and' => '*|И',
-    'background' => 'Предистория',
-    'but' => 'Но|*',
-    'examples' => 'Примери',
-    'feature' => 'Функционалност',
-    'given' => 'Дадено|*',
-    'name' => 'Bulgarian',
-    'native' => 'български',
-    'rule' => 'Rule',
-    'scenario' => 'Сценарий|Пример',
-    'scenario_outline' => 'Рамка на сценарий',
-    'then' => 'То|*',
-    'when' => 'Когато|*',
-  ),
-  'bm' => 
-  array (
-    'and' => 'Dan|*',
-    'background' => 'Latar Belakang',
-    'but' => 'Tetapi|Tapi|*',
-    'examples' => 'Contoh',
-    'feature' => 'Fungsi',
-    'given' => 'Diberi|Bagi|*',
-    'name' => 'Malay',
-    'native' => 'Bahasa Melayu',
-    'rule' => 'Rule',
-    'scenario' => 'Keadaan|Senario|Situasi',
-    'scenario_outline' => 'Garis Panduan Senario|Kerangka Keadaan|Kerangka Senario|Kerangka Situasi',
-    'then' => 'Kemudian|Maka|*',
-    'when' => 'Apabila|*',
-  ),
-  'bs' => 
-  array (
-    'and' => '*|A|I',
-    'background' => 'Pozadina',
-    'but' => 'Ali|*',
-    'examples' => 'Primjeri',
-    'feature' => 'Karakteristika',
-    'given' => 'Dato|*',
-    'name' => 'Bosnian',
-    'native' => 'Bosanski',
-    'rule' => 'Rule',
-    'scenario' => 'Scenariju|Scenario|Primjer',
-    'scenario_outline' => 'Scenario-outline|Scenariju-obris',
-    'then' => 'Zatim|*',
-    'when' => 'Kada|*',
-  ),
-  'ca' => 
-  array (
-    'and' => '*|I',
-    'background' => 'Antecedents|Rerefons',
-    'but' => 'Però|*',
-    'examples' => 'Exemples',
-    'feature' => 'Característica|Funcionalitat',
-    'given' => 'Donada|Atesa|Donat|Atès|*',
-    'name' => 'Catalan',
-    'native' => 'català',
-    'rule' => 'Rule',
-    'scenario' => 'Escenari|Exemple',
-    'scenario_outline' => 'Esquema de l\'escenari',
-    'then' => 'Aleshores|Cal|*',
-    'when' => 'Quan|*',
-  ),
-  'cs' => 
-  array (
-    'and' => 'A také|*|A',
-    'background' => 'Kontext|Pozadí',
-    'but' => 'Ale|*',
-    'examples' => 'Příklady',
-    'feature' => 'Požadavek',
-    'given' => 'Za předpokladu|Pokud|*',
-    'name' => 'Czech',
-    'native' => 'Česky',
-    'rule' => 'Pravidlo',
-    'scenario' => 'Příklad|Scénář',
-    'scenario_outline' => 'Osnova scénáře|Náčrt Scénáře',
-    'then' => 'Pak|*',
-    'when' => 'Když|*',
-  ),
-  'cy-GB' => 
-  array (
-    'and' => '*|A',
-    'background' => 'Cefndir',
-    'but' => 'Ond|*',
-    'examples' => 'Enghreifftiau',
-    'feature' => 'Arwedd',
-    'given' => 'Anrhegedig a|*',
-    'name' => 'Welsh',
-    'native' => 'Cymraeg',
-    'rule' => 'Rule',
-    'scenario' => 'Enghraifft|Scenario',
-    'scenario_outline' => 'Scenario Amlinellol',
-    'then' => 'Yna|*',
-    'when' => 'Pryd|*',
-  ),
-  'da' => 
-  array (
-    'and' => 'Og|*',
-    'background' => 'Baggrund',
-    'but' => 'Men|*',
-    'examples' => 'Eksempler',
-    'feature' => 'Egenskab',
-    'given' => 'Givet|*',
-    'name' => 'Danish',
-    'native' => 'dansk',
-    'rule' => 'Rule',
-    'scenario' => 'Eksempel|Scenarie',
-    'scenario_outline' => 'Abstrakt Scenario',
-    'then' => 'Så|*',
-    'when' => 'Når|*',
-  ),
-  'de' => 
-  array (
-    'and' => 'Und|*',
-    'background' => 'Voraussetzungen|Vorbedingungen|Hintergrund|Grundlage',
-    'but' => 'Aber|*',
-    'examples' => 'Beispiele',
-    'feature' => 'Funktionalität|Funktion',
-    'given' => 'Gegeben seien|Gegeben sei|Angenommen|*',
-    'name' => 'German',
-    'native' => 'Deutsch',
-    'rule' => 'Regel|Rule',
-    'scenario' => 'Beispiel|Szenario',
-    'scenario_outline' => 'Szenariogrundriss|Szenarien',
-    'then' => 'Dann|*',
-    'when' => 'Wenn|*',
-  ),
-  'el' => 
-  array (
-    'and' => 'Και|*',
-    'background' => 'Υπόβαθρο',
-    'but' => 'Αλλά|*',
-    'examples' => 'Παραδείγματα|Σενάρια',
-    'feature' => 'Δυνατότητα|Λειτουργία',
-    'given' => 'Δεδομένου|*',
-    'name' => 'Greek',
-    'native' => 'Ελληνικά',
-    'rule' => 'Rule',
-    'scenario' => 'Παράδειγμα|Σενάριο',
-    'scenario_outline' => 'Περίγραμμα Σεναρίου|Περιγραφή Σεναρίου',
-    'then' => 'Τότε|*',
-    'when' => 'Όταν|*',
-  ),
-  'em' => 
-  array (
-    'and' => '😂<|*',
-    'background' => '💤',
-    'but' => '😔<|*',
-    'examples' => '📓',
-    'feature' => '📚',
-    'given' => '😐<|*',
-    'name' => 'Emoji',
-    'native' => '😀',
-    'rule' => 'Rule',
-    'scenario' => '📕|🥒',
-    'scenario_outline' => '📖',
-    'then' => '🙏<|*',
-    'when' => '🎬<|*',
-  ),
-  'en-Scouse' => 
-  array (
-    'and' => 'An|*',
-    'background' => 'Dis is what went down',
-    'but' => 'Buh|*',
-    'examples' => 'Examples',
-    'feature' => 'Feature',
-    'given' => 'Youse know when youse got|Givun|*',
-    'name' => 'Scouse',
-    'native' => 'Scouse',
-    'rule' => 'Rule',
-    'scenario' => 'The thing of it is',
-    'scenario_outline' => 'Wharrimean is',
-    'then' => 'Den youse gotta|Dun|*',
-    'when' => 'Youse know like when|Wun|*',
-  ),
-  'en-au' => 
-  array (
-    'and' => 'Too right|*',
-    'background' => 'First off',
-    'but' => 'Yeah nah|*',
-    'examples' => 'You\'ll wanna',
-    'feature' => 'Pretty much',
-    'given' => 'Y\'know|*',
-    'name' => 'Australian',
-    'native' => 'Australian',
-    'rule' => 'Rule',
-    'scenario' => 'Awww, look mate',
-    'scenario_outline' => 'Reckon it\'s like',
-    'then' => 'But at the end of the day I reckon|*',
-    'when' => 'It\'s just unbelievable|*',
-  ),
-  'en-lol' => 
-  array (
-    'and' => 'AN|*',
-    'background' => 'B4',
-    'but' => 'BUT|*',
-    'examples' => 'EXAMPLZ',
-    'feature' => 'OH HAI',
-    'given' => 'I CAN HAZ|*',
-    'name' => 'LOLCAT',
-    'native' => 'LOLCAT',
-    'rule' => 'Rule',
-    'scenario' => 'MISHUN',
-    'scenario_outline' => 'MISHUN SRSLY',
-    'then' => 'DEN|*',
-    'when' => 'WEN|*',
-  ),
-  'en-old' => 
-  array (
-    'and' => 'Ond|*|7',
-    'background' => 'Aer|Ær',
-    'but' => 'Ac|*',
-    'examples' => 'Se the|Se ðe|Se þe',
-    'feature' => 'Hwaet|Hwæt',
-    'given' => 'Thurh|Ðurh|Þurh|*',
-    'name' => 'Old English',
-    'native' => 'Englisc',
-    'rule' => 'Rule',
-    'scenario' => 'Swa',
-    'scenario_outline' => 'Swa hwaer swa|Swa hwær swa',
-    'then' => 'Tha the|Ða ðe|Þa þe|Tha|Ða|Þa|*',
-    'when' => 'Tha|Ða|Þa|*',
-  ),
-  'en-pirate' => 
-  array (
-    'and' => 'Aye|*',
-    'background' => 'Yo-ho-ho',
-    'but' => 'Avast!|*',
-    'examples' => 'Dead men tell no tales',
-    'feature' => 'Ahoy matey!',
-    'given' => 'Gangway!|*',
-    'name' => 'Pirate',
-    'native' => 'Pirate',
-    'rule' => 'Rule',
-    'scenario' => 'Heave to',
-    'scenario_outline' => 'Shiver me timbers',
-    'then' => 'Let go and haul|*',
-    'when' => 'Blimey!|*',
-  ),
-  'en-tx' => 
-  array (
-    'and' => 'Come hell or high water',
-    'background' => 'Lemme tell y\'all a story',
-    'but' => 'Well now hold on, I\'ll you what',
-    'examples' => 'Now that\'s a story longer than a cattle drive in July',
-    'feature' => 'This ain’t my first rodeo|All gussied up',
-    'given' => 'All git out|Fixin\' to',
-    'name' => 'Texas',
-    'native' => 'Texas',
-    'rule' => 'Rule ',
-    'scenario' => 'All hat and no cattle',
-    'scenario_outline' => 'Busy as a hound in flea season|Serious as a snake bite',
-    'then' => 'There’s no tree but bears some fruit',
-    'when' => 'Quick out of the chute',
-  ),
-  'eo' => 
-  array (
-    'and' => 'Kaj|*',
-    'background' => 'Fono',
-    'but' => 'Sed|*',
-    'examples' => 'Ekzemploj',
-    'feature' => 'Trajto',
-    'given' => 'Donitaĵo|Komence|*',
-    'name' => 'Esperanto',
-    'native' => 'Esperanto',
-    'rule' => 'Rule',
-    'scenario' => 'Ekzemplo|Scenaro|Kazo',
-    'scenario_outline' => 'Konturo de la scenaro|Kazo-skizo|Skizo',
-    'then' => 'Do|*',
-    'when' => 'Se|*',
-  ),
-  'es' => 
-  array (
-    'and' => '*|E|Y',
-    'background' => 'Antecedentes',
-    'but' => 'Pero|*',
-    'examples' => 'Ejemplos',
-    'feature' => 'Necesidad del negocio|Característica|Requisito',
-    'given' => 'Dadas|Dados|Dada|Dado|*',
-    'name' => 'Spanish',
-    'native' => 'español',
-    'rule' => 'Regla de negocio|Regla',
-    'scenario' => 'Escenario|Ejemplo',
-    'scenario_outline' => 'Esquema del escenario',
-    'then' => 'Entonces|*',
-    'when' => 'Cuando|*',
-  ),
-  'et' => 
-  array (
-    'and' => 'Ja|*',
-    'background' => 'Taust',
-    'but' => 'Kuid|*',
-    'examples' => 'Juhtumid',
-    'feature' => 'Omadus',
-    'given' => 'Eeldades|*',
-    'name' => 'Estonian',
-    'native' => 'eesti keel',
-    'rule' => 'Reegel',
-    'scenario' => 'Stsenaarium|Juhtum',
-    'scenario_outline' => 'Raamstsenaarium|Raamjuhtum',
-    'then' => 'Siis|*',
-    'when' => 'Kui|*',
-  ),
-  'fa' => 
-  array (
-    'and' => '*|و',
-    'background' => 'زمینه',
-    'but' => 'اما|*',
-    'examples' => 'نمونه ها',
-    'feature' => 'وِیژگی',
-    'given' => 'با فرض|*',
-    'name' => 'Persian',
-    'native' => 'فارسی',
-    'rule' => 'Rule',
-    'scenario' => 'سناریو|مثال',
-    'scenario_outline' => 'الگوی سناریو',
-    'then' => 'آنگاه|*',
-    'when' => 'هنگامی|*',
-  ),
-  'fi' => 
-  array (
-    'and' => 'Ja|*',
-    'background' => 'Tausta',
-    'but' => 'Mutta|*',
-    'examples' => 'Tapaukset',
-    'feature' => 'Ominaisuus',
-    'given' => 'Oletetaan|*',
-    'name' => 'Finnish',
-    'native' => 'suomi',
-    'rule' => 'Rule',
-    'scenario' => 'Tapaus',
-    'scenario_outline' => 'Tapausaihio',
-    'then' => 'Niin|*',
-    'when' => 'Kun|*',
-  ),
-  'fr' => 
-  array (
-    'and' => 'Et qu\'<|Et que|Et|*',
-    'background' => 'Contexte',
-    'but' => 'Mais qu\'<|Mais que|Mais|*',
-    'examples' => 'Exemples',
-    'feature' => 'Fonctionnalité',
-    'given' => 'Etant donné qu\'<|Étant donné qu\'<|Etant donné que|Étant donné que|Etant données|Étant données|Etant donnée|Etant donnés|Sachant qu\'<|Étant donnée|Étant donnés|Etant donné|Sachant que|Étant donné|Sachant|Soit|*',
-    'name' => 'French',
-    'native' => 'français',
-    'rule' => 'Règle',
-    'scenario' => 'Scénario|Exemple',
-    'scenario_outline' => 'Plan du Scénario|Plan du scénario',
-    'then' => 'Alors|Donc|*',
-    'when' => 'Lorsqu\'<|Lorsque|Quand|*',
-  ),
-  'ga' => 
-  array (
-    'and' => 'Agus<|*',
-    'background' => 'Cúlra',
-    'but' => 'Ach<|*',
-    'examples' => 'Samplaí',
-    'feature' => 'Gné',
-    'given' => 'Cuir i gcás nach<|Cuir i gcás gur<|Cuir i gcás nár<|Cuir i gcás go<|*',
-    'name' => 'Irish',
-    'native' => 'Gaeilge',
-    'rule' => 'Rule',
-    'scenario' => 'Sampla|Cás',
-    'scenario_outline' => 'Cás Achomair',
-    'then' => 'Ansin<|*',
-    'when' => 'Nuair nach<|Nuair nár<|Nuair ba<|Nuair a<|*',
-  ),
-  'gj' => 
-  array (
-    'and' => 'અને|*',
-    'background' => 'બેકગ્રાઉન્ડ',
-    'but' => 'પણ|*',
-    'examples' => 'ઉદાહરણો',
-    'feature' => 'વ્યાપાર જરૂર|ક્ષમતા|લક્ષણ',
-    'given' => 'આપેલ છે|*',
-    'name' => 'Gujarati',
-    'native' => 'ગુજરાતી',
-    'rule' => 'Rule',
-    'scenario' => 'ઉદાહરણ|સ્થિતિ',
-    'scenario_outline' => 'પરિદ્દશ્ય રૂપરેખા|પરિદ્દશ્ય ઢાંચો',
-    'then' => 'પછી|*',
-    'when' => 'ક્યારે|*',
-  ),
-  'gl' => 
-  array (
-    'and' => '*|E',
-    'background' => 'Contexto',
-    'but' => 'Mais|Pero|*',
-    'examples' => 'Exemplos',
-    'feature' => 'Característica',
-    'given' => 'Dadas|Dados|Dada|Dado|*',
-    'name' => 'Galician',
-    'native' => 'galego',
-    'rule' => 'Rule',
-    'scenario' => 'Escenario|Exemplo',
-    'scenario_outline' => 'Esbozo do escenario',
-    'then' => 'Entón|Logo|*',
-    'when' => 'Cando|*',
-  ),
-  'he' => 
-  array (
-    'and' => 'וגם|*',
-    'background' => 'רקע',
-    'but' => 'אבל|*',
-    'examples' => 'דוגמאות',
-    'feature' => 'תכונה',
-    'given' => 'בהינתן|*',
-    'name' => 'Hebrew',
-    'native' => 'עברית',
-    'rule' => 'כלל',
-    'scenario' => 'דוגמא|תרחיש',
-    'scenario_outline' => 'תבנית תרחיש',
-    'then' => 'אזי|אז|*',
-    'when' => 'כאשר|*',
-  ),
-  'hi' => 
-  array (
-    'and' => 'तथा|और|*',
-    'background' => 'पृष्ठभूमि',
-    'but' => 'किन्तु|परन्तु|पर|*',
-    'examples' => 'उदाहरण',
-    'feature' => 'रूप लेख',
-    'given' => 'चूंकि|अगर|यदि|*',
-    'name' => 'Hindi',
-    'native' => 'हिंदी',
-    'rule' => 'नियम',
-    'scenario' => 'परिदृश्य',
-    'scenario_outline' => 'परिदृश्य रूपरेखा',
-    'then' => 'तदा|तब|*',
-    'when' => 'कदा|जब|*',
-  ),
-  'hr' => 
-  array (
-    'and' => '*|I',
-    'background' => 'Pozadina',
-    'but' => 'Ali|*',
-    'examples' => 'Scenariji|Primjeri',
-    'feature' => 'Mogucnost|Mogućnost|Osobina',
-    'given' => 'Ukoliko|Zadani|Zadano|Zadan|*',
-    'name' => 'Croatian',
-    'native' => 'hrvatski',
-    'rule' => 'Rule',
-    'scenario' => 'Scenarij|Primjer',
-    'scenario_outline' => 'Koncept|Skica',
-    'then' => 'Onda|*',
-    'when' => 'Kada|Kad|*',
-  ),
-  'ht' => 
-  array (
-    'and' => 'Epi|Ak|*|E',
-    'background' => 'Istorik|Kontèks',
-    'but' => 'Men|*',
-    'examples' => 'Egzanp',
-    'feature' => 'Fonksyonalite|Karakteristik|Mak',
-    'given' => 'Sipoze Ke|Sipoze ke|Sipoze|*',
-    'name' => 'Creole',
-    'native' => 'kreyòl',
-    'rule' => 'Rule',
-    'scenario' => 'Senaryo',
-    'scenario_outline' => 'Senaryo Deskripsyon|Senaryo deskripsyon|Dyagram Senaryo|Dyagram senaryo|Plan Senaryo|Plan senaryo',
-    'then' => 'Le sa a|Lè sa a|*',
-    'when' => 'Le|Lè|*',
-  ),
-  'hu' => 
-  array (
-    'and' => 'És|*',
-    'background' => 'Háttér',
-    'but' => 'De|*',
-    'examples' => 'Példák',
-    'feature' => 'Jellemző',
-    'given' => 'Amennyiben|Adott|*',
-    'name' => 'Hungarian',
-    'native' => 'magyar',
-    'rule' => 'Szabály',
-    'scenario' => 'Forgatókönyv|Példa',
-    'scenario_outline' => 'Forgatókönyv vázlat',
-    'then' => 'Akkor|*',
-    'when' => 'Amikor|Majd|Ha|*',
-  ),
-  'id' => 
-  array (
-    'and' => 'Dan|*',
-    'background' => 'Latar Belakang|Dasar',
-    'but' => 'Tetapi|Tapi|*',
-    'examples' => 'Contoh|Misal',
-    'feature' => 'Fitur',
-    'given' => 'Diasumsikan|Diketahui|Dengan|Bila|Jika|*',
-    'name' => 'Indonesian',
-    'native' => 'Bahasa Indonesia',
-    'rule' => 'Aturan|Rule',
-    'scenario' => 'Skenario',
-    'scenario_outline' => 'Garis-Besar Skenario|Skenario konsep',
-    'then' => 'Kemudian|Maka|*',
-    'when' => 'Ketika|*',
-  ),
-  'is' => 
-  array (
-    'and' => 'Og|*',
-    'background' => 'Bakgrunnur',
-    'but' => 'En|*',
-    'examples' => 'Atburðarásir|Dæmi',
-    'feature' => 'Eiginleiki',
-    'given' => 'Ef|*',
-    'name' => 'Icelandic',
-    'native' => 'Íslenska',
-    'rule' => 'Rule',
-    'scenario' => 'Atburðarás',
-    'scenario_outline' => 'Lýsing Atburðarásar|Lýsing Dæma',
-    'then' => 'Þá|*',
-    'when' => 'Þegar|*',
-  ),
-  'it' => 
-  array (
-    'and' => '*|E',
-    'background' => 'Contesto',
-    'but' => 'Ma|*',
-    'examples' => 'Esempi',
-    'feature' => 'Esigenza di Business|Funzionalità|Abilità',
-    'given' => 'Data|Date|Dati|Dato|*',
-    'name' => 'Italian',
-    'native' => 'italiano',
-    'rule' => 'Regola',
-    'scenario' => 'Scenario|Esempio',
-    'scenario_outline' => 'Schema dello scenario',
-    'then' => 'Allora|*',
-    'when' => 'Quando|*',
-  ),
-  'ja' => 
-  array (
-    'and' => 'かつ<|*',
-    'background' => '背景',
-    'but' => 'しかし<|ただし<|但し<|*',
-    'examples' => 'サンプル|例',
-    'feature' => 'フィーチャ|機能',
-    'given' => '前提<|*',
-    'name' => 'Japanese',
-    'native' => '日本語',
-    'rule' => 'Rule',
-    'scenario' => 'シナリオ',
-    'scenario_outline' => 'シナリオアウトライン|シナリオテンプレート|シナリオテンプレ|テンプレ',
-    'then' => 'ならば<|*',
-    'when' => 'もし<|*',
-  ),
-  'jv' => 
-  array (
-    'and' => 'Lan|*',
-    'background' => 'Dasar',
-    'but' => 'Ananging|Nanging|Tapi|*',
-    'examples' => 'Contone|Conto',
-    'feature' => 'Fitur',
-    'given' => 'Nalikaning|Nalika|*',
-    'name' => 'Javanese',
-    'native' => 'Basa Jawa',
-    'rule' => 'Rule',
-    'scenario' => 'Skenario',
-    'scenario_outline' => 'Konsep skenario',
-    'then' => 'Banjur|Njuk|*',
-    'when' => 'Manawa|Menawa|*',
-  ),
-  'ka' => 
-  array (
-    'and' => 'და<|*',
-    'background' => 'კონტექსტი',
-    'but' => 'მაგ­რამ<|*',
-    'examples' => 'მაგალითები',
-    'feature' => 'თვისება',
-    'given' => 'მოცემული<|*',
-    'name' => 'Georgian',
-    'native' => 'ქართველი',
-    'rule' => 'Rule',
-    'scenario' => 'მაგალითად|სცენარის',
-    'scenario_outline' => 'სცენარის ნიმუში',
-    'then' => 'მაშინ<|*',
-    'when' => 'როდესაც<|*',
-  ),
-  'kn' => 
-  array (
-    'and' => 'ಮತ್ತು|*',
-    'background' => 'ಹಿನ್ನೆಲೆ',
-    'but' => 'ಆದರೆ|*',
-    'examples' => 'ಉದಾಹರಣೆಗಳು',
-    'feature' => 'ಹೆಚ್ಚಳ',
-    'given' => 'ನೀಡಿದ|*',
-    'name' => 'Kannada',
-    'native' => 'ಕನ್ನಡ',
-    'rule' => 'Rule',
-    'scenario' => 'ಕಥಾಸಾರಾಂಶ|ಉದಾಹರಣೆ',
-    'scenario_outline' => 'ವಿವರಣೆ',
-    'then' => 'ನಂತರ|*',
-    'when' => 'ಸ್ಥಿತಿಯನ್ನು|*',
-  ),
-  'ko' => 
-  array (
-    'and' => '그리고<|*',
-    'background' => '배경',
-    'but' => '하지만<|단<|*',
-    'examples' => '예',
-    'feature' => '기능',
-    'given' => '먼저<|조건<|*',
-    'name' => 'Korean',
-    'native' => '한국어',
-    'rule' => 'Rule',
-    'scenario' => '시나리오',
-    'scenario_outline' => '시나리오 개요',
-    'then' => '그러면<|*',
-    'when' => '만약<|만일<|*',
-  ),
-  'lt' => 
-  array (
-    'and' => 'Ir|*',
-    'background' => 'Kontekstas',
-    'but' => 'Bet|*',
-    'examples' => 'Pavyzdžiai|Scenarijai|Variantai',
-    'feature' => 'Savybė',
-    'given' => 'Duota|*',
-    'name' => 'Lithuanian',
-    'native' => 'lietuvių kalba',
-    'rule' => 'Rule',
-    'scenario' => 'Scenarijus|Pavyzdys',
-    'scenario_outline' => 'Scenarijaus šablonas',
-    'then' => 'Tada|*',
-    'when' => 'Kai|*',
-  ),
-  'lu' => 
-  array (
-    'and' => 'an|*|a',
-    'background' => 'Hannergrond',
-    'but' => 'awer|mä|*',
-    'examples' => 'Beispiller',
-    'feature' => 'Funktionalitéit',
-    'given' => 'ugeholl|*',
-    'name' => 'Luxemburgish',
-    'native' => 'Lëtzebuergesch',
-    'rule' => 'Rule',
-    'scenario' => 'Beispill|Szenario',
-    'scenario_outline' => 'Plang vum Szenario',
-    'then' => 'dann|*',
-    'when' => 'wann|*',
-  ),
-  'lv' => 
-  array (
-    'and' => 'Un|*',
-    'background' => 'Konteksts|Situācija',
-    'but' => 'Bet|*',
-    'examples' => 'Paraugs|Piemēri',
-    'feature' => 'Funkcionalitāte|Fīča',
-    'given' => 'Kad|*',
-    'name' => 'Latvian',
-    'native' => 'latviešu',
-    'rule' => 'Rule',
-    'scenario' => 'Scenārijs|Piemērs',
-    'scenario_outline' => 'Scenārijs pēc parauga',
-    'then' => 'Tad|*',
-    'when' => 'Ja|*',
-  ),
-  'mk-Cyrl' => 
-  array (
-    'and' => '*|И',
-    'background' => 'Контекст|Содржина',
-    'but' => 'Но|*',
-    'examples' => 'Сценарија|Примери',
-    'feature' => 'Бизнис потреба|Функционалност|Можност',
-    'given' => 'Дадена|Дадено|*',
-    'name' => 'Macedonian',
-    'native' => 'Македонски',
-    'rule' => 'Rule',
-    'scenario' => 'На пример|Сценарио|Пример',
-    'scenario_outline' => 'Преглед на сценарија|Концепт|Скица',
-    'then' => 'Тогаш|*',
-    'when' => 'Кога|*',
-  ),
-  'mk-Latn' => 
-  array (
-    'and' => '*|I',
-    'background' => 'Sodrzhina|Kontekst',
-    'but' => 'No|*',
-    'examples' => 'Scenaria|Primeri',
-    'feature' => 'Biznis potreba|Funkcionalnost|Mozhnost',
-    'given' => 'Dadena|Dadeno|*',
-    'name' => 'Macedonian (Latin)',
-    'native' => 'Makedonski (Latinica)',
-    'rule' => 'Rule',
-    'scenario' => 'Na primer|Scenario',
-    'scenario_outline' => 'Pregled na scenarija|Koncept|Skica',
-    'then' => 'Togash|*',
-    'when' => 'Koga|*',
-  ),
-  'mn' => 
-  array (
-    'and' => 'Тэгээд|Мөн|*',
-    'background' => 'Агуулга',
-    'but' => 'Гэхдээ|Харин|*',
-    'examples' => 'Тухайлбал',
-    'feature' => 'Функционал|Функц',
-    'given' => 'Өгөгдсөн нь|Анх|*',
-    'name' => 'Mongolian',
-    'native' => 'монгол',
-    'rule' => 'Rule',
-    'scenario' => 'Сценар',
-    'scenario_outline' => 'Сценарын төлөвлөгөө',
-    'then' => 'Үүний дараа|Тэгэхэд|*',
-    'when' => 'Хэрэв|*',
-  ),
-  'mr' => 
-  array (
-    'and' => 'तसेच|आणि|*',
-    'background' => 'पार्श्वभूमी',
-    'but' => 'परंतु|पण|*',
-    'examples' => 'उदाहरण',
-    'feature' => 'वैशिष्ट्य|सुविधा',
-    'given' => 'दिलेल्या प्रमाणे|जर<|*',
-    'name' => 'Marathi',
-    'native' => 'मराठी',
-    'rule' => 'नियम',
-    'scenario' => 'परिदृश्य',
-    'scenario_outline' => 'परिदृश्य रूपरेखा',
-    'then' => 'तेव्हा|मग|*',
-    'when' => 'जेव्हा|*',
-  ),
-  'ne' => 
-  array (
-    'and' => 'अनी|*|र',
-    'background' => 'पृष्ठभूमी',
-    'but' => 'तर|*',
-    'examples' => 'उदाहरणहरु|उदाहरण',
-    'feature' => 'विशेषता|सुविधा',
-    'given' => 'दिइएको|दिएको|यदि|*',
-    'name' => 'Nepali',
-    'native' => 'नेपाली',
-    'rule' => 'नियम',
-    'scenario' => 'परिदृश्य',
-    'scenario_outline' => 'परिदृश्य रूपरेखा',
-    'then' => 'त्यसपछि|अनी|*',
-    'when' => 'जब|*',
-  ),
-  'nl' => 
-  array (
-    'and' => 'En|*',
-    'background' => 'Achtergrond',
-    'but' => 'Maar|*',
-    'examples' => 'Voorbeelden',
-    'feature' => 'Functionaliteit',
-    'given' => 'Gegeven|Stel|*',
-    'name' => 'Dutch',
-    'native' => 'Nederlands',
-    'rule' => 'Rule',
-    'scenario' => 'Voorbeeld|Scenario',
-    'scenario_outline' => 'Abstract Scenario',
-    'then' => 'Dan|*',
-    'when' => 'Wanneer|Als|*',
-  ),
-  'no' => 
-  array (
-    'and' => 'Og|*',
-    'background' => 'Bakgrunn',
-    'but' => 'Men|*',
-    'examples' => 'Eksempler',
-    'feature' => 'Egenskap',
-    'given' => 'Gitt|*',
-    'name' => 'Norwegian',
-    'native' => 'norsk',
-    'rule' => 'Regel',
-    'scenario' => 'Eksempel|Scenario',
-    'scenario_outline' => 'Abstrakt Scenario|Scenariomal',
-    'then' => 'Så|*',
-    'when' => 'Når|*',
-  ),
-  'pa' => 
-  array (
-    'and' => 'ਅਤੇ|*',
-    'background' => 'ਪਿਛੋਕੜ',
-    'but' => 'ਪਰ|*',
-    'examples' => 'ਉਦਾਹਰਨਾਂ',
-    'feature' => 'ਨਕਸ਼ ਨੁਹਾਰ|ਮੁਹਾਂਦਰਾ|ਖਾਸੀਅਤ',
-    'given' => 'ਜਿਵੇਂ ਕਿ|ਜੇਕਰ|*',
-    'name' => 'Panjabi',
-    'native' => 'ਪੰਜਾਬੀ',
-    'rule' => 'Rule',
-    'scenario' => 'ਉਦਾਹਰਨ|ਪਟਕਥਾ',
-    'scenario_outline' => 'ਪਟਕਥਾ ਰੂਪ ਰੇਖਾ|ਪਟਕਥਾ ਢਾਂਚਾ',
-    'then' => 'ਤਦ|*',
-    'when' => 'ਜਦੋਂ|*',
-  ),
-  'pl' => 
-  array (
-    'and' => 'Oraz|*|I',
-    'background' => 'Założenia',
-    'but' => 'Ale|*',
-    'examples' => 'Przykłady',
-    'feature' => 'Potrzeba biznesowa|Właściwość|Funkcja|Aspekt',
-    'given' => 'Zakładając, że|Zakładając|Mając|*',
-    'name' => 'Polish',
-    'native' => 'polski',
-    'rule' => 'Reguła|Zasada',
-    'scenario' => 'Scenariusz|Przykład',
-    'scenario_outline' => 'Szablon scenariusza',
-    'then' => 'Wtedy|*',
-    'when' => 'Jeżeli|Jeśli|Kiedy|Gdy|*',
-  ),
-  'pt' => 
-  array (
-    'and' => '*|E',
-    'background' => 'Cenario de Fundo|Cenário de Fundo|Contexto|Fundo',
-    'but' => 'Mas|*',
-    'examples' => 'Cenarios|Cenários|Exemplos',
-    'feature' => 'Caracteristica|Característica|Funcionalidade',
-    'given' => 'Dadas|Dados|Dada|Dado|*',
-    'name' => 'Portuguese',
-    'native' => 'português',
-    'rule' => 'Regra',
-    'scenario' => 'Cenario|Cenário|Exemplo',
-    'scenario_outline' => 'Delineacao do Cenario|Delineação do Cenário|Esquema do Cenario|Esquema do Cenário',
-    'then' => 'Entao|Então|*',
-    'when' => 'Quando|*',
-  ),
-  'ro' => 
-  array (
-    'and' => 'Si|Şi|Și|*',
-    'background' => 'Context',
-    'but' => 'Dar|*',
-    'examples' => 'Exemple',
-    'feature' => 'Functionalitate|Funcţionalitate|Funcționalitate',
-    'given' => 'Dată fiind<|Date fiind|Dati fiind|Daţi fiind|Dați fiind|Dat fiind|*',
-    'name' => 'Romanian',
-    'native' => 'română',
-    'rule' => 'Rule',
-    'scenario' => 'Scenariu|Exemplu',
-    'scenario_outline' => 'Structura scenariu|Structură scenariu',
-    'then' => 'Atunci|*',
-    'when' => 'Cand|Când|*',
-  ),
-  'ru' => 
-  array (
-    'and' => 'К тому же|Также|*|И',
-    'background' => 'Предыстория|Контекст',
-    'but' => 'Иначе|Но|*|А',
-    'examples' => 'Примеры',
-    'feature' => 'Функциональность|Функционал|Свойство|Функция',
-    'given' => 'Допустим|Пусть|Дано|*',
-    'name' => 'Russian',
-    'native' => 'русский',
-    'rule' => 'Правило',
-    'scenario' => 'Сценарий|Пример',
-    'scenario_outline' => 'Структура сценария|Шаблон сценария',
-    'then' => 'Затем|Тогда|То|*',
-    'when' => 'Когда|Если|*',
-  ),
-  'sk' => 
-  array (
-    'and' => 'A taktiež|A zároveň|A tiež|*|A',
-    'background' => 'Pozadie',
-    'but' => 'Ale|*',
-    'examples' => 'Príklady',
-    'feature' => 'Požiadavka|Vlastnosť|Funkcia',
-    'given' => 'Za predpokladu|Pokiaľ|*',
-    'name' => 'Slovak',
-    'native' => 'Slovensky',
-    'rule' => 'Rule',
-    'scenario' => 'Príklad|Scenár',
-    'scenario_outline' => 'Osnova Scenára|Náčrt Scenára|Náčrt Scenáru',
-    'then' => 'Potom|Tak|*',
-    'when' => 'Keď|Ak|*',
-  ),
-  'sl' => 
-  array (
-    'and' => 'Ter|In',
-    'background' => 'Kontekst|Osnova|Ozadje',
-    'but' => 'Vendar|Ampak|Toda',
-    'examples' => 'Scenariji|Primeri',
-    'feature' => 'Funkcionalnost|Značilnost|Funkcija|Lastnost|Moznosti|Možnosti',
-    'given' => 'Privzeto|Podano|Zaradi|Dano',
-    'name' => 'Slovenian',
-    'native' => 'Slovenski',
-    'rule' => 'Rule',
-    'scenario' => 'Scenarij|Primer',
-    'scenario_outline' => 'Struktura scenarija|Oris scenarija|Koncept|Osnutek|Skica',
-    'then' => 'Takrat|Potem|Nato',
-    'when' => 'Kadar|Ce|Ko|Če',
-  ),
-  'sr-Cyrl' => 
-  array (
-    'and' => '*|И',
-    'background' => 'Контекст|Позадина|Основа',
-    'but' => 'Али|*',
-    'examples' => 'Сценарији|Примери',
-    'feature' => 'Функционалност|Могућност|Особина',
-    'given' => 'За дате|За дати|За дато|*',
-    'name' => 'Serbian',
-    'native' => 'Српски',
-    'rule' => 'Правило',
-    'scenario' => 'Сценарио|Пример|Пример',
-    'scenario_outline' => 'Структура сценарија|Концепт|Скица',
-    'then' => 'Онда|*',
-    'when' => 'Када|Кад|*',
-  ),
-  'sr-Latn' => 
-  array (
-    'and' => '*|I',
-    'background' => 'Kontekst|Pozadina|Osnova',
-    'but' => 'Ali|*',
-    'examples' => 'Scenariji|Primeri',
-    'feature' => 'Funkcionalnost|Mogucnost|Mogućnost|Osobina',
-    'given' => 'Za date|Za dati|Za dato|*',
-    'name' => 'Serbian (Latin)',
-    'native' => 'Srpski (Latinica)',
-    'rule' => 'Pravilo',
-    'scenario' => 'Scenario|Primer',
-    'scenario_outline' => 'Struktura scenarija|Koncept|Skica',
-    'then' => 'Onda|*',
-    'when' => 'Kada|Kad|*',
-  ),
-  'sv' => 
-  array (
-    'and' => 'Och|*',
-    'background' => 'Bakgrund',
-    'but' => 'Men|*',
-    'examples' => 'Exempel',
-    'feature' => 'Egenskap',
-    'given' => 'Givet|*',
-    'name' => 'Swedish',
-    'native' => 'Svenska',
-    'rule' => 'Regel',
-    'scenario' => 'Scenario',
-    'scenario_outline' => 'Abstrakt Scenario|Scenariomall',
-    'then' => 'Så|*',
-    'when' => 'När|*',
-  ),
-  'ta' => 
-  array (
-    'and' => 'மற்றும்|மேலும்|*',
-    'background' => 'பின்னணி',
-    'but' => 'ஆனால்|*',
-    'examples' => 'எடுத்துக்காட்டுகள்|நிலைமைகளில்|காட்சிகள்',
-    'feature' => 'வணிக தேவை|அம்சம்|திறன்',
-    'given' => 'கொடுக்கப்பட்ட|*',
-    'name' => 'Tamil',
-    'native' => 'தமிழ்',
-    'rule' => 'Rule',
-    'scenario' => 'உதாரணமாக|காட்சி',
-    'scenario_outline' => 'காட்சி வார்ப்புரு|காட்சி சுருக்கம்',
-    'then' => 'அப்பொழுது|*',
-    'when' => 'எப்போது|*',
-  ),
-  'te' => 
-  array (
-    'and' => 'మరియు|*',
-    'background' => 'నేపథ్యం',
-    'but' => 'కాని|*',
-    'examples' => 'ఉదాహరణలు',
-    'feature' => 'గుణము',
-    'given' => 'చెప్పబడినది|*',
-    'name' => 'Telugu',
-    'native' => 'తెలుగు',
-    'rule' => 'Rule',
-    'scenario' => 'సన్నివేశం|ఉదాహరణ',
-    'scenario_outline' => 'కథనం',
-    'then' => 'అప్పుడు|*',
-    'when' => 'ఈ పరిస్థితిలో|*',
-  ),
-  'th' => 
-  array (
-    'and' => 'และ|*',
-    'background' => 'แนวคิด',
-    'but' => 'แต่|*',
-    'examples' => 'ชุดของเหตุการณ์|ชุดของตัวอย่าง',
-    'feature' => 'ความต้องการทางธุรกิจ|ความสามารถ|โครงหลัก',
-    'given' => 'กำหนดให้|*',
-    'name' => 'Thai',
-    'native' => 'ไทย',
-    'rule' => 'Rule',
-    'scenario' => 'เหตุการณ์',
-    'scenario_outline' => 'โครงสร้างของเหตุการณ์|สรุปเหตุการณ์',
-    'then' => 'ดังนั้น|*',
-    'when' => 'เมื่อ|*',
-  ),
-  'tlh' => 
-  array (
-    'and' => 'latlh|\'ej|*',
-    'background' => 'mo\'',
-    'but' => '\'ach|\'a|*',
-    'examples' => 'ghantoH|lutmey',
-    'feature' => 'poQbogh malja\'|Qu\'meH \'ut|perbogh|Qap|laH',
-    'given' => 'DaH ghu\' bejlu\'|ghu\' noblu\'|*',
-    'name' => 'Klingon',
-    'native' => 'tlhIngan',
-    'rule' => 'Rule',
-    'scenario' => 'lut',
-    'scenario_outline' => 'lut chovnatlh',
-    'then' => 'vaj|*',
-    'when' => 'qaSDI\'|*',
-  ),
-  'tr' => 
-  array (
-    'and' => 'Ve|*',
-    'background' => 'Geçmiş',
-    'but' => 'Fakat|Ama|*',
-    'examples' => 'Örnekler',
-    'feature' => 'Özellik',
-    'given' => 'Diyelim ki|*',
-    'name' => 'Turkish',
-    'native' => 'Türkçe',
-    'rule' => 'Kural',
-    'scenario' => 'Senaryo|Örnek',
-    'scenario_outline' => 'Senaryo taslağı',
-    'then' => 'O zaman|*',
-    'when' => 'Eğer ki|*',
-  ),
-  'tt' => 
-  array (
-    'and' => 'Һәм|Вә|*',
-    'background' => 'Кереш',
-    'but' => 'Ләкин|Әмма|*',
-    'examples' => 'Мисаллар|Үрнәкләр',
-    'feature' => 'Үзенчәлеклелек|Мөмкинлек',
-    'given' => 'Әйтик|*',
-    'name' => 'Tatar',
-    'native' => 'Татарча',
-    'rule' => 'Rule',
-    'scenario' => 'Сценарий',
-    'scenario_outline' => 'Сценарийның төзелеше',
-    'then' => 'Нәтиҗәдә|*',
-    'when' => 'Әгәр|*',
-  ),
-  'uk' => 
-  array (
-    'and' => 'А також|Та|*|І',
-    'background' => 'Передумова',
-    'but' => 'Але|*',
-    'examples' => 'Приклади',
-    'feature' => 'Функціонал',
-    'given' => 'Припустимо, що|Припустимо|Нехай|Дано|*',
-    'name' => 'Ukrainian',
-    'native' => 'Українська',
-    'rule' => 'Rule',
-    'scenario' => 'Сценарій|Приклад',
-    'scenario_outline' => 'Структура сценарію',
-    'then' => 'Тоді|То|*',
-    'when' => 'Коли|Якщо|*',
-  ),
-  'ur' => 
-  array (
-    'and' => 'اور|*',
-    'background' => 'پس منظر',
-    'but' => 'لیکن|*',
-    'examples' => 'مثالیں',
-    'feature' => 'کاروبار کی ضرورت|خصوصیت|صلاحیت',
-    'given' => 'فرض کیا|بالفرض|اگر|*',
-    'name' => 'Urdu',
-    'native' => 'اردو',
-    'rule' => 'Rule',
-    'scenario' => 'منظرنامہ',
-    'scenario_outline' => 'منظر نامے کا خاکہ',
-    'then' => 'پھر|تب|*',
-    'when' => 'جب|*',
-  ),
-  'uz' => 
-  array (
-    'and' => 'Ва|*',
-    'background' => 'Тарих',
-    'but' => 'Бирок|Лекин|Аммо|*',
-    'examples' => 'Мисоллар',
-    'feature' => 'Функционал',
-    'given' => 'Агар|*',
-    'name' => 'Uzbek',
-    'native' => 'Узбекча',
-    'rule' => 'Rule',
-    'scenario' => 'Сценарий',
-    'scenario_outline' => 'Сценарий структураси',
-    'then' => 'Унда|*',
-    'when' => 'Агар|*',
-  ),
-  'vi' => 
-  array (
-    'and' => 'Và|*',
-    'background' => 'Bối cảnh',
-    'but' => 'Nhưng|*',
-    'examples' => 'Dữ liệu',
-    'feature' => 'Tính năng',
-    'given' => 'Biết|Cho|*',
-    'name' => 'Vietnamese',
-    'native' => 'Tiếng Việt',
-    'rule' => 'Rule',
-    'scenario' => 'Tình huống|Kịch bản',
-    'scenario_outline' => 'Khung tình huống|Khung kịch bản',
-    'then' => 'Thì|*',
-    'when' => 'Khi|*',
-  ),
-  'zh-CN' => 
-  array (
-    'and' => '同时<|并且<|而且<|*',
-    'background' => '背景',
-    'but' => '但是<|*',
-    'examples' => '例子',
-    'feature' => '功能',
-    'given' => '假如<|假定<|假设<|*',
-    'name' => 'Chinese simplified',
-    'native' => '简体中文',
-    'rule' => 'Rule',
-    'scenario' => '剧本|场景',
-    'scenario_outline' => '剧本大纲|场景大纲',
-    'then' => '那么<|*',
-    'when' => '当<|*',
-  ),
-  'zh-TW' => 
-  array (
-    'and' => '並且<|同時<|而且<|*',
-    'background' => '背景',
-    'but' => '但是<|*',
-    'examples' => '例子',
-    'feature' => '功能',
-    'given' => '假如<|假定<|假設<|*',
-    'name' => 'Chinese traditional',
-    'native' => '繁體中文',
-    'rule' => 'Rule',
-    'scenario' => '劇本|場景',
-    'scenario_outline' => '劇本大綱|場景大綱',
-    'then' => '那麼<|*',
-    'when' => '當<|*',
-  ),
-);

+ 0 - 3
vendor/behat/gherkin/libpath.php

@@ -1,3 +0,0 @@
-<?php
-
-return __DIR__;

+ 0 - 48
vendor/behat/gherkin/src/Behat/Gherkin/Cache/CacheInterface.php

@@ -1,48 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Cache;
-
-use Behat\Gherkin\Node\FeatureNode;
-
-/**
- * Parser cache interface.
- *
- * @author     Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface CacheInterface
-{
-    /**
-     * Checks that cache for feature exists and is fresh.
-     *
-     * @param string  $path      Feature path
-     * @param integer $timestamp The last time feature was updated
-     *
-     * @return bool
-     */
-    public function isFresh($path, $timestamp);
-
-    /**
-     * Reads feature cache from path.
-     *
-     * @param string $path Feature path
-     *
-     * @return FeatureNode
-     */
-    public function read($path);
-
-    /**
-     * Caches feature node.
-     *
-     * @param string      $path    Feature path
-     * @param FeatureNode $feature Feature instance
-     */
-    public function write($path, FeatureNode $feature);
-}

+ 0 - 109
vendor/behat/gherkin/src/Behat/Gherkin/Cache/FileCache.php

@@ -1,109 +0,0 @@
-<?php
-
-/*
-* This file is part of the Behat Gherkin.
-* (c) Konstantin Kudryashov <ever.zet@gmail.com>
-*
-* For the full copyright and license information, please view the LICENSE
-* file that was distributed with this source code.
-*/
-
-namespace Behat\Gherkin\Cache;
-
-use Behat\Gherkin\Exception\CacheException;
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Gherkin;
-
-/**
- * File cache.
- * Caches feature into a file.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class FileCache implements CacheInterface
-{
-    private $path;
-
-    /**
-     * Initializes file cache.
-     *
-     * @param string $path Path to the folder where to store caches.
-     *
-     * @throws CacheException
-     */
-    public function __construct($path)
-    {
-        $this->path = rtrim($path, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.'v'.Gherkin::VERSION;
-
-        if (!is_dir($this->path)) {
-            @mkdir($this->path, 0777, true);
-        }
-
-        if (!is_writeable($this->path)) {
-            throw new CacheException(sprintf('Cache path "%s" is not writeable. Check your filesystem permissions or disable Gherkin file cache.', $this->path));
-        }
-    }
-
-    /**
-     * Checks that cache for feature exists and is fresh.
-     *
-     * @param string  $path      Feature path
-     * @param integer $timestamp The last time feature was updated
-     *
-     * @return bool
-     */
-    public function isFresh($path, $timestamp)
-    {
-        $cachePath = $this->getCachePathFor($path);
-
-        if (!file_exists($cachePath)) {
-            return false;
-        }
-
-        return filemtime($cachePath) > $timestamp;
-    }
-
-    /**
-     * Reads feature cache from path.
-     *
-     * @param string $path Feature path
-     *
-     * @return FeatureNode
-     *
-     * @throws CacheException
-     */
-    public function read($path)
-    {
-        $cachePath = $this->getCachePathFor($path);
-        $feature = unserialize(file_get_contents($cachePath));
-
-        if (!$feature instanceof FeatureNode) {
-            throw new CacheException(sprintf('Can not load cache for a feature "%s" from "%s".', $path, $cachePath ));
-        }
-
-        return $feature;
-    }
-
-    /**
-     * Caches feature node.
-     *
-     * @param string      $path    Feature path
-     * @param FeatureNode $feature Feature instance
-     */
-    public function write($path, FeatureNode $feature)
-    {
-        file_put_contents($this->getCachePathFor($path), serialize($feature));
-    }
-
-    /**
-     * Returns feature cache file path from features path.
-     *
-     * @param string $path Feature path
-     *
-     * @return string
-     */
-    protected function getCachePathFor($path)
-    {
-        return $this->path.'/'.md5($path).'.feature.cache';
-    }
-}

+ 0 - 66
vendor/behat/gherkin/src/Behat/Gherkin/Cache/MemoryCache.php

@@ -1,66 +0,0 @@
-<?php
-
-/*
-* This file is part of the Behat Gherkin.
-* (c) Konstantin Kudryashov <ever.zet@gmail.com>
-*
-* For the full copyright and license information, please view the LICENSE
-* file that was distributed with this source code.
-*/
-
-namespace Behat\Gherkin\Cache;
-
-use Behat\Gherkin\Node\FeatureNode;
-
-/**
- * Memory cache.
- * Caches feature into a memory.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class MemoryCache implements CacheInterface
-{
-    private $features = array();
-    private $timestamps = array();
-
-    /**
-     * Checks that cache for feature exists and is fresh.
-     *
-     * @param string  $path      Feature path
-     * @param integer $timestamp The last time feature was updated
-     *
-     * @return bool
-     */
-    public function isFresh($path, $timestamp)
-    {
-        if (!isset($this->features[$path])) {
-            return false;
-        }
-
-        return $this->timestamps[$path] > $timestamp;
-    }
-
-    /**
-     * Reads feature cache from path.
-     *
-     * @param string $path Feature path
-     *
-     * @return FeatureNode
-     */
-    public function read($path)
-    {
-        return $this->features[$path];
-    }
-
-    /**
-     * Caches feature node.
-     *
-     * @param string      $path    Feature path
-     * @param FeatureNode $feature Feature instance
-     */
-    public function write($path, FeatureNode $feature)
-    {
-        $this->features[$path]   = $feature;
-        $this->timestamps[$path] = time();
-    }
-}

+ 0 - 22
vendor/behat/gherkin/src/Behat/Gherkin/Exception/CacheException.php

@@ -1,22 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Exception;
-
-use RuntimeException;
-
-/**
- * Cache exception.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class CacheException extends RuntimeException implements Exception
-{
-}

+ 0 - 15
vendor/behat/gherkin/src/Behat/Gherkin/Exception/Exception.php

@@ -1,15 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Exception;
-
-interface Exception
-{
-}

+ 0 - 17
vendor/behat/gherkin/src/Behat/Gherkin/Exception/LexerException.php

@@ -1,17 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Exception;
-
-use RuntimeException;
-
-class LexerException extends RuntimeException implements Exception
-{
-}

+ 0 - 17
vendor/behat/gherkin/src/Behat/Gherkin/Exception/NodeException.php

@@ -1,17 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Exception;
-
-use RuntimeException;
-
-class NodeException extends RuntimeException implements Exception
-{
-}

+ 0 - 17
vendor/behat/gherkin/src/Behat/Gherkin/Exception/ParserException.php

@@ -1,17 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Exception;
-
-use RuntimeException;
-
-class ParserException extends RuntimeException implements Exception
-{
-}

+ 0 - 52
vendor/behat/gherkin/src/Behat/Gherkin/Filter/ComplexFilter.php

@@ -1,52 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\FeatureNode;
-
-/**
- * Abstract filter class.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-abstract class ComplexFilter implements ComplexFilterInterface
-{
-    /**
-     * Filters feature according to the filter.
-     *
-     * @param FeatureNode $feature
-     *
-     * @return FeatureNode
-     */
-    public function filterFeature(FeatureNode $feature)
-    {
-        $scenarios = array();
-        foreach ($feature->getScenarios() as $scenario) {
-            if (!$this->isScenarioMatch($feature, $scenario)) {
-                continue;
-            }
-
-            $scenarios[] = $scenario;
-        }
-
-        return new FeatureNode(
-            $feature->getTitle(),
-            $feature->getDescription(),
-            $feature->getTags(),
-            $feature->getBackground(),
-            $scenarios,
-            $feature->getKeyword(),
-            $feature->getLanguage(),
-            $feature->getFile(),
-            $feature->getLine()
-        );
-    }
-}

+ 0 - 32
vendor/behat/gherkin/src/Behat/Gherkin/Filter/ComplexFilterInterface.php

@@ -1,32 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\ScenarioInterface;
-
-/**
- * Filter interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface ComplexFilterInterface extends FeatureFilterInterface
-{
-    /**
-     * Checks if scenario or outline matches specified filter.
-     *
-     * @param FeatureNode       $feature  Feature node instance
-     * @param ScenarioInterface $scenario Scenario or Outline node instance
-     *
-     * @return bool
-     */
-    public function isScenarioMatch(FeatureNode $feature, ScenarioInterface $scenario);
-}

+ 0 - 39
vendor/behat/gherkin/src/Behat/Gherkin/Filter/FeatureFilterInterface.php

@@ -1,39 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\FeatureNode;
-
-/**
- * Feature filter interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface FeatureFilterInterface
-{
-    /**
-     * Checks if Feature matches specified filter.
-     *
-     * @param FeatureNode $feature Feature instance
-     *
-     * @return bool
-     */
-    public function isFeatureMatch(FeatureNode $feature);
-
-    /**
-     * Filters feature according to the filter and returns new one.
-     *
-     * @param FeatureNode $feature
-     *
-     * @return FeatureNode
-     */
-    public function filterFeature(FeatureNode $feature);
-}

+ 0 - 30
vendor/behat/gherkin/src/Behat/Gherkin/Filter/FilterInterface.php

@@ -1,30 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\ScenarioInterface;
-
-/**
- * Filter interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface FilterInterface extends FeatureFilterInterface
-{
-    /**
-     * Checks if scenario or outline matches specified filter.
-     *
-     * @param ScenarioInterface $scenario Scenario or Outline node instance
-     *
-     * @return bool
-     */
-    public function isScenarioMatch(ScenarioInterface $scenario);
-}

+ 0 - 124
vendor/behat/gherkin/src/Behat/Gherkin/Filter/LineFilter.php

@@ -1,124 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\ExampleTableNode;
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\OutlineNode;
-use Behat\Gherkin\Node\ScenarioInterface;
-
-/**
- * Filters scenarios by definition line number.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class LineFilter implements FilterInterface
-{
-    protected $filterLine;
-
-    /**
-     * Initializes filter.
-     *
-     * @param string $filterLine Line of the scenario to filter on
-     */
-    public function __construct($filterLine)
-    {
-        $this->filterLine = intval($filterLine);
-    }
-
-    /**
-     * Checks if Feature matches specified filter.
-     *
-     * @param FeatureNode $feature Feature instance
-     *
-     * @return bool
-     */
-    public function isFeatureMatch(FeatureNode $feature)
-    {
-        return $this->filterLine === $feature->getLine();
-    }
-
-    /**
-     * Checks if scenario or outline matches specified filter.
-     *
-     * @param ScenarioInterface $scenario Scenario or Outline node instance
-     *
-     * @return bool
-     */
-    public function isScenarioMatch(ScenarioInterface $scenario)
-    {
-        if ($this->filterLine === $scenario->getLine()) {
-            return true;
-        }
-
-        if ($scenario instanceof OutlineNode && $scenario->hasExamples()) {
-            return $this->filterLine === $scenario->getLine()
-                || in_array($this->filterLine, $scenario->getExampleTable()->getLines());
-        }
-
-        return false;
-    }
-
-    /**
-     * Filters feature according to the filter and returns new one.
-     *
-     * @param FeatureNode $feature
-     *
-     * @return FeatureNode
-     */
-    public function filterFeature(FeatureNode $feature)
-    {
-        $scenarios = array();
-        foreach ($feature->getScenarios() as $scenario) {
-            if (!$this->isScenarioMatch($scenario)) {
-                continue;
-            }
-
-            if ($scenario instanceof OutlineNode && $scenario->hasExamples()) {
-                foreach ($scenario->getExampleTables() as $exampleTable) {
-                    $table = $exampleTable->getTable();
-                    $lines = array_keys($table);
-
-                    if (in_array($this->filterLine, $lines)) {
-                        $filteredTable = array($lines[0] => $table[$lines[0]]);
-
-                        if ($lines[0] !== $this->filterLine) {
-                            $filteredTable[$this->filterLine] = $table[$this->filterLine];
-                        }
-
-                        $scenario = new OutlineNode(
-                            $scenario->getTitle(),
-                            $scenario->getTags(),
-                            $scenario->getSteps(),
-                            array(new ExampleTableNode($filteredTable, $exampleTable->getKeyword(), $exampleTable->getTags())),
-                            $scenario->getKeyword(),
-                            $scenario->getLine()
-                        );
-                    }
-                }
-            }
-
-            $scenarios[] = $scenario;
-        }
-
-        return new FeatureNode(
-            $feature->getTitle(),
-            $feature->getDescription(),
-            $feature->getTags(),
-            $feature->getBackground(),
-            $scenarios,
-            $feature->getKeyword(),
-            $feature->getLanguage(),
-            $feature->getFile(),
-            $feature->getLine()
-        );
-    }
-}

+ 0 - 143
vendor/behat/gherkin/src/Behat/Gherkin/Filter/LineRangeFilter.php

@@ -1,143 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\ExampleTableNode;
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\OutlineNode;
-use Behat\Gherkin\Node\ScenarioInterface;
-
-/**
- * Filters scenarios by definition line number range.
- *
- * @author Fabian Kiss <headrevision@gmail.com>
- */
-class LineRangeFilter implements FilterInterface
-{
-    protected $filterMinLine;
-    protected $filterMaxLine;
-
-    /**
-     * Initializes filter.
-     *
-     * @param string $filterMinLine Minimum line of a scenario to filter on
-     * @param string $filterMaxLine Maximum line of a scenario to filter on
-     */
-    public function __construct($filterMinLine, $filterMaxLine)
-    {
-        $this->filterMinLine = intval($filterMinLine);
-        if ($filterMaxLine == '*') {
-            $this->filterMaxLine = PHP_INT_MAX;
-        } else {
-            $this->filterMaxLine = intval($filterMaxLine);
-        }
-    }
-
-    /**
-     * Checks if Feature matches specified filter.
-     *
-     * @param FeatureNode $feature Feature instance
-     *
-     * @return bool
-     */
-    public function isFeatureMatch(FeatureNode $feature)
-    {
-        return $this->filterMinLine <= $feature->getLine()
-            && $this->filterMaxLine >= $feature->getLine();
-    }
-
-    /**
-     * Checks if scenario or outline matches specified filter.
-     *
-     * @param ScenarioInterface $scenario Scenario or Outline node instance
-     *
-     * @return bool
-     */
-    public function isScenarioMatch(ScenarioInterface $scenario)
-    {
-        if ($this->filterMinLine <= $scenario->getLine() && $this->filterMaxLine >= $scenario->getLine()) {
-            return true;
-        }
-
-        if ($scenario instanceof OutlineNode && $scenario->hasExamples()) {
-            foreach ($scenario->getExampleTable()->getLines() as $line) {
-                if ($this->filterMinLine <= $line && $this->filterMaxLine >= $line) {
-                    return true;
-                }
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Filters feature according to the filter.
-     *
-     * @param FeatureNode $feature
-     *
-     * @return FeatureNode
-     */
-    public function filterFeature(FeatureNode $feature)
-    {
-        $scenarios = array();
-        foreach ($feature->getScenarios() as $scenario) {
-            if (!$this->isScenarioMatch($scenario)) {
-                continue;
-            }
-
-            if ($scenario instanceof OutlineNode && $scenario->hasExamples()) {
-                // first accumulate examples and then create scenario
-                $exampleTableNodes = array();
-
-                foreach ($scenario->getExampleTables() as $exampleTable) {
-                    $table = $exampleTable->getTable();
-                    $lines = array_keys($table);
-
-                    $filteredTable = array($lines[0] => $table[$lines[0]]);
-                    unset($table[$lines[0]]);
-
-                    foreach ($table as $line => $row) {
-                        if ($this->filterMinLine <= $line && $this->filterMaxLine >= $line) {
-                            $filteredTable[$line] = $row;
-                        }
-                    }
-
-                    if (count($filteredTable) > 1) {
-                        $exampleTableNodes[] = new ExampleTableNode($filteredTable, $exampleTable->getKeyword(), $exampleTable->getTags());
-                    }
-                }
-
-                $scenario = new OutlineNode(
-                    $scenario->getTitle(),
-                    $scenario->getTags(),
-                    $scenario->getSteps(),
-                    $exampleTableNodes,
-                    $scenario->getKeyword(),
-                    $scenario->getLine()
-                );
-            }
-
-            $scenarios[] = $scenario;
-        }
-
-        return new FeatureNode(
-            $feature->getTitle(),
-            $feature->getDescription(),
-            $feature->getTags(),
-            $feature->getBackground(),
-            $scenarios,
-            $feature->getKeyword(),
-            $feature->getLanguage(),
-            $feature->getFile(),
-            $feature->getLine()
-        );
-    }
-}

+ 0 - 76
vendor/behat/gherkin/src/Behat/Gherkin/Filter/NameFilter.php

@@ -1,76 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\ScenarioInterface;
-
-/**
- * Filters scenarios by feature/scenario name.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class NameFilter extends SimpleFilter
-{
-    protected $filterString;
-
-    /**
-     * Initializes filter.
-     *
-     * @param string $filterString Name filter string
-     */
-    public function __construct($filterString)
-    {
-        $this->filterString = trim($filterString);
-    }
-
-    /**
-     * Checks if Feature matches specified filter.
-     *
-     * @param FeatureNode $feature Feature instance
-     *
-     * @return bool
-     */
-    public function isFeatureMatch(FeatureNode $feature)
-    {
-        if (null === $feature->getTitle()) {
-            return false;
-        }
-
-        if ('/' === $this->filterString[0]) {
-            return 1 === preg_match($this->filterString, $feature->getTitle());
-        }
-
-        return false !== mb_strpos($feature->getTitle(), $this->filterString, 0, 'utf8');
-    }
-
-    /**
-     * Checks if scenario or outline matches specified filter.
-     *
-     * @param ScenarioInterface $scenario Scenario or Outline node instance
-     *
-     * @return bool
-     */
-    public function isScenarioMatch(ScenarioInterface $scenario)
-    {
-        if (null === $scenario->getTitle()) {
-            return false;
-        }
-
-        if ('/' === $this->filterString[0] && 1 === preg_match($this->filterString, $scenario->getTitle())) {
-            return true;
-        } elseif (false !== mb_strpos($scenario->getTitle(), $this->filterString, 0, 'utf8')) {
-            return true;
-        }
-
-        return false;
-    }
-}

+ 0 - 61
vendor/behat/gherkin/src/Behat/Gherkin/Filter/NarrativeFilter.php

@@ -1,61 +0,0 @@
-<?php
-
-/*
- * This file is part of the Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\ScenarioInterface;
-use Behat\Gherkin\Node\FeatureNode;
-
-/**
- * Filters features by their narrative using regular expression.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class NarrativeFilter extends SimpleFilter
-{
-    /**
-     * @var string
-     */
-    private $regex;
-
-    /**
-     * Initializes filter.
-     *
-     * @param string $regex
-     */
-    public function __construct($regex)
-    {
-        $this->regex = $regex;
-    }
-
-    /**
-     * Checks if Feature matches specified filter.
-     *
-     * @param FeatureNode $feature Feature instance
-     *
-     * @return bool
-     */
-    public function isFeatureMatch(FeatureNode $feature)
-    {
-        return 1 === preg_match($this->regex, $feature->getDescription() ?? '');
-    }
-
-    /**
-     * Checks if scenario or outline matches specified filter.
-     *
-     * @param ScenarioInterface $scenario Scenario or Outline node instance
-     *
-     * @return bool
-     */
-    public function isScenarioMatch(ScenarioInterface $scenario)
-    {
-        return false;
-    }
-}

+ 0 - 72
vendor/behat/gherkin/src/Behat/Gherkin/Filter/PathsFilter.php

@@ -1,72 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\ScenarioInterface;
-
-/**
- * Filters features by their paths.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class PathsFilter extends SimpleFilter
-{
-    protected $filterPaths = array();
-
-    /**
-     * Initializes filter.
-     *
-     * @param string[] $paths List of approved paths
-     */
-    public function __construct(array $paths)
-    {
-        $this->filterPaths = array_map(
-            function ($realpath) {
-                return rtrim($realpath, DIRECTORY_SEPARATOR) .
-                    (is_dir($realpath) ? DIRECTORY_SEPARATOR : '');
-            },
-            array_filter(
-                array_map('realpath', $paths)
-            )
-        );
-    }
-
-    /**
-     * Checks if Feature matches specified filter.
-     *
-     * @param FeatureNode $feature Feature instance
-     *
-     * @return bool
-     */
-    public function isFeatureMatch(FeatureNode $feature)
-    {
-        foreach ($this->filterPaths as $path) {
-            if (0 === strpos(realpath($feature->getFile()), $path)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Checks if scenario or outline matches specified filter.
-     *
-     * @param ScenarioInterface $scenario Scenario or Outline node instance
-     *
-     * @return false This filter is designed to work only with features
-     */
-    public function isScenarioMatch(ScenarioInterface $scenario)
-    {
-        return false;
-    }
-}

+ 0 - 63
vendor/behat/gherkin/src/Behat/Gherkin/Filter/RoleFilter.php

@@ -1,63 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\ScenarioInterface;
-
-/**
- * Filters features by their actors role.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class RoleFilter extends SimpleFilter
-{
-    protected $pattern;
-
-    /**
-     * Initializes filter.
-     *
-     * @param string $role Approved role wildcard
-     */
-    public function __construct($role)
-    {
-        $this->pattern = '/as an? ' . strtr(preg_quote($role, '/'), array(
-            '\*' => '.*',
-            '\?' => '.',
-            '\[' => '[',
-            '\]' => ']'
-        )) . '[$\n]/i';
-    }
-
-    /**
-     * Checks if Feature matches specified filter.
-     *
-     * @param FeatureNode $feature Feature instance
-     *
-     * @return bool
-     */
-    public function isFeatureMatch(FeatureNode $feature)
-    {
-        return 1 === preg_match($this->pattern, $feature->getDescription() ?? '');
-    }
-
-    /**
-     * Checks if scenario or outline matches specified filter.
-     *
-     * @param ScenarioInterface $scenario Scenario or Outline node instance
-     *
-     * @return false This filter is designed to work only with features
-     */
-    public function isScenarioMatch(ScenarioInterface $scenario)
-    {
-        return false;
-    }
-}

+ 0 - 56
vendor/behat/gherkin/src/Behat/Gherkin/Filter/SimpleFilter.php

@@ -1,56 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\FeatureNode;
-
-/**
- * Abstract filter class.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-abstract class SimpleFilter implements FilterInterface
-{
-    /**
-     * Filters feature according to the filter.
-     *
-     * @param FeatureNode $feature
-     *
-     * @return FeatureNode
-     */
-    public function filterFeature(FeatureNode $feature)
-    {
-        if ($this->isFeatureMatch($feature)) {
-            return $feature;
-        }
-
-        $scenarios = array();
-        foreach ($feature->getScenarios() as $scenario) {
-            if (!$this->isScenarioMatch($scenario)) {
-                continue;
-            }
-
-            $scenarios[] = $scenario;
-        }
-
-        return new FeatureNode(
-            $feature->getTitle(),
-            $feature->getDescription(),
-            $feature->getTags(),
-            $feature->getBackground(),
-            $scenarios,
-            $feature->getKeyword(),
-            $feature->getLanguage(),
-            $feature->getFile(),
-            $feature->getLine()
-        );
-    }
-}

+ 0 - 159
vendor/behat/gherkin/src/Behat/Gherkin/Filter/TagFilter.php

@@ -1,159 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Filter;
-
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\OutlineNode;
-use Behat\Gherkin\Node\ScenarioInterface;
-
-/**
- * Filters scenarios by feature/scenario tag.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class TagFilter extends ComplexFilter
-{
-    protected $filterString;
-
-    /**
-     * Initializes filter.
-     *
-     * @param string $filterString Name filter string
-     */
-    public function __construct($filterString)
-    {
-        $this->filterString = trim($filterString);
-
-       if(preg_match('/\s/u', $this->filterString)) {
-            trigger_error(
-                "Tags with whitespace are deprecated and may be removed in a future version",
-                E_USER_DEPRECATED
-            );
-       }
-    }
-
-    /**
-     * Filters feature according to the filter.
-     *
-     * @param FeatureNode $feature
-     *
-     * @return FeatureNode
-     */
-    public function filterFeature(FeatureNode $feature)
-    {
-        $scenarios = array();
-        foreach ($feature->getScenarios() as $scenario) {
-            if (!$this->isScenarioMatch($feature, $scenario)) {
-                continue;
-            }
-
-            if ($scenario instanceof OutlineNode && $scenario->hasExamples()) {
-
-                $exampleTables = array();
-
-                foreach ($scenario->getExampleTables() as $exampleTable) {
-                    if ($this->isTagsMatchCondition(array_merge($feature->getTags(), $scenario->getTags(), $exampleTable->getTags()))) {
-                        $exampleTables[] = $exampleTable;
-                    }
-                }
-
-                $scenario = new OutlineNode(
-                    $scenario->getTitle(),
-                    $scenario->getTags(),
-                    $scenario->getSteps(),
-                    $exampleTables,
-                    $scenario->getKeyword(),
-                    $scenario->getLine()
-                );
-            }
-
-            $scenarios[] = $scenario;
-        }
-
-        return new FeatureNode(
-            $feature->getTitle(),
-            $feature->getDescription(),
-            $feature->getTags(),
-            $feature->getBackground(),
-            $scenarios,
-            $feature->getKeyword(),
-            $feature->getLanguage(),
-            $feature->getFile(),
-            $feature->getLine()
-        );
-    }
-
-    /**
-     * Checks if Feature matches specified filter.
-     *
-     * @param FeatureNode $feature Feature instance
-     *
-     * @return bool
-     */
-    public function isFeatureMatch(FeatureNode $feature)
-    {
-        return $this->isTagsMatchCondition($feature->getTags());
-    }
-
-    /**
-     * Checks if scenario or outline matches specified filter.
-     *
-     * @param FeatureNode $feature Feature node instance
-     * @param ScenarioInterface $scenario Scenario or Outline node instance
-     *
-     * @return bool
-     */
-    public function isScenarioMatch(FeatureNode $feature, ScenarioInterface $scenario)
-    {
-        if ($scenario instanceof OutlineNode && $scenario->hasExamples()) {
-            foreach ($scenario->getExampleTables() as $example) {
-                if ($this->isTagsMatchCondition(array_merge($feature->getTags(), $scenario->getTags(), $example->getTags()))) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        return $this->isTagsMatchCondition(array_merge($feature->getTags(), $scenario->getTags()));
-    }
-
-    /**
-     * Checks that node matches condition.
-     *
-     * @param string[] $tags
-     *
-     * @return bool
-     */
-    protected function isTagsMatchCondition($tags)
-    {
-        $satisfies = true;
-
-        foreach (explode('&&', $this->filterString) as $andTags) {
-            $satisfiesComma = false;
-
-            foreach (explode(',', $andTags) as $tag) {
-                $tag = str_replace('@', '', trim($tag));
-
-                if ('~' === $tag[0]) {
-                    $tag = mb_substr($tag, 1, mb_strlen($tag, 'utf8') - 1, 'utf8');
-                    $satisfiesComma = !in_array($tag, $tags) || $satisfiesComma;
-                } else {
-                    $satisfiesComma = in_array($tag, $tags) || $satisfiesComma;
-                }
-            }
-
-            $satisfies = $satisfiesComma && $satisfies;
-        }
-
-        return $satisfies;
-    }
-}

+ 0 - 142
vendor/behat/gherkin/src/Behat/Gherkin/Gherkin.php

@@ -1,142 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin;
-
-use Behat\Gherkin\Filter\FeatureFilterInterface;
-use Behat\Gherkin\Filter\LineFilter;
-use Behat\Gherkin\Filter\LineRangeFilter;
-use Behat\Gherkin\Loader\FileLoaderInterface;
-use Behat\Gherkin\Loader\LoaderInterface;
-
-/**
- * Gherkin manager.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class Gherkin
-{
-    const VERSION = '4.8.0';
-
-    /**
-     * @var LoaderInterface[]
-     */
-    protected $loaders = array();
-    /**
-     * @var FeatureFilterInterface[]
-     */
-    protected $filters = array();
-
-    /**
-     * Adds loader to manager.
-     *
-     * @param LoaderInterface $loader Feature loader
-     */
-    public function addLoader(LoaderInterface $loader)
-    {
-        $this->loaders[] = $loader;
-    }
-
-    /**
-     * Adds filter to manager.
-     *
-     * @param FeatureFilterInterface $filter Feature filter
-     */
-    public function addFilter(FeatureFilterInterface $filter)
-    {
-        $this->filters[] = $filter;
-    }
-
-    /**
-     * Sets filters to the parser.
-     *
-     * @param FeatureFilterInterface[] $filters
-     */
-    public function setFilters(array $filters)
-    {
-        $this->filters = array();
-        array_map(array($this, 'addFilter'), $filters);
-    }
-
-    /**
-     * Sets base features path.
-     *
-     * @param string $path Loaders base path
-     */
-    public function setBasePath($path)
-    {
-        foreach ($this->loaders as $loader) {
-            if ($loader instanceof FileLoaderInterface) {
-                $loader->setBasePath($path);
-            }
-        }
-    }
-
-    /**
-     * Loads & filters resource with added loaders.
-     *
-     * @param mixed                    $resource Resource to load
-     * @param FeatureFilterInterface[] $filters  Additional filters
-     *
-     * @return array
-     */
-    public function load($resource, array $filters = array())
-    {
-        $filters = array_merge($this->filters, $filters);
-
-        $matches = array();
-        if (preg_match('/^(.*)\:(\d+)-(\d+|\*)$/', $resource, $matches)) {
-            $resource = $matches[1];
-            $filters[] = new LineRangeFilter($matches[2], $matches[3]);
-        } elseif (preg_match('/^(.*)\:(\d+)$/', $resource, $matches)) {
-            $resource = $matches[1];
-            $filters[] = new LineFilter($matches[2]);
-        }
-
-        $loader = $this->resolveLoader($resource);
-
-        if (null === $loader) {
-            return array();
-        }
-
-        $features = array();
-        foreach ($loader->load($resource) as $feature) {
-            foreach ($filters as $filter) {
-                $feature = $filter->filterFeature($feature);
-
-                if (!$feature->hasScenarios() && !$filter->isFeatureMatch($feature)) {
-                    continue 2;
-                }
-            }
-
-            $features[] = $feature;
-        }
-
-        return $features;
-    }
-
-    /**
-     * Resolves loader by resource.
-     *
-     * @param mixed $resource Resource to load
-     *
-     * @return LoaderInterface
-     */
-    public function resolveLoader($resource)
-    {
-        foreach ($this->loaders as $loader) {
-            if ($loader->supports($resource)) {
-                return $loader;
-            }
-        }
-
-        return null;
-    }
-}

+ 0 - 200
vendor/behat/gherkin/src/Behat/Gherkin/Keywords/ArrayKeywords.php

@@ -1,200 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Keywords;
-
-/**
- * Array initializable keywords holder.
- *
- * $keywords = new Behat\Gherkin\Keywords\ArrayKeywords(array(
- *     'en' => array(
- *         'feature'          => 'Feature',
- *         'background'       => 'Background',
- *         'scenario'         => 'Scenario',
- *         'scenario_outline' => 'Scenario Outline|Scenario Template',
- *         'examples'         => 'Examples|Scenarios',
- *         'given'            => 'Given',
- *         'when'             => 'When',
- *         'then'             => 'Then',
- *         'and'              => 'And',
- *         'but'              => 'But'
- *     ),
- *     'ru' => array(
- *         'feature'          => 'Функционал',
- *         'background'       => 'Предыстория',
- *         'scenario'         => 'Сценарий',
- *         'scenario_outline' => 'Структура сценария',
- *         'examples'         => 'Примеры',
- *         'given'            => 'Допустим',
- *         'when'             => 'Если',
- *         'then'             => 'То',
- *         'and'              => 'И',
- *         'but'              => 'Но'
- *     )
- * ));
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class ArrayKeywords implements KeywordsInterface
-{
-    private $keywords = array();
-    private $keywordString = array();
-    private $language;
-
-    /**
-     * Initializes holder with keywords.
-     *
-     * @param array $keywords Keywords array
-     */
-    public function __construct(array $keywords)
-    {
-        $this->keywords = $keywords;
-    }
-
-    /**
-     * Sets keywords holder language.
-     *
-     * @param string $language Language name
-     */
-    public function setLanguage($language)
-    {
-        if (!isset($this->keywords[$language])) {
-            $this->language = 'en';
-        } else {
-            $this->language = $language;
-        }
-    }
-
-    /**
-     * Returns Feature keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getFeatureKeywords()
-    {
-        return $this->keywords[$this->language]['feature'];
-    }
-
-    /**
-     * Returns Background keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getBackgroundKeywords()
-    {
-        return $this->keywords[$this->language]['background'];
-    }
-
-    /**
-     * Returns Scenario keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getScenarioKeywords()
-    {
-        return $this->keywords[$this->language]['scenario'];
-    }
-
-    /**
-     * Returns Scenario Outline keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getOutlineKeywords()
-    {
-        return $this->keywords[$this->language]['scenario_outline'];
-    }
-
-    /**
-     * Returns Examples keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getExamplesKeywords()
-    {
-        return $this->keywords[$this->language]['examples'];
-    }
-
-    /**
-     * Returns Given keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getGivenKeywords()
-    {
-        return $this->keywords[$this->language]['given'];
-    }
-
-    /**
-     * Returns When keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getWhenKeywords()
-    {
-        return $this->keywords[$this->language]['when'];
-    }
-
-    /**
-     * Returns Then keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getThenKeywords()
-    {
-        return $this->keywords[$this->language]['then'];
-    }
-
-    /**
-     * Returns And keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getAndKeywords()
-    {
-        return $this->keywords[$this->language]['and'];
-    }
-
-    /**
-     * Returns But keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getButKeywords()
-    {
-        return $this->keywords[$this->language]['but'];
-    }
-
-    /**
-     * Returns all step keywords (Given, When, Then, And, But).
-     *
-     * @return string
-     */
-    public function getStepKeywords()
-    {
-        if (!isset($this->keywordString[$this->language])) {
-            $keywords = array_merge(
-                explode('|', $this->getGivenKeywords()),
-                explode('|', $this->getWhenKeywords()),
-                explode('|', $this->getThenKeywords()),
-                explode('|', $this->getAndKeywords()),
-                explode('|', $this->getButKeywords())
-            );
-
-            usort($keywords, function ($keyword1, $keyword2) {
-                return mb_strlen($keyword2, 'utf8') - mb_strlen($keyword1, 'utf8');
-            });
-
-            $this->keywordString[$this->language] = implode('|', $keywords);
-        }
-
-        return $this->keywordString[$this->language];
-    }
-}

+ 0 - 31
vendor/behat/gherkin/src/Behat/Gherkin/Keywords/CachedArrayKeywords.php

@@ -1,31 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Keywords;
-
-/**
- * File initializable keywords holder.
- *
- * $keywords = new Behat\Gherkin\Keywords\CachedArrayKeywords($file);
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class CachedArrayKeywords extends ArrayKeywords
-{
-    /**
-     * Initializes holder with file.
-     *
-     * @param string $file Cached array path
-     */
-    public function __construct($file)
-    {
-        parent::__construct(include($file));
-    }
-}

+ 0 - 121
vendor/behat/gherkin/src/Behat/Gherkin/Keywords/CucumberKeywords.php

@@ -1,121 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Keywords;
-
-use Symfony\Component\Yaml\Exception\ParseException;
-use Symfony\Component\Yaml\Yaml;
-
-/**
- * Cucumber-translations reader.
- *
- * $keywords = new Behat\Gherkin\Keywords\CucumberKeywords($i18nYmlPath);
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class CucumberKeywords extends ArrayKeywords
-{
-    /**
-     * Initializes holder with yaml string OR file.
-     *
-     * @param string $yaml Yaml string or file path
-     */
-    public function __construct($yaml)
-    {
-        // Handle filename explicitly for BC reasons, as Symfony Yaml 3.0 does not do it anymore
-        $file = null;
-        if (strpos($yaml, "\n") === false && is_file($yaml)) {
-            if (false === is_readable($yaml)) {
-                throw new ParseException(sprintf('Unable to parse "%s" as the file is not readable.', $yaml));
-            }
-
-            $file = $yaml;
-            $yaml = file_get_contents($file);
-        }
-
-        try {
-            $content = Yaml::parse($yaml);
-        } catch (ParseException $e) {
-            if ($file) {
-                $e->setParsedFile($file);
-            }
-
-            throw $e;
-        }
-
-        parent::__construct($content);
-    }
-
-    /**
-     * Returns Feature keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getGivenKeywords()
-    {
-        return $this->prepareStepString(parent::getGivenKeywords());
-    }
-
-    /**
-     * Returns When keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getWhenKeywords()
-    {
-        return $this->prepareStepString(parent::getWhenKeywords());
-    }
-
-    /**
-     * Returns Then keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getThenKeywords()
-    {
-        return $this->prepareStepString(parent::getThenKeywords());
-    }
-
-    /**
-     * Returns And keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getAndKeywords()
-    {
-        return $this->prepareStepString(parent::getAndKeywords());
-    }
-
-    /**
-     * Returns But keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getButKeywords()
-    {
-        return $this->prepareStepString(parent::getButKeywords());
-    }
-
-    /**
-     * Trim *| from the begining of the list.
-     *
-     * @param string $keywordsString Keywords string
-     *
-     * @return string
-     */
-    private function prepareStepString($keywordsString)
-    {
-        if (0 === mb_strpos($keywordsString, '*|', 0, 'UTF-8')) {
-            $keywordsString = mb_substr($keywordsString, 2, mb_strlen($keywordsString, 'utf8') - 2, 'utf8');
-        }
-
-        return $keywordsString;
-    }
-}

+ 0 - 365
vendor/behat/gherkin/src/Behat/Gherkin/Keywords/KeywordsDumper.php

@@ -1,365 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Keywords;
-
-/**
- * Gherkin keywords dumper.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class KeywordsDumper
-{
-    private $keywords;
-    private $keywordsDumper;
-
-    /**
-     * Initializes dumper.
-     *
-     * @param KeywordsInterface $keywords Keywords instance
-     */
-    public function __construct(KeywordsInterface $keywords)
-    {
-        $this->keywords = $keywords;
-        $this->keywordsDumper = array($this, 'dumpKeywords');
-    }
-
-    /**
-     * Sets keywords mapper function.
-     *
-     * Callable should accept 2 arguments (array $keywords and bool $isShort)
-     *
-     * @param callable $mapper Mapper function
-     */
-    public function setKeywordsDumperFunction($mapper)
-    {
-        $this->keywordsDumper = $mapper;
-    }
-
-    /**
-     * Defaults keywords dumper.
-     *
-     * @param array $keywords Keywords list
-     * @param bool  $isShort  Is short version
-     *
-     * @return string
-     */
-    public function dumpKeywords(array $keywords, $isShort)
-    {
-        if ($isShort) {
-            return 1 < count($keywords) ? '(' . implode('|', $keywords) . ')' : $keywords[0];
-        }
-
-        return $keywords[0];
-    }
-
-    /**
-     * Dumps keyworded feature into string.
-     *
-     * @param string $language Keywords language
-     * @param bool   $short    Dump short version
-     * @param bool   $excludeAsterisk
-     *
-     * @return string|array String for short version and array of features for extended
-     */
-    public function dump($language, $short = true, $excludeAsterisk = false)
-    {
-        $this->keywords->setLanguage($language);
-        $languageComment = '';
-        if ('en' !== $language) {
-            $languageComment = "# language: $language\n";
-        }
-
-        $keywords = explode('|', $this->keywords->getFeatureKeywords());
-
-        if ($short) {
-            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
-
-            return trim($languageComment . $this->dumpFeature($keywords, $short, $excludeAsterisk));
-        }
-
-        $features = array();
-        foreach ($keywords as $keyword) {
-            $keyword = call_user_func($this->keywordsDumper, array($keyword), $short);
-            $features[] = trim($languageComment . $this->dumpFeature($keyword, $short, $excludeAsterisk));
-        }
-
-        return $features;
-    }
-
-    /**
-     * Dumps feature example.
-     *
-     * @param string  $keyword Item keyword
-     * @param bool    $short   Dump short version?
-     *
-     * @return string
-     */
-    protected function dumpFeature($keyword, $short = true, $excludeAsterisk = false)
-    {
-        $dump = <<<GHERKIN
-{$keyword}: Internal operations
-  In order to stay secret
-  As a secret organization
-  We need to be able to erase past agents' memory
-
-
-GHERKIN;
-
-        // Background
-        $keywords = explode('|', $this->keywords->getBackgroundKeywords());
-        if ($short) {
-            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
-            $dump .= $this->dumpBackground($keywords, $short, $excludeAsterisk);
-        } else {
-            $keyword = call_user_func($this->keywordsDumper, array($keywords[0]), $short);
-            $dump .= $this->dumpBackground($keyword, $short, $excludeAsterisk);
-        }
-
-        // Scenario
-        $keywords = explode('|', $this->keywords->getScenarioKeywords());
-        if ($short) {
-            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
-            $dump .= $this->dumpScenario($keywords, $short, $excludeAsterisk);
-        } else {
-            foreach ($keywords as $keyword) {
-                $keyword = call_user_func($this->keywordsDumper, array($keyword), $short);
-                $dump .= $this->dumpScenario($keyword, $short, $excludeAsterisk);
-            }
-        }
-
-        // Outline
-        $keywords = explode('|', $this->keywords->getOutlineKeywords());
-        if ($short) {
-            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
-            $dump .= $this->dumpOutline($keywords, $short, $excludeAsterisk);
-        } else {
-            foreach ($keywords as $keyword) {
-                $keyword = call_user_func($this->keywordsDumper, array($keyword), $short);
-                $dump .= $this->dumpOutline($keyword, $short, $excludeAsterisk);
-            }
-        }
-
-        return $dump;
-    }
-
-    /**
-     * Dumps background example.
-     *
-     * @param string $keyword Item keyword
-     * @param bool   $short   Dump short version?
-     *
-     * @return string
-     */
-    protected function dumpBackground($keyword, $short = true, $excludeAsterisk = false)
-    {
-        $dump = <<<GHERKIN
-  {$keyword}:
-
-GHERKIN;
-
-        // Given
-        $dump .= $this->dumpStep(
-            $this->keywords->getGivenKeywords(),
-            'there is agent A',
-            $short,
-            $excludeAsterisk
-        );
-
-        // And
-        $dump .= $this->dumpStep(
-            $this->keywords->getAndKeywords(),
-            'there is agent B',
-            $short,
-            $excludeAsterisk
-        );
-
-        return $dump . "\n";
-    }
-
-    /**
-     * Dumps scenario example.
-     *
-     * @param string $keyword Item keyword
-     * @param bool   $short   Dump short version?
-     *
-     * @return string
-     */
-    protected function dumpScenario($keyword, $short = true, $excludeAsterisk = false)
-    {
-        $dump = <<<GHERKIN
-  {$keyword}: Erasing agent memory
-
-GHERKIN;
-
-        // Given
-        $dump .= $this->dumpStep(
-            $this->keywords->getGivenKeywords(),
-            'there is agent J',
-            $short,
-            $excludeAsterisk
-        );
-
-        // And
-        $dump .= $this->dumpStep(
-            $this->keywords->getAndKeywords(),
-            'there is agent K',
-            $short,
-            $excludeAsterisk
-        );
-
-        // When
-        $dump .= $this->dumpStep(
-            $this->keywords->getWhenKeywords(),
-            'I erase agent K\'s memory',
-            $short,
-            $excludeAsterisk
-        );
-
-        // Then
-        $dump .= $this->dumpStep(
-            $this->keywords->getThenKeywords(),
-            'there should be agent J',
-            $short,
-            $excludeAsterisk
-        );
-
-        // But
-        $dump .= $this->dumpStep(
-            $this->keywords->getButKeywords(),
-            'there should not be agent K',
-            $short,
-            $excludeAsterisk
-        );
-
-        return $dump . "\n";
-    }
-
-    /**
-     * Dumps outline example.
-     *
-     * @param string $keyword Item keyword
-     * @param bool   $short   Dump short version?
-     *
-     * @return string
-     */
-    protected function dumpOutline($keyword, $short = true, $excludeAsterisk = false)
-    {
-        $dump = <<<GHERKIN
-  {$keyword}: Erasing other agents' memory
-
-GHERKIN;
-
-        // Given
-        $dump .= $this->dumpStep(
-            $this->keywords->getGivenKeywords(),
-            'there is agent <agent1>',
-            $short,
-            $excludeAsterisk
-        );
-
-        // And
-        $dump .= $this->dumpStep(
-            $this->keywords->getAndKeywords(),
-            'there is agent <agent2>',
-            $short,
-            $excludeAsterisk
-        );
-
-        // When
-        $dump .= $this->dumpStep(
-            $this->keywords->getWhenKeywords(),
-            'I erase agent <agent2>\'s memory',
-            $short,
-            $excludeAsterisk
-        );
-
-        // Then
-        $dump .= $this->dumpStep(
-            $this->keywords->getThenKeywords(),
-            'there should be agent <agent1>',
-            $short,
-            $excludeAsterisk
-        );
-
-        // But
-        $dump .= $this->dumpStep(
-            $this->keywords->getButKeywords(),
-            'there should not be agent <agent2>',
-            $short,
-            $excludeAsterisk
-        );
-
-        $keywords = explode('|', $this->keywords->getExamplesKeywords());
-        if ($short) {
-            $keyword = call_user_func($this->keywordsDumper, $keywords, $short);
-        } else {
-            $keyword = call_user_func($this->keywordsDumper, array($keywords[0]), $short);
-        }
-
-        $dump .= <<<GHERKIN
-
-    {$keyword}:
-      | agent1 | agent2 |
-      | D      | M      |
-
-GHERKIN;
-
-        return $dump . "\n";
-    }
-
-    /**
-     * Dumps step example.
-     *
-     * @param string $keywords Item keyword
-     * @param string $text     Step text
-     * @param bool   $short    Dump short version?
-     *
-     * @return string
-     */
-    protected function dumpStep($keywords, $text, $short = true, $excludeAsterisk = false)
-    {
-        $dump = '';
-
-        $keywords = explode('|', $keywords);
-        if ($short) {
-            $keywords = array_map(
-                function ($keyword) {
-                    return str_replace('<', '', $keyword);
-                },
-                $keywords
-            );
-            $keywords = call_user_func($this->keywordsDumper, $keywords, $short);
-            $dump .= <<<GHERKIN
-    {$keywords} {$text}
-
-GHERKIN;
-        } else {
-            foreach ($keywords as $keyword) {
-                if ($excludeAsterisk && '*' === $keyword) {
-                    continue;
-                }
-
-                $indent = ' ';
-                if (false !== mb_strpos($keyword, '<', 0, 'utf8')) {
-                    $keyword = mb_substr($keyword, 0, -1, 'utf8');
-                    $indent = '';
-                }
-                $keyword = call_user_func($this->keywordsDumper, array($keyword), $short);
-                $dump .= <<<GHERKIN
-    {$keyword}{$indent}{$text}
-
-GHERKIN;
-            }
-        }
-
-        return $dump;
-    }
-}

+ 0 - 103
vendor/behat/gherkin/src/Behat/Gherkin/Keywords/KeywordsInterface.php

@@ -1,103 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Keywords;
-
-/**
- * Keywords holder interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface KeywordsInterface
-{
-    /**
-     * Sets keywords holder language.
-     *
-     * @param string $language Language name
-     */
-    public function setLanguage($language);
-
-    /**
-     * Returns Feature keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getFeatureKeywords();
-
-    /**
-     * Returns Background keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getBackgroundKeywords();
-
-    /**
-     * Returns Scenario keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getScenarioKeywords();
-
-    /**
-     * Returns Scenario Outline keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getOutlineKeywords();
-
-    /**
-     * Returns Examples keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getExamplesKeywords();
-
-    /**
-     * Returns Given keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getGivenKeywords();
-
-    /**
-     * Returns When keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getWhenKeywords();
-
-    /**
-     * Returns Then keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getThenKeywords();
-
-    /**
-     * Returns And keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getAndKeywords();
-
-    /**
-     * Returns But keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getButKeywords();
-
-    /**
-     * Returns all step keywords (splitted by "|").
-     *
-     * @return string
-     */
-    public function getStepKeywords();
-}

+ 0 - 653
vendor/behat/gherkin/src/Behat/Gherkin/Lexer.php

@@ -1,653 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin;
-
-use Behat\Gherkin\Exception\LexerException;
-use Behat\Gherkin\Keywords\KeywordsInterface;
-
-/**
- * Gherkin lexer.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class Lexer
-{
-    private $language;
-    private $lines;
-    private $linesCount;
-    private $line;
-    private $trimmedLine;
-    private $lineNumber;
-    private $eos;
-    private $keywords;
-    private $keywordsCache = array();
-    private $stepKeywordTypesCache = array();
-    private $deferredObjects = array();
-    private $deferredObjectsCount = 0;
-    private $stashedToken;
-    private $inPyString = false;
-    private $pyStringSwallow = 0;
-    private $featureStarted = false;
-    private $allowMultilineArguments = false;
-    private $allowSteps = false;
-    private $pyStringDelimiter = null;
-
-    /**
-     * Initializes lexer.
-     *
-     * @param KeywordsInterface $keywords Keywords holder
-     */
-    public function __construct(KeywordsInterface $keywords)
-    {
-        $this->keywords = $keywords;
-    }
-
-    /**
-     * Sets lexer input.
-     *
-     * @param string $input    Input string
-     * @param string $language Language name
-     *
-     * @throws Exception\LexerException
-     */
-    public function analyse($input, $language = 'en')
-    {
-        // try to detect unsupported encoding
-        if ('UTF-8' !== mb_detect_encoding($input, 'UTF-8', true)) {
-            throw new LexerException('Feature file is not in UTF8 encoding');
-        }
-
-        $input = strtr($input, array("\r\n" => "\n", "\r" => "\n"));
-
-        $this->lines = explode("\n", $input);
-        $this->linesCount = count($this->lines);
-        $this->line = $this->lines[0];
-        $this->lineNumber = 1;
-        $this->trimmedLine = null;
-        $this->eos = false;
-
-        $this->deferredObjects = array();
-        $this->deferredObjectsCount = 0;
-        $this->stashedToken = null;
-        $this->inPyString = false;
-        $this->pyStringSwallow = 0;
-
-        $this->featureStarted = false;
-        $this->allowMultilineArguments = false;
-        $this->allowSteps = false;
-
-        $this->keywords->setLanguage($this->language = $language);
-        $this->keywordsCache = array();
-        $this->stepKeywordTypesCache = array();
-    }
-
-    /**
-     * Returns current lexer language.
-     *
-     * @return string
-     */
-    public function getLanguage()
-    {
-        return $this->language;
-    }
-
-    /**
-     * Returns next token or previously stashed one.
-     *
-     * @return array
-     */
-    public function getAdvancedToken()
-    {
-        return $this->getStashedToken() ?: $this->getNextToken();
-    }
-
-    /**
-     * Defers token.
-     *
-     * @param array $token Token to defer
-     */
-    public function deferToken(array $token)
-    {
-        $token['deferred'] = true;
-        $this->deferredObjects[] = $token;
-        ++$this->deferredObjectsCount;
-    }
-
-    /**
-     * Predicts the upcoming token without passing over it.
-     *
-     * @return array
-     */
-    public function predictToken()
-    {
-        if (null === $this->stashedToken) {
-            $this->stashedToken = $this->getNextToken();
-        }
-
-        return $this->stashedToken;
-    }
-
-    /**
-     * Skips over the currently-predicted token, if any.
-     *
-     * @return void
-     */
-    public function skipPredictedToken()
-    {
-        $this->stashedToken = null;
-    }
-
-    /**
-     * Constructs token with specified parameters.
-     *
-     * @param string $type  Token type
-     * @param string $value Token value
-     *
-     * @return array
-     */
-    public function takeToken($type, $value = null)
-    {
-        return array(
-            'type'     => $type,
-            'line'     => $this->lineNumber,
-            'value'    => $value ?: null,
-            'deferred' => false
-        );
-    }
-
-    /**
-     * Consumes line from input & increments line counter.
-     */
-    protected function consumeLine()
-    {
-        ++$this->lineNumber;
-
-        if (($this->lineNumber - 1) === $this->linesCount) {
-            $this->eos = true;
-
-            return;
-        }
-
-        $this->line = $this->lines[$this->lineNumber - 1];
-        $this->trimmedLine = null;
-    }
-
-    /**
-     * Consumes first part of line from input without incrementing the line number
-     */
-    protected function consumeLineUntil(int $trimmedOffset)
-    {
-        $this->line = mb_substr(ltrim($this->line), $trimmedOffset, null, 'utf-8');
-        $this->trimmedLine = null;
-    }
-
-    /**
-     * Returns trimmed version of line.
-     *
-     * @return string
-     */
-    protected function getTrimmedLine()
-    {
-        return null !== $this->trimmedLine ? $this->trimmedLine : $this->trimmedLine = trim($this->line);
-    }
-
-    /**
-     * Returns stashed token or null if hasn't.
-     *
-     * @return array|null
-     */
-    protected function getStashedToken()
-    {
-        $stashedToken = $this->stashedToken;
-        $this->stashedToken = null;
-
-        return $stashedToken;
-    }
-
-    /**
-     * Returns deferred token or null if hasn't.
-     *
-     * @return array|null
-     */
-    protected function getDeferredToken()
-    {
-        if (!$this->deferredObjectsCount) {
-            return null;
-        }
-
-        --$this->deferredObjectsCount;
-
-        return array_shift($this->deferredObjects);
-    }
-
-    /**
-     * Returns next token from input.
-     *
-     * @return array
-     */
-    protected function getNextToken()
-    {
-        return $this->getDeferredToken()
-            ?: $this->scanEOS()
-            ?: $this->scanLanguage()
-            ?: $this->scanComment()
-            ?: $this->scanPyStringOp()
-            ?: $this->scanPyStringContent()
-            ?: $this->scanStep()
-            ?: $this->scanScenario()
-            ?: $this->scanBackground()
-            ?: $this->scanOutline()
-            ?: $this->scanExamples()
-            ?: $this->scanFeature()
-            ?: $this->scanTags()
-            ?: $this->scanTableRow()
-            ?: $this->scanNewline()
-            ?: $this->scanText();
-    }
-
-    /**
-     * Scans for token with specified regex.
-     *
-     * @param string $regex Regular expression
-     * @param string $type  Expected token type
-     *
-     * @return null|array
-     */
-    protected function scanInput($regex, $type)
-    {
-        if (!preg_match($regex, $this->line, $matches)) {
-            return null;
-        }
-
-        $token = $this->takeToken($type, $matches[1]);
-        $this->consumeLine();
-
-        return $token;
-    }
-
-    /**
-     * Scans for token with specified keywords.
-     *
-     * @param string $keywords Keywords (splitted with |)
-     * @param string $type     Expected token type
-     *
-     * @return null|array
-     */
-    protected function scanInputForKeywords($keywords, $type)
-    {
-        if (!preg_match('/^(\s*)(' . $keywords . '):\s*(.*)/u', $this->line, $matches)) {
-            return null;
-        }
-
-        $token = $this->takeToken($type, $matches[3]);
-        $token['keyword'] = $matches[2];
-        $token['indent'] = mb_strlen($matches[1], 'utf8');
-
-        $this->consumeLine();
-
-        // turn off language searching
-        if ('Feature' === $type) {
-            $this->featureStarted = true;
-        }
-
-        // turn off PyString and Table searching
-        if ('Feature' === $type || 'Scenario' === $type || 'Outline' === $type) {
-            $this->allowMultilineArguments = false;
-        } elseif ('Examples' === $type) {
-            $this->allowMultilineArguments = true;
-        }
-
-        // turn on steps searching
-        if ('Scenario' === $type || 'Background' === $type || 'Outline' === $type) {
-            $this->allowSteps = true;
-        }
-
-        return $token;
-    }
-
-    /**
-     * Scans EOS from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanEOS()
-    {
-        if (!$this->eos) {
-            return null;
-        }
-
-        return $this->takeToken('EOS');
-    }
-
-    /**
-     * Returns keywords for provided type.
-     *
-     * @param string $type Keyword type
-     *
-     * @return string
-     */
-    protected function getKeywords($type)
-    {
-        if (!isset($this->keywordsCache[$type])) {
-            $getter = 'get' . $type . 'Keywords';
-            $keywords = $this->keywords->$getter();
-
-            if ('Step' === $type) {
-                $padded = array();
-                foreach (explode('|', $keywords) as $keyword) {
-                    $padded[] = false !== mb_strpos($keyword, '<', 0, 'utf8')
-                        ? preg_quote(mb_substr($keyword, 0, -1, 'utf8'), '/') . '\s*'
-                        : preg_quote($keyword, '/') . '\s+';
-                }
-
-                $keywords = implode('|', $padded);
-            }
-
-            $this->keywordsCache[$type] = $keywords;
-        }
-
-        return $this->keywordsCache[$type];
-    }
-
-    /**
-     * Scans Feature from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanFeature()
-    {
-        return $this->scanInputForKeywords($this->getKeywords('Feature'), 'Feature');
-    }
-
-    /**
-     * Scans Background from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanBackground()
-    {
-        return $this->scanInputForKeywords($this->getKeywords('Background'), 'Background');
-    }
-
-    /**
-     * Scans Scenario from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanScenario()
-    {
-        return $this->scanInputForKeywords($this->getKeywords('Scenario'), 'Scenario');
-    }
-
-    /**
-     * Scans Scenario Outline from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanOutline()
-    {
-        return $this->scanInputForKeywords($this->getKeywords('Outline'), 'Outline');
-    }
-
-    /**
-     * Scans Scenario Outline Examples from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanExamples()
-    {
-        return $this->scanInputForKeywords($this->getKeywords('Examples'), 'Examples');
-    }
-
-    /**
-     * Scans Step from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanStep()
-    {
-        if (!$this->allowSteps) {
-            return null;
-        }
-
-        $keywords = $this->getKeywords('Step');
-        if (!preg_match('/^\s*(' . $keywords . ')([^\s].*)/u', $this->line, $matches)) {
-            return null;
-        }
-
-        $keyword = trim($matches[1]);
-        $token = $this->takeToken('Step', $keyword);
-        $token['keyword_type'] = $this->getStepKeywordType($keyword);
-        $token['text'] = $matches[2];
-
-        $this->consumeLine();
-        $this->allowMultilineArguments = true;
-
-        return $token;
-    }
-
-    /**
-     * Scans PyString from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanPyStringOp()
-    {
-        if (!$this->allowMultilineArguments) {
-            return null;
-        }
-
-        if(!preg_match('/^\s*(?<delimiter>"""|```)/u', $this->line, $matches, PREG_OFFSET_CAPTURE)) {
-            return null;
-        }
-
-        ['delimiter' => [0 => $delimiter, 1 => $indent]] = $matches;
-
-        if ($this->inPyString) {
-            if ($this->pyStringDelimiter !== $delimiter) {
-                return null;
-            }
-            $this->pyStringDelimiter = null;
-        }
-        else {
-            $this->pyStringDelimiter= $delimiter;
-        }
-
-        $this->inPyString = !$this->inPyString;
-        $token = $this->takeToken('PyStringOp');
-        $this->pyStringSwallow = $indent;
-
-        $this->consumeLine();
-
-        return $token;
-    }
-
-    /**
-     * Scans PyString content.
-     *
-     * @return null|array
-     */
-    protected function scanPyStringContent()
-    {
-        if (!$this->inPyString) {
-            return null;
-        }
-
-        $token = $this->scanText();
-        // swallow trailing spaces
-        $token['value'] = preg_replace('/^\s{0,' . $this->pyStringSwallow . '}/u', '', $token['value'] ?? '');
-
-        return $token;
-    }
-
-    /**
-     * Scans Table Row from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanTableRow()
-    {
-        if (!$this->allowMultilineArguments) {
-            return null;
-        }
-
-        $line = $this->getTrimmedLine();
-        if (!isset($line[0]) || '|' !== $line[0] || '|' !== substr($line, -1)) {
-            return null;
-        }
-
-        $token = $this->takeToken('TableRow');
-        $line = mb_substr($line, 1, mb_strlen($line, 'utf8') - 2, 'utf8');
-        $columns = array_map(function ($column) {
-            return trim(str_replace('\\|', '|', $column));
-        }, preg_split('/(?<!\\\)\|/u', $line));
-        $token['columns'] = $columns;
-
-        $this->consumeLine();
-
-        return $token;
-    }
-
-    /**
-     * Scans Tags from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanTags()
-    {
-        $line = $this->getTrimmedLine();
-
-        if (!isset($line[0]) || '@' !== $line[0]) {
-            return null;
-        }
-
-        if(preg_match('/^(?<line>.*)\s+#.*$/', $line, $matches)) {
-            ['line' => $line] = $matches;
-            $this->consumeLineUntil(mb_strlen($line, 'utf-8'));
-        } else {
-            $this->consumeLine();
-        }
-
-        $token = $this->takeToken('Tag');
-        $tags = explode('@', mb_substr($line, 1, mb_strlen($line, 'utf8') - 1, 'utf8'));
-        $tags = array_map('trim', $tags);
-        $token['tags'] = $tags;
-
-
-        return $token;
-    }
-
-    /**
-     * Scans Language specifier from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanLanguage()
-    {
-        if ($this->featureStarted) {
-            return null;
-        }
-
-        if ($this->inPyString) {
-            return null;
-        }
-
-        if (0 !== mb_strpos(ltrim($this->line), '#', 0, 'utf8')) {
-            return null;
-        }
-
-        return $this->scanInput('/^\s*\#\s*language:\s*([\w_\-]+)\s*$/', 'Language');
-    }
-
-    /**
-     * Scans Comment from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanComment()
-    {
-        if ($this->inPyString) {
-            return null;
-        }
-
-        $line = $this->getTrimmedLine();
-        if (0 !== mb_strpos($line, '#', 0, 'utf8')) {
-            return null;
-        }
-
-        $token = $this->takeToken('Comment', $line);
-        $this->consumeLine();
-
-        return $token;
-    }
-
-    /**
-     * Scans Newline from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanNewline()
-    {
-        if ('' !== $this->getTrimmedLine()) {
-            return null;
-        }
-
-        $token = $this->takeToken('Newline', mb_strlen($this->line, 'utf8'));
-        $this->consumeLine();
-
-        return $token;
-    }
-
-    /**
-     * Scans text from input & returns it if found.
-     *
-     * @return null|array
-     */
-    protected function scanText()
-    {
-        $token = $this->takeToken('Text', $this->line);
-        $this->consumeLine();
-
-        return $token;
-    }
-
-    /**
-     * Returns step type keyword (Given, When, Then, etc.).
-     *
-     * @param string $native Step keyword in provided language
-     * @return string
-     */
-    private function getStepKeywordType($native)
-    {
-        // Consider "*" as a AND keyword so that it is normalized to the previous step type
-        if ('*' === $native) {
-            return 'And';
-        }
-
-        if (empty($this->stepKeywordTypesCache)) {
-            $this->stepKeywordTypesCache = array(
-                'Given' => explode('|', $this->keywords->getGivenKeywords()),
-                'When' => explode('|', $this->keywords->getWhenKeywords()),
-                'Then' => explode('|', $this->keywords->getThenKeywords()),
-                'And' => explode('|', $this->keywords->getAndKeywords()),
-                'But' => explode('|', $this->keywords->getButKeywords())
-            );
-        }
-
-        foreach ($this->stepKeywordTypesCache as $type => $keywords) {
-            if (in_array($native, $keywords) || in_array($native . '<', $keywords)) {
-                return $type;
-            }
-        }
-
-        return 'Given';
-    }
-}

+ 0 - 72
vendor/behat/gherkin/src/Behat/Gherkin/Loader/AbstractFileLoader.php

@@ -1,72 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Loader;
-
-/**
- * Abstract filesystem loader.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-abstract class AbstractFileLoader implements FileLoaderInterface
-{
-    protected $basePath;
-
-    /**
-     * Sets base features path.
-     *
-     * @param string $path Base loader path
-     */
-    public function setBasePath($path)
-    {
-        $this->basePath = realpath($path);
-    }
-
-    /**
-     * Finds relative path for provided absolute (relative to base features path).
-     *
-     * @param string $path Absolute path
-     *
-     * @return string
-     */
-    protected function findRelativePath($path)
-    {
-        if (null !== $this->basePath) {
-            return strtr($path, array($this->basePath . DIRECTORY_SEPARATOR => ''));
-        }
-
-        return $path;
-    }
-
-    /**
-     * Finds absolute path for provided relative (relative to base features path).
-     *
-     * @param string $path Relative path
-     *
-     * @return string
-     */
-    protected function findAbsolutePath($path)
-    {
-        if (is_file($path) || is_dir($path)) {
-            return realpath($path);
-        }
-
-        if (null === $this->basePath) {
-            return false;
-        }
-
-        if (is_file($this->basePath . DIRECTORY_SEPARATOR . $path)
-               || is_dir($this->basePath . DIRECTORY_SEPARATOR . $path)) {
-            return realpath($this->basePath . DIRECTORY_SEPARATOR . $path);
-        }
-
-        return false;
-    }
-}

+ 0 - 312
vendor/behat/gherkin/src/Behat/Gherkin/Loader/ArrayLoader.php

@@ -1,312 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Loader;
-
-use Behat\Gherkin\Node\BackgroundNode;
-use Behat\Gherkin\Node\ExampleTableNode;
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\OutlineNode;
-use Behat\Gherkin\Node\PyStringNode;
-use Behat\Gherkin\Node\ScenarioNode;
-use Behat\Gherkin\Node\StepNode;
-use Behat\Gherkin\Node\TableNode;
-
-/**
- * From-array loader.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class ArrayLoader implements LoaderInterface
-{
-    /**
-     * Checks if current loader supports provided resource.
-     *
-     * @param mixed $resource Resource to load
-     *
-     * @return bool
-     */
-    public function supports($resource)
-    {
-        return is_array($resource) && (isset($resource['features']) || isset($resource['feature']));
-    }
-
-    /**
-     * Loads features from provided resource.
-     *
-     * @param mixed $resource Resource to load
-     *
-     * @return FeatureNode[]
-     */
-    public function load($resource)
-    {
-        $features = array();
-
-        if (isset($resource['features'])) {
-            foreach ($resource['features'] as $iterator => $hash) {
-                $feature = $this->loadFeatureHash($hash, $iterator);
-                $features[] = $feature;
-            }
-        } elseif (isset($resource['feature'])) {
-            $feature = $this->loadFeatureHash($resource['feature']);
-            $features[] = $feature;
-        }
-
-        return $features;
-    }
-
-    /**
-     * Loads feature from provided feature hash.
-     *
-     * @param array   $hash Feature hash
-     * @param integer $line
-     *
-     * @return FeatureNode
-     */
-    protected function loadFeatureHash(array $hash, $line = 0)
-    {
-        $hash = array_merge(
-            array(
-                'title' => null,
-                'description' => null,
-                'tags' => array(),
-                'keyword' => 'Feature',
-                'language' => 'en',
-                'line' => $line,
-                'scenarios' => array(),
-            ),
-            $hash
-        );
-        $background = isset($hash['background']) ? $this->loadBackgroundHash($hash['background']) : null;
-
-        $scenarios = array();
-        foreach ((array) $hash['scenarios'] as $scenarioIterator => $scenarioHash) {
-            if (isset($scenarioHash['type']) && 'outline' === $scenarioHash['type']) {
-                $scenarios[] = $this->loadOutlineHash($scenarioHash, $scenarioIterator);
-            } else {
-                $scenarios[] = $this->loadScenarioHash($scenarioHash, $scenarioIterator);
-            }
-        }
-
-        return new FeatureNode($hash['title'], $hash['description'], $hash['tags'], $background, $scenarios, $hash['keyword'], $hash['language'], null, $hash['line']);
-    }
-
-    /**
-     * Loads background from provided hash.
-     *
-     * @param array $hash Background hash
-     *
-     * @return BackgroundNode
-     */
-    protected function loadBackgroundHash(array $hash)
-    {
-        $hash = array_merge(
-            array(
-                'title' => null,
-                'keyword' => 'Background',
-                'line' => 0,
-                'steps' => array(),
-            ),
-            $hash
-        );
-
-        $steps = $this->loadStepsHash($hash['steps']);
-
-        return new BackgroundNode($hash['title'], $steps, $hash['keyword'], $hash['line']);
-    }
-
-    /**
-     * Loads scenario from provided scenario hash.
-     *
-     * @param array   $hash Scenario hash
-     * @param integer $line Scenario definition line
-     *
-     * @return ScenarioNode
-     */
-    protected function loadScenarioHash(array $hash, $line = 0)
-    {
-        $hash = array_merge(
-            array(
-                'title' => null,
-                'tags' => array(),
-                'keyword' => 'Scenario',
-                'line' => $line,
-                'steps' => array(),
-            ),
-            $hash
-        );
-
-        $steps = $this->loadStepsHash($hash['steps']);
-
-        return new ScenarioNode($hash['title'], $hash['tags'], $steps, $hash['keyword'], $hash['line']);
-    }
-
-    /**
-     * Loads outline from provided outline hash.
-     *
-     * @param array   $hash Outline hash
-     * @param integer $line Outline definition line
-     *
-     * @return OutlineNode
-     */
-    protected function loadOutlineHash(array $hash, $line = 0)
-    {
-        $hash = array_merge(
-            array(
-                'title' => null,
-                'tags' => array(),
-                'keyword' => 'Scenario Outline',
-                'line' => $line,
-                'steps' => array(),
-                'examples' => array(),
-            ),
-            $hash
-        );
-
-        $steps = $this->loadStepsHash($hash['steps']);
-
-        if (isset($hash['examples']['keyword'])) {
-            $examplesKeyword = $hash['examples']['keyword'];
-            unset($hash['examples']['keyword']);
-        } else {
-            $examplesKeyword = 'Examples';
-        }
-
-        $exHash = $hash['examples'];
-        $examples = array();
-
-        if ($this->examplesAreInArray($exHash)) {
-            $examples = $this->processExamplesArray($exHash, $examplesKeyword, $examples);
-        } else {
-            // examples as a single table - we create an array with the only one element
-            $examples[] = new ExampleTableNode($exHash, $examplesKeyword);;
-        }
-
-        return new OutlineNode($hash['title'], $hash['tags'], $steps, $examples, $hash['keyword'], $hash['line']);
-    }
-
-    /**
-     * Loads steps from provided hash.
-     *
-     * @param array $hash
-     *
-     * @return StepNode[]
-     */
-    private function loadStepsHash(array $hash)
-    {
-        $steps = array();
-        foreach ($hash as $stepIterator => $stepHash) {
-            $steps[] = $this->loadStepHash($stepHash, $stepIterator);
-        }
-
-        return $steps;
-    }
-
-    /**
-     * Loads step from provided hash.
-     *
-     * @param array   $hash Step hash
-     * @param integer $line Step definition line
-     *
-     * @return StepNode
-     */
-    protected function loadStepHash(array $hash, $line = 0)
-    {
-        $hash = array_merge(
-            array(
-                'keyword_type' => 'Given',
-                'type' => 'Given',
-                'text' => null,
-                'keyword' => 'Scenario',
-                'line' => $line,
-                'arguments' => array(),
-            ),
-            $hash
-        );
-
-        $arguments = array();
-        foreach ($hash['arguments'] as $argumentHash) {
-            if ('table' === $argumentHash['type']) {
-                $arguments[] = $this->loadTableHash($argumentHash['rows']);
-            } elseif ('pystring' === $argumentHash['type']) {
-                $arguments[] = $this->loadPyStringHash($argumentHash, $hash['line'] + 1);
-            }
-        }
-
-        return new StepNode($hash['type'], $hash['text'], $arguments, $hash['line'], $hash['keyword_type']);
-    }
-
-    /**
-     * Loads table from provided hash.
-     *
-     * @param array $hash Table hash
-     *
-     * @return TableNode
-     */
-    protected function loadTableHash(array $hash)
-    {
-        return new TableNode($hash);
-    }
-
-    /**
-     * Loads PyString from provided hash.
-     *
-     * @param array   $hash PyString hash
-     * @param integer $line
-     *
-     * @return PyStringNode
-     */
-    protected function loadPyStringHash(array $hash, $line = 0)
-    {
-        $line = isset($hash['line']) ? $hash['line'] : $line;
-
-        $strings = array();
-        foreach (explode("\n", $hash['text']) as $string) {
-            $strings[] = $string;
-        }
-
-        return new PyStringNode($strings, $line);
-    }
-
-    /**
-     * Checks if examples node is an array
-     * @param $exHash object hash
-     * @return bool
-     */
-    private function examplesAreInArray($exHash)
-    {
-        return isset($exHash[0]);
-    }
-
-    /**
-     * Processes cases when examples are in the form of array of arrays
-     * OR in the form of array of objects
-     *
-     * @param $exHash array hash
-     * @param $examplesKeyword string
-     * @param $examples array
-     * @return array
-     */
-    private function processExamplesArray($exHash, $examplesKeyword, $examples)
-    {
-        for ($i = 0; $i < count($exHash); $i++) {
-            if (isset($exHash[$i]['table'])) {
-                // we have examples as objects, hence there could be tags
-                $exHashTags = isset($exHash[$i]['tags']) ? $exHash[$i]['tags'] : array();
-                $examples[] = new ExampleTableNode($exHash[$i]['table'], $examplesKeyword, $exHashTags);
-            } else {
-                // we have examples as arrays
-                $examples[] = new ExampleTableNode($exHash[$i], $examplesKeyword);
-            }
-        }
-
-        return $examples;
-    }
-}

+ 0 - 193
vendor/behat/gherkin/src/Behat/Gherkin/Loader/CucumberNDJsonAstLoader.php

@@ -1,193 +0,0 @@
-<?php
-
-namespace Behat\Gherkin\Loader;
-
-use Behat\Gherkin\Node\BackgroundNode;
-use Behat\Gherkin\Node\ExampleTableNode;
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\OutlineNode;
-use Behat\Gherkin\Node\ScenarioInterface;
-use Behat\Gherkin\Node\ScenarioNode;
-use Behat\Gherkin\Node\StepNode;
-
-/**
- * Loads a feature from cucumber's protobuf JSON format
- */
-class CucumberNDJsonAstLoader implements LoaderInterface
-{
-
-    public function supports($resource)
-    {
-        return is_string($resource);
-    }
-
-    public function load($resource)
-    {
-        return array_values(array_filter(array_map(
-            static function ($line) use ($resource) {
-                return self::getFeature(json_decode($line, true), $resource);
-            },
-            file($resource)
-        )));
-    }
-
-    /**
-     * @return FeatureNode|null
-     */
-    private static function getFeature(array $json, $filePath)
-    {
-        if (!isset($json['gherkinDocument']['feature'])) {
-            return null;
-        }
-
-        $featureJson = $json['gherkinDocument']['feature'];
-
-        $feature = new FeatureNode(
-            isset($featureJson['name']) ? $featureJson['name'] : null,
-            $featureJson['description'] ? trim($featureJson['description']) : null,
-            self::getTags($featureJson),
-            self::getBackground($featureJson),
-            self::getScenarios($featureJson),
-            $featureJson['keyword'],
-            $featureJson['language'],
-            preg_replace('/(?<=\\.feature).*$/', '', $filePath),
-            $featureJson['location']['line']
-        );
-
-        return $feature;
-    }
-
-    /**
-     * @return string[]
-     */
-    private static function getTags(array $json)
-    {
-        return array_map(
-            static function(array $tag) { return preg_replace('/^@/', '', $tag['name']); },
-            isset($json['tags']) ? $json['tags'] : []
-        );
-    }
-
-    /**
-     * @return ScenarioInterface[]
-     */
-    private static function getScenarios(array $json)
-    {
-
-        return array_values(
-            array_map(
-                static function ($child) {
-
-                    if ($child['scenario']['examples']) {
-                        return new OutlineNode(
-                            isset($child['scenario']['name']) ? $child['scenario']['name'] : null,
-                            self::getTags($child['scenario']),
-                            self::getSteps(isset($child['scenario']['steps']) ? $child['scenario']['steps'] : []),
-                            self::getTables($child['scenario']['examples']),
-                            $child['scenario']['keyword'],
-                            $child['scenario']['location']['line']
-                        );
-                    }
-                    else {
-                        return new ScenarioNode(
-                            $child['scenario']['name'],
-                            self::getTags($child['scenario']),
-                            self::getSteps(isset($child['scenario']['steps']) ? $child['scenario']['steps'] : []),
-                            $child['scenario']['keyword'],
-                            $child['scenario']['location']['line']
-                        );
-                    }
-
-                },
-                array_filter(
-                    isset($json['children']) ? $json['children'] : [],
-                    static function ($child) {
-                        return isset($child['scenario']);
-                    }
-                )
-            )
-        );
-    }
-
-    /**
-     * @return BackgroundNode|null
-     */
-    private static function getBackground(array $json)
-    {
-        $backgrounds = array_values(
-            array_map(
-                static function ($child) {
-                    return new BackgroundNode(
-                        $child['background']['name'],
-                        self::getSteps(isset($child['background']['steps']) ? $child['background']['steps'] : []),
-                        $child['background']['keyword'],
-                        $child['background']['location']['line']
-                    );
-                },
-                array_filter(
-                    isset($json['children']) ? $json['children'] : [],
-                    static function ($child) {
-                        return isset($child['background']);
-                    }
-                )
-            )
-        );
-
-        return count($backgrounds) == 1 ? $backgrounds[0] : null;
-    }
-
-    /**
-     * @return StepNode[]
-     */
-    private static function getSteps(array $json)
-    {
-        return array_map(
-            static function(array $json) {
-                return new StepNode(
-                    trim($json['keyword']),
-                    $json['text'],
-                    [],
-                    $json['location']['line'],
-                    trim($json['keyword'])
-                );
-            },
-            $json
-        );
-    }
-
-    /**
-     * @return ExampleTableNode[]
-     */
-    private static function getTables(array $json)
-    {
-        return array_map(
-            static function($tableJson) {
-
-                $table = [];
-
-                $table[$tableJson['tableHeader']['location']['line']] = array_map(
-                    static function($cell) {
-                        return $cell['value'];
-                    },
-                    $tableJson['tableHeader']['cells']
-                );
-
-                foreach ($tableJson['tableBody'] as $bodyRow) {
-                    $table[$bodyRow['location']['line']] = array_map(
-                        static function($cell) {
-                            return $cell['value'];
-                        },
-                        $bodyRow['cells']
-                    );
-                }
-
-                return new ExampleTableNode(
-                    $table,
-                    $tableJson['keyword'],
-                    self::getTags($tableJson)
-                );
-            },
-            $json
-        );
-    }
-}

+ 0 - 80
vendor/behat/gherkin/src/Behat/Gherkin/Loader/DirectoryLoader.php

@@ -1,80 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Loader;
-
-use Behat\Gherkin\Gherkin;
-use Behat\Gherkin\Node\FeatureNode;
-use RecursiveDirectoryIterator;
-use RecursiveIteratorIterator;
-
-/**
- * Directory contents loader.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class DirectoryLoader extends AbstractFileLoader
-{
-    protected $gherkin;
-
-    /**
-     * Initializes loader.
-     *
-     * @param Gherkin $gherkin Gherkin manager
-     */
-    public function __construct(Gherkin $gherkin)
-    {
-        $this->gherkin = $gherkin;
-    }
-
-    /**
-     * Checks if current loader supports provided resource.
-     *
-     * @param mixed $path Resource to load
-     *
-     * @return bool
-     */
-    public function supports($path)
-    {
-        return is_string($path)
-        && is_dir($this->findAbsolutePath($path));
-    }
-
-    /**
-     * Loads features from provided resource.
-     *
-     * @param string $path Resource to load
-     *
-     * @return FeatureNode[]
-     */
-    public function load($path)
-    {
-        $path = $this->findAbsolutePath($path);
-
-        $iterator = new RecursiveIteratorIterator(
-            new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS)
-        );
-        $paths = array_map('strval', iterator_to_array($iterator));
-        uasort($paths, 'strnatcasecmp');
-
-        $features = array();
-
-        foreach ($paths as $path) {
-            $path = (string) $path;
-            $loader = $this->gherkin->resolveLoader($path);
-
-            if (null !== $loader) {
-                $features = array_merge($features, $loader->load($path));
-            }
-        }
-
-        return $features;
-    }
-}

+ 0 - 26
vendor/behat/gherkin/src/Behat/Gherkin/Loader/FileLoaderInterface.php

@@ -1,26 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Loader;
-
-/**
- * File Loader interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface FileLoaderInterface extends LoaderInterface
-{
-    /**
-     * Sets base features path.
-     *
-     * @param string $path Base loader path
-     */
-    public function setBasePath($path);
-}

+ 0 - 101
vendor/behat/gherkin/src/Behat/Gherkin/Loader/GherkinFileLoader.php

@@ -1,101 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Loader;
-
-use Behat\Gherkin\Cache\CacheInterface;
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Parser;
-
-/**
- * Gherkin *.feature files loader.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class GherkinFileLoader extends AbstractFileLoader
-{
-    protected $parser;
-    protected $cache;
-
-    /**
-     * Initializes loader.
-     *
-     * @param Parser         $parser Parser
-     * @param CacheInterface $cache  Cache layer
-     */
-    public function __construct(Parser $parser, CacheInterface $cache = null)
-    {
-        $this->parser = $parser;
-        $this->cache = $cache;
-    }
-
-    /**
-     * Sets cache layer.
-     *
-     * @param CacheInterface $cache Cache layer
-     */
-    public function setCache(CacheInterface $cache)
-    {
-        $this->cache = $cache;
-    }
-
-    /**
-     * Checks if current loader supports provided resource.
-     *
-     * @param mixed $path Resource to load
-     *
-     * @return bool
-     */
-    public function supports($path)
-    {
-        return is_string($path)
-        && is_file($absolute = $this->findAbsolutePath($path))
-        && 'feature' === pathinfo($absolute, PATHINFO_EXTENSION);
-    }
-
-    /**
-     * Loads features from provided resource.
-     *
-     * @param string $path Resource to load
-     *
-     * @return FeatureNode[]
-     */
-    public function load($path)
-    {
-        $path = $this->findAbsolutePath($path);
-
-        if ($this->cache) {
-            if ($this->cache->isFresh($path, filemtime($path))) {
-                $feature = $this->cache->read($path);
-            } elseif (null !== $feature = $this->parseFeature($path)) {
-                $this->cache->write($path, $feature);
-            }
-        } else {
-            $feature = $this->parseFeature($path);
-        }
-
-        return null !== $feature ? array($feature) : array();
-    }
-
-    /**
-     * Parses feature at provided absolute path.
-     *
-     * @param string $path Feature path
-     *
-     * @return FeatureNode
-     */
-    protected function parseFeature($path)
-    {
-        $content = file_get_contents($path);
-        $feature = $this->parser->parse($content, $path);
-
-        return $feature;
-    }
-}

+ 0 - 39
vendor/behat/gherkin/src/Behat/Gherkin/Loader/LoaderInterface.php

@@ -1,39 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Loader;
-
-use Behat\Gherkin\Node\FeatureNode;
-
-/**
- * Loader interface.
- *
- * @author      Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface LoaderInterface
-{
-    /**
-     * Checks if current loader supports provided resource.
-     *
-     * @param mixed $resource Resource to load
-     *
-     * @return bool
-     */
-    public function supports($resource);
-
-    /**
-     * Loads features from provided resource.
-     *
-     * @param mixed $resource Resource to load
-     *
-     * @return FeatureNode[]
-     */
-    public function load($resource);
-}

+ 0 - 72
vendor/behat/gherkin/src/Behat/Gherkin/Loader/YamlFileLoader.php

@@ -1,72 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Loader;
-
-use Behat\Gherkin\Node\FeatureNode;
-use Symfony\Component\Yaml\Yaml;
-
-/**
- * Yaml files loader.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class YamlFileLoader extends AbstractFileLoader
-{
-    private $loader;
-
-    public function __construct()
-    {
-        $this->loader = new ArrayLoader();
-    }
-
-    /**
-     * Checks if current loader supports provided resource.
-     *
-     * @param mixed $path Resource to load
-     *
-     * @return bool
-     */
-    public function supports($path)
-    {
-        return is_string($path)
-            && is_file($absolute = $this->findAbsolutePath($path))
-            && 'yml' === pathinfo($absolute, PATHINFO_EXTENSION);
-    }
-
-    /**
-     * Loads features from provided resource.
-     *
-     * @param string $path Resource to load
-     *
-     * @return FeatureNode[]
-     */
-    public function load($path)
-    {
-        $path = $this->findAbsolutePath($path);
-        $hash = Yaml::parse(file_get_contents($path));
-
-        $features = $this->loader->load($hash);
-
-        return array_map(function (FeatureNode $feature) use ($path) {
-            return new FeatureNode(
-                $feature->getTitle(),
-                $feature->getDescription(),
-                $feature->getTags(),
-                $feature->getBackground(),
-                $feature->getScenarios(),
-                $feature->getKeyword(),
-                $feature->getLanguage(),
-                $path,
-                $feature->getLine()
-            );
-        }, $features);
-    }
-}

+ 0 - 20
vendor/behat/gherkin/src/Behat/Gherkin/Node/ArgumentInterface.php

@@ -1,20 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Gherkin arguments interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface ArgumentInterface extends NodeInterface
-{
-}

+ 0 - 112
vendor/behat/gherkin/src/Behat/Gherkin/Node/BackgroundNode.php

@@ -1,112 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Represents Gherkin Background.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class BackgroundNode implements ScenarioLikeInterface
-{
-    /**
-     * @var string
-     */
-    private $title;
-    /**
-     * @var StepNode[]
-     */
-    private $steps = array();
-    /**
-     * @var string
-     */
-    private $keyword;
-    /**
-     * @var integer
-     */
-    private $line;
-
-    /**
-     * Initializes background.
-     *
-     * @param null|string $title
-     * @param StepNode[]  $steps
-     * @param string      $keyword
-     * @param integer     $line
-     */
-    public function __construct($title, array $steps, $keyword, $line)
-    {
-        $this->title = $title;
-        $this->steps = $steps;
-        $this->keyword = $keyword;
-        $this->line = $line;
-    }
-
-    /**
-     * Returns node type string
-     *
-     * @return string
-     */
-    public function getNodeType()
-    {
-        return 'Background';
-    }
-
-    /**
-     * Returns background title.
-     *
-     * @return null|string
-     */
-    public function getTitle()
-    {
-        return $this->title;
-    }
-
-    /**
-     * Checks if background has steps.
-     *
-     * @return bool
-     */
-    public function hasSteps()
-    {
-        return 0 < count($this->steps);
-    }
-
-    /**
-     * Returns background steps.
-     *
-     * @return StepNode[]
-     */
-    public function getSteps()
-    {
-        return $this->steps;
-    }
-
-    /**
-     * Returns background keyword.
-     *
-     * @return string
-     */
-    public function getKeyword()
-    {
-        return $this->keyword;
-    }
-
-    /**
-     * Returns background declaration line number.
-     *
-     * @return integer
-     */
-    public function getLine()
-    {
-        return $this->line;
-    }
-}

+ 0 - 274
vendor/behat/gherkin/src/Behat/Gherkin/Node/ExampleNode.php

@@ -1,274 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Represents Gherkin Outline Example.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class ExampleNode implements ScenarioInterface
-{
-    /**
-     * @var string
-     */
-    private $title;
-    /**
-     * @var string[]
-     */
-    private $tags;
-    /**
-     * @var StepNode[]
-     */
-    private $outlineSteps;
-    /**
-     * @var string[]
-     */
-    private $tokens;
-    /**
-     * @var integer
-     */
-    private $line;
-    /**
-     * @var null|StepNode[]
-     */
-    private $steps;
-    /**
-     * @var string
-     */
-    private $outlineTitle;
-
-    /**
-     * Initializes outline.
-     *
-     * @param string      $title
-     * @param string[]    $tags
-     * @param StepNode[]  $outlineSteps
-     * @param string[]    $tokens
-     * @param integer     $line
-     * @param string|null $outlineTitle
-     */
-    public function __construct($title, array $tags, $outlineSteps, array $tokens, $line, $outlineTitle = null)
-    {
-        $this->title = $title;
-        $this->tags = $tags;
-        $this->outlineSteps = $outlineSteps;
-        $this->tokens = $tokens;
-        $this->line = $line;
-        $this->outlineTitle = $outlineTitle;
-    }
-
-    /**
-     * Returns node type string
-     *
-     * @return string
-     */
-    public function getNodeType()
-    {
-        return 'Example';
-    }
-
-    /**
-     * Returns node keyword.
-     *
-     * @return string
-     */
-    public function getKeyword()
-    {
-        return $this->getNodeType();
-    }
-
-    /**
-     * Returns example title.
-     *
-     * @return string
-     */
-    public function getTitle()
-    {
-        return $this->title;
-    }
-
-    /**
-     * Checks if outline is tagged with tag.
-     *
-     * @param string $tag
-     *
-     * @return bool
-     */
-    public function hasTag($tag)
-    {
-        return in_array($tag, $this->getTags());
-    }
-
-    /**
-     * Checks if outline has tags (both inherited from feature and own).
-     *
-     * @return bool
-     */
-    public function hasTags()
-    {
-        return 0 < count($this->getTags());
-    }
-
-    /**
-     * Returns outline tags (including inherited from feature).
-     *
-     * @return string[]
-     */
-    public function getTags()
-    {
-        return $this->tags;
-    }
-
-    /**
-     * Checks if outline has steps.
-     *
-     * @return bool
-     */
-    public function hasSteps()
-    {
-        return 0 < count($this->outlineSteps);
-    }
-
-    /**
-     * Returns outline steps.
-     *
-     * @return StepNode[]
-     */
-    public function getSteps()
-    {
-        return $this->steps = $this->steps ? : $this->createExampleSteps();
-    }
-
-    /**
-     * Returns example tokens.
-     *
-     * @return string[]
-     */
-    public function getTokens()
-    {
-        return $this->tokens;
-    }
-
-    /**
-     * Returns outline declaration line number.
-     *
-     * @return integer
-     */
-    public function getLine()
-    {
-        return $this->line;
-    }
-
-    /**
-     * Returns outline title.
-     *
-     * @return string
-     */
-    public function getOutlineTitle()
-    {
-        return $this->outlineTitle;
-    }
-
-    /**
-     * Creates steps for this example from abstract outline steps.
-     *
-     * @return StepNode[]
-     */
-    protected function createExampleSteps()
-    {
-        $steps = array();
-        foreach ($this->outlineSteps as $outlineStep) {
-            $keyword = $outlineStep->getKeyword();
-            $keywordType = $outlineStep->getKeywordType();
-            $text = $this->replaceTextTokens($outlineStep->getText());
-            $args = $this->replaceArgumentsTokens($outlineStep->getArguments());
-            $line = $outlineStep->getLine();
-
-            $steps[] = new StepNode($keyword, $text, $args, $line, $keywordType);
-        }
-
-        return $steps;
-    }
-
-    /**
-     * Replaces tokens in arguments with row values.
-     *
-     * @param ArgumentInterface[] $arguments
-     *
-     * @return ArgumentInterface[]
-     */
-    protected function replaceArgumentsTokens(array $arguments)
-    {
-        foreach ($arguments as $num => $argument) {
-            if ($argument instanceof TableNode) {
-                $arguments[$num] = $this->replaceTableArgumentTokens($argument);
-            }
-            if ($argument instanceof PyStringNode) {
-                $arguments[$num] = $this->replacePyStringArgumentTokens($argument);
-            }
-        }
-
-        return $arguments;
-    }
-
-    /**
-     * Replaces tokens in table with row values.
-     *
-     * @param TableNode $argument
-     *
-     * @return TableNode
-     */
-    protected function replaceTableArgumentTokens(TableNode $argument)
-    {
-        $table = $argument->getTable();
-        foreach ($table as $line => $row) {
-            foreach (array_keys($row) as $col) {
-                $table[$line][$col] = $this->replaceTextTokens($table[$line][$col]);
-            }
-        }
-
-        return new TableNode($table);
-    }
-
-    /**
-     * Replaces tokens in PyString with row values.
-     *
-     * @param PyStringNode $argument
-     *
-     * @return PyStringNode
-     */
-    protected function replacePyStringArgumentTokens(PyStringNode $argument)
-    {
-        $strings = $argument->getStrings();
-        foreach ($strings as $line => $string) {
-            $strings[$line] = $this->replaceTextTokens($strings[$line]);
-        }
-
-        return new PyStringNode($strings, $argument->getLine());
-    }
-
-    /**
-     * Replaces tokens in text with row values.
-     *
-     * @param string $text
-     *
-     * @return string
-     */
-    protected function replaceTextTokens($text)
-    {
-        foreach ($this->tokens as $key => $val) {
-            $text = str_replace('<' . $key . '>', $val, $text);
-        }
-
-        return $text;
-    }
-}

+ 0 - 73
vendor/behat/gherkin/src/Behat/Gherkin/Node/ExampleTableNode.php

@@ -1,73 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Represents Gherkin Outline Example Table.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class ExampleTableNode extends TableNode
-{
-    /**
-     * @var string[]
-     */
-    private $tags;
-
-    /**
-     * @var string
-     */
-    private $keyword;
-
-    /**
-     * Initializes example table.
-     *
-     * @param array $table Table in form of [$rowLineNumber => [$val1, $val2, $val3]]
-     * @param string $keyword
-     * @param string[] $tags
-     */
-    public function __construct(array $table, $keyword, array $tags = array())
-    {
-        $this->keyword = $keyword;
-        $this->tags = $tags;
-
-        parent::__construct($table);
-    }
-
-    /**
-     * Returns node type string
-     *
-     * @return string
-     */
-    public function getNodeType()
-    {
-        return 'ExampleTable';
-    }
-
-    /**
-     * Returns attached tags
-     * @return \string[]
-     */
-    public function getTags()
-    {
-        return $this->tags;
-    }
-
-    /**
-     * Returns example table keyword.
-     *
-     * @return string
-     */
-    public function getKeyword()
-    {
-        return $this->keyword;
-    }
-}

+ 0 - 271
vendor/behat/gherkin/src/Behat/Gherkin/Node/FeatureNode.php

@@ -1,271 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Represents Gherkin Feature.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class FeatureNode implements KeywordNodeInterface, TaggedNodeInterface
-{
-    /**
-     * @var null|string
-     */
-    private $title;
-    /**
-     * @var null|string
-     */
-    private $description;
-    /**
-     * @var string[]
-     */
-    private $tags = array();
-    /**
-     * @var null|BackgroundNode
-     */
-    private $background;
-    /**
-     * @var ScenarioInterface[]
-     */
-    private $scenarios = array();
-    /**
-     * @var string
-     */
-    private $keyword;
-    /**
-     * @var string
-     */
-    private $language;
-    /**
-     * @var null|string
-     */
-    private $file;
-    /**
-     * @var integer
-     */
-    private $line;
-
-    /**
-     * Initializes feature.
-     *
-     * @param null|string         $title
-     * @param null|string         $description
-     * @param string[]            $tags
-     * @param null|BackgroundNode $background
-     * @param ScenarioInterface[] $scenarios
-     * @param string              $keyword
-     * @param string              $language
-     * @param null|string         $file        The absolute path to the feature file.
-     * @param integer             $line
-     */
-    public function __construct(
-        $title,
-        $description,
-        array $tags,
-        BackgroundNode $background = null,
-        array $scenarios,
-        $keyword,
-        $language,
-        $file,
-        $line
-    ) {
-        // Verify that the feature file is an absolute path.
-        if (!empty($file) && !$this->isAbsolutePath($file)) {
-            throw new \InvalidArgumentException('The file should be an absolute path.');
-        }
-        $this->title = $title;
-        $this->description = $description;
-        $this->tags = $tags;
-        $this->background = $background;
-        $this->scenarios = $scenarios;
-        $this->keyword = $keyword;
-        $this->language = $language;
-        $this->file = $file;
-        $this->line = $line;
-    }
-
-    /**
-     * Returns node type string
-     *
-     * @return string
-     */
-    public function getNodeType()
-    {
-        return 'Feature';
-    }
-
-    /**
-     * Returns feature title.
-     *
-     * @return null|string
-     */
-    public function getTitle()
-    {
-        return $this->title;
-    }
-
-    /**
-     * Checks if feature has a description.
-     *
-     * @return bool
-     */
-    public function hasDescription()
-    {
-        return !empty($this->description);
-    }
-
-    /**
-     * Returns feature description.
-     *
-     * @return null|string
-     */
-    public function getDescription()
-    {
-        return $this->description;
-    }
-
-    /**
-     * Checks if feature is tagged with tag.
-     *
-     * @param string $tag
-     *
-     * @return bool
-     */
-    public function hasTag($tag)
-    {
-        return in_array($tag, $this->tags);
-    }
-
-    /**
-     * Checks if feature has tags.
-     *
-     * @return bool
-     */
-    public function hasTags()
-    {
-        return 0 < count($this->tags);
-    }
-
-    /**
-     * Returns feature tags.
-     *
-     * @return string[]
-     */
-    public function getTags()
-    {
-        return $this->tags;
-    }
-
-    /**
-     * Checks if feature has background.
-     *
-     * @return bool
-     */
-    public function hasBackground()
-    {
-        return null !== $this->background;
-    }
-
-    /**
-     * Returns feature background.
-     *
-     * @return null|BackgroundNode
-     */
-    public function getBackground()
-    {
-        return $this->background;
-    }
-
-    /**
-     * Checks if feature has scenarios.
-     *
-     * @return bool
-     */
-    public function hasScenarios()
-    {
-        return 0 < count($this->scenarios);
-    }
-
-    /**
-     * Returns feature scenarios.
-     *
-     * @return ScenarioInterface[]
-     */
-    public function getScenarios()
-    {
-        return $this->scenarios;
-    }
-
-    /**
-     * Returns feature keyword.
-     *
-     * @return string
-     */
-    public function getKeyword()
-    {
-        return $this->keyword;
-    }
-
-    /**
-     * Returns feature language.
-     *
-     * @return string
-     */
-    public function getLanguage()
-    {
-        return $this->language;
-    }
-
-    /**
-     * Returns feature file as an absolute path.
-     *
-     * @return null|string
-     */
-    public function getFile()
-    {
-        return $this->file;
-    }
-
-    /**
-     * Returns feature declaration line number.
-     *
-     * @return integer
-     */
-    public function getLine()
-    {
-        return $this->line;
-    }
-
-    /**
-     * Returns whether the file path is an absolute path.
-     *
-     * @param string $file A file path
-     *
-     * @return bool
-     *
-     * @see https://github.com/symfony/filesystem/blob/master/Filesystem.php
-     */
-    protected function isAbsolutePath($file)
-    {
-        if (null === $file) {
-            @trigger_error(sprintf('Calling "%s()" with a null in the $file argument is deprecated since Symfony 4.4.', __METHOD__), E_USER_DEPRECATED);
-        }
-
-        return strspn($file, '/\\', 0, 1)
-            || (\strlen($file) > 3 && ctype_alpha($file[0])
-                && ':' === $file[1]
-                && strspn($file, '/\\', 2, 1)
-            )
-            || null !== parse_url($file, PHP_URL_SCHEME)
-        ;
-    }
-}

+ 0 - 33
vendor/behat/gherkin/src/Behat/Gherkin/Node/KeywordNodeInterface.php

@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Gherkin keyword node interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface KeywordNodeInterface extends NodeInterface
-{
-    /**
-     * Returns node keyword.
-     *
-     * @return string
-     */
-    public function getKeyword();
-
-    /**
-     * Returns node title.
-     *
-     * @return null|string
-     */
-    public function getTitle();
-}

+ 0 - 33
vendor/behat/gherkin/src/Behat/Gherkin/Node/NodeInterface.php

@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Gherkin node interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface NodeInterface
-{
-    /**
-     * Returns node type string
-     *
-     * @return string
-     */
-    public function getNodeType();
-
-    /**
-     * Returns feature declaration line number.
-     *
-     * @return integer
-     */
-    public function getLine();
-}

+ 0 - 246
vendor/behat/gherkin/src/Behat/Gherkin/Node/OutlineNode.php

@@ -1,246 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Represents Gherkin Outline.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class OutlineNode implements ScenarioInterface
-{
-    /**
-     * @var string
-     */
-    private $title;
-    /**
-     * @var string[]
-     */
-    private $tags;
-    /**
-     * @var StepNode[]
-     */
-    private $steps;
-    /**
-     * @var ExampleTableNode|ExampleTableNode[]
-     */
-    private $tables;
-    /**
-     * @var string
-     */
-    private $keyword;
-    /**
-     * @var integer
-     */
-    private $line;
-    /**
-     * @var null|ExampleNode[]
-     */
-    private $examples;
-
-    /**
-     * Initializes outline.
-     *
-     * @param null|string      $title
-     * @param string[]         $tags
-     * @param StepNode[]       $steps
-     * @param ExampleTableNode|ExampleTableNode[]  $tables
-     * @param string           $keyword
-     * @param integer          $line
-     */
-    public function __construct(
-        $title,
-        array $tags,
-        array $steps,
-        $tables,
-        $keyword,
-        $line
-    ) {
-        $this->title = $title;
-        $this->tags = $tags;
-        $this->steps = $steps;
-        $this->keyword = $keyword;
-        $this->line = $line;
-        if (!is_array($tables)) {
-           $this->tables = array($tables);
-        } else {
-            $this->tables = $tables;
-        }
-    }
-
-    /**
-     * Returns node type string
-     *
-     * @return string
-     */
-    public function getNodeType()
-    {
-        return 'Outline';
-    }
-
-    /**
-     * Returns outline title.
-     *
-     * @return null|string
-     */
-    public function getTitle()
-    {
-        return $this->title;
-    }
-
-    /**
-     * Checks if outline is tagged with tag.
-     *
-     * @param string $tag
-     *
-     * @return bool
-     */
-    public function hasTag($tag)
-    {
-        return in_array($tag, $this->getTags());
-    }
-
-    /**
-     * Checks if outline has tags (both inherited from feature and own).
-     *
-     * @return bool
-     */
-    public function hasTags()
-    {
-        return 0 < count($this->getTags());
-    }
-
-    /**
-     * Returns outline tags (including inherited from feature).
-     *
-     * @return string[]
-     */
-    public function getTags()
-    {
-        return $this->tags;
-    }
-
-    /**
-     * Checks if outline has steps.
-     *
-     * @return bool
-     */
-    public function hasSteps()
-    {
-        return 0 < count($this->steps);
-    }
-
-    /**
-     * Returns outline steps.
-     *
-     * @return StepNode[]
-     */
-    public function getSteps()
-    {
-        return $this->steps;
-    }
-
-    /**
-     * Checks if outline has examples.
-     *
-     * @return bool
-     */
-    public function hasExamples()
-    {
-        return 0 < count($this->tables);
-    }
-
-    /**
-     * Builds and returns examples table for the outline.
-     *
-     * WARNING: it returns a merged table with tags lost.
-     *
-     * @deprecated use getExampleTables instead
-     * @return ExampleTableNode
-     */
-    public function getExampleTable()
-    {
-        $table = array();
-        foreach ($this->tables[0]->getTable() as $k => $v) {
-            $table[$k] = $v;
-        }
-
-        /** @var ExampleTableNode $exampleTableNode */
-        $exampleTableNode = new ExampleTableNode($table, $this->tables[0]->getKeyword());
-        for ($i = 1; $i < count($this->tables); $i++) {
-            $exampleTableNode->mergeRowsFromTable($this->tables[$i]);
-        }
-        return $exampleTableNode;
-    }
-
-    /**
-     * Returns list of examples for the outline.
-     * @return ExampleNode[]
-     */
-    public function getExamples()
-    {
-        return $this->examples = $this->examples ?: $this->createExamples();
-    }
-
-    /**
-     * Returns examples tables array for the outline.
-     * @return ExampleTableNode[]
-     */
-    public function getExampleTables()
-    {
-        return $this->tables;
-    }
-
-    /**
-     * Returns outline keyword.
-     *
-     * @return string
-     */
-    public function getKeyword()
-    {
-        return $this->keyword;
-    }
-
-    /**
-     * Returns outline declaration line number.
-     *
-     * @return integer
-     */
-    public function getLine()
-    {
-        return $this->line;
-    }
-
-    /**
-     * Creates examples for this outline using examples table.
-     *
-     * @return ExampleNode[]
-     */
-    protected function createExamples()
-    {
-        $examples = array();
-
-        foreach ($this->getExampleTables() as $exampleTable) {
-            foreach ($exampleTable->getColumnsHash() as $rowNum => $row) {
-                $examples[] = new ExampleNode(
-                    $exampleTable->getRowAsString($rowNum + 1),
-                    array_merge($this->tags, $exampleTable->getTags()),
-                    $this->getSteps(),
-                    $row,
-                    $exampleTable->getRowLine($rowNum + 1),
-                    $this->getTitle()
-                );
-            }
-        }
-
-        return $examples;
-    }
-}

+ 0 - 90
vendor/behat/gherkin/src/Behat/Gherkin/Node/PyStringNode.php

@@ -1,90 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Represents Gherkin PyString argument.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class PyStringNode implements ArgumentInterface
-{
-    /**
-     * @var array
-     */
-    private $strings = array();
-    /**
-     * @var integer
-     */
-    private $line;
-
-    /**
-     * Initializes PyString.
-     *
-     * @param array   $strings String in form of [$stringLine]
-     * @param integer $line    Line number where string been started
-     */
-    public function __construct(array $strings, $line)
-    {
-        $this->strings = $strings;
-        $this->line = $line;
-    }
-
-    /**
-     * Returns node type.
-     *
-     * @return string
-     */
-    public function getNodeType()
-    {
-        return 'PyString';
-    }
-
-    /**
-     * Returns entire PyString lines set.
-     *
-     * @return array
-     */
-    public function getStrings()
-    {
-        return $this->strings;
-    }
-
-    /**
-     * Returns raw string.
-     *
-     * @return string
-     */
-    public function getRaw()
-    {
-        return implode("\n", $this->strings);
-    }
-
-    /**
-     * Converts PyString into string.
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        return $this->getRaw();
-    }
-
-    /**
-     * Returns line number at which PyString was started.
-     *
-     * @return integer
-     */
-    public function getLine()
-    {
-        return $this->line;
-    }
-}

+ 0 - 20
vendor/behat/gherkin/src/Behat/Gherkin/Node/ScenarioInterface.php

@@ -1,20 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Gherkin scenario interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface ScenarioInterface extends ScenarioLikeInterface, TaggedNodeInterface
-{
-}

+ 0 - 20
vendor/behat/gherkin/src/Behat/Gherkin/Node/ScenarioLikeInterface.php

@@ -1,20 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Gherkin scenario-like interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface ScenarioLikeInterface extends KeywordNodeInterface, StepContainerInterface
-{
-}

+ 0 - 150
vendor/behat/gherkin/src/Behat/Gherkin/Node/ScenarioNode.php

@@ -1,150 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Represents Gherkin Scenario.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class ScenarioNode implements ScenarioInterface
-{
-    /**
-     * @var string
-     */
-    private $title;
-    /**
-     * @var array
-     */
-    private $tags = array();
-    /**
-     * @var StepNode[]
-     */
-    private $steps = array();
-    /**
-     * @var string
-     */
-    private $keyword;
-    /**
-     * @var integer
-     */
-    private $line;
-
-    /**
-     * Initializes scenario.
-     *
-     * @param null|string $title
-     * @param array       $tags
-     * @param StepNode[]  $steps
-     * @param string      $keyword
-     * @param integer     $line
-     */
-    public function __construct($title, array $tags, array $steps, $keyword, $line)
-    {
-        $this->title = $title;
-        $this->tags = $tags;
-        $this->steps = $steps;
-        $this->keyword = $keyword;
-        $this->line = $line;
-    }
-
-    /**
-     * Returns node type string
-     *
-     * @return string
-     */
-    public function getNodeType()
-    {
-        return 'Scenario';
-    }
-
-    /**
-     * Returns scenario title.
-     *
-     * @return null|string
-     */
-    public function getTitle()
-    {
-        return $this->title;
-    }
-
-    /**
-     * Checks if scenario is tagged with tag.
-     *
-     * @param string $tag
-     *
-     * @return bool
-     */
-    public function hasTag($tag)
-    {
-        return in_array($tag, $this->getTags());
-    }
-
-    /**
-     * Checks if scenario has tags (both inherited from feature and own).
-     *
-     * @return bool
-     */
-    public function hasTags()
-    {
-        return 0 < count($this->getTags());
-    }
-
-    /**
-     * Returns scenario tags (including inherited from feature).
-     *
-     * @return array
-     */
-    public function getTags()
-    {
-        return $this->tags;
-    }
-
-    /**
-     * Checks if scenario has steps.
-     *
-     * @return bool
-     */
-    public function hasSteps()
-    {
-        return 0 < count($this->steps);
-    }
-
-    /**
-     * Returns scenario steps.
-     *
-     * @return StepNode[]
-     */
-    public function getSteps()
-    {
-        return $this->steps;
-    }
-
-    /**
-     * Returns scenario keyword.
-     *
-     * @return string
-     */
-    public function getKeyword()
-    {
-        return $this->keyword;
-    }
-
-    /**
-     * Returns scenario declaration line number.
-     *
-     * @return integer
-     */
-    public function getLine()
-    {
-        return $this->line;
-    }
-}

+ 0 - 33
vendor/behat/gherkin/src/Behat/Gherkin/Node/StepContainerInterface.php

@@ -1,33 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Gherkin step container interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface StepContainerInterface extends NodeInterface
-{
-    /**
-     * Checks if container has steps.
-     *
-     * @return bool
-     */
-    public function hasSteps();
-
-    /**
-     * Returns container steps.
-     *
-     * @return StepNode[]
-     */
-    public function getSteps();
-}

+ 0 - 152
vendor/behat/gherkin/src/Behat/Gherkin/Node/StepNode.php

@@ -1,152 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-use Behat\Gherkin\Exception\NodeException;
-
-/**
- * Represents Gherkin Step.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class StepNode implements NodeInterface
-{
-    /**
-     * @var string
-     */
-    private $keyword;
-    /**
-     * @var string
-     */
-    private $keywordType;
-    /**
-     * @var string
-     */
-    private $text;
-    /**
-     * @var ArgumentInterface[]
-     */
-    private $arguments = array();
-    /**
-     * @var integer
-     */
-    private $line;
-
-    /**
-     * Initializes step.
-     *
-     * @param string              $keyword
-     * @param string              $text
-     * @param ArgumentInterface[] $arguments
-     * @param integer             $line
-     * @param string              $keywordType
-     */
-    public function __construct($keyword, $text, array $arguments, $line, $keywordType = null)
-    {
-        if (count($arguments) > 1) {
-            throw new NodeException(sprintf(
-                'Steps could have only one argument, but `%s %s` have %d.',
-                $keyword,
-                $text,
-                count($arguments)
-            ));
-        }
-
-        $this->keyword = $keyword;
-        $this->text = $text;
-        $this->arguments = $arguments;
-        $this->line = $line;
-        $this->keywordType = $keywordType ?: 'Given';
-    }
-
-    /**
-     * Returns node type string
-     *
-     * @return string
-     */
-    public function getNodeType()
-    {
-        return 'Step';
-    }
-
-    /**
-     * Returns step keyword in provided language (Given, When, Then, etc.).
-     *
-     * @return string
-     *
-     * @deprecated use getKeyword() instead
-     */
-    public function getType()
-    {
-        return $this->getKeyword();
-    }
-
-    /**
-     * Returns step keyword in provided language (Given, When, Then, etc.).
-     *
-     * @return string
-     *
-     */
-    public function getKeyword()
-    {
-        return $this->keyword;
-    }
-
-    /**
-     * Returns step type keyword (Given, When, Then, etc.).
-     *
-     * @return string
-     */
-    public function getKeywordType()
-    {
-        return $this->keywordType;
-    }
-
-    /**
-     * Returns step text.
-     *
-     * @return string
-     */
-    public function getText()
-    {
-        return $this->text;
-    }
-
-    /**
-     * Checks if step has arguments.
-     *
-     * @return bool
-     */
-    public function hasArguments()
-    {
-        return 0 < count($this->arguments);
-    }
-
-    /**
-     * Returns step arguments.
-     *
-     * @return ArgumentInterface[]
-     */
-    public function getArguments()
-    {
-        return $this->arguments;
-    }
-
-    /**
-     * Returns step declaration line number.
-     *
-     * @return integer
-     */
-    public function getLine()
-    {
-        return $this->line;
-    }
-}

+ 0 - 383
vendor/behat/gherkin/src/Behat/Gherkin/Node/TableNode.php

@@ -1,383 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-use ArrayIterator;
-use Behat\Gherkin\Exception\NodeException;
-use Iterator;
-use IteratorAggregate;
-use ReturnTypeWillChange;
-
-/**
- * Represents Gherkin Table argument.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class TableNode implements ArgumentInterface, IteratorAggregate
-{
-    /**
-     * @var array
-     */
-    private $table;
-    /**
-     * @var integer
-     */
-    private $maxLineLength = array();
-
-    /**
-     * Initializes table.
-     *
-     * @param array $table Table in form of [$rowLineNumber => [$val1, $val2, $val3]]
-     *
-     * @throws NodeException If the given table is invalid
-     */
-    public function __construct(array $table)
-    {
-        $this->table = $table;
-        $columnCount = null;
-
-        foreach ($this->getRows() as $ridx => $row) {
-
-            if (!is_array($row)) {
-                throw new NodeException(sprintf(
-                    "Table row '%s' is expected to be array, got %s",
-                    $ridx,
-                    gettype($row)
-                ));
-            }
-
-            if ($columnCount === null) {
-                $columnCount = count($row);
-            }
-
-            if (count($row) !== $columnCount) {
-                throw new NodeException(sprintf(
-                    "Table row '%s' is expected to have %s columns, got %s",
-                    $ridx,
-                    $columnCount,
-                    count($row)
-                ));
-            }
-
-            foreach ($row as $column => $string) {
-                if (!isset($this->maxLineLength[$column])) {
-                    $this->maxLineLength[$column] = 0;
-                }
-
-                if (!is_scalar($string)) {
-                    throw new NodeException(sprintf(
-                        "Table cell at row '%s', col '%s' is expected to be scalar, got %s",
-                        $ridx,
-                        $column,
-                        gettype($string)
-                    ));
-                }
-
-                $this->maxLineLength[$column] = max($this->maxLineLength[$column], mb_strlen($string, 'utf8'));
-            }
-        }
-    }
-
-    /**
-     * Creates a table from a given list.
-     *
-     * @param array $list One-dimensional array
-     *
-     * @return TableNode
-     *
-     * @throws NodeException If the given list is not a one-dimensional array
-     */
-    public static function fromList(array $list)
-    {
-        if (count($list) !== count($list, COUNT_RECURSIVE)) {
-            throw new NodeException('List is not a one-dimensional array.');
-        }
-
-        array_walk($list, function (&$item) {
-            $item = array($item);
-        });
-        return new self($list);
-    }
-
-    /**
-     * Returns node type.
-     *
-     * @return string
-     */
-    public function getNodeType()
-    {
-        return 'Table';
-    }
-
-    /**
-     * Returns table hash, formed by columns (ColumnsHash).
-     *
-     * @return array
-     */
-    public function getHash()
-    {
-        return $this->getColumnsHash();
-    }
-
-    /**
-     * Returns table hash, formed by columns.
-     *
-     * @return array
-     */
-    public function getColumnsHash()
-    {
-        $rows = $this->getRows();
-        $keys = array_shift($rows);
-
-        $hash = array();
-        foreach ($rows as $row) {
-            $hash[] = array_combine($keys, $row);
-        }
-
-        return $hash;
-    }
-
-    /**
-     * Returns table hash, formed by rows.
-     *
-     * @return array
-     */
-    public function getRowsHash()
-    {
-        $hash = array();
-
-        foreach ($this->getRows() as $row) {
-            $hash[array_shift($row)] = (1 == count($row)) ? $row[0] : $row;
-        }
-
-        return $hash;
-    }
-
-    /**
-     * Returns numerated table lines.
-     * Line numbers are keys, lines are values.
-     *
-     * @return array
-     */
-    public function getTable()
-    {
-        return $this->table;
-    }
-
-    /**
-     * Returns table rows.
-     *
-     * @return array
-     */
-    public function getRows()
-    {
-        return array_values($this->table);
-    }
-
-    /**
-     * Returns table definition lines.
-     *
-     * @return array
-     */
-    public function getLines()
-    {
-        return array_keys($this->table);
-    }
-
-    /**
-     * Returns specific row in a table.
-     *
-     * @param integer $index Row number
-     *
-     * @return array
-     *
-     * @throws NodeException If row with specified index does not exist
-     */
-    public function getRow($index)
-    {
-        $rows = $this->getRows();
-
-        if (!isset($rows[$index])) {
-            throw new NodeException(sprintf('Rows #%d does not exist in table.', $index));
-        }
-
-        return $rows[$index];
-    }
-
-    /**
-     * Returns specific column in a table.
-     *
-     * @param integer $index Column number
-     *
-     * @return array
-     *
-     * @throws NodeException If column with specified index does not exist
-     */
-    public function getColumn($index)
-    {
-        if ($index >= count($this->getRow(0))) {
-            throw new NodeException(sprintf('Column #%d does not exist in table.', $index));
-        }
-
-        $rows = $this->getRows();
-        $column = array();
-
-        foreach ($rows as $row) {
-            $column[] = $row[$index];
-        }
-
-        return $column;
-    }
-
-    /**
-     * Returns line number at which specific row was defined.
-     *
-     * @param integer $index
-     *
-     * @return integer
-     *
-     * @throws NodeException If row with specified index does not exist
-     */
-    public function getRowLine($index)
-    {
-        $lines = array_keys($this->table);
-
-        if (!isset($lines[$index])) {
-            throw new NodeException(sprintf('Rows #%d does not exist in table.', $index));
-        }
-
-        return $lines[$index];
-    }
-
-    /**
-     * Converts row into delimited string.
-     *
-     * @param integer $rowNum Row number
-     *
-     * @return string
-     */
-    public function getRowAsString($rowNum)
-    {
-        $values = array();
-        foreach ($this->getRow($rowNum) as $column => $value) {
-            $values[] = $this->padRight(' ' . $value . ' ', $this->maxLineLength[$column] + 2);
-        }
-
-        return sprintf('|%s|', implode('|', $values));
-    }
-
-    /**
-     * Converts row into delimited string.
-     *
-     * @param integer  $rowNum  Row number
-     * @param callable $wrapper Wrapper function
-     *
-     * @return string
-     */
-    public function getRowAsStringWithWrappedValues($rowNum, $wrapper)
-    {
-        $values = array();
-        foreach ($this->getRow($rowNum) as $column => $value) {
-            $value = $this->padRight(' ' . $value . ' ', $this->maxLineLength[$column] + 2);
-
-            $values[] = call_user_func($wrapper, $value, $column);
-        }
-
-        return sprintf('|%s|', implode('|', $values));
-    }
-
-    /**
-     * Converts entire table into string
-     *
-     * @return string
-     */
-    public function getTableAsString()
-    {
-        $lines = array();
-        for ($i = 0; $i < count($this->getRows()); $i++) {
-            $lines[] = $this->getRowAsString($i);
-        }
-
-        return implode("\n", $lines);
-    }
-
-    /**
-     * Returns line number at which table was started.
-     *
-     * @return integer
-     */
-    public function getLine()
-    {
-        return $this->getRowLine(0);
-    }
-
-    /**
-     * Converts table into string
-     *
-     * @return string
-     */
-    public function __toString()
-    {
-        return $this->getTableAsString();
-    }
-
-    /**
-     * Retrieves a hash iterator.
-     *
-     * @return Iterator
-     */
-    #[ReturnTypeWillChange]
-    public function getIterator()
-    {
-        return new ArrayIterator($this->getHash());
-    }
-
-    /**
-     * Obtains and adds rows from another table to the current table.
-     * The second table should have the same structure as the current one.
-     * @param TableNode $node
-     *
-     * @deprecated remove together with OutlineNode::getExampleTable
-     */
-    public function mergeRowsFromTable(TableNode $node)
-    {
-        // check structure
-        if ($this->getRow(0) !== $node->getRow(0)) {
-            throw new NodeException("Tables have different structure. Cannot merge one into another");
-        }
-
-        $firstLine = $node->getLine();
-        foreach ($node->getTable() as $line => $value) {
-            if ($line === $firstLine) {
-                continue;
-            }
-
-            $this->table[$line] = $value;
-        }
-    }
-
-    /**
-     * Pads string right.
-     *
-     * @param string  $text   Text to pad
-     * @param integer $length Length
-     *
-     * @return string
-     */
-    protected function padRight($text, $length)
-    {
-        while ($length > mb_strlen($text, 'utf8')) {
-            $text = $text . ' ';
-        }
-
-        return $text;
-    }
-}

+ 0 - 42
vendor/behat/gherkin/src/Behat/Gherkin/Node/TaggedNodeInterface.php

@@ -1,42 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin\Node;
-
-/**
- * Gherkin tagged node interface.
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-interface TaggedNodeInterface extends NodeInterface
-{
-    /**
-     * Checks if node is tagged with tag.
-     *
-     * @param string $tag
-     *
-     * @return bool
-     */
-    public function hasTag($tag);
-
-    /**
-     * Checks if node has tags (both inherited from feature and own).
-     *
-     * @return bool
-     */
-    public function hasTags();
-
-    /**
-     * Returns node tags (including inherited from feature).
-     *
-     * @return string[]
-     */
-    public function getTags();
-}

+ 0 - 771
vendor/behat/gherkin/src/Behat/Gherkin/Parser.php

@@ -1,771 +0,0 @@
-<?php
-
-/*
- * This file is part of the Behat Gherkin.
- * (c) Konstantin Kudryashov <ever.zet@gmail.com>
- *
- * For the full copyright and license information, please view the LICENSE
- * file that was distributed with this source code.
- */
-
-namespace Behat\Gherkin;
-
-use Behat\Gherkin\Exception\LexerException;
-use Behat\Gherkin\Exception\NodeException;
-use Behat\Gherkin\Exception\ParserException;
-use Behat\Gherkin\Node\BackgroundNode;
-use Behat\Gherkin\Node\ExampleTableNode;
-use Behat\Gherkin\Node\FeatureNode;
-use Behat\Gherkin\Node\OutlineNode;
-use Behat\Gherkin\Node\PyStringNode;
-use Behat\Gherkin\Node\ScenarioInterface;
-use Behat\Gherkin\Node\ScenarioNode;
-use Behat\Gherkin\Node\StepNode;
-use Behat\Gherkin\Node\TableNode;
-
-/**
- * Gherkin parser.
- *
- * $lexer  = new Behat\Gherkin\Lexer($keywords);
- * $parser = new Behat\Gherkin\Parser($lexer);
- * $featuresArray = $parser->parse('/path/to/feature.feature');
- *
- * @author Konstantin Kudryashov <ever.zet@gmail.com>
- */
-class Parser
-{
-    private $lexer;
-    private $input;
-    private $file;
-    private $tags = array();
-    private $languageSpecifierLine;
-
-    private $passedNodesStack = array();
-
-    /**
-     * Initializes parser.
-     *
-     * @param Lexer $lexer Lexer instance
-     */
-    public function __construct(Lexer $lexer)
-    {
-        $this->lexer = $lexer;
-    }
-
-    /**
-     * Parses input & returns features array.
-     *
-     * @param string $input Gherkin string document
-     * @param string $file  File name
-     *
-     * @return FeatureNode|null
-     *
-     * @throws ParserException
-     */
-    public function parse($input, $file = null)
-    {
-        $this->languageSpecifierLine = null;
-        $this->input = $input;
-        $this->file = $file;
-        $this->tags = array();
-
-        try {
-            $this->lexer->analyse($this->input, 'en');
-        } catch (LexerException $e) {
-            throw new ParserException(
-                sprintf('Lexer exception "%s" thrown for file %s', $e->getMessage(), $file),
-                0,
-                $e
-            );
-        }
-
-        $feature = null;
-        while ('EOS' !== ($predicted = $this->predictTokenType())) {
-            $node = $this->parseExpression();
-
-            if (null === $node || "\n" === $node) {
-                continue;
-            }
-
-            if (!$feature && $node instanceof FeatureNode) {
-                $feature = $node;
-                continue;
-            }
-
-            if ($feature && $node instanceof FeatureNode) {
-                throw new ParserException(sprintf(
-                    'Only one feature is allowed per feature file. But %s got multiple.',
-                    $this->file
-                ));
-            }
-
-            if (is_string($node)) {
-                throw new ParserException(sprintf(
-                    'Expected Feature, but got text: "%s"%s',
-                    $node,
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-
-            if (!$node instanceof FeatureNode) {
-                throw new ParserException(sprintf(
-                    'Expected Feature, but got %s on line: %d%s',
-                    $node->getKeyword(),
-                    $node->getLine(),
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-        }
-
-        return $feature;
-    }
-
-    /**
-     * Returns next token if it's type equals to expected.
-     *
-     * @param string $type Token type
-     *
-     * @return array
-     *
-     * @throws Exception\ParserException
-     */
-    protected function expectTokenType($type)
-    {
-        $types = (array) $type;
-        if (in_array($this->predictTokenType(), $types)) {
-            return $this->lexer->getAdvancedToken();
-        }
-
-        $token = $this->lexer->predictToken();
-
-        throw new ParserException(sprintf(
-            'Expected %s token, but got %s on line: %d%s',
-            implode(' or ', $types),
-            $this->predictTokenType(),
-            $token['line'],
-            $this->file ? ' in file: ' . $this->file : ''
-        ));
-    }
-
-    /**
-     * Returns next token if it's type equals to expected.
-     *
-     * @param string $type Token type
-     *
-     * @return null|array
-     */
-    protected function acceptTokenType($type)
-    {
-        if ($type !== $this->predictTokenType()) {
-            return null;
-        }
-
-        return $this->lexer->getAdvancedToken();
-    }
-
-    /**
-     * Returns next token type without real input reading (prediction).
-     *
-     * @return string
-     */
-    protected function predictTokenType()
-    {
-        $token = $this->lexer->predictToken();
-
-        return $token['type'];
-    }
-
-    /**
-     * Parses current expression & returns Node.
-     *
-     * @return string|FeatureNode|BackgroundNode|ScenarioNode|OutlineNode|TableNode|StepNode
-     *
-     * @throws ParserException
-     */
-    protected function parseExpression()
-    {
-        $type = $this->predictTokenType();
-
-        while ($type === 'Comment') {
-            $this->expectTokenType('Comment');
-
-            $type = $this->predictTokenType();
-        }
-
-        switch ($type) {
-            case 'Feature':
-                return $this->parseFeature();
-            case 'Background':
-                return $this->parseBackground();
-            case 'Scenario':
-                return $this->parseScenario();
-            case 'Outline':
-                return $this->parseOutline();
-            case 'Examples':
-                return $this->parseExamples();
-            case 'TableRow':
-                return $this->parseTable();
-            case 'PyStringOp':
-                return $this->parsePyString();
-            case 'Step':
-                return $this->parseStep();
-            case 'Text':
-                return $this->parseText();
-            case 'Newline':
-                return $this->parseNewline();
-            case 'Tag':
-                return $this->parseTags();
-            case 'Language':
-                return $this->parseLanguage();
-            case 'EOS':
-                return '';
-        }
-
-        throw new ParserException(sprintf('Unknown token type: %s', $type));
-    }
-
-    /**
-     * Parses feature token & returns it's node.
-     *
-     * @return FeatureNode
-     *
-     * @throws ParserException
-     */
-    protected function parseFeature()
-    {
-        $token = $this->expectTokenType('Feature');
-
-        $title = trim($token['value'] ?? '');
-        $description = null;
-        $tags = $this->popTags();
-        $background = null;
-        $scenarios = array();
-        $keyword = $token['keyword'];
-        $language = $this->lexer->getLanguage();
-        $file = $this->file;
-        $line = $token['line'];
-
-        array_push($this->passedNodesStack, 'Feature');
-
-        // Parse description, background, scenarios & outlines
-        while ('EOS' !== $this->predictTokenType()) {
-            $node = $this->parseExpression();
-
-            if (is_string($node)) {
-                $text = preg_replace('/^\s{0,' . ($token['indent'] + 2) . '}|\s*$/', '', $node);
-                $description .= (null !== $description ? "\n" : '') . $text;
-                continue;
-            }
-
-            if (!$background && $node instanceof BackgroundNode) {
-                $background = $node;
-                continue;
-            }
-
-            if ($node instanceof ScenarioInterface) {
-                $scenarios[] = $node;
-                continue;
-            }
-
-            if ($background instanceof BackgroundNode && $node instanceof BackgroundNode) {
-                throw new ParserException(sprintf(
-                    'Each Feature could have only one Background, but found multiple on lines %d and %d%s',
-                    $background->getLine(),
-                    $node->getLine(),
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-
-            if (!$node instanceof ScenarioNode) {
-                throw new ParserException(sprintf(
-                    'Expected Scenario, Outline or Background, but got %s on line: %d%s',
-                    $node->getNodeType(),
-                    $node->getLine(),
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-        }
-
-        return new FeatureNode(
-            rtrim($title) ?: null,
-            rtrim($description ?? '') ?: null,
-            $tags,
-            $background,
-            $scenarios,
-            $keyword,
-            $language,
-            $file,
-            $line
-        );
-    }
-
-    /**
-     * Parses background token & returns it's node.
-     *
-     * @return BackgroundNode
-     *
-     * @throws ParserException
-     */
-    protected function parseBackground()
-    {
-        $token = $this->expectTokenType('Background');
-
-        $title = trim($token['value'] ?? '');
-        $keyword = $token['keyword'];
-        $line = $token['line'];
-
-        if (count($this->popTags())) {
-            throw new ParserException(sprintf(
-                'Background can not be tagged, but it is on line: %d%s',
-                $line,
-                $this->file ? ' in file: ' . $this->file : ''
-            ));
-        }
-
-        // Parse description and steps
-        $steps = array();
-        $allowedTokenTypes = array('Step', 'Newline', 'Text', 'Comment');
-        while (in_array($this->predictTokenType(), $allowedTokenTypes)) {
-            $node = $this->parseExpression();
-
-            if ($node instanceof StepNode) {
-                $steps[] = $this->normalizeStepNodeKeywordType($node, $steps);
-                continue;
-            }
-
-            if (!count($steps) && is_string($node)) {
-                $text = preg_replace('/^\s{0,' . ($token['indent'] + 2) . '}|\s*$/', '', $node);
-                $title .= "\n" . $text;
-                continue;
-            }
-
-            if ("\n" === $node) {
-                continue;
-            }
-
-            if (is_string($node)) {
-                throw new ParserException(sprintf(
-                    'Expected Step, but got text: "%s"%s',
-                    $node,
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-
-            if (!$node instanceof StepNode) {
-                throw new ParserException(sprintf(
-                    'Expected Step, but got %s on line: %d%s',
-                    $node->getNodeType(),
-                    $node->getLine(),
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-        }
-
-        return new BackgroundNode(rtrim($title) ?: null, $steps, $keyword, $line);
-    }
-
-    /**
-     * Parses scenario token & returns it's node.
-     *
-     * @return ScenarioNode
-     *
-     * @throws ParserException
-     */
-    protected function parseScenario()
-    {
-        $token = $this->expectTokenType('Scenario');
-
-        $title = trim($token['value'] ?? '');
-        $tags = $this->popTags();
-        $keyword = $token['keyword'];
-        $line = $token['line'];
-
-        array_push($this->passedNodesStack, 'Scenario');
-
-        // Parse description and steps
-        $steps = array();
-        while (in_array($this->predictTokenType(), array('Step', 'Newline', 'Text', 'Comment'))) {
-            $node = $this->parseExpression();
-
-            if ($node instanceof StepNode) {
-                $steps[] = $this->normalizeStepNodeKeywordType($node, $steps);
-                continue;
-            }
-
-            if (!count($steps) && is_string($node)) {
-                $text = preg_replace('/^\s{0,' . ($token['indent'] + 2) . '}|\s*$/', '', $node);
-                $title .= "\n" . $text;
-                continue;
-            }
-
-            if ("\n" === $node) {
-                continue;
-            }
-
-            if (is_string($node)) {
-                throw new ParserException(sprintf(
-                    'Expected Step, but got text: "%s"%s',
-                    $node,
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-
-            if (!$node instanceof StepNode) {
-                throw new ParserException(sprintf(
-                    'Expected Step, but got %s on line: %d%s',
-                    $node->getNodeType(),
-                    $node->getLine(),
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-        }
-
-        array_pop($this->passedNodesStack);
-
-        return new ScenarioNode(rtrim($title) ?: null, $tags, $steps, $keyword, $line);
-    }
-
-    /**
-     * Parses scenario outline token & returns it's node.
-     *
-     * @return OutlineNode
-     *
-     * @throws ParserException
-     */
-    protected function parseOutline()
-    {
-        $token = $this->expectTokenType('Outline');
-
-        $title = trim($token['value'] ?? '');
-        $tags = $this->popTags();
-        $keyword = $token['keyword'];
-
-        /** @var ExampleTableNode $examples */
-        $examples = array();
-        $line = $token['line'];
-
-        // Parse description, steps and examples
-        $steps = array();
-
-        array_push($this->passedNodesStack, 'Outline');
-
-        while (in_array($nextTokenType = $this->predictTokenType(), array('Step', 'Examples', 'Newline', 'Text', 'Comment', 'Tag'))) {
-            if ($nextTokenType === 'Comment') {
-                $this->lexer->skipPredictedToken();
-                continue;
-            }
-
-            $node = $this->parseExpression();
-
-            if ($node instanceof StepNode) {
-                $steps[] = $this->normalizeStepNodeKeywordType($node, $steps);
-                continue;
-            }
-
-            if ($node instanceof ExampleTableNode) {
-                $examples[] = $node;
-
-                continue;
-            }
-
-            if (!count($steps) && is_string($node)) {
-                $text = preg_replace('/^\s{0,' . ($token['indent'] + 2) . '}|\s*$/', '', $node);
-                $title .= "\n" . $text;
-                continue;
-            }
-
-            if ("\n" === $node) {
-                continue;
-            }
-
-            if (is_string($node)) {
-                throw new ParserException(sprintf(
-                    'Expected Step or Examples table, but got text: "%s"%s',
-                    $node,
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-
-            if (!$node instanceof StepNode) {
-                throw new ParserException(sprintf(
-                    'Expected Step or Examples table, but got %s on line: %d%s',
-                    $node->getNodeType(),
-                    $node->getLine(),
-                    $this->file ? ' in file: ' . $this->file : ''
-                ));
-            }
-        }
-
-        if (empty($examples)) {
-            throw new ParserException(sprintf(
-                'Outline should have examples table, but got none for outline "%s" on line: %d%s',
-                rtrim($title),
-                $line,
-                $this->file ? ' in file: ' . $this->file : ''
-            ));
-        }
-
-        return new OutlineNode(rtrim($title) ?: null, $tags, $steps, $examples, $keyword, $line);
-    }
-
-    /**
-     * Parses step token & returns it's node.
-     *
-     * @return StepNode
-     */
-    protected function parseStep()
-    {
-        $token = $this->expectTokenType('Step');
-
-        $keyword = $token['value'];
-        $keywordType = $token['keyword_type'];
-        $text = trim($token['text']);
-        $line = $token['line'];
-
-        array_push($this->passedNodesStack, 'Step');
-
-        $arguments = array();
-        while (in_array($predicted = $this->predictTokenType(), array('PyStringOp', 'TableRow', 'Newline', 'Comment'))) {
-            if ('Comment' === $predicted || 'Newline' === $predicted) {
-                $this->acceptTokenType($predicted);
-                continue;
-            }
-
-            $node = $this->parseExpression();
-
-            if ($node instanceof PyStringNode || $node instanceof TableNode) {
-                $arguments[] = $node;
-            }
-        }
-
-        array_pop($this->passedNodesStack);
-
-        return new StepNode($keyword, $text, $arguments, $line, $keywordType);
-    }
-
-    /**
-     * Parses examples table node.
-     *
-     * @return ExampleTableNode
-     */
-    protected function parseExamples()
-    {
-        $keyword = ($this->expectTokenType('Examples'))['keyword'];
-        $tags = empty($this->tags) ? array() : $this->popTags();
-        $table = $this->parseTableRows();
-
-        try {
-            return new ExampleTableNode($table, $keyword, $tags);
-        } catch(NodeException $e) {
-            $this->rethrowNodeException($e);
-        }
-    }
-
-    /**
-     * Parses table token & returns it's node.
-     *
-     * @return TableNode
-     */
-    protected function parseTable()
-    {
-        $table = $this->parseTableRows();
-
-        try {
-            return new TableNode($table);
-        } catch(NodeException $e) {
-            $this->rethrowNodeException($e);
-        }
-    }
-
-    /**
-     * Parses PyString token & returns it's node.
-     *
-     * @return PyStringNode
-     */
-    protected function parsePyString()
-    {
-        $token = $this->expectTokenType('PyStringOp');
-
-        $line = $token['line'];
-
-        $strings = array();
-        while ('PyStringOp' !== ($predicted = $this->predictTokenType()) && 'Text' === $predicted) {
-            $token = $this->expectTokenType('Text');
-
-            $strings[] = $token['value'];
-        }
-
-        $this->expectTokenType('PyStringOp');
-
-        return new PyStringNode($strings, $line);
-    }
-
-    /**
-     * Parses tags.
-     *
-     * @return BackgroundNode|FeatureNode|OutlineNode|ScenarioNode|StepNode|TableNode|string
-     */
-    protected function parseTags()
-    {
-        $token = $this->expectTokenType('Tag');
-
-        $this->guardTags($token['tags']);
-
-        $this->tags = array_merge($this->tags, $token['tags']);
-
-        $possibleTransitions = array(
-            'Outline' => array(
-                'Examples',
-                'Step'
-            )
-        );
-
-        $currentType = '-1';
-        // check if that is ok to go inside:
-        if (!empty($this->passedNodesStack)) {
-            $currentType = $this->passedNodesStack[count($this->passedNodesStack) - 1];
-        }
-
-        $nextType = $this->predictTokenType();
-        if (!isset($possibleTransitions[$currentType]) || in_array($nextType, $possibleTransitions[$currentType])) {
-            return $this->parseExpression();
-        }
-
-        return "\n";
-    }
-
-    /**
-     * Returns current set of tags and clears tag buffer.
-     *
-     * @return array
-     */
-    protected function popTags()
-    {
-        $tags = $this->tags;
-        $this->tags = array();
-
-        return $tags;
-    }
-
-    /**
-     * Checks the tags fit the required format
-     *
-     * @param string[] $tags
-     */
-    protected function guardTags(array $tags)
-    {
-        foreach ($tags as $tag) {
-            if (preg_match('/\s/', $tag)) {
-                trigger_error('Whitespace in tags is deprecated, found "$tag"', E_USER_DEPRECATED);
-            }
-        }
-    }
-
-    /**
-     * Parses next text line & returns it.
-     *
-     * @return string
-     */
-    protected function parseText()
-    {
-        $token = $this->expectTokenType('Text');
-
-        return $token['value'];
-    }
-
-    /**
-     * Parses next newline & returns \n.
-     *
-     * @return string
-     */
-    protected function parseNewline()
-    {
-        $this->expectTokenType('Newline');
-
-        return "\n";
-    }
-
-    /**
-     * Parses language block and updates lexer configuration based on it.
-     *
-     * @return BackgroundNode|FeatureNode|OutlineNode|ScenarioNode|StepNode|TableNode|string
-     *
-     * @throws ParserException
-     */
-    protected function parseLanguage()
-    {
-        $token = $this->expectTokenType('Language');
-
-        if (null === $this->languageSpecifierLine) {
-            $this->lexer->analyse($this->input, $token['value']);
-            $this->languageSpecifierLine = $token['line'];
-        } elseif ($token['line'] !== $this->languageSpecifierLine) {
-            throw new ParserException(sprintf(
-                'Ambiguous language specifiers on lines: %d and %d%s',
-                $this->languageSpecifierLine,
-                $token['line'],
-                $this->file ? ' in file: ' . $this->file : ''
-            ));
-        }
-
-        return $this->parseExpression();
-    }
-
-    /**
-     * Parses the rows of a table
-     *
-     * @return string[][]
-     */
-    private function parseTableRows()
-    {
-        $table = array();
-        while (in_array($predicted = $this->predictTokenType(), array('TableRow', 'Newline', 'Comment'))) {
-            if ('Comment' === $predicted || 'Newline' === $predicted) {
-                $this->acceptTokenType($predicted);
-                continue;
-            }
-
-            $token = $this->expectTokenType('TableRow');
-
-            $table[$token['line']] = $token['columns'];
-        }
-
-        return $table;
-    }
-
-    /**
-     * Changes step node type for types But, And to type of previous step if it exists else sets to Given
-     *
-     * @param StepNode   $node
-     * @param StepNode[] $steps
-     * @return StepNode
-     */
-    private function normalizeStepNodeKeywordType(StepNode $node, array $steps = array())
-    {
-        if (in_array($node->getKeywordType(), array('And', 'But'))) {
-            if (($prev = end($steps))) {
-                $keywordType = $prev->getKeywordType();
-            } else {
-                $keywordType = 'Given';
-            }
-
-            $node = new StepNode(
-                $node->getKeyword(),
-                $node->getText(),
-                $node->getArguments(),
-                $node->getLine(),
-                $keywordType
-            );
-        }
-        return $node;
-    }
-
-    private function rethrowNodeException(NodeException $e): void
-    {
-        throw new ParserException(
-            $e->getMessage() . ($this->file ? ' in file ' . $this->file : ''),
-            0,
-            $e
-        );
-    }
-}

+ 0 - 117
vendor/bin/codecept

@@ -1,117 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-/**
- * Proxy PHP file generated by Composer
- *
- * This file includes the referenced bin path (../codeception/base/codecept)
- * using a stream wrapper to prevent the shebang from being output on PHP<8
- *
- * @generated
- */
-
-namespace Composer;
-
-$GLOBALS['_composer_bin_dir'] = __DIR__;
-$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
-
-if (PHP_VERSION_ID < 80000) {
-    if (!class_exists('Composer\BinProxyWrapper')) {
-        /**
-         * @internal
-         */
-        final class BinProxyWrapper
-        {
-            private $handle;
-            private $position;
-            private $realpath;
-
-            public function stream_open($path, $mode, $options, &$opened_path)
-            {
-                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
-                $opened_path = substr($path, 17);
-                $this->realpath = realpath($opened_path) ?: $opened_path;
-                $opened_path = $this->realpath;
-                $this->handle = fopen($this->realpath, $mode);
-                $this->position = 0;
-
-                return (bool) $this->handle;
-            }
-
-            public function stream_read($count)
-            {
-                $data = fread($this->handle, $count);
-
-                if ($this->position === 0) {
-                    $data = preg_replace('{^#!.*\r?\n}', '', $data);
-                }
-
-                $this->position += strlen($data);
-
-                return $data;
-            }
-
-            public function stream_cast($castAs)
-            {
-                return $this->handle;
-            }
-
-            public function stream_close()
-            {
-                fclose($this->handle);
-            }
-
-            public function stream_lock($operation)
-            {
-                return $operation ? flock($this->handle, $operation) : true;
-            }
-
-            public function stream_seek($offset, $whence)
-            {
-                if (0 === fseek($this->handle, $offset, $whence)) {
-                    $this->position = ftell($this->handle);
-                    return true;
-                }
-
-                return false;
-            }
-
-            public function stream_tell()
-            {
-                return $this->position;
-            }
-
-            public function stream_eof()
-            {
-                return feof($this->handle);
-            }
-
-            public function stream_stat()
-            {
-                return array();
-            }
-
-            public function stream_set_option($option, $arg1, $arg2)
-            {
-                return true;
-            }
-
-            public function url_stat($path, $flags)
-            {
-                $path = substr($path, 17);
-                if (file_exists($path)) {
-                    return stat($path);
-                }
-
-                return false;
-            }
-        }
-    }
-
-    if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
-        include("phpvfscomposer://" . __DIR__ . '/..'.'/codeception/base/codecept');
-        exit(0);
-    }
-}
-
-include __DIR__ . '/..'.'/codeception/base/codecept';

+ 0 - 5
vendor/bin/codecept.bat

@@ -1,5 +0,0 @@
-@ECHO OFF
-setlocal DISABLEDELAYEDEXPANSION
-SET BIN_TARGET=%~dp0/codecept
-SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
-php "%BIN_TARGET%" %*

+ 0 - 117
vendor/bin/markdown

@@ -1,117 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-/**
- * Proxy PHP file generated by Composer
- *
- * This file includes the referenced bin path (../cebe/markdown/bin/markdown)
- * using a stream wrapper to prevent the shebang from being output on PHP<8
- *
- * @generated
- */
-
-namespace Composer;
-
-$GLOBALS['_composer_bin_dir'] = __DIR__;
-$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
-
-if (PHP_VERSION_ID < 80000) {
-    if (!class_exists('Composer\BinProxyWrapper')) {
-        /**
-         * @internal
-         */
-        final class BinProxyWrapper
-        {
-            private $handle;
-            private $position;
-            private $realpath;
-
-            public function stream_open($path, $mode, $options, &$opened_path)
-            {
-                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
-                $opened_path = substr($path, 17);
-                $this->realpath = realpath($opened_path) ?: $opened_path;
-                $opened_path = $this->realpath;
-                $this->handle = fopen($this->realpath, $mode);
-                $this->position = 0;
-
-                return (bool) $this->handle;
-            }
-
-            public function stream_read($count)
-            {
-                $data = fread($this->handle, $count);
-
-                if ($this->position === 0) {
-                    $data = preg_replace('{^#!.*\r?\n}', '', $data);
-                }
-
-                $this->position += strlen($data);
-
-                return $data;
-            }
-
-            public function stream_cast($castAs)
-            {
-                return $this->handle;
-            }
-
-            public function stream_close()
-            {
-                fclose($this->handle);
-            }
-
-            public function stream_lock($operation)
-            {
-                return $operation ? flock($this->handle, $operation) : true;
-            }
-
-            public function stream_seek($offset, $whence)
-            {
-                if (0 === fseek($this->handle, $offset, $whence)) {
-                    $this->position = ftell($this->handle);
-                    return true;
-                }
-
-                return false;
-            }
-
-            public function stream_tell()
-            {
-                return $this->position;
-            }
-
-            public function stream_eof()
-            {
-                return feof($this->handle);
-            }
-
-            public function stream_stat()
-            {
-                return array();
-            }
-
-            public function stream_set_option($option, $arg1, $arg2)
-            {
-                return true;
-            }
-
-            public function url_stat($path, $flags)
-            {
-                $path = substr($path, 17);
-                if (file_exists($path)) {
-                    return stat($path);
-                }
-
-                return false;
-            }
-        }
-    }
-
-    if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
-        include("phpvfscomposer://" . __DIR__ . '/..'.'/cebe/markdown/bin/markdown');
-        exit(0);
-    }
-}
-
-include __DIR__ . '/..'.'/cebe/markdown/bin/markdown';

+ 0 - 5
vendor/bin/markdown.bat

@@ -1,5 +0,0 @@
-@ECHO OFF
-setlocal DISABLEDELAYEDEXPANSION
-SET BIN_TARGET=%~dp0/markdown
-SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
-php "%BIN_TARGET%" %*

+ 0 - 120
vendor/bin/phpunit

@@ -1,120 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-/**
- * Proxy PHP file generated by Composer
- *
- * This file includes the referenced bin path (../phpunit/phpunit/phpunit)
- * using a stream wrapper to prevent the shebang from being output on PHP<8
- *
- * @generated
- */
-
-namespace Composer;
-
-$GLOBALS['_composer_bin_dir'] = __DIR__;
-$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
-$GLOBALS['__PHPUNIT_ISOLATION_EXCLUDE_LIST'] = $GLOBALS['__PHPUNIT_ISOLATION_BLACKLIST'] = array(realpath(__DIR__ . '/..'.'/phpunit/phpunit/phpunit'));
-
-if (PHP_VERSION_ID < 80000) {
-    if (!class_exists('Composer\BinProxyWrapper')) {
-        /**
-         * @internal
-         */
-        final class BinProxyWrapper
-        {
-            private $handle;
-            private $position;
-            private $realpath;
-
-            public function stream_open($path, $mode, $options, &$opened_path)
-            {
-                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
-                $opened_path = substr($path, 17);
-                $this->realpath = realpath($opened_path) ?: $opened_path;
-                $opened_path = 'phpvfscomposer://'.$this->realpath;
-                $this->handle = fopen($this->realpath, $mode);
-                $this->position = 0;
-
-                return (bool) $this->handle;
-            }
-
-            public function stream_read($count)
-            {
-                $data = fread($this->handle, $count);
-
-                if ($this->position === 0) {
-                    $data = preg_replace('{^#!.*\r?\n}', '', $data);
-                }
-                $data = str_replace('__DIR__', var_export(dirname($this->realpath), true), $data);
-                $data = str_replace('__FILE__', var_export($this->realpath, true), $data);
-
-                $this->position += strlen($data);
-
-                return $data;
-            }
-
-            public function stream_cast($castAs)
-            {
-                return $this->handle;
-            }
-
-            public function stream_close()
-            {
-                fclose($this->handle);
-            }
-
-            public function stream_lock($operation)
-            {
-                return $operation ? flock($this->handle, $operation) : true;
-            }
-
-            public function stream_seek($offset, $whence)
-            {
-                if (0 === fseek($this->handle, $offset, $whence)) {
-                    $this->position = ftell($this->handle);
-                    return true;
-                }
-
-                return false;
-            }
-
-            public function stream_tell()
-            {
-                return $this->position;
-            }
-
-            public function stream_eof()
-            {
-                return feof($this->handle);
-            }
-
-            public function stream_stat()
-            {
-                return array();
-            }
-
-            public function stream_set_option($option, $arg1, $arg2)
-            {
-                return true;
-            }
-
-            public function url_stat($path, $flags)
-            {
-                $path = substr($path, 17);
-                if (file_exists($path)) {
-                    return stat($path);
-                }
-
-                return false;
-            }
-        }
-    }
-
-    if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
-        include("phpvfscomposer://" . __DIR__ . '/..'.'/phpunit/phpunit/phpunit');
-        exit(0);
-    }
-}
-
-include __DIR__ . '/..'.'/phpunit/phpunit/phpunit';

+ 0 - 5
vendor/bin/phpunit.bat

@@ -1,5 +0,0 @@
-@ECHO OFF
-setlocal DISABLEDELAYEDEXPANSION
-SET BIN_TARGET=%~dp0/phpunit
-SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
-php "%BIN_TARGET%" %*

+ 0 - 117
vendor/bin/yii

@@ -1,117 +0,0 @@
-#!/usr/bin/env php
-<?php
-
-/**
- * Proxy PHP file generated by Composer
- *
- * This file includes the referenced bin path (../yiisoft/yii2/yii)
- * using a stream wrapper to prevent the shebang from being output on PHP<8
- *
- * @generated
- */
-
-namespace Composer;
-
-$GLOBALS['_composer_bin_dir'] = __DIR__;
-$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
-
-if (PHP_VERSION_ID < 80000) {
-    if (!class_exists('Composer\BinProxyWrapper')) {
-        /**
-         * @internal
-         */
-        final class BinProxyWrapper
-        {
-            private $handle;
-            private $position;
-            private $realpath;
-
-            public function stream_open($path, $mode, $options, &$opened_path)
-            {
-                // get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
-                $opened_path = substr($path, 17);
-                $this->realpath = realpath($opened_path) ?: $opened_path;
-                $opened_path = $this->realpath;
-                $this->handle = fopen($this->realpath, $mode);
-                $this->position = 0;
-
-                return (bool) $this->handle;
-            }
-
-            public function stream_read($count)
-            {
-                $data = fread($this->handle, $count);
-
-                if ($this->position === 0) {
-                    $data = preg_replace('{^#!.*\r?\n}', '', $data);
-                }
-
-                $this->position += strlen($data);
-
-                return $data;
-            }
-
-            public function stream_cast($castAs)
-            {
-                return $this->handle;
-            }
-
-            public function stream_close()
-            {
-                fclose($this->handle);
-            }
-
-            public function stream_lock($operation)
-            {
-                return $operation ? flock($this->handle, $operation) : true;
-            }
-
-            public function stream_seek($offset, $whence)
-            {
-                if (0 === fseek($this->handle, $offset, $whence)) {
-                    $this->position = ftell($this->handle);
-                    return true;
-                }
-
-                return false;
-            }
-
-            public function stream_tell()
-            {
-                return $this->position;
-            }
-
-            public function stream_eof()
-            {
-                return feof($this->handle);
-            }
-
-            public function stream_stat()
-            {
-                return array();
-            }
-
-            public function stream_set_option($option, $arg1, $arg2)
-            {
-                return true;
-            }
-
-            public function url_stat($path, $flags)
-            {
-                $path = substr($path, 17);
-                if (file_exists($path)) {
-                    return stat($path);
-                }
-
-                return false;
-            }
-        }
-    }
-
-    if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
-        include("phpvfscomposer://" . __DIR__ . '/..'.'/yiisoft/yii2/yii');
-        exit(0);
-    }
-}
-
-include __DIR__ . '/..'.'/yiisoft/yii2/yii';

+ 0 - 5
vendor/bin/yii.bat

@@ -1,5 +0,0 @@
-@ECHO OFF
-setlocal DISABLEDELAYEDEXPANSION
-SET BIN_TARGET=%~dp0/yii
-SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
-php "%BIN_TARGET%" %*

+ 0 - 17
vendor/bower-asset/bootstrap/.editorconfig

@@ -1,17 +0,0 @@
-# editorconfig.org
-
-root = true
-
-[*]
-charset = utf-8
-end_of_line = lf
-indent_size = 2
-indent_style = space
-insert_final_newline = true
-trim_trailing_whitespace = true
-
-[*.md]
-trim_trailing_whitespace = false
-
-[*.py]
-indent_size = 4

+ 0 - 15
vendor/bower-asset/bootstrap/.gitattributes

@@ -1,15 +0,0 @@
-# Enforce Unix newlines
-*.css   text eol=lf
-*.html  text eol=lf
-*.js    text eol=lf
-*.json  text eol=lf
-*.less  text eol=lf
-*.md    text eol=lf
-*.svg   text eol=lf
-*.yml   text eol=lf
-# Don't diff or textually merge source maps
-*.map   binary
-
-bootstrap-theme.css linguist-vendored=false
-bootstrap.css linguist-vendored=false
-bootstrap.js linguist-vendored=false

+ 0 - 41
vendor/bower-asset/bootstrap/.gitignore

@@ -1,41 +0,0 @@
-# Ignore docs files
-_gh_pages
-_site
-.ruby-version
-
-# Numerous always-ignore extensions
-*.diff
-*.err
-*.log
-*.orig
-*.rej
-*.swo
-*.swp
-*.vi
-*.zip
-*~
-
-# OS or Editor folders
-._*
-.cache
-.DS_Store
-.idea
-.project
-.settings
-.tmproj
-*.esproj
-*.sublime-project
-*.sublime-workspace
-nbproject
-Thumbs.db
-
-# Komodo
-.komodotools
-*.komodoproject
-
-# Jekyll metadata
-docs/.jekyll-metadata
-
-# Folders to ignore
-bower_components
-node_modules

+ 0 - 12
vendor/bower-asset/bootstrap/.hound.yml

@@ -1,12 +0,0 @@
-fail_on_violations: true
-
-scss:
-  enabled: false
-
-javascript:
-  enabled: true
-  config_file: js/.jshintrc
-
-jscs:
-  enabled: true
-  config_file: js/.jscsrc

+ 0 - 41
vendor/bower-asset/bootstrap/.travis.yml

@@ -1,41 +0,0 @@
-sudo: required
-dist: trusty
-language: node_js
-git:
-  depth: 10
-node_js:
-  - "0.12"
-before_install:
-  # Remove ./node_modules/.bin from PATH so node-which doesn't replace Unix which and cause RVM to barf. See https://github.com/travis-ci/travis-ci/issues/5092
-  - export PATH=$(python -c 'from sys import argv;from collections import OrderedDict as od;print(":".join(od((p,None) for p in argv[1].split(":") if p.startswith("/")).keys()))' "$PATH")
-  - rvm install 2.2
-  - rvm use 2.2 --fuzzy
-  - "export TRAVIS_COMMIT_MSG=\"$(git log --format=%B --no-merges -n 1)\""
-  - echo "$TRAVIS_COMMIT_MSG" | grep '\[skip validator\]'; export TWBS_DO_VALIDATOR=$?; true
-  - echo "$TRAVIS_COMMIT_MSG" | grep '\[skip sauce\]'; export TWBS_DO_SAUCE=$?; true
-  - if [ "$TRAVIS_REPO_SLUG" = twbs-savage/bootstrap ]; then export TWBS_DO_VALIDATOR=0; fi
-install:
-  - bundle install --deployment --jobs=1
-  - cp grunt/npm-shrinkwrap.json ./
-  - npm install
-cache:
-  directories:
-    - node_modules
-    - vendor/bundle
-env:
-  global:
-    - NPM_CONFIG_PROGRESS="false"
-    - SAUCE_USERNAME="bootstrap"
-    - secure: "pJkBwnuae9dKU5tEcCqccfS1QQw7/meEcfz63fM7ba7QJNjoA6BaXj08L5Z3Vb5vBmVPwBawxo5Hp0jC0r/Z/O0hGnAmz/Cz09L+cy7dSAZ9x4hvZePSja/UAusaB5ogMoO8l2b773MzgQeSmrLbExr9BWLeqEfjC2hFgdgHLaQ="
-    - secure: "RKWpS+P20b4tG9tawzCMJSmQftoonmC7tJzyGYiHuEM1TcpHALLBcnzKlr/+DiPTfzDJWY4kS8pxfhK4uXOe8OHnhpMNub7LEWtFPePlZIervOJcsOydaQocTKqVVWD6OUubMeQmQ+tZmvmpjoJ1uPPEbFs9ciF7+dv3U5tLUZ0="
-    - secure: "XswSKBY0HJ/aO9VOBeWlvGpqSFF/DsJmNKz7o5RkJMJX340qe44J929uUNwwOwlv9YrgptzC2W6l8bpmZQV+p6IYs99SoSA8CCaUfIJaqeU9x/UiT5vIHgqaNax+vFJwvzHLpF5v/ggFqFEKCd54gCDasePLTztHeC4oL104iaQ="
-  matrix:
-    - TWBS_TEST=core
-    - TWBS_TEST=validate-html
-    - TWBS_TEST=sauce-js-unit
-matrix:
-  fast_finish: true
-notifications:
-  slack: heybb:iz4wwosL0N0EdaX1gvgkU0NH
-  webhooks:
-    - http://savage1.twbsapps.com/savage/travis

+ 0 - 5
vendor/bower-asset/bootstrap/CHANGELOG.md

@@ -1,5 +0,0 @@
-Bootstrap uses [GitHub's Releases feature](https://github.com/blog/1547-release-your-software) for its changelogs.
-
-See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap.
-
-Release announcement posts on [the official Bootstrap blog](http://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release.

+ 0 - 1
vendor/bower-asset/bootstrap/CNAME

@@ -1 +0,0 @@
-getbootstrap.com

+ 0 - 271
vendor/bower-asset/bootstrap/CONTRIBUTING.md

@@ -1,271 +0,0 @@
-# Contributing to Bootstrap
-
-Looking to contribute something to Bootstrap? **Here's how you can help.**
-
-Please take a moment to review this document in order to make the contribution
-process easy and effective for everyone involved.
-
-Following these guidelines helps to communicate that you respect the time of
-the developers managing and developing this open source project. In return,
-they should reciprocate that respect in addressing your issue or assessing
-patches and features.
-
-
-## Using the issue tracker
-
-The [issue tracker](https://github.com/twbs/bootstrap/issues) is
-the preferred channel for [bug reports](#bug-reports), [features requests](#feature-requests)
-and [submitting pull requests](#pull-requests), but please respect the following
-restrictions:
-
-* Please **do not** use the issue tracker for personal support requests. Stack
-  Overflow ([`twitter-bootstrap-3`](https://stackoverflow.com/questions/tagged/twitter-bootstrap-3) tag), [Slack](https://bootstrap-slack.herokuapp.com/) or [IRC](README.md#community) are better places to get help.
-
-* Please **do not** derail or troll issues. Keep the discussion on topic and
-  respect the opinions of others.
-
-* Please **do not** post comments consisting solely of "+1" or ":thumbsup:".
-  Use [GitHub's "reactions" feature](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments)
-  instead. We reserve the right to delete comments which violate this rule.
-
-* Please **do not** open issues or pull requests regarding the code in
-  [`Normalize`](https://github.com/necolas/normalize.css) (open them in
-  their respective repositories).
-
-* Please **do not** open issues regarding the official themes offered on <http://themes.getbootstrap.com/>.
-  Instead, please email any questions or feedback regarding those themes to `themes AT getbootstrap DOT com`.
-
-
-## Issues and labels
-
-Our bug tracker utilizes several labels to help organize and identify issues. Here's what they represent and how we use them:
-
-- `browser bug` - Issues that are reported to us, but actually are the result of a browser-specific bug. These are diagnosed with reduced test cases and result in an issue opened on that browser's own bug tracker.
-- `confirmed` - Issues that have been confirmed with a reduced test case and identify a bug in Bootstrap.
-- `css` - Issues stemming from our compiled CSS or source Less/Sass files.
-- `customizer` - Issues with our web-based Customizer.
-- `docs` - Issues for improving or updating our documentation.
-- `examples` - Issues involving the example templates included in our docs.
-- `feature` - Issues asking for a new feature to be added, or an existing one to be extended or modified. New features require a minor version bump (e.g., `v3.0.0` to `v3.1.0`).
-- `grunt` - Issues with our included JavaScript-based Gruntfile, which is used to run all our tests, concatenate and compile source files, and more.
-- `help wanted` - Issues we need or would love help from the community to resolve.
-- `js` - Issues stemming from our compiled or source JavaScript files.
-- `meta` - Issues with the project itself or our GitHub repository.
-
-For a complete look at our labels, see the [project labels page](https://github.com/twbs/bootstrap/labels).
-
-
-## Bug reports
-
-A bug is a _demonstrable problem_ that is caused by the code in the repository.
-Good bug reports are extremely helpful, so thanks!
-
-Guidelines for bug reports:
-
-0. **Validate and lint your code** &mdash; [validate your HTML](http://html5.validator.nu)
-   and [lint your HTML](https://github.com/twbs/bootlint) to ensure your
-   problem isn't caused by a simple error in your own code.
-
-1. **Use the GitHub issue search** &mdash; check if the issue has already been
-   reported.
-
-2. **Check if the issue has been fixed** &mdash; try to reproduce it using the
-   latest `master` or development branch in the repository.
-
-3. **Isolate the problem** &mdash; ideally create a [reduced test
-   case](https://css-tricks.com/reduced-test-cases/) and a live example.
-   [This JS Bin](http://jsbin.com/lefey/1/edit?html,output) is a helpful template.
-
-
-A good bug report shouldn't leave others needing to chase you up for more
-information. Please try to be as detailed as possible in your report. What is
-your environment? What steps will reproduce the issue? What browser(s) and OS
-experience the problem? Do other browsers show the bug differently? What
-would you expect to be the outcome? All these details will help people to fix
-any potential bugs.
-
-Example:
-
-> Short and descriptive example bug report title
->
-> A summary of the issue and the browser/OS environment in which it occurs. If
-> suitable, include the steps required to reproduce the bug.
->
-> 1. This is the first step
-> 2. This is the second step
-> 3. Further steps, etc.
->
-> `<url>` - a link to the reduced test case
->
-> Any other information you want to share that is relevant to the issue being
-> reported. This might include the lines of code that you have identified as
-> causing the bug, and potential solutions (and your opinions on their
-> merits).
-
-### Reporting upstream browser bugs
-
-Sometimes bugs reported to us are actually caused by bugs in the browser(s) themselves, not bugs in Bootstrap per se.
-When feasible, we aim to report such upstream bugs to the relevant browser vendor(s), and then list them on our [Wall of Browser Bugs](http://getbootstrap.com/browser-bugs/) and [document them in MDN](https://developer.mozilla.org/en-US/docs/Web).
-
-| Vendor(s)     | Browser(s)                   | Rendering engine | Bug reporting website(s)                                                              | Notes                                                    |
-| ------------- | ---------------------------- | ---------------- | ------------------------------------------------------------------------------------- | -------------------------------------------------------- |
-| Mozilla       | Firefox                      | Gecko            | https://bugzilla.mozilla.org/enter_bug.cgi                                            | "Core" is normally the right product option to choose.   |
-| Apple         | Safari                       | WebKit           | https://bugs.webkit.org/enter_bug.cgi?product=WebKit <br> https://bugreport.apple.com | In Apple's bug reporter, choose "Safari" as the product. |
-| Google, Opera | Chrome, Chromium, Opera v15+ | Blink            | https://code.google.com/p/chromium/issues/list                                        | Click the "New issue" button.                            |
-| Microsoft     | Edge                         | EdgeHTML         | https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/                 |                                                          |
-
-### Issues bots
-
-[@twbs-lmvtfy](https://github.com/twbs-lmvtfy) is a Bootstrap bot that hangs out in our GitHub issue tracker and automatically checks for HTML validation errors in live examples (e.g. jsFiddles, JS Bins, Bootplys, Plunks, CodePens, etc.) posted in issue comments. If it finds any errors, it will post a follow-up comment on the issue and point out the errors. If this happens with an example you've posted, please fix the errors and post an updated live example. If you opened a bug report, please check whether the bug still occurs with your revised, valid live example. If the bug no longer occurs, it was probably due to your invalid HTML rather than something in Bootstrap and we'd appreciate it if you could close out the GitHub issue.
-
-
-## Feature requests
-
-Feature requests are welcome, but please note that they **must target
-[Bootstrap v4](https://github.com/twbs/bootstrap/tree/v4-dev),** because
-Bootstrap v3 is now in maintenance mode and is closed off to new features.
-This is so that we can focus our efforts on Bootstrap v4, the future of the
-framework.
-
-Before opening a feature request, please take a moment to find out whether your idea
-fits with the scope and aims of the project. It's up to *you* to make a strong
-case to convince the project's developers of the merits of this feature. Please
-provide as much detail and context as possible.
-
-
-## Pull requests
-
-Good pull requests—patches, improvements, new features—are a fantastic
-help. They should remain focused in scope and avoid containing unrelated
-commits.
-
-**Please ask first** before embarking on any significant pull request (e.g.
-implementing features, refactoring code, porting to a different language),
-otherwise you risk spending a lot of time working on something that the
-project's developers might not want to merge into the project.
-
-In particular, **pull requests that add new features to Bootstrap v3 will be
-rejected.** Bootstrap v3 is now in maintenance mode and is therefore closed
-off to new features, so that we can focus our efforts on Bootstrap v4, the
-future of the framework. Pull requests that add new features should target
-[Bootstrap v4 (the `v4-dev` git branch)](https://github.com/twbs/bootstrap/tree/v4-dev)
-instead, where they will be welcomed and duly considered.
-
-Please adhere to the [coding guidelines](#code-guidelines) used throughout the
-project (indentation, accurate comments, etc.) and any other requirements
-(such as test coverage).
-
-**Do not edit `bootstrap.css`, `bootstrap-theme.css`, or `bootstrap.js`
-directly!** Those files are automatically generated. You should edit the
-source files in [`/bootstrap/less/`](https://github.com/twbs/bootstrap/tree/master/less),
-[`/bootstrap/scss/`](https://github.com/twbs/bootstrap/tree/v4-dev/scss) (for Bootstrap v4),
-and/or [`/bootstrap/js/`](https://github.com/twbs/bootstrap/tree/master/js) instead.
-
-Similarly, when contributing to Bootstrap's documentation, you should edit the
-documentation source files in
-[the `/bootstrap/docs/` directory of the `master` branch](https://github.com/twbs/bootstrap/tree/master/docs).
-**Do not edit the `gh-pages` branch.** That branch is generated from the
-documentation source files and is managed separately by the Bootstrap Core Team.
-
-Adhering to the following process is the best way to get your work
-included in the project:
-
-1. [Fork](https://help.github.com/fork-a-repo/) the project, clone your fork,
-   and configure the remotes:
-
-   ```bash
-   # Clone your fork of the repo into the current directory
-   git clone https://github.com/<your-username>/bootstrap.git
-   # Navigate to the newly cloned directory
-   cd bootstrap
-   # Assign the original repo to a remote called "upstream"
-   git remote add upstream https://github.com/twbs/bootstrap.git
-   ```
-
-2. If you cloned a while ago, get the latest changes from upstream:
-
-   ```bash
-   git checkout master
-   git pull upstream master
-   ```
-
-3. Create a new topic branch (off the main project development branch) to
-   contain your feature, change, or fix:
-
-   ```bash
-   git checkout -b <topic-branch-name>
-   ```
-
-4. Commit your changes in logical chunks. Please adhere to these [git commit
-   message guidelines](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
-   or your code is unlikely to be merged into the main project. Use Git's
-   [interactive rebase](https://help.github.com/articles/interactive-rebase)
-   feature to tidy up your commits before making them public.
-
-5. Locally merge (or rebase) the upstream development branch into your topic branch:
-
-   ```bash
-   git pull [--rebase] upstream master
-   ```
-
-6. Push your topic branch up to your fork:
-
-   ```bash
-   git push origin <topic-branch-name>
-   ```
-
-7. [Open a Pull Request](https://help.github.com/articles/using-pull-requests/)
-    with a clear title and description against the `master` branch.
-
-**IMPORTANT**: By submitting a patch, you agree to allow the project owners to
-license your work under the terms of the [MIT License](LICENSE) (if it
-includes code changes) and under the terms of the
-[Creative Commons Attribution 3.0 Unported License](docs/LICENSE)
-(if it includes documentation changes).
-
-### Pull request bots
-
-[@twbs-rorschach](https://github.com/twbs-rorschach) is a Bootstrap bot that hangs out in our GitHub issue tracker and automatically checks all pull requests for a few simple common mistakes. It's possible that Rorschach might leave a comment on your pull request and then close it. If that happens, simply fix the problem(s) mentioned in the comment (there should be link(s) in the comment explaining the problem(s) in detail) and then either:
-
-* Push the revised version to your pull request's branch and post a comment on the pull request saying that you've fixed the problem(s). One of the Bootstrap Core Team members will then come along and reopen your pull request.
-* Or you can just open a new pull request for your revised version.
-
-[@twbs-savage](https://github.com/twbs-savage) is a Bootstrap bot that automatically runs cross-browser tests (via [Sauce](https://saucelabs.com) and Travis CI) on JavaScript pull requests. Savage will leave a comment on pull requests stating whether cross-browser JS tests passed or failed, with a link to the full Travis build details. If your pull request fails, check the Travis log to see which browser + OS combinations failed. Each browser test in the Travis log includes a link to a Sauce page with details about the test. On those details pages, you can watch a screencast of the test run to see exactly which unit tests failed.
-
-
-## Code guidelines
-
-### HTML
-
-[Adhere to the Code Guide.](http://codeguide.co/#html)
-
-- Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags).
-- Use CDNs and HTTPS for third-party JS when possible. We don't use protocol-relative URLs in this case because they break when viewing the page locally via `file://`.
-- Use [WAI-ARIA](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA) attributes in documentation examples to promote accessibility.
-
-### CSS
-
-[Adhere to the Code Guide.](http://codeguide.co/#css)
-
-- When feasible, default color palettes should comply with [WCAG color contrast guidelines](http://www.w3.org/TR/WCAG20/#visual-audio-contrast).
-- Except in rare cases, don't remove default `:focus` styles (via e.g. `outline: none;`) without providing alternative styles. See [this A11Y Project post](http://a11yproject.com/posts/never-remove-css-outlines) for more details.
-
-### JS
-
-- No semicolons (in client-side JS)
-- 2 spaces (no tabs)
-- strict mode
-- "Attractive"
-- Don't use [jQuery event alias convenience methods](https://github.com/jquery/jquery/blob/master/src/event/alias.js) (such as `$().focus()`). Instead, use [`$().trigger(eventType, ...)`](http://api.jquery.com/trigger/) or [`$().on(eventType, ...)`](http://api.jquery.com/on/), depending on whether you're firing an event or listening for an event. (For example, `$().trigger('focus')` or `$().on('focus', function (event) { /* handle focus event */ })`) We do this to be compatible with custom builds of jQuery where the event aliases module has been excluded.
-
-### Checking coding style
-
-Run `grunt test` before committing to ensure your changes follow our coding standards.
-
-
-## License
-
-By contributing your code, you agree to license your contribution under the [MIT License](LICENSE).
-By contributing to the documentation, you agree to license your contribution under the [Creative Commons Attribution 3.0 Unported License](docs/LICENSE).
-
-Prior to v3.1.0, Bootstrap's code was released under the Apache License v2.0.

+ 0 - 6
vendor/bower-asset/bootstrap/Gemfile

@@ -1,6 +0,0 @@
-source 'https://rubygems.org'
-
-group :development, :test do
-  gem 'jekyll', '~> 3.1.2'
-  gem 'jekyll-sitemap', '~> 0.11.0'
-end

+ 0 - 43
vendor/bower-asset/bootstrap/Gemfile.lock

@@ -1,43 +0,0 @@
-GEM
-  remote: https://rubygems.org/
-  specs:
-    addressable (2.4.0)
-    colorator (0.1)
-    ffi (1.9.14-x64-mingw32)
-    jekyll (3.1.6)
-      colorator (~> 0.1)
-      jekyll-sass-converter (~> 1.0)
-      jekyll-watch (~> 1.1)
-      kramdown (~> 1.3)
-      liquid (~> 3.0)
-      mercenary (~> 0.3.3)
-      rouge (~> 1.7)
-      safe_yaml (~> 1.0)
-    jekyll-sass-converter (1.4.0)
-      sass (~> 3.4)
-    jekyll-sitemap (0.11.0)
-      addressable (~> 2.4.0)
-    jekyll-watch (1.4.0)
-      listen (~> 3.0, < 3.1)
-    kramdown (1.11.1)
-    liquid (3.0.6)
-    listen (3.0.8)
-      rb-fsevent (~> 0.9, >= 0.9.4)
-      rb-inotify (~> 0.9, >= 0.9.7)
-    mercenary (0.3.6)
-    rb-fsevent (0.9.7)
-    rb-inotify (0.9.7)
-      ffi (>= 0.5.0)
-    rouge (1.11.1)
-    safe_yaml (1.0.4)
-    sass (3.4.22)
-
-PLATFORMS
-  x64-mingw32
-
-DEPENDENCIES
-  jekyll (~> 3.1.2)
-  jekyll-sitemap (~> 0.11.0)
-
-BUNDLED WITH
-   1.12.5

+ 0 - 511
vendor/bower-asset/bootstrap/Gruntfile.js

@@ -1,511 +0,0 @@
-/*!
- * Bootstrap's Gruntfile
- * http://getbootstrap.com
- * Copyright 2013-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-module.exports = function (grunt) {
-  'use strict';
-
-  // Force use of Unix newlines
-  grunt.util.linefeed = '\n';
-
-  RegExp.quote = function (string) {
-    return string.replace(/[-\\^$*+?.()|[\]{}]/g, '\\$&');
-  };
-
-  var fs = require('fs');
-  var path = require('path');
-  var generateGlyphiconsData = require('./grunt/bs-glyphicons-data-generator.js');
-  var BsLessdocParser = require('./grunt/bs-lessdoc-parser.js');
-  var getLessVarsData = function () {
-    var filePath = path.join(__dirname, 'less/variables.less');
-    var fileContent = fs.readFileSync(filePath, { encoding: 'utf8' });
-    var parser = new BsLessdocParser(fileContent);
-    return { sections: parser.parseFile() };
-  };
-  var generateRawFiles = require('./grunt/bs-raw-files-generator.js');
-  var generateCommonJSModule = require('./grunt/bs-commonjs-generator.js');
-  var configBridge = grunt.file.readJSON('./grunt/configBridge.json', { encoding: 'utf8' });
-
-  Object.keys(configBridge.paths).forEach(function (key) {
-    configBridge.paths[key].forEach(function (val, i, arr) {
-      arr[i] = path.join('./docs/assets', val);
-    });
-  });
-
-  // Project configuration.
-  grunt.initConfig({
-
-    // Metadata.
-    pkg: grunt.file.readJSON('package.json'),
-    banner: '/*!\n' +
-            ' * Bootstrap v<%= pkg.version %> (<%= pkg.homepage %>)\n' +
-            ' * Copyright 2011-<%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +
-            ' * Licensed under the <%= pkg.license %> license\n' +
-            ' */\n',
-    jqueryCheck: configBridge.config.jqueryCheck.join('\n'),
-    jqueryVersionCheck: configBridge.config.jqueryVersionCheck.join('\n'),
-
-    // Task configuration.
-    clean: {
-      dist: 'dist',
-      docs: 'docs/dist'
-    },
-
-    jshint: {
-      options: {
-        jshintrc: 'js/.jshintrc'
-      },
-      grunt: {
-        options: {
-          jshintrc: 'grunt/.jshintrc'
-        },
-        src: ['Gruntfile.js', 'package.js', 'grunt/*.js']
-      },
-      core: {
-        src: 'js/*.js'
-      },
-      test: {
-        options: {
-          jshintrc: 'js/tests/unit/.jshintrc'
-        },
-        src: 'js/tests/unit/*.js'
-      },
-      assets: {
-        src: ['docs/assets/js/src/*.js', 'docs/assets/js/*.js', '!docs/assets/js/*.min.js']
-      }
-    },
-
-    jscs: {
-      options: {
-        config: 'js/.jscsrc'
-      },
-      grunt: {
-        src: '<%= jshint.grunt.src %>'
-      },
-      core: {
-        src: '<%= jshint.core.src %>'
-      },
-      test: {
-        src: '<%= jshint.test.src %>'
-      },
-      assets: {
-        options: {
-          requireCamelCaseOrUpperCaseIdentifiers: null
-        },
-        src: '<%= jshint.assets.src %>'
-      }
-    },
-
-    concat: {
-      options: {
-        banner: '<%= banner %>\n<%= jqueryCheck %>\n<%= jqueryVersionCheck %>',
-        stripBanners: false
-      },
-      bootstrap: {
-        src: [
-          'js/transition.js',
-          'js/alert.js',
-          'js/button.js',
-          'js/carousel.js',
-          'js/collapse.js',
-          'js/dropdown.js',
-          'js/modal.js',
-          'js/tooltip.js',
-          'js/popover.js',
-          'js/scrollspy.js',
-          'js/tab.js',
-          'js/affix.js'
-        ],
-        dest: 'dist/js/<%= pkg.name %>.js'
-      }
-    },
-
-    uglify: {
-      options: {
-        compress: {
-          warnings: false
-        },
-        mangle: true,
-        preserveComments: /^!|@preserve|@license|@cc_on/i
-      },
-      core: {
-        src: '<%= concat.bootstrap.dest %>',
-        dest: 'dist/js/<%= pkg.name %>.min.js'
-      },
-      customize: {
-        src: configBridge.paths.customizerJs,
-        dest: 'docs/assets/js/customize.min.js'
-      },
-      docsJs: {
-        src: configBridge.paths.docsJs,
-        dest: 'docs/assets/js/docs.min.js'
-      }
-    },
-
-    qunit: {
-      options: {
-        inject: 'js/tests/unit/phantom.js'
-      },
-      files: 'js/tests/index.html'
-    },
-
-    less: {
-      compileCore: {
-        options: {
-          strictMath: true,
-          sourceMap: true,
-          outputSourceFiles: true,
-          sourceMapURL: '<%= pkg.name %>.css.map',
-          sourceMapFilename: 'dist/css/<%= pkg.name %>.css.map'
-        },
-        src: 'less/bootstrap.less',
-        dest: 'dist/css/<%= pkg.name %>.css'
-      },
-      compileTheme: {
-        options: {
-          strictMath: true,
-          sourceMap: true,
-          outputSourceFiles: true,
-          sourceMapURL: '<%= pkg.name %>-theme.css.map',
-          sourceMapFilename: 'dist/css/<%= pkg.name %>-theme.css.map'
-        },
-        src: 'less/theme.less',
-        dest: 'dist/css/<%= pkg.name %>-theme.css'
-      }
-    },
-
-    autoprefixer: {
-      options: {
-        browsers: configBridge.config.autoprefixerBrowsers
-      },
-      core: {
-        options: {
-          map: true
-        },
-        src: 'dist/css/<%= pkg.name %>.css'
-      },
-      theme: {
-        options: {
-          map: true
-        },
-        src: 'dist/css/<%= pkg.name %>-theme.css'
-      },
-      docs: {
-        src: ['docs/assets/css/src/docs.css']
-      },
-      examples: {
-        expand: true,
-        cwd: 'docs/examples/',
-        src: ['**/*.css'],
-        dest: 'docs/examples/'
-      }
-    },
-
-    csslint: {
-      options: {
-        csslintrc: 'less/.csslintrc'
-      },
-      dist: [
-        'dist/css/bootstrap.css',
-        'dist/css/bootstrap-theme.css'
-      ],
-      examples: [
-        'docs/examples/**/*.css'
-      ],
-      docs: {
-        options: {
-          ids: false,
-          'overqualified-elements': false
-        },
-        src: 'docs/assets/css/src/docs.css'
-      }
-    },
-
-    cssmin: {
-      options: {
-        // TODO: disable `zeroUnits` optimization once clean-css 3.2 is released
-        //    and then simplify the fix for https://github.com/twbs/bootstrap/issues/14837 accordingly
-        compatibility: 'ie8',
-        keepSpecialComments: '*',
-        sourceMap: true,
-        sourceMapInlineSources: true,
-        advanced: false
-      },
-      minifyCore: {
-        src: 'dist/css/<%= pkg.name %>.css',
-        dest: 'dist/css/<%= pkg.name %>.min.css'
-      },
-      minifyTheme: {
-        src: 'dist/css/<%= pkg.name %>-theme.css',
-        dest: 'dist/css/<%= pkg.name %>-theme.min.css'
-      },
-      docs: {
-        src: [
-          'docs/assets/css/ie10-viewport-bug-workaround.css',
-          'docs/assets/css/src/pygments-manni.css',
-          'docs/assets/css/src/docs.css'
-        ],
-        dest: 'docs/assets/css/docs.min.css'
-      }
-    },
-
-    csscomb: {
-      options: {
-        config: 'less/.csscomb.json'
-      },
-      dist: {
-        expand: true,
-        cwd: 'dist/css/',
-        src: ['*.css', '!*.min.css'],
-        dest: 'dist/css/'
-      },
-      examples: {
-        expand: true,
-        cwd: 'docs/examples/',
-        src: '**/*.css',
-        dest: 'docs/examples/'
-      },
-      docs: {
-        src: 'docs/assets/css/src/docs.css',
-        dest: 'docs/assets/css/src/docs.css'
-      }
-    },
-
-    copy: {
-      fonts: {
-        expand: true,
-        src: 'fonts/**',
-        dest: 'dist/'
-      },
-      docs: {
-        expand: true,
-        cwd: 'dist/',
-        src: [
-          '**/*'
-        ],
-        dest: 'docs/dist/'
-      }
-    },
-
-    connect: {
-      server: {
-        options: {
-          port: 3000,
-          base: '.'
-        }
-      }
-    },
-
-    jekyll: {
-      options: {
-        bundleExec: true,
-        config: '_config.yml',
-        incremental: false
-      },
-      docs: {},
-      github: {
-        options: {
-          raw: 'github: true'
-        }
-      }
-    },
-
-    htmlmin: {
-      dist: {
-        options: {
-          collapseBooleanAttributes: true,
-          collapseWhitespace: true,
-          conservativeCollapse: true,
-          decodeEntities: false,
-          minifyCSS: {
-            compatibility: 'ie8',
-            keepSpecialComments: 0
-          },
-          minifyJS: true,
-          minifyURLs: false,
-          processConditionalComments: true,
-          removeAttributeQuotes: true,
-          removeComments: true,
-          removeOptionalAttributes: true,
-          removeOptionalTags: true,
-          removeRedundantAttributes: true,
-          removeScriptTypeAttributes: true,
-          removeStyleLinkTypeAttributes: true,
-          removeTagWhitespace: false,
-          sortAttributes: true,
-          sortClassName: true
-        },
-        expand: true,
-        cwd: '_gh_pages',
-        dest: '_gh_pages',
-        src: [
-          '**/*.html',
-          '!examples/**/*.html'
-        ]
-      }
-    },
-
-    pug: {
-      options: {
-        pretty: true,
-        data: getLessVarsData
-      },
-      customizerVars: {
-        src: 'docs/_pug/customizer-variables.pug',
-        dest: 'docs/_includes/customizer-variables.html'
-      },
-      customizerNav: {
-        src: 'docs/_pug/customizer-nav.pug',
-        dest: 'docs/_includes/nav/customize.html'
-      }
-    },
-
-    htmllint: {
-      options: {
-        ignore: [
-          'Attribute "autocomplete" not allowed on element "button" at this point.',
-          'Attribute "autocomplete" is only allowed when the input type is "color", "date", "datetime", "datetime-local", "email", "hidden", "month", "number", "password", "range", "search", "tel", "text", "time", "url", or "week".',
-          'Element "img" is missing required attribute "src".'
-        ]
-      },
-      src: '_gh_pages/**/*.html'
-    },
-
-    watch: {
-      src: {
-        files: '<%= jshint.core.src %>',
-        tasks: ['jshint:core', 'qunit', 'concat']
-      },
-      test: {
-        files: '<%= jshint.test.src %>',
-        tasks: ['jshint:test', 'qunit']
-      },
-      less: {
-        files: 'less/**/*.less',
-        tasks: 'less'
-      }
-    },
-
-    'saucelabs-qunit': {
-      all: {
-        options: {
-          build: process.env.TRAVIS_JOB_ID,
-          throttled: 10,
-          maxRetries: 3,
-          maxPollRetries: 4,
-          urls: ['http://127.0.0.1:3000/js/tests/index.html?hidepassed'],
-          browsers: grunt.file.readYAML('grunt/sauce_browsers.yml')
-        }
-      }
-    },
-
-    exec: {
-      npmUpdate: {
-        command: 'npm update'
-      }
-    },
-
-    compress: {
-      main: {
-        options: {
-          archive: 'bootstrap-<%= pkg.version %>-dist.zip',
-          mode: 'zip',
-          level: 9,
-          pretty: true
-        },
-        files: [
-          {
-            expand: true,
-            cwd: 'dist/',
-            src: ['**'],
-            dest: 'bootstrap-<%= pkg.version %>-dist'
-          }
-        ]
-      }
-    }
-
-  });
-
-
-  // These plugins provide necessary tasks.
-  require('load-grunt-tasks')(grunt, { scope: 'devDependencies' });
-  require('time-grunt')(grunt);
-
-  // Docs HTML validation task
-  grunt.registerTask('validate-html', ['jekyll:docs', 'htmllint']);
-
-  var runSubset = function (subset) {
-    return !process.env.TWBS_TEST || process.env.TWBS_TEST === subset;
-  };
-  var isUndefOrNonZero = function (val) {
-    return val === undefined || val !== '0';
-  };
-
-  // Test task.
-  var testSubtasks = [];
-  // Skip core tests if running a different subset of the test suite
-  if (runSubset('core') &&
-      // Skip core tests if this is a Savage build
-      process.env.TRAVIS_REPO_SLUG !== 'twbs-savage/bootstrap') {
-    testSubtasks = testSubtasks.concat(['dist-css', 'dist-js', 'csslint:dist', 'test-js', 'docs']);
-  }
-  // Skip HTML validation if running a different subset of the test suite
-  if (runSubset('validate-html') &&
-      // Skip HTML5 validator on Travis when [skip validator] is in the commit message
-      isUndefOrNonZero(process.env.TWBS_DO_VALIDATOR)) {
-    testSubtasks.push('validate-html');
-  }
-  // Only run Sauce Labs tests if there's a Sauce access key
-  if (typeof process.env.SAUCE_ACCESS_KEY !== 'undefined' &&
-      // Skip Sauce if running a different subset of the test suite
-      runSubset('sauce-js-unit') &&
-      // Skip Sauce on Travis when [skip sauce] is in the commit message
-      isUndefOrNonZero(process.env.TWBS_DO_SAUCE)) {
-    testSubtasks.push('connect');
-    testSubtasks.push('saucelabs-qunit');
-  }
-  grunt.registerTask('test', testSubtasks);
-  grunt.registerTask('test-js', ['jshint:core', 'jshint:test', 'jshint:grunt', 'jscs:core', 'jscs:test', 'jscs:grunt', 'qunit']);
-
-  // JS distribution task.
-  grunt.registerTask('dist-js', ['concat', 'uglify:core', 'commonjs']);
-
-  // CSS distribution task.
-  grunt.registerTask('less-compile', ['less:compileCore', 'less:compileTheme']);
-  grunt.registerTask('dist-css', ['less-compile', 'autoprefixer:core', 'autoprefixer:theme', 'csscomb:dist', 'cssmin:minifyCore', 'cssmin:minifyTheme']);
-
-  // Full distribution task.
-  grunt.registerTask('dist', ['clean:dist', 'dist-css', 'copy:fonts', 'dist-js']);
-
-  // Default task.
-  grunt.registerTask('default', ['clean:dist', 'copy:fonts', 'test']);
-
-  grunt.registerTask('build-glyphicons-data', function () { generateGlyphiconsData.call(this, grunt); });
-
-  // task for building customizer
-  grunt.registerTask('build-customizer', ['build-customizer-html', 'build-raw-files']);
-  grunt.registerTask('build-customizer-html', 'pug');
-  grunt.registerTask('build-raw-files', 'Add scripts/less files to customizer.', function () {
-    var banner = grunt.template.process('<%= banner %>');
-    generateRawFiles(grunt, banner);
-  });
-
-  grunt.registerTask('commonjs', 'Generate CommonJS entrypoint module in dist dir.', function () {
-    var srcFiles = grunt.config.get('concat.bootstrap.src');
-    var destFilepath = 'dist/js/npm.js';
-    generateCommonJSModule(grunt, srcFiles, destFilepath);
-  });
-
-  // Docs task.
-  grunt.registerTask('docs-css', ['autoprefixer:docs', 'autoprefixer:examples', 'csscomb:docs', 'csscomb:examples', 'cssmin:docs']);
-  grunt.registerTask('lint-docs-css', ['csslint:docs', 'csslint:examples']);
-  grunt.registerTask('docs-js', ['uglify:docsJs', 'uglify:customize']);
-  grunt.registerTask('lint-docs-js', ['jshint:assets', 'jscs:assets']);
-  grunt.registerTask('docs', ['docs-css', 'lint-docs-css', 'docs-js', 'lint-docs-js', 'clean:docs', 'copy:docs', 'build-glyphicons-data', 'build-customizer']);
-  grunt.registerTask('docs-github', ['jekyll:github', 'htmlmin']);
-
-  grunt.registerTask('prep-release', ['dist', 'docs', 'docs-github', 'compress']);
-};

+ 0 - 22
vendor/bower-asset/bootstrap/ISSUE_TEMPLATE.md

@@ -1,22 +0,0 @@
-Before opening an issue:
-
-- [Search for duplicate or closed issues](https://github.com/twbs/bootstrap/issues?utf8=%E2%9C%93&q=is%3Aissue)
-- [Validate](http://validator.w3.org/nu/) and [lint](https://github.com/twbs/bootlint#in-the-browser) any HTML to avoid common problems
-- Prepare a [reduced test case](https://css-tricks.com/reduced-test-cases/) for any bugs
-- Read the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md)
-
-When asking general "how to" questions:
-
-- Please do not open an issue here
-- Instead, ask for help on [StackOverflow, IRC, or Slack](https://github.com/twbs/bootstrap/blob/master/README.md#community)
-
-When reporting a bug, include:
-
-- Operating system and version (Windows, Mac OS X, Android, iOS, Win10 Mobile)
-- Browser and version (Chrome, Firefox, Safari, IE, MS Edge, Opera 15+, Android Browser)
-- Reduced test cases and potential fixes using [JS Bin](https://jsbin.com)
-
-When suggesting a feature, include:
-
-- As much detail as possible for what we should add and why it's important to Bootstrap
-- Relevant links to prior art, screenshots, or live demos whenever possible

+ 0 - 21
vendor/bower-asset/bootstrap/LICENSE

@@ -1,21 +0,0 @@
-The MIT License (MIT)
-
-Copyright (c) 2011-2016 Twitter, Inc.
-
-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.

+ 0 - 142
vendor/bower-asset/bootstrap/README.md

@@ -1,142 +0,0 @@
-# [Bootstrap](http://getbootstrap.com)
-
-[![Slack](https://bootstrap-slack.herokuapp.com/badge.svg)](https://bootstrap-slack.herokuapp.com)
-![Bower version](https://img.shields.io/bower/v/bootstrap.svg)
-[![npm version](https://img.shields.io/npm/v/bootstrap.svg)](https://www.npmjs.com/package/bootstrap)
-[![Build Status](https://img.shields.io/travis/twbs/bootstrap/master.svg)](https://travis-ci.org/twbs/bootstrap)
-[![devDependency Status](https://img.shields.io/david/dev/twbs/bootstrap.svg)](https://david-dm.org/twbs/bootstrap#info=devDependencies)
-[![NuGet](https://img.shields.io/nuget/v/bootstrap.svg)](https://www.nuget.org/packages/Bootstrap)
-[![Selenium Test Status](https://saucelabs.com/browser-matrix/bootstrap.svg)](https://saucelabs.com/u/bootstrap)
-
-Bootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created by [Mark Otto](https://twitter.com/mdo) and [Jacob Thornton](https://twitter.com/fat), and maintained by the [core team](https://github.com/orgs/twbs/people) with the massive support and involvement of the community.
-
-To get started, check out <http://getbootstrap.com>!
-
-
-## Table of contents
-
-* [Quick start](#quick-start)
-* [Bugs and feature requests](#bugs-and-feature-requests)
-* [Documentation](#documentation)
-* [Contributing](#contributing)
-* [Community](#community)
-* [Versioning](#versioning)
-* [Creators](#creators)
-* [Copyright and license](#copyright-and-license)
-
-
-## Quick start
-
-Several quick start options are available:
-
-* [Download the latest release](https://github.com/twbs/bootstrap/archive/v3.3.7.zip).
-* Clone the repo: `git clone https://github.com/twbs/bootstrap.git`.
-* Install with [Bower](http://bower.io): `bower install bootstrap`.
-* Install with [npm](https://www.npmjs.com): `npm install bootstrap@3`.
-* Install with [Meteor](https://www.meteor.com): `meteor add twbs:bootstrap`.
-* Install with [Composer](https://getcomposer.org): `composer require twbs/bootstrap`.
-
-Read the [Getting started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more.
-
-### What's included
-
-Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this:
-
-```
-bootstrap/
-├── css/
-│   ├── bootstrap.css
-│   ├── bootstrap.css.map
-│   ├── bootstrap.min.css
-│   ├── bootstrap.min.css.map
-│   ├── bootstrap-theme.css
-│   ├── bootstrap-theme.css.map
-│   ├── bootstrap-theme.min.css
-│   └── bootstrap-theme.min.css.map
-├── js/
-│   ├── bootstrap.js
-│   └── bootstrap.min.js
-└── fonts/
-    ├── glyphicons-halflings-regular.eot
-    ├── glyphicons-halflings-regular.svg
-    ├── glyphicons-halflings-regular.ttf
-    ├── glyphicons-halflings-regular.woff
-    └── glyphicons-halflings-regular.woff2
-```
-
-We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). CSS [source maps](https://developer.chrome.com/devtools/docs/css-preprocessors) (`bootstrap.*.map`) are available for use with certain browsers' developer tools. Fonts from Glyphicons are included, as is the optional Bootstrap theme.
-
-
-## Bugs and feature requests
-
-Have a bug or a feature request? Please first read the [issue guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md#using-the-issue-tracker) and search for existing and closed issues. If your problem or idea is not addressed yet, [please open a new issue](https://github.com/twbs/bootstrap/issues/new).
-
-Note that **feature requests must target [Bootstrap v4](https://github.com/twbs/bootstrap/tree/v4-dev),** because Bootstrap v3 is now in maintenance mode and is closed off to new features. This is so that we can focus our efforts on Bootstrap v4.
-
-
-## Documentation
-
-Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at <http://getbootstrap.com>. The docs may also be run locally.
-
-### Running documentation locally
-
-1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) and other Ruby dependencies with `bundle install`.
-   **Note for Windows users:** Read [this unofficial guide](http://jekyll-windows.juthilo.com/) to get Jekyll up and running without problems.
-2. From the root `/bootstrap` directory, run `bundle exec jekyll serve` in the command line.
-4. Open `http://localhost:9001` in your browser, and voilà.
-
-Learn more about using Jekyll by reading its [documentation](http://jekyllrb.com/docs/home/).
-
-### Documentation for previous releases
-
-Documentation for v2.3.2 has been made available for the time being at <http://getbootstrap.com/2.3.2/> while folks transition to Bootstrap 3.
-
-[Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download.
-
-
-## Contributing
-
-Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
-
-Moreover, if your pull request contains JavaScript patches or features, you must include [relevant unit tests](https://github.com/twbs/bootstrap/tree/master/js/tests). All HTML and CSS should conform to the [Code Guide](https://github.com/mdo/code-guide), maintained by [Mark Otto](https://github.com/mdo).
-
-**Bootstrap v3 is now closed off to new features.** It has gone into maintenance mode so that we can focus our efforts on [Bootstrap v4](https://github.com/twbs/bootstrap/tree/v4-dev), the future of the framework. Pull requests which add new features (rather than fix bugs) should target [Bootstrap v4 (the `v4-dev` git branch)](https://github.com/twbs/bootstrap/tree/v4-dev) instead.
-
-Editor preferences are available in the [editor config](https://github.com/twbs/bootstrap/blob/master/.editorconfig) for easy use in common text editors. Read more and download plugins at <http://editorconfig.org>.
-
-
-## Community
-
-Get updates on Bootstrap's development and chat with the project maintainers and community members.
-
-* Follow [@getbootstrap on Twitter](https://twitter.com/getbootstrap).
-* Read and subscribe to [The Official Bootstrap Blog](http://blog.getbootstrap.com).
-* Join [the official Slack room](https://bootstrap-slack.herokuapp.com).
-* Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##bootstrap` channel.
-* Implementation help may be found at Stack Overflow (tagged [`twitter-bootstrap-3`](https://stackoverflow.com/questions/tagged/twitter-bootstrap-3)).
-* Developers should use the keyword `bootstrap` on packages which modify or add to the functionality of Bootstrap when distributing through [npm](https://www.npmjs.com/browse/keyword/bootstrap) or similar delivery mechanisms for maximum discoverability.
-
-
-## Versioning
-
-For transparency into our release cycle and in striving to maintain backward compatibility, Bootstrap is maintained under [the Semantic Versioning guidelines](http://semver.org/). Sometimes we screw up, but we'll adhere to those rules whenever possible.
-
-See [the Releases section of our GitHub project](https://github.com/twbs/bootstrap/releases) for changelogs for each release version of Bootstrap. Release announcement posts on [the official Bootstrap blog](http://blog.getbootstrap.com) contain summaries of the most noteworthy changes made in each release.
-
-
-## Creators
-
-**Mark Otto**
-
-* <https://twitter.com/mdo>
-* <https://github.com/mdo>
-
-**Jacob Thornton**
-
-* <https://twitter.com/fat>
-* <https://github.com/fat>
-
-
-## Copyright and license
-
-Code and documentation copyright 2011-2016 Twitter, Inc. Code released under [the MIT license](https://github.com/twbs/bootstrap/blob/master/LICENSE). Docs released under [Creative Commons](https://github.com/twbs/bootstrap/blob/master/docs/LICENSE).

+ 0 - 40
vendor/bower-asset/bootstrap/_config.yml

@@ -1,40 +0,0 @@
-# Dependencies
-markdown:         kramdown
-highlighter:      rouge
-
-# Permalinks
-permalink:        pretty
-
-# Server
-source:           docs
-destination:      _gh_pages
-host:             0.0.0.0
-port:             9001
-url:              http://getbootstrap.com
-encoding:         UTF-8
-
-gems:
-  - jekyll-sitemap
-
-# Custom vars
-current_version:  3.3.7
-repo:             https://github.com/twbs/bootstrap
-sass_repo:        https://github.com/twbs/bootstrap-sass
-
-download:
-  source:         https://github.com/twbs/bootstrap/archive/v3.3.7.zip
-  dist:           https://github.com/twbs/bootstrap/releases/download/v3.3.7/bootstrap-3.3.7-dist.zip
-  sass:           https://github.com/twbs/bootstrap-sass/archive/v3.3.7.tar.gz
-
-blog:             http://blog.getbootstrap.com
-expo:             http://expo.getbootstrap.com
-themes:           http://themes.getbootstrap.com
-
-cdn:
-  # See https://www.srihash.org for info on how to generate the hashes
-  css:            https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css
-  css_hash:       "sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u"
-  css_theme:      https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css
-  css_theme_hash: "sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp"
-  js:             https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js
-  js_hash:        "sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa"

+ 0 - 34
vendor/bower-asset/bootstrap/bower.json

@@ -1,34 +0,0 @@
-{
-  "name": "bootstrap",
-  "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
-  "keywords": [
-    "css",
-    "js",
-    "less",
-    "mobile-first",
-    "responsive",
-    "front-end",
-    "framework",
-    "web"
-  ],
-  "homepage": "http://getbootstrap.com",
-  "license": "MIT",
-  "moduleType": "globals",
-  "main": [
-    "less/bootstrap.less",
-    "dist/js/bootstrap.js"
-  ],
-  "ignore": [
-    "/.*",
-    "_config.yml",
-    "CNAME",
-    "composer.json",
-    "CONTRIBUTING.md",
-    "docs",
-    "js/tests",
-    "test-infra"
-  ],
-  "dependencies": {
-    "jquery": "1.9.1 - 3"
-  }
-}

+ 0 - 37
vendor/bower-asset/bootstrap/composer.json

@@ -1,37 +0,0 @@
-{
-  "name": "twbs/bootstrap",
-  "description": "The most popular front-end framework for developing responsive, mobile first projects on the web.",
-  "keywords": [
-    "css",
-    "js",
-    "less",
-    "mobile-first",
-    "responsive",
-    "front-end",
-    "framework",
-    "web"
-  ],
-  "homepage": "http://getbootstrap.com",
-  "authors": [
-    {
-      "name": "Mark Otto",
-      "email": "markdotto@gmail.com"
-    },
-    {
-      "name": "Jacob Thornton",
-      "email": "jacobthornton@gmail.com"
-    }
-  ],
-  "support": {
-    "issues": "https://github.com/twbs/bootstrap/issues"
-  },
-  "license": "MIT",
-  "extra": {
-    "branch-alias": {
-      "dev-master": "3.3.x-dev"
-    }
-  },
-  "replace": {
-    "twitter/bootstrap": "self.version"
-  }
-}

+ 0 - 587
vendor/bower-asset/bootstrap/dist/css/bootstrap-theme.css

@@ -1,587 +0,0 @@
-/*!
- * Bootstrap v3.3.7 (http://getbootstrap.com)
- * Copyright 2011-2016 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-.btn-default,
-.btn-primary,
-.btn-success,
-.btn-info,
-.btn-warning,
-.btn-danger {
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
-}
-.btn-default:active,
-.btn-primary:active,
-.btn-success:active,
-.btn-info:active,
-.btn-warning:active,
-.btn-danger:active,
-.btn-default.active,
-.btn-primary.active,
-.btn-success.active,
-.btn-info.active,
-.btn-warning.active,
-.btn-danger.active {
-  -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-          box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
-}
-.btn-default.disabled,
-.btn-primary.disabled,
-.btn-success.disabled,
-.btn-info.disabled,
-.btn-warning.disabled,
-.btn-danger.disabled,
-.btn-default[disabled],
-.btn-primary[disabled],
-.btn-success[disabled],
-.btn-info[disabled],
-.btn-warning[disabled],
-.btn-danger[disabled],
-fieldset[disabled] .btn-default,
-fieldset[disabled] .btn-primary,
-fieldset[disabled] .btn-success,
-fieldset[disabled] .btn-info,
-fieldset[disabled] .btn-warning,
-fieldset[disabled] .btn-danger {
-  -webkit-box-shadow: none;
-          box-shadow: none;
-}
-.btn-default .badge,
-.btn-primary .badge,
-.btn-success .badge,
-.btn-info .badge,
-.btn-warning .badge,
-.btn-danger .badge {
-  text-shadow: none;
-}
-.btn:active,
-.btn.active {
-  background-image: none;
-}
-.btn-default {
-  text-shadow: 0 1px 0 #fff;
-  background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
-  background-image:      -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
-  background-image:         linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #dbdbdb;
-  border-color: #ccc;
-}
-.btn-default:hover,
-.btn-default:focus {
-  background-color: #e0e0e0;
-  background-position: 0 -15px;
-}
-.btn-default:active,
-.btn-default.active {
-  background-color: #e0e0e0;
-  border-color: #dbdbdb;
-}
-.btn-default.disabled,
-.btn-default[disabled],
-fieldset[disabled] .btn-default,
-.btn-default.disabled:hover,
-.btn-default[disabled]:hover,
-fieldset[disabled] .btn-default:hover,
-.btn-default.disabled:focus,
-.btn-default[disabled]:focus,
-fieldset[disabled] .btn-default:focus,
-.btn-default.disabled.focus,
-.btn-default[disabled].focus,
-fieldset[disabled] .btn-default.focus,
-.btn-default.disabled:active,
-.btn-default[disabled]:active,
-fieldset[disabled] .btn-default:active,
-.btn-default.disabled.active,
-.btn-default[disabled].active,
-fieldset[disabled] .btn-default.active {
-  background-color: #e0e0e0;
-  background-image: none;
-}
-.btn-primary {
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
-  background-image:      -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
-  background-image:         linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #245580;
-}
-.btn-primary:hover,
-.btn-primary:focus {
-  background-color: #265a88;
-  background-position: 0 -15px;
-}
-.btn-primary:active,
-.btn-primary.active {
-  background-color: #265a88;
-  border-color: #245580;
-}
-.btn-primary.disabled,
-.btn-primary[disabled],
-fieldset[disabled] .btn-primary,
-.btn-primary.disabled:hover,
-.btn-primary[disabled]:hover,
-fieldset[disabled] .btn-primary:hover,
-.btn-primary.disabled:focus,
-.btn-primary[disabled]:focus,
-fieldset[disabled] .btn-primary:focus,
-.btn-primary.disabled.focus,
-.btn-primary[disabled].focus,
-fieldset[disabled] .btn-primary.focus,
-.btn-primary.disabled:active,
-.btn-primary[disabled]:active,
-fieldset[disabled] .btn-primary:active,
-.btn-primary.disabled.active,
-.btn-primary[disabled].active,
-fieldset[disabled] .btn-primary.active {
-  background-color: #265a88;
-  background-image: none;
-}
-.btn-success {
-  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
-  background-image:      -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
-  background-image:         linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #3e8f3e;
-}
-.btn-success:hover,
-.btn-success:focus {
-  background-color: #419641;
-  background-position: 0 -15px;
-}
-.btn-success:active,
-.btn-success.active {
-  background-color: #419641;
-  border-color: #3e8f3e;
-}
-.btn-success.disabled,
-.btn-success[disabled],
-fieldset[disabled] .btn-success,
-.btn-success.disabled:hover,
-.btn-success[disabled]:hover,
-fieldset[disabled] .btn-success:hover,
-.btn-success.disabled:focus,
-.btn-success[disabled]:focus,
-fieldset[disabled] .btn-success:focus,
-.btn-success.disabled.focus,
-.btn-success[disabled].focus,
-fieldset[disabled] .btn-success.focus,
-.btn-success.disabled:active,
-.btn-success[disabled]:active,
-fieldset[disabled] .btn-success:active,
-.btn-success.disabled.active,
-.btn-success[disabled].active,
-fieldset[disabled] .btn-success.active {
-  background-color: #419641;
-  background-image: none;
-}
-.btn-info {
-  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
-  background-image:      -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
-  background-image:         linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #28a4c9;
-}
-.btn-info:hover,
-.btn-info:focus {
-  background-color: #2aabd2;
-  background-position: 0 -15px;
-}
-.btn-info:active,
-.btn-info.active {
-  background-color: #2aabd2;
-  border-color: #28a4c9;
-}
-.btn-info.disabled,
-.btn-info[disabled],
-fieldset[disabled] .btn-info,
-.btn-info.disabled:hover,
-.btn-info[disabled]:hover,
-fieldset[disabled] .btn-info:hover,
-.btn-info.disabled:focus,
-.btn-info[disabled]:focus,
-fieldset[disabled] .btn-info:focus,
-.btn-info.disabled.focus,
-.btn-info[disabled].focus,
-fieldset[disabled] .btn-info.focus,
-.btn-info.disabled:active,
-.btn-info[disabled]:active,
-fieldset[disabled] .btn-info:active,
-.btn-info.disabled.active,
-.btn-info[disabled].active,
-fieldset[disabled] .btn-info.active {
-  background-color: #2aabd2;
-  background-image: none;
-}
-.btn-warning {
-  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
-  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
-  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #e38d13;
-}
-.btn-warning:hover,
-.btn-warning:focus {
-  background-color: #eb9316;
-  background-position: 0 -15px;
-}
-.btn-warning:active,
-.btn-warning.active {
-  background-color: #eb9316;
-  border-color: #e38d13;
-}
-.btn-warning.disabled,
-.btn-warning[disabled],
-fieldset[disabled] .btn-warning,
-.btn-warning.disabled:hover,
-.btn-warning[disabled]:hover,
-fieldset[disabled] .btn-warning:hover,
-.btn-warning.disabled:focus,
-.btn-warning[disabled]:focus,
-fieldset[disabled] .btn-warning:focus,
-.btn-warning.disabled.focus,
-.btn-warning[disabled].focus,
-fieldset[disabled] .btn-warning.focus,
-.btn-warning.disabled:active,
-.btn-warning[disabled]:active,
-fieldset[disabled] .btn-warning:active,
-.btn-warning.disabled.active,
-.btn-warning[disabled].active,
-fieldset[disabled] .btn-warning.active {
-  background-color: #eb9316;
-  background-image: none;
-}
-.btn-danger {
-  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
-  background-image:      -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
-  background-image:         linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-color: #b92c28;
-}
-.btn-danger:hover,
-.btn-danger:focus {
-  background-color: #c12e2a;
-  background-position: 0 -15px;
-}
-.btn-danger:active,
-.btn-danger.active {
-  background-color: #c12e2a;
-  border-color: #b92c28;
-}
-.btn-danger.disabled,
-.btn-danger[disabled],
-fieldset[disabled] .btn-danger,
-.btn-danger.disabled:hover,
-.btn-danger[disabled]:hover,
-fieldset[disabled] .btn-danger:hover,
-.btn-danger.disabled:focus,
-.btn-danger[disabled]:focus,
-fieldset[disabled] .btn-danger:focus,
-.btn-danger.disabled.focus,
-.btn-danger[disabled].focus,
-fieldset[disabled] .btn-danger.focus,
-.btn-danger.disabled:active,
-.btn-danger[disabled]:active,
-fieldset[disabled] .btn-danger:active,
-.btn-danger.disabled.active,
-.btn-danger[disabled].active,
-fieldset[disabled] .btn-danger.active {
-  background-color: #c12e2a;
-  background-image: none;
-}
-.thumbnail,
-.img-thumbnail {
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-}
-.dropdown-menu > li > a:hover,
-.dropdown-menu > li > a:focus {
-  background-color: #e8e8e8;
-  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
-  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
-  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
-  background-repeat: repeat-x;
-}
-.dropdown-menu > .active > a,
-.dropdown-menu > .active > a:hover,
-.dropdown-menu > .active > a:focus {
-  background-color: #2e6da4;
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
-  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
-  background-repeat: repeat-x;
-}
-.navbar-default {
-  background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
-  background-image:      -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
-  background-image:         linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-radius: 4px;
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
-}
-.navbar-default .navbar-nav > .open > a,
-.navbar-default .navbar-nav > .active > a {
-  background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
-  background-image:      -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
-  background-image:         linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
-  background-repeat: repeat-x;
-  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
-          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
-}
-.navbar-brand,
-.navbar-nav > li > a {
-  text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
-}
-.navbar-inverse {
-  background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
-  background-image:      -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
-  background-image:         linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
-  filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
-  background-repeat: repeat-x;
-  border-radius: 4px;
-}
-.navbar-inverse .navbar-nav > .open > a,
-.navbar-inverse .navbar-nav > .active > a {
-  background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
-  background-image:      -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
-  background-image:         linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
-  background-repeat: repeat-x;
-  -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
-          box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
-}
-.navbar-inverse .navbar-brand,
-.navbar-inverse .navbar-nav > li > a {
-  text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
-}
-.navbar-static-top,
-.navbar-fixed-top,
-.navbar-fixed-bottom {
-  border-radius: 0;
-}
-@media (max-width: 767px) {
-  .navbar .navbar-nav .open .dropdown-menu > .active > a,
-  .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
-  .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
-    color: #fff;
-    background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-    background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-    background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
-    background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
-    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
-    background-repeat: repeat-x;
-  }
-}
-.alert {
-  text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
-  -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
-          box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
-}
-.alert-success {
-  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
-  background-image:      -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
-  background-image:         linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
-  background-repeat: repeat-x;
-  border-color: #b2dba1;
-}
-.alert-info {
-  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
-  background-image:      -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
-  background-image:         linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
-  background-repeat: repeat-x;
-  border-color: #9acfea;
-}
-.alert-warning {
-  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
-  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
-  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
-  background-repeat: repeat-x;
-  border-color: #f5e79e;
-}
-.alert-danger {
-  background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
-  background-image:      -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
-  background-image:         linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
-  background-repeat: repeat-x;
-  border-color: #dca7a7;
-}
-.progress {
-  background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
-  background-image:      -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
-  background-image:         linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
-  background-repeat: repeat-x;
-}
-.progress-bar {
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
-  background-image:      -o-linear-gradient(top, #337ab7 0%, #286090 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
-  background-image:         linear-gradient(to bottom, #337ab7 0%, #286090 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
-  background-repeat: repeat-x;
-}
-.progress-bar-success {
-  background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
-  background-image:      -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
-  background-image:         linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
-  background-repeat: repeat-x;
-}
-.progress-bar-info {
-  background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
-  background-image:      -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
-  background-image:         linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
-  background-repeat: repeat-x;
-}
-.progress-bar-warning {
-  background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
-  background-image:      -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
-  background-image:         linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
-  background-repeat: repeat-x;
-}
-.progress-bar-danger {
-  background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
-  background-image:      -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
-  background-image:         linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
-  background-repeat: repeat-x;
-}
-.progress-bar-striped {
-  background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:      -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-  background-image:         linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
-}
-.list-group {
-  border-radius: 4px;
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-          box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
-}
-.list-group-item.active,
-.list-group-item.active:hover,
-.list-group-item.active:focus {
-  text-shadow: 0 -1px 0 #286090;
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);
-  background-image:      -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a));
-  background-image:         linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);
-  background-repeat: repeat-x;
-  border-color: #2b669a;
-}
-.list-group-item.active .badge,
-.list-group-item.active:hover .badge,
-.list-group-item.active:focus .badge {
-  text-shadow: none;
-}
-.panel {
-  -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
-          box-shadow: 0 1px 2px rgba(0, 0, 0, .05);
-}
-.panel-default > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
-  background-image:      -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
-  background-image:         linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
-  background-repeat: repeat-x;
-}
-.panel-primary > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-  background-image:      -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
-  background-image:         linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
-  background-repeat: repeat-x;
-}
-.panel-success > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
-  background-image:      -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6));
-  background-image:         linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);
-  background-repeat: repeat-x;
-}
-.panel-info > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
-  background-image:      -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3));
-  background-image:         linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);
-  background-repeat: repeat-x;
-}
-.panel-warning > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
-  background-image:      -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc));
-  background-image:         linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);
-  background-repeat: repeat-x;
-}
-.panel-danger > .panel-heading {
-  background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
-  background-image:      -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc));
-  background-image:         linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);
-  background-repeat: repeat-x;
-}
-.well {
-  background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
-  background-image:      -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
-  background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5));
-  background-image:         linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
-  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);
-  background-repeat: repeat-x;
-  border-color: #dcdcdc;
-  -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
-          box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);
-}
-/*# sourceMappingURL=bootstrap-theme.css.map */

部分文件因文件數量過多而無法顯示